LoginSignup
0
1

More than 3 years have passed since last update.

統計学入門 東京大学出版会 2章練習問題

Last updated at Posted at 2020-05-10

第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]

'''

となります。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1