単回帰モデル分析
<相関係数の検定>にあげてあるプログラムに回帰分析の機能を付け加えた。回帰分析は次の単回帰モデル
を用いているが、詳しくは(岡本安晴「データ分析のための統計学入門」、おうふう)を参照されたい。また、回帰分析一般については(岡本安晴「心理学データ分析と測定」勁草書房;第1章〜第4章)で説明している。
プログラムは、相関係数の検定のプログラムに単回帰分析のためのコードを追加したもので、以下のようになっている。
================== simpleRegMain.py ======================
import matplotlib.pyplot as plt
from simpleRegSub import Ccalc
pairs = [[70, 168], [68, 165], [62,
159], [56, 156], [70, 170],
[64, 162], [59, 162], [70, 169], [68, 168], [69, 170],
[67, 168], [63, 166], [58, 163], [74, 170], [65, 168],
[60, 160], [65, 165], [72, 175], [61, 164], [77, 174],
[68, 164], [64, 161], [70, 166], [47, 147], [66, 165],
[68, 170], [73, 174], [74, 172], [63, 164], [83, 182],
[58, 159], [64, 166], [67, 167], [75, 174], [67, 163],
[68, 166], [68, 167], [66, 165], [63, 165], [55, 154],
[61, 163], [60, 160], [62, 164], [62, 160], [59, 160],
[51, 155], [59, 163], [68, 170], [56, 157], [79, 180]]
calc_p = Ccalc(pairs)
t, df, p, r, a, b = calc_p.calc()
print("\nt = %f df = %d"%(t, df))
print("Prob(x < %f) = %f Prob(x
> %f) = %f df
= %d"%(t, p, t, 1.0 - p, df))
print("\nY = %f * X +
%f"%(a, b))
min_x = max_x = pairs[0][0]
min_y = max_y = pairs[0][1]
for v in pairs:
if min_x > v[0]:
min_x = v[0]
if max_x < v[0]:
max_x = v[0]
if min_y > v[1]:
min_y = v[1]
if max_y < v[1]:
max_y = v[1]
reg_min = a * min_x + b
reg_max = a * max_x + b
xdata = []
ydata = []
for v in pairs:
xdata.append(v[0])
ydata.append(v[1])
plt.xlabel("X")
plt.ylabel("Y")
plt.title("Y = %f * X + %f r = %.3f"%(a, b,
r))
plt.plot(xdata, ydata, 'go')
plt.plot([min_x, max_x], [reg_min,
reg_max])
plt.show()
=================================================
データ対をリストとして表し、これらのリストを要素とするリストpairsとして入力データを表している。データを表すリストpairsを実引数としてクラス型Ccalcのオブジェクトcalc_pを作成して、メソッドcalc_p.calc()によりt値などを算出している。クラス型CcalcはプログラムsimpleRegSub.pyにおいて以下のように宣言されている。
=============== simpleRegSub.py ====================
import math
from calc_p_from_t
import p_value
def sqr(x):
return x * x
class Ccalc:
def __init__(self, pairs):
self.pairs = pairs
def calc(self):
n =
len(self.pairs)
print("n = %d"%n)
sum_x = 0.0
sum_y = 0.0
for
i in range(0, n):
sum_x += self.pairs[i][0]
sum_y += self.pairs[i][1]
mean_x = sum_x / n
mean_y = sum_y / n
print("Mean_x = %f"%mean_x)
print("Mean_y = %f"%mean_y)
ssum_x = 0.0
ssum_y = 0.0
sum_xy = 0.0
for
i in range(0, n):
ssum_x += sqr(self.pairs[i][0] - mean_x)
ssum_y += sqr(self.pairs[i][1] - mean_y)
sum_xy += (self.pairs[i][0] - mean_x) * (self.pairs[i][1] - mean_y)
var_x = ssum_x / n
var_y = ssum_y / n
print("Var_x = %f"%var_x)
print("Var_y = %f"%var_y)
sd_x
= math.sqrt(var_x)
sd_y
= math.sqrt(var_y)
print("sd_x = %f"%sd_x)
print("sd_y = %f"%sd_y)
cor
= sum_xy / math.sqrt(ssum_x * ssum_y)
print("r = %f"%cor)
t =
cor * math.sqrt(n - 2.0) / math.sqrt(1.0 - (cor ** 2.0))
df =
n - 2
p =
p_value(t, df)
a =
cor * sd_y / sd_x
b =
mean_y - a * mean_x
return t, df, p, cor, a, b
=============================================
単回帰モデルの係数は次式
によって求めている。
上のプログラムを実行すると、図1のように散布図に回帰直線が描かれたWindowsが表示される。
図1
右上のX印をクリックしてWindowを閉じるとプログラムの実行終了となる。実行終了後のIDLEのコンソール画面は図2のようになっている。
図2
表示されている確率は帰無仮説「相関係数=0」すなわち「a=0」に対する確率である。
プログラムのソースコードファイルは圧縮ファイルSimpleRegPrg.zipにまとめた。ファイル名SimpleRegPrg.zipをクリックしてダウンロード展開すれば利用できる。