第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