統計量
平均値、分散などの1変量統計量、中央値、四分位数などの順序統計量、相関係数、共分散などの2変量統計量を求めるPythonスクリプト例を以下のように用意した。
PythonスクリプトをJupyter Notebook用にまとめたものを圧縮ファイルStats.zipとした。ダウンロード・解凍して自由に利用されたい。
日本気象協会のウェブサイトで横浜市の10日間最高気温予測を調べると、表A.1のようであった。
表A.1 横浜市の10日間最高気温予測より(日本気象協会ウェブサイト:2019.10.28) |
||||||||||
日 |
10月29日 |
30日 |
31日 |
11月1日 |
2日 |
3日 |
4日 |
5日 |
6日 |
7日 |
温度 |
16℃ |
23℃ |
22℃ |
24℃ |
22℃ |
20℃ |
18℃ |
19℃ |
20℃ |
19℃ |
平均値、分散、標準偏差を求めるスクリプトを次のように作成した。
import numpy as np
data = [16, 23, 22, 24, 22, 20, 18,
19, 20, 19]
m = np.mean(data)
v = np.var(data)
sd = np.std(data)
print('平均値
= ', m)
print('分散 = ', v)
print('標準偏差 = ', sd)
実行すると、以下の出力を得る。
平均値 = 20.3
分散 = 5.41
標準偏差 = 2.3259406699226015
上の表A.1のデータの中央値、四分位数、最小値、最大値を得るスクリプトを、次のように作成した。
import numpy as np
data = [16, 23, 22, 24, 22, 20, 18,
19, 20, 19]
v_min = np.amin(data)
q1 = np.percentile(data, 25)
med = np.median(data)
q3 = np.percentile(data, 75)
v_max = np.amax(data)
print('順序統計量 = ', np.sort(data))
print('最小値 = ',
v_min)
print('第1四分位数 = ', q1)
print('中央値 = ', med)
print('第3四分位数 = ', q3)
print('最大値 = ',
v_max)
上のスクリプトを実行すると、以下の出力を得る。
順序統計量 = [16 18 19 19 20 20 22 22 23 24]
最小値 = 16
第1四分位数 = 19.0
中央値 = 20.0
第3四分位数 = 22.0
最大値 = 24
まず、並べ換えられたものが順序統計量として出力され、その後、最小値、第1四分位数、中央値、第3四分位数、最大値が出力されている。
2教科、Sub. AとSub. B、のスコアが表F.1のようであるとする。
表F.1 2教科[Sub.A,
Sub.B]のスコア |
[79, 72]
[77, 70] [74,
75] [53, 44] [76, 52] [68, 60]
[96, 96] [85,
71] [74, 49] [93, 80] [54, 55]
[86, 70] [89,
96] [87, 87] [81, 81] [84, 85]
[78, 64] [76,
53] [54, 57] [75, 60] |
表F.1の2教科のスコアの相関係数、共分散を求めるプログラムを、次のように用意した。
import numpy as np
data = [
[79,
72], [77, 70], [74, 75], [53, 44], [76, 52],
[68,
60], [96, 96], [85, 71], [74, 49], [93, 80],
[54,
55], [86, 70], [89, 96], [87, 87], [81, 81],
[84,
85], [78, 64], [76, 53], [54, 57], [75, 60]
]
A = []
B = []
for v in data:
A.append(v[0])
B.append(v[1])
r = np.corrcoef(A, B)
print(r)
print('相関係数 = ', r[0][1])
C = np.cov(A, B)
print(C)
print('推定共分散 = ', C[0][1])
n = len(data)
C1 = C * (n-1) / n
print('標本共分散 = ', C1[0][1])
リストAとBに対応する順番に値を設定して、相関行列を算出する関数を
r = np.corrcoef(A, B)
と呼び出している。この関数は、相関行列を返すので、相関係数は行列の成分r[0][1]の値として得られる。
共分散も同様であるが、次の関数呼び出し
C = np.cov(A, B)
では、共分散行列は分母を「データ数―1」で割ったもの、したがって分散は不偏分散が算出されるので、次のように
n = len(data)
C1 = C * (n-1) / n
標本数で調整すれば標本分散が得られる。
上のスクリプトを実行すると、以下の出力が得られる。
[[1.
0.77718556]
[0.77718556 1. ]]
相関係数 = 0.7771855633037875
[[148.15526316 144.78157895]
[144.78157895 234.23947368]]
推定共分散 = 144.7815789473684
標本共分散 = 137.54249999999996
疑似相関
2変量との相関係数から変量の影響を単回帰モデルで除いた相関係数、すなわち偏相関係数は次式で与えられる。
ここで、はとの相関係数、はとの相関係数である。
偏相関係数を求めるスクリプトを次のように用意した。
Rxy = float(input('r_xy = '))
Rxz = float(input('r_xz = '))
Ryz = float(input('r_yz = '))
Rxy_z = (Rxy - Rxz * Ryz) / (((1 -
Rxz**2) * (1 - Ryz**2)) ** 0.5)
print('\nr_xy.z = ', Rxy_z)
上のスクリプトを実行すると、相関係数、、の値を変数r_xy、r_xz、r_yzの値として入力が求められる。3つの相関係数を入力すると、偏相関係数の値がr_xy.zの値として出力される。実行例を以下に示す。
r_xy = 0.45
r_xz = 0.8
r_yz = 0.75
r_xy.z = -0.3779644730092275