日本心理学会第84回大会、2020
予測アセスメントと相関係数
―関連特性の予測確率―
岡本 安晴
日本女子大学(定年退職)
特性AとBがあり、AとBの間には正の相関があるとする。このとき、「特性Aのある人は特性Bがある」と言うことは不適切である。相関係数は確率的関係を表すものであり、「特性Aのある人は特性Bがある」は決定論的言明であり成り立たないこともある。この言明の成り立つ確率が示されなければならない。言明が1人の人についての場合と、2人の人の間の比較の場合について確率を求める。言明「特性Aのある人は特性Bがある」の確率は、相関が無いとき、言明の成り立つ確率は0.5で、言明の当たりはずれの確率は等しい。相関係数=0.5のときは、言明の成り立つ確率は約2⁄3で、3人に1人の割合で外れる。相関係数>0.8になると言明の外れる確率も5人に1人以下になる。次に、2人の比較の場合について調べる。相関が無い場合、「個人pの方が特性Aが強い」とき、言明「個人pの方が特性Bが強い」の成り立つ確率は0.5で、言明の当たりはずれの確率は等しい。相関係数=0.5のときは、言明の成り立つ確率は約2⁄3で、3人に1人の割合で外れる。相関係数>0.8になると言明の外れる確率も5人に1人以下になる。
図1
図1の描画スクリプト
import numpy as np
import scipy.stats as ss
import scipy.integrate as si
import matplotlib.pyplot as plt
class BiNormal:
def __init__(self, r):
self.r = r
def pdf(self, x, y):
return ss.multivariate_normal.pdf([x, y],
mean
= [0.0, 0.0],
cov = [[1.0, self.r],[self.r, 1.0]])
def L_f(x):
return 0.0
def U_f(x):
return float('inf')
corr = [0.0, 0.3, 0.5, 0.7, 0.9, 0.95]
Probs = []
for r in corr:
bi_norm = BiNormal(r)
v, e =
si.dblquad(bi_norm.pdf, 0.0, float('inf'), L_f, U_f)
print('r = ', r, 'prob = ', v * 2) # 1/Prob(X>0) = 2.0
Probs.append(v * 2)
plt.title(r'P(B>0|A>0) at
$\rho$', fontsize = 16)
plt.plot(corr, Probs, 'b-')
plt.xticks(np.arange(0.0, 1.05, 0.2))
plt.xlabel(r'$\rho$', fontsize = 14)
plt.ylabel(r'Prob.(B>0|A>0)',
fontsize = 14)
plt.show()
図2
図2の描画スクリプト
import numpy as np
import scipy.stats as ss
import scipy.integrate as si
import matplotlib.pyplot as plt
Xs = np.arange(0.0, 3.01, 0.5)
Rs = [0.0, 0.3, 0.5, 0.7, 0.9, 0.95]
for r in Rs:
Probs = []
for x in Xs:
Normal = ss.norm(r * x, (1.0 - r**2)**0.5)
v = 1.0 -
Normal.cdf(0.0)
print('r = ', r, ' x = ', x,
' prob = ', v)
Probs.append(v)
plt.plot(Xs, Probs, label =
r'$\rho$ = {}'.format(r))
plt.yticks(np.arange(0.5, 1.01, 0.1))
plt.xlabel('A', fontsize = 14)
plt.ylabel('P(B>0|A)', fontsize =
14)
plt.title(r'Probability of B>0
conditional on A for $\rho$', fontsize = 16)
plt.legend()
plt.show()
図3
図3の描画スクリプト
import numpy as np
import scipy.stats as ss
import scipy.integrate as si
import matplotlib.pyplot as plt
class BiNormal:
def __init__(self, r, sgm):
self.r = r
self.sgm = sgm
def pdf(self, x, y):
return ss.multivariate_normal.pdf([x, y],
mean
= [0.0, 0.0],
cov = [[self.sgm**2, (self.sgm**2) * self.r],
[(self.sgm**2) * self.r, self.sgm**2]])
Xs = np.arange(0.0, 3.01, 0.5)
Rs = [0.0, 0.3, 0.5, 0.7, 0.9, 0.95]
for r in Rs:
Probs = []
for x in Xs:
Normal = ss.norm(r * x, (2.0 * (1.0 - r**2))**0.5)
v =
1.0 - Normal.cdf(0.0)
print('r = ', r, ' x = ', x,
' prob = ', v)
Probs.append(v)
plt.plot(Xs, Probs, label =
r'$\rho$ = {}'.format(r))
plt.yticks(np.arange(0.5, 1.01, 0.1))
plt.xlabel(r'$A_p$ - $A_q$', fontsize
= 14)
plt.ylabel(r'P($B_p$ -
$B_q$>0|$A_p$ - $A_q$)', fontsize = 14)
plt.title(r'Probability of $B_p$ -
$B_q$>0' +
'\n' + r'conditional on $A_p$ - $A_q$ for $\rho$', fontsize = 16)
plt.legend(loc = 'lower right')
plt.tight_layout()
plt.show()
図4
図4の描画スクリプト
import numpy as np
import scipy.stats as ss
import scipy.integrate as si
import matplotlib.pyplot as plt
class BiNormal:
def __init__(self, r):
self.r = r
def pdf(self, x, y):
return ss.multivariate_normal.pdf([x, y],
mean = [0.0, 0.0],
cov = [[1.0, self.r],[self.r, 1.0]])
x = np.arange(-3.0, 3.01, 0.1)
y = np.arange(-3.0, 3.01, 0.1)
X, Y = np.meshgrid(x, y)
plt.figure(figsize = (7, 7))
rhos = [0.0, 0.9, 0.3, 0.5]
dcolors = ['k', 'g', 'r', 'm']
for r, c in zip(rhos, dcolors):
bi_norm = BiNormal(r)
def f(x, y):
return bi_norm.pdf(x, y)
Z = []
pos = -1
for vy in y:
Z.append([])
pos
+= 1
for
vx in x:
Z[pos].append(f(vx, vy))
Z = np.array(Z)
C = plt.contour(X, Y, Z, 8,
colors = c)
plt.title((r'$\rho$ = 0(black), $\rho$ = 0.3(red)') +
'\n' + (r'$\rho$ = 0.5(magenta), $\rho$ = 0.9(green)'), fontsize =
16)
plt.plot([-2.5, 2.5], [0.0, 0.0],
'k-', linewidth = 1)
plt.plot([0.0, 0.0], [-2.5, 2.5],
'k-', linewidth = 1)
plt.xlabel('A', fontsize = 16)
plt.ylabel('B', fontsize = 16)
plt.show()
参考書
岡本安晴(2019)いまさら聞けないPythonでデータ分析.丸善出版