第2回の練習問題の解答例¶
X = [10,15,22,34,33,49,50,50,51,59,69]
Y = [15,22,40,39,30,61,55,48,70,81,60]
問題1 X、Yそれぞれで標準得点、偏差値を求めよ。
問題2 X、Yそれぞれの分散とXとYの共分散を求めよ。
問題3 X,Yの相関係数を求めよ。
問題1
In [1]:
# データ
X = [10,15,22,34,33,49,50,50,51,59,69]
Y = [15,22,40,39,30,61,55,48,70,81,60]
# Xの標準得点
# numpyで平均、標準偏差を求め、for文を用いてそれぞれの標準得点を算出
# 標準得点 = (平均値 - 個々の得点) / 標準偏差
# numpyのimport
import numpy as np
# 平均値と標準偏差の算出
x_m = np.average(X)
x_std = np.std(X)
# 計算結果を保存するリストの作成
X_st = []
# それぞれのデータに関して標準得点を計算してX_stに追加
for i in X:
X_st.append((x_m - i)/x_std)
# 結果の表示
X_st
Out[1]:
[1.6830039932456407, 1.4041930907501279, 1.01385782725641, 0.34471166126717934, 0.40047384176628187, -0.491721046219359, -0.5474832267184616, -0.5474832267184616, -0.6032454072175641, -1.0493428512103846, -1.6069646562014102]
In [2]:
# Yも同様に計算
y_m = np.average(Y)
y_std = np.std(Y)
Y_st = []
for i in Y:
Y_st.append((y_m - i)/x_std)
Y_st
Out[2]:
[1.8046669325164102, 1.4143316690226924, 0.4106124200388463, 0.4663746005379488, 0.9682342250298718, -0.7603933704423074, -0.42582028744769207, -0.035485023953974175, -1.2622529949342305, -1.8756369804243584, -0.7046311899432048]
In [3]:
# Xの偏差値
# 偏差値は標準得点に10倍して50を足した値
# 平均値と標準偏差はすでに算出しているのでそれを利用
# 計算結果を保存するリストの作成
X_T = []
# それぞれのデータに関して偏差値を計算してX_Tに追加
for i in X:
X_T.append(10 * (x_m - i)/x_std + 50)
# 結果の表示
X_T
Out[3]:
[66.8300399324564, 64.04193090750128, 60.138578272564104, 53.44711661267179, 54.00473841766282, 45.08278953780641, 44.52516773281538, 44.52516773281538, 43.96754592782436, 39.50657148789615, 33.9303534379859]
In [4]:
# Yの偏差値も同様に計算
# 計算結果を保存するリストの作成
Y_T = []
# それぞれのデータに関して偏差値を計算してY_Tに追加
for i in Y:
Y_T.append(10 * (y_m - i)/y_std + 50)
# 結果の表示
Y_T
Out[4]:
[66.63297183365648, 63.03539084716337, 53.784468310466785, 54.29840845139437, 58.92386971974266, 42.99172535098744, 46.07536619655297, 49.672947183046084, 38.36626408263915, 32.712922532435684, 43.505665491915025]
問題2
In [5]:
# Xの分散
# 個々の値から平均値を引いた値を2乗
x_d = 0
for i in X:
x_d += (i - x_m)**2
x_var = x_d/len(X)
x_var
Out[5]:
321.60330578512395
In [6]:
# Yの分散
y_d = 0
for i in Y:
y_d += (i - y_m)**2
y_var = y_d/len(Y)
y_var
Out[6]:
378.5950413223141
In [7]:
# XとYの共分散
xy = 0
for i,j in zip(X,Y):
xy += (i - x_m) * (j - y_m)
xy_cov = xy / len(X)
xy_cov
Out[7]:
306.297520661157
zip()
は2つ以上のリストから要素を取り出す関数です。- 上のコードでは
zip()
を用いてX、Yの先頭から要素を取り出しiおよびjに代入しています。 - また、分散、共分散は以下のようにnumpyで簡単に求めることができますが、numpyの
cov()
がデフォルトで出力するのは不偏分散、不偏共分散です。 - 授業で求めた分散は標本分散、標本共分散です。
- 標本分散、標本共分散を出力するためには、
cov()
の引数として、ddof=0
を与えます。 - この授業で「分散」、「共分散」と言った場合、標本分散、標本共分散を指します。
In [8]:
np.cov(X,Y)
Out[8]:
array([[353.76363636, 336.92727273], [336.92727273, 416.45454545]])
In [9]:
np.cov(X,Y,ddof=0)
Out[9]:
array([[321.60330579, 306.29752066], [306.29752066, 378.59504132]])
問題3
In [10]:
# 相関係数は共分散を(Xの分散×Yの分散)のルートで割ったもの
# ルートはnumpyのsqrt()を使用します。
xy_cov/np.sqrt(x_var * y_var)
Out[10]:
0.8778003881596494