#第2章練習問題
これらの計算はすでにある関数を用いればすぐ求められるようなものばかりではありますが,中身の勉強という意味で一から実装していくものとします。
###2.2平均差・ジニ係数
A : 0, 3, 3, 5, 5, 5, 5, 7, 7, 10
B : 0, 1, 2, 3, 5, 5, 7, 8, 9, 10
C : 3, 4, 4, 5, 5, 5, 5, 6, 6, 7
のデータについて平均差とジニ係数を計算せよ。
ここで平均差とジニ係数はそれぞれ以下の式で定義されます。
\frac{Σ_iΣ_j|x_i-x_j|}{n^2}
\frac{Σ_iΣ_j|x_i-x_j|}{2n^2 \bar{x}}
ゆえに以下のようにプログラムを書きました。
import numpy as np
A = np.array([0,3,3,5,5,5,5,7,7,10])
B = np.array([0,1,2,3,5,5,7,8,9,10])
C = np.array([3,4,4,5,5,5,5,6,6,7])
#平均差
def ave_diff(x):
n=len(x)**2
result = [np.abs(x[i]-x[j])/n for i in range(len(x)) for j in range(len(x))]
return sum(result)
"""
print(ave_diff(A))
print(ave_diff(B))
print(ave_diff(C))
2.76
3.7599999999999976
1.2000000000000008
"""
#ジニ係数
def get_gini(x):
def get_gini(x):
n=len(x)**2
x_bar=x.mean()
result = [np.abs(x[i]-x[j])/(2*n*x_bar) for i in range(len(x)) for j in range(len(x))]
return sum(result)
"""
print(get_gini(A))
print(get_gini(B))
print(get_gini(C))
0.2760000000000002
0.3760000000000002
0.12000000000000008
"""
###2.3エントロピー
p_i=f_i/nとした時
H(p_1, p_2, ...., p_n) = -Σp_iilog(p_ii)
で定義されます。
この量をエントロピーといい、Hが大きいほど分布は一様となり、小さいほど集中性が見られます。
例題
100人の学生に出身地を尋ねた。10年前と本年に対して以下の結果を得た。集中性という見地からこの出身地の分布を比較せよ。
地域 | A | B | C | D | E | 計 |
---|---|---|---|---|---|---|
本年 | 32 | 19 | 10 | 24 | 15 | 100 |
10年前 | 28 | 13 | 18 | 29 | 12 | 100 |
import numpy as np
a=np.array([32, 19, 10, 24, 15])
b=np.array([28,13,18,29,12])
def entropy(x):
H=0
n=sum(x)
H=[x[i]/n*np.log10(x[i]/n) for i in range(len(x))]
# for i in range(len(x)):
# p=a[i]/n
# H.append(p*np.log10(p))
return -sum(H)
"""
print(entropy(a))
print(entropy(b))
0.667724435887455
0.6704368955892825
"""
###2.4標準得点・偏差得点
データBについて標準得点、偏差値得点を計算せよ
標準得点・標準化
z_i = \frac{xi-\bar{x}}{S_x}
ですので、
def standard_score(x):
x_bar = x.mean()
s=np.sqrt(x.var())
z = [(x[i]-x_bar)/s for i in range(len(x))]
return z
"""
standard_score(B)
[-1.5214515486254614,
-1.217161238900369,
-0.9128709291752768,
-0.6085806194501845,
0.0,
0.0,
0.6085806194501845,
0.9128709291752768,
1.217161238900369,
1.5214515486254614]
"""
偏差値得点については
T_i = 10z_i * 50
ですので上の関数を少し変更し、
def dev_val(x):
x_bar = x.mean()
s=np.sqrt(x.var())
T = [(x[i]-x_bar)/s*10 +50 for i in range(len(x))]
return T
'''
def_val(B)
[34.78548451374539,
37.82838761099631,
40.87129070824723,
43.91419380549816,
50.0,
50.0,
56.08580619450184,
59.12870929175277,
62.17161238900369,
65.21451548625461]
'''
となります。