Up

日本心理学会第84回大会、2020

予測アセスメントと相関係数

―関連特性の予測確率―

 

 岡本 安晴

日本女子大学(定年退職)

 

 特性ABがあり、ABの間には正の相関があるとする。このとき、「特性Aのある人は特性Bがある」と言うことは不適切である。相関係数は確率的関係を表すものであり、「特性Aのある人は特性Bがある」は決定論的言明であり成り立たないこともある。この言明の成り立つ確率が示されなければならない。言明が1人の人についての場合と、2人の人の間の比較の場合について確率を求める。言明「特性Aのある人は特性Bがある」の確率は、相関が無いとき、言明の成り立つ確率は0.5で、言明の当たりはずれの確率は等しい。相関係数=0.5のときは、言明の成り立つ確率は約23で、3人に1人の割合で外れる。相関係数>0.8になると言明の外れる確率も5人に1人以下になる。次に、2人の比較の場合について調べる。相関が無い場合、「個人pの方が特性Aが強い」とき、言明「個人pの方が特性Bが強い」の成り立つ確率は0.5で、言明の当たりはずれの確率は等しい。相関係数=0.5のときは、言明の成り立つ確率は約23で、3人に1人の割合で外れる。相関係数>0.8になると言明の外れる確率も5人に1人以下になる。

 

パワーポイントPDFファイル

 

図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でデータ分析.丸善出版

 

Up