137

機械学習関連の技術記事を投稿します。137と言えば微細構造定数

【統計学入門(東京大学出版会)】第2章 練習問題 解答

機械学習や深層学習を勉強する中で、その基礎となる統計学を抑えていないのはよくないと思い、東京大学出版会から出版されている統計学入門(基礎統計学Ⅰ)を読んでいます。 執筆時点では第10章の練習問題を解いている途中ですが、本書は間違いなく良書だと思います。 体系的に統計情報を学べるのはもちろんのこと、各章の最後にある練習問題はその章の内容を理解していないと解けない問題が多いため、手を動かすことでより深く理解できます。 問題の中には、解いた結果の意味について考察するものもあり、本書の中で紹介された内容がどのように現実問題で役立つかを理解できます。 自分は本書のおかげで、χの二乗分布が何に役立つのか理解できました。

しかしこの本、本の名前に「入門」と書いてはいますが、難易度は高めであることに注意が必要です。 自分は大学が物理学科専攻で数式と格闘する毎日であったおかげか、数式で詰まることはほとんどありませんでしたが、大学教養レベルの数学の知識がないと読むのは厳しいと思います。

章末の練習問題の解答は、問題によっては答えのみしか書かれていないため不親切だと思いました。 せっかく良問が揃っている中で解説がないのは、初学者にとって厳しいです。 そこで、あとで問題を解き直したときに困らないように、練習問題の解答の詳解を記事としてまとめることにしました。 第1章の練習問題など、自由研究のような問題を除いて解答に至るまでの途中の計算式などを書いていこうと思います。 また、電卓を用いて値を求めるような問題に関しては、Pythonでプログラムを書いて求めています。

本章以外の解答

本章以外の練習問題の解答は別の記事で公開しています。
必要に応じて参照してください。

2.2

データA, B, Cを、平均差とジニ係数の式にそれぞれ代入すれば求まります。

平均差


\displaystyle \sum_{i} \sum_{j} \frac{|x_{i} - x_{j}|}{n^{2}}

平均差を求めるPythonプログラムを示します。

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):
    X_sum = 0
    for xi in X:
        for xj in X:
            X_sum += np.abs(xi - xj)
    return X_sum / (X.size**2)

print("AveDiff A: {}".format(ave_diff(A)))
print("AveDiff B: {}".format(ave_diff(B)))
print("AveDiff C: {}".format(ave_diff(C)))

上記プログラムの実行結果を次に示します。

AveDiff A: 2.76
AveDiff B: 3.76
AveDiff C: 1.2

ジニ係数


\displaystyle GI = \sum_{i} \sum_{j} \frac{|x_{i} - x_{j}|}{2n^{2}\overline{x}}

ジニ係数を求めるPythonプログラムを示します。

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 gini(X):
    X_mean = np.mean(X)
    X_sum = 0
    for xi in X:
        for xj in X:
            X_sum += np.abs(xi - xj)
    return X_sum / (2 * X.size**2 * X_mean)

print("Gini A: {}".format(gini(A)))
print("Gini B: {}".format(gini(B)))
print("Gini C: {}".format(gini(C)))

上記プログラムの実行結果を次に示します。

Gini A: 0.276
Gini B: 0.376
Gini C: 0.12

2.3

10年前と本年における学生の出身地の分布データを、エントロピー  H の式に代入して値を確認します。


\displaystyle H(X) = - \sum_{i = 1}^{k} \hat{p_{i}} \log \hat{p_{i}}

 p_{i} は、確率変数が  X = i となる確率です)

10年前と本年における学生の出身地の分布データについて、エントロピーを求めるPythonプログラムを示します。

import numpy as np

this_year = [32, 19, 10, 24, 15]
ten_years_ago = [28, 13, 18, 29, 12]


def entropy(X):
    f = np.array(X)
    p = f / np.sum(f)
    H = -np.sum(p * np.log10(p))
    return H

print("this year: {}".format(entropy(this_year)))
print("10 years ago: {}".format(entropy(ten_years_ago)))

上記プログラムの実行結果を次に示します。

this year: 0.667724435887455
10 years ago: 0.6704368955892825

エントロピーは確率変数(学生の出身地)の集中性を決めるため、10年前と本年では学生の出身地の集中性はそれほど変化していないと言えます。

2.4

データBを、標準得点と偏差値得点の式に代入します。

標準得点


\displaystyle \mu = \sum^{n} x_{i} \\
\displaystyle \sigma = \sqrt{\sum^{n}(x_{i}^{2} - \mu^{2})} \\
\displaystyle z_{i} = \frac{x_{i} - \mu}{\sigma}

 \mu は平均、 \sigma標準偏差 z_{i} は標準得点になります。

偏差値得点


T_{i} = 10 z_{i} + 50

 z_{i} は標準得点、 T_{i} は偏差値得点になります。

これらの式を使って、データBの標準得点と偏差値得点を求めるプログラムを次に示します。

import numpy as np

B = np.array([0, 1, 2, 3, 5, 5, 7, 8, 9, 10])

B_ave = np.mean(B)
B_std = np.sqrt(np.sum(np.mean(B**2) - B_ave**2))
z = (B - B_ave) / B_std

print(f"Standard Score: {z}")
print("Deviation Score: {}".format(10 * z + 50))

上記プログラムの実行結果を次に示します。

Standard Score: [-1.52145155 -1.21716124 -0.91287093 -0.60858062  0.          0.
  0.60858062  0.91287093  1.21716124  1.52145155]
Deviation Score: [34.78548451 37.82838761 40.87129071 43.91419381 50.         50.
 56.08580619 59.12870929 62.17161239 65.21451549]