【統計学入門(東京大学出版会)】第6章 練習問題 解答
東京大学出版会から出版されている統計学入門(基礎統計学Ⅰ)について第6章の練習問題の解答を書いていきます。
本章以外の解答
本章以外の練習問題の解答は別の記事で公開しています。
必要に応じて参照してください。
6.1
二項分布
二項分布の期待値 は、
で与えられます。
一方 は、
となるため、分散 は、
となります。
ポアソン分布
ポアソン分布の期待値 は、
で与えられます。
一方 は、
となるため、分散 は、
となります。
6.2
ポアソン分布 は、次の式で与えられます。
4床の空きベッドが確保されているため、ベッドが不足する確率は救急患者数が5人以上である確率を求めればよいことになります。
したがって、
を求めることで答えが得られます。
上記の計算を行うPythonプログラムを次に示します。
from math import exp, pow, factorial ans = 1.0 for x in range(5): ans -= exp(-2.5) * pow(2.5, x) / factorial(x) print(ans)
上記のプログラムを実行すると、次の結果が得られます。
0.10882198108584873
6.3
負の二項分布とは、 回目の成功を得るまでの試行回数 に関する確率分布 です。 したがって最後の試行が成功となり、それ以外の 回の試行では、 回の成功と 回の失敗となる確率を求めればよいことになります。
成功の確率を 失敗の確率を とすると、確率分布 は、
以上により、負の二項分布を導出できました。
6.4
i)
個のコインのうち、1個のコインが表になり 個のコインが裏になる確率と、 個のコインが表になり1個のコインが裏になる確率の和が になります。
したがって、
ii)
繰り返し数を とすると、 回目でi)を満たす確率 は、
となるため、 の期待値 は、
から求めることができます。
ここで が非常に大きい(=無限大)のときは、
が成り立つため、
の関係式が得られます。
この関係式を利用すると、
が得られます。
6.5
定数
が確率密度関数となるためには、
を満たせばよいことになります。 したがって、
より(偶関数の性質を利用)、 が求まります。
以降の計算では、この の値を利用して期待値などの値を求めます。 すなわち、
です。
期待値
の期待値 は、
となります(奇関数の性質を利用)。
分散
となるため、分散
が得られます。
歪度
、 と、
より、歪度 は、
となります。
尖度
より、尖度 は、
となります。
6.6
i)
指数分布の確率密度関数 は、次の式で与えられます( は正の値)。
これを用いて、
となります。
は、過去に だけの時間が過ぎた状態という前提条件をもとにして、 だけ時間を進めたときの確率を示しています。 一方で は、いかなる前提条件をもとにせず、 だけ時間を進めたときの確率を示しています。 これらが同じ確率になっているということは、過去の時間経過がその後の確率に影響を与えていない、ということを示していると言えます。
ii)
累積分布関数 は、
となるため、
が得られます。
6.7
付表の正規分布表を利用します。
付表は上側の確率の値を示しているため、 の場合は、表の値の1/2となる値を見る必要があることに注意が必要です。 例えば、 の場合は、0.005に対応する の値を参照するといった具合です。
また本来は、内挿を考慮して値を求める必要がありますが、簡単のため2点間で近い方の値を の値として採用しています。
0.01 | 2.58 |
0.02 | 2.32 |
0.05 | 1.96 |
0.10 | 1.65 |
および
0.01 | 2.32 |
0.02 | 2.05 |
0.05 | 1.65 |
0.10 | 1.28 |
が得られます。
6.8
ベータ分布の確率密度関数 は、
かつ凹関数であることから、 を微分して0となる の値がモード(最頻)となります。
したがって、
を満たす を求めればよいことになります。 は に依存しないことに注意して計算すると、
が得られます。
なお、 のときはベータ分布が一様分布になることから、モードは の範囲で任意の値を取れる点に注意してください。
6.9
ワイブル分布の密度関数 を次に示します。
累積分布関数 は、
と求まります。 ここで求めた累積分布関数は、 を満たす場合に限定しています。 の場合は となるので、累積分布関数も0になります。
6.10
標準正規分布
したがってモーメント母関数 は、変数変換 とガウス積分の公式を使って求めることができます。
ここでマクローリン展開すると、
となります。
一方、モーメント母関数 は、
という性質があるため、
が得られます。
よって尖度 は、
となります。
指数分布
指数分布の確率密度関数 は、次の式で与えられます。
したがってモーメント母関数 は、次のようになります。 なお、 とします。
ここでマクローリン展開すると、
となります。
したがって、
が得られます。
よって尖度 は、
となります。
【Python】機械学習ライブラリにおける乱数固定
機械学習向けに提供されるライブラリは、内部で乱数を使っていることが多く、何も考えずにプログラムを書くとプログラム実行の度に結果が変わってしまいます(再現性がありません)。 再現性のあるプログラムを書くためには乱数を固定化する必要がありますが、利用するライブラリによって乱数を固定化する方法が異なります。
本記事では、自分が日頃利用しているライブラリについて、再現性を確保するために必要となる手続きをまとめたいと思います。 なお、本記事は自分が頻繁に利用するライブラリに絞って説明していますので、すべての機械学習のライブラリについて網羅できているわけではありません。 また、本記事は随時更新していく予定です。
Python
- ハッシュ生成のランダム化を無効化 参考
os.environ["PYTHONHASHSEED"] = str(seed)
random
- 乱数Seed固定 参考
random.seed(seed)
numpy
- 乱数Seed固定 参考
np.random.seed(seed)
PyTorch
- 乱数Seed固定 参考
torch.manual_seed(seed)
CUDA専用の乱数Seed固定API torch.cuda.manual_seed
もありますが、上記のAPIを実行するだけでCUDA側の乱数Seedも固定してくれるようです。
- cudnn内の非決定的な処理の固定化 参考
torch.backends.cudnn.deterministic = True torch.backends.cudnn.benchmark = False
torch.backends.cudnn.benchmark
に False
にすると最適化による実行の高速化の恩恵は得られませんが、テストやデバッグ等に費やす時間を考えると結果としてトータルの時間は節約できる、と公式のドキュメントには記載されていました。
【統計学入門(東京大学出版会)】第5章 練習問題 解答
東京大学出版会から出版されている統計学入門(基礎統計学Ⅰ)について第5章の練習問題の解答を書いていきます。
本章以外の解答
本章以外の練習問題の解答は別の記事で公開しています。
必要に応じて参照してください。
5.1
i)
密度関数
一様分布の密度関数 を次に示します。
期待値
期待値 は、
となります。
分散
と求まるので、
分散は は、
となります。
ii)
チェビシェフの不等式は、次の式で与えられます。
したがって、i)の結果を利用して、
が成り立つことを適当なk(ここでは とします)について確認すればよいことになります。
となり、不等式が成り立つことが確認できました。
iii)
密度関数 を次に示します。
これから、
と求まります。
歪度
歪度 は、
で求めますが、
であるため、 となります。
尖度
尖度 は、
で求めますが、
から、
となります。
5.2
各等級の当選金を 、本数を とすると、宝くじの期待値 は、次の式で表されます。
なお、全本数を としました。
上記の式を用いて期待値を求めるPythonプログラムを次に示します。
import numpy as np money = np.array([ 40000000, 10000000, 200000, 10000000, 100000, 1000000, 140000, 10000, 1000, 200 ]) num = np.array([ 7, 14, 903, 5, 645, 130, 130, 1300, 26000, 1300000 ]) total = np.sum(money * num) / 13000000 print(total)
上記のプログラムを実行した結果を次に示します。
89.4076923076923
5.3
i)
n回目に初めてコインが表になる確率 は、n-1回目まで裏が出ることと同じであるため、次の式で表されます。
ii)
i)の結果を用いて期待値 を求めると、
となり題意は示されました。
5.4
を式変形すると、
となります。上記の式を最小にするためには、 をについて微分した値が0になればよいので、
したがって、 のとき が最小値 をとります。
5.5
正n面体で各面が出る確率は、 です。 ここから、各期待値と分散が求まります。
期待値
期待値 は、1次式の和の公式 を用いて、
となります。
分散
分散 は、1次式の和の公式と2次式の和の公式 を用いて、
となります。
5.6
確率変数 の密度関数 は、次のように与えられます。
累積分布関数
の累積分布関数 は、
と求まります。
密度関数
となります。
期待値
期待値 は、
と求まります。
分散
となるため、分散 は、
と求まります。
5.7
確率変数 の密度関数 は、次のように与えられます。
累積分布関数
の累積分布関数 は、
で求めることができます。 は偶関数であるため、
となるため、
が得られます。 ここで は、標準正規分布の累積分布関数です。
密度関数
を用いると、
となります。
期待値
期待値 は、
で求めますが、 と であることを利用し、 が の域値であること(累積分布関数の算出で偶関数の性質を使うときに、 が負の領域を考慮して累積分布関数を2倍していること)に注意すると、
分散
となるため、分散 は、
と求まります。
5.8
コインの投げた回数を 回として、表が出た回数について の極限を取ることを考えます。
右極限 を取ると となります。 ただし、累積分布関数は と定義されるため、 より、右連続ではありません。
一方で左極限 を取ると となります。 ここで、累積分布関数は と定義されるため、 より、左連続になります(コインを投げた回数が離散値を取ることに注意します)。
一方、累積分布関数を と定義した場合は、同様の議論から左連続ではなく右連続になります。
以上のことから、 は右連続ではなく左連続になる点で とは異なります。
【統計学入門(東京大学出版会)】第4章 練習問題 解答
東京大学出版会から出版されている統計学入門(基礎統計学Ⅰ)について第4章の練習問題の解答を書いていきます。
本章以外の解答
本章以外の練習問題の解答は別の記事で公開しています。
必要に応じて参照してください。
4.1
(i)
6以外の目が出る確率は5/6であるため、さいころを4回投げたときに6の目が1回も出ない確率は、
となります。したがって、6の目が少なくとも1回出るほうに賭けたほうがよいことになります。
(ii)
さいころを2個同時に投げて(6, 6)の以外の目が出る確率は1/36であるため、24回投げたときに(6, 6)の目が1回も出ない確率は、
となります。したがって、(6, 6)の目が1回も出ないほうに賭けたほうがよいことになります。
4.2
さいころを2個同時に投げて目の和が12となる組合せは、(6, 6)の目しかありません。(6, 6)以外の目が出る確率は35/36です。
さいころを投げた回数を としたときに(6, 6)の目が出る確率が0.9を超えることは、次の式によって表すことができます。
この式を満たす を求めると となるため、答えは82となります。 なお、この不等式を求めるときに対数を取って計算すると楽ですが、符号の扱いに気を付けましょう。
4.3
30人から15人のグループを2つ作ることになるから、30人から15人を選ぶ組合せ数は次の式によって求められます。
15と30の階乗は、スターリングの公式によって求めます。
30の階乗は として、次のように値を求めることができます。
同様に15の階乗は として、次のように値を求めます。
これらを計算すると、最終的に求めたい組合せ数 156415325.9563033 ≒ 156,415,326 が得られます。
ちなみに、Pythonプログラムを使うと簡単に階乗を求めることができます。
from math import factorial combination = factorial(30) / factorial(15)**2 print(combination)
このプログラムを実行すると155,117,520が得られ、スターリングの公式を用いて求めた結果と実際の値とが近い値になっていることがわかります。
4.4
r人すべてが異なる誕生日である確率は、次の式で表されます。
r人のうち少なくとも2人が同じ誕生日である場合は、r人すべてが異なる誕生日である場合の補集合であるため、次の式で表されます。
rが5, 10, 15, 20~25, 30, 35, 40, 50, 60のときの確率を求めるPythonプログラムを次に示します。
for rmax in [5, 10, 15, 20, 21, 22, 23, 24, 25, 30, 35, 40, 50, 60]: ans = 1 for r in range(1, rmax+1): ans *= (1 - (r-1)/365) ans = 1 - ans print(f"r={rmax}, ans={ans}")
上記のプログラムを実行すると、次に示す結果が得られます。
r=5, ans=0.02713557369979347 r=10, ans=0.11694817771107768 r=15, ans=0.25290131976368646 r=20, ans=0.41143838358058016 r=21, ans=0.4436883351652059 r=22, ans=0.4756953076625502 r=23, ans=0.5072972343239854 r=24, ans=0.5383442579145288 r=25, ans=0.5686997039694639 r=30, ans=0.7063162427192687 r=35, ans=0.8143832388747152 r=40, ans=0.891231809817949 r=50, ans=0.9703735795779884 r=60, ans=0.994122660865348
4.5
ある人を起点にして考えると、他の人が隣に来る確率は2/3であるのに対して、向かい合いになる確率は1/3です。
問題の「向かい合って座るのが15組に対して、隣同士になるのが30組」になることは、この確率に沿っているだけと考えられます。
したがって、心理学者の推論は妥当ではないといえます。
4.6
さいころの目の和が9になる場合と10になる場合のパターンについて、それぞれ発生しうるさいころの組合せ数を次に示します。
さいころの和が9
パターン | 組合せ数 |
---|---|
(1, 2, 6) | 6 |
(1, 3, 5) | 6 |
(1, 4, 4) | 3 |
(2, 2, 5) | 3 |
(2, 3, 4) | 6 |
(3, 3, 3) | 1 |
したがって、さいころの和が9になる組合せ数の合計は25となります。
さいころの和が10
パターン | 組合せ数 |
---|---|
(1, 3, 6) | 6 |
(1, 4, 5) | 6 |
(2, 2, 6) | 3 |
(2, 3, 5) | 6 |
(2, 4, 4) | 3 |
(3, 3, 4) | 3 |
したがって、さいころの和が10になる組合せ数の合計は27となります。
以上のことから、組合せ数が多いさいころの和が10のなる場合のほうが起こりやすいといえます。
4.7
(i)
ベイズの定理と全確率の法則から、
、 であるから、
となります。したがって、 となります。
(ii)
として、
を満たす の範囲を求めると、 となります。
【統計学入門(東京大学出版会)】第3章 練習問題 解答
前回に引き続き、東京大学出版会から出版されている統計学入門(基礎統計学Ⅰ)について第3章の練習問題の解答を書いていきます。
本章以外の解答
本章以外の練習問題の解答は別の記事で公開しています。
必要に応じて参照してください。
3.1
自民得票率(tokuhyo)をX軸に、持ち家比率(motiie)をY軸にした散布図を描くPythonプログラムを次に示します。
matplotlibの図の背景はデフォルトで透明であるため、fig.patch.set_alpha(1)
で不透明にしている点に注意してください。
import numpy as np import matplotlib.pyplot as plt tokuhyo = np.array([ 41.4, 76.3, 59.2, 51.8, 52.5, 53.2, 62.4, 55.0, 57.7, 63.2, 37.5, 48.5, 32.4, 20.5, 47.9, 68.9, 68.5, 52.5, 63.3, 58.8, 59.7, 48.4, 40.7, 51.0, 50.9, 34.3, 25.8, 32.1, 34.4, 55.1, 60.3, 57.0, 45.6, 54.2, 55.1, 55.7, 70.3, 61.8, 47.6, 42.5, 71.3, 55.2, 65.2, 42.9, 54.7, 62.0, 48.2 ]) motiie = np.array([ 52.8, 71.2, 72.6, 63.7, 81.3, 81.8, 70.9, 74.0, 73.2, 72.9, 66.7, 65.7, 43.7, 55.5, 79.6, 85.7, 75.3, 80.5, 73.0, 77.0, 77.5, 69.2, 60.0, 78.2, 79.5, 61.8, 49.6, 59.6, 72.1, 71.0, 76.3, 72.8, 71.8, 60.7, 67.0, 71.8, 71.2, 68.3, 68.5, 54.8, 76.0, 65.8, 69.4, 66.9, 69.7, 71.2, 59.6 ]) fig = plt.figure(figsize=(6, 6)) fig.patch.set_alpha(1) plt.subplot(1, 1, 1) plt.scatter(tokuhyo, motiie) plt.xlabel("tokuhyo") plt.ylabel("motiie") plt.title("3.1")
上記のプログラムを実行すると、次の散布図が描画されます。
変数 の間の相関係数 は、次の式によって求められます。
変数 を自民得票率、変数 を持ち家比率として相関係数 を求めるPythonプログラムを次に示します。
import numpy as np tokuhyo = np.array([ 41.4, 76.3, 59.2, 51.8, 52.5, 53.2, 62.4, 55.0, 57.7, 63.2, 37.5, 48.5, 32.4, 20.5, 47.9, 68.9, 68.5, 52.5, 63.3, 58.8, 59.7, 48.4, 40.7, 51.0, 50.9, 34.3, 25.8, 32.1, 34.4, 55.1, 60.3, 57.0, 45.6, 54.2, 55.1, 55.7, 70.3, 61.8, 47.6, 42.5, 71.3, 55.2, 65.2, 42.9, 54.7, 62.0, 48.2 ]) motiie = np.array([ 52.8, 71.2, 72.6, 63.7, 81.3, 81.8, 70.9, 74.0, 73.2, 72.9, 66.7, 65.7, 43.7, 55.5, 79.6, 85.7, 75.3, 80.5, 73.0, 77.0, 77.5, 69.2, 60.0, 78.2, 79.5, 61.8, 49.6, 59.6, 72.1, 71.0, 76.3, 72.8, 71.8, 60.7, 67.0, 71.8, 71.2, 68.3, 68.5, 54.8, 76.0, 65.8, 69.4, 66.9, 69.7, 71.2, 59.6 ]) n = tokuhyo.size tokuhyo_ave = np.mean(tokuhyo) motiie_ave = np.mean(motiie) rxy = np.sum((tokuhyo - tokuhyo_ave) * (motiie - motiie_ave)) / (np.sqrt(np.sum((tokuhyo - tokuhyo_ave)**2)) * np.sqrt(np.sum((motiie - motiie_ave)**2))) print(f"Correlation Coefficient: {rxy}")
上記プログラムの実行結果を次に示します。
Correlation Coefficient: 0.6387815655787518
3.3
スピアマンの順位相関係数 は、次式で求められます。
一方、ケンドールの順位相関係数 は、次式で求められます。
は、 かつ または、 かつ を満たす個数。
は、 かつ または、 かつ を満たす個数。
これらの式に従って と を求めるPythonプログラムを次に示します。
import numpy as np import itertools def spearman(d1, d2): n = d1.size return 1 - 6 * np.sum((d1 - d2)**2) / (n**3 - n) def kendall(d1, d2): G = H = 0 n = d1.size for i in range(n): Ri = d1[i] Rid = d2[i] for j in range(i+1, n): Rj = d1[j] Rjd = d2[j] if (Ri > Rj and Rid > Rjd) or (Ri < Rj and Rid < Rjd): G += 1 elif (Ri > Rj and Rid < Rjd) or (Ri < Rj and Rid > Rjd): H += 1 return (G - H) / (n*(n-1) / 2) data = { "1": np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]), "2": np.array([1, 5, 2, 3, 6, 7, 15, 8, 4, 11, 10, 14, 18, 13, 22, 24, 16, 19, 30, 9, 25, 17, 26, 23, 12, 20, 28, 21, 27, 29]), "3": np.array([8, 3, 1, 4, 2, 5, 11, 7, 15, 9, 6, 13, 10, 22, 12, 14, 18, 19, 17, 22, 16, 24, 21, 20, 28, 30, 25, 26, 27, 29]), "4": np.array([20, 1, 4, 2, 6, 3, 12, 17, 8, 5, 18, 13, 23, 26, 29, 15, 16, 9, 10, 11, 30, 7, 27, 19, 14, 21, 28, 24, 22, 25]), } for d in itertools.combinations(data.keys(), 2): entry1 = d[0] entry2 = d[1] rs = spearman(data[entry1], data[entry2]) rk = kendall(data[entry1], data[entry2]) print(f"rs ({entry1} - {entry2}): {rs}") print(f"rk ({entry1} - {entry2}): {rk}") print("")
上記プログラムの実行結果を次に示します。
rs (1 - 2): 0.821579532814238 rk (1 - 2): 0.664367816091954 rs (1 - 3): 0.9272525027808676 rk (1 - 3): 0.767816091954023 rs (1 - 4): 0.5933259176863181 rk (1 - 4): 0.43908045977011495 rs (2 - 3): 0.671857619577308 rk (2 - 3): 0.5011494252873563 rs (2 - 4): 0.6373748609566184 rk (2 - 4): 0.46206896551724136 rs (3 - 4): 0.5343715239154616 rk (3 - 4): 0.3586206896551724
3.4
それぞれPythonのプログラムで解答を書きます。
(i)
乱数を発生させるPythonプログラムを示します。
1から11の乱数を発生させるために、random.randint
を利用しました。
import random random.seed(1) d = int(random.randint(1, 11))
(ii)
変数 の間の相関係数 は、次の式によって求められます。
import random import numpy as np random.seed(1) x = np.array([71, 68, 66, 67, 70, 71, 70, 73, 72, 65, 66]) y = np.array([69, 64, 65, 63, 65, 62, 65, 64, 66, 59, 62]) x_mean = np.mean(x) y_mean = np.mean(y) x_sampled = np.zeros_like(x) y_sampled = np.zeros_like(y) for i in range(11): d = int(random.randint(1, 11)) - 1 x_sampled[i] = x[d] y_sampled[i] = y[d] rxy = np.sum((x_sampled - x_mean) * (y_sampled - y_mean)) / \ (np.sqrt(np.sum((x_sampled - x_mean)**2)) * np.sqrt(np.sum((y_sampled - y_mean)**2))) print(rxy)
上記プログラムの実行結果を次に示します。
0.49543369430686224
(iii)
(ii)を200回行い、 の値をビン数10でヒストグラムにするPythonプログラムを次に示します。
import random import numpy as np import matplotlib.pyplot as plt random.seed(1) x = np.array([71, 68, 66, 67, 70, 71, 70, 73, 72, 65, 66]) y = np.array([69, 64, 65, 63, 65, 62, 65, 64, 66, 59, 62]) x_mean = np.mean(x) y_mean = np.mean(y) rxy_list = [] for _ in range(200): x_sampled = np.zeros_like(x) y_sampled = np.zeros_like(y) for i in range(11): d = int(random.randint(1, 11)) - 1 x_sampled[i] = x[d] y_sampled[i] = y[d] rxy = np.sum((x_sampled - x_mean) * (y_sampled - y_mean)) / \ (np.sqrt(np.sum((x_sampled - x_mean)**2)) * np.sqrt(np.sum((y_sampled - y_mean)**2))) rxy_list.append(rxy) fig = plt.figure(figsize=(6, 6)) fig.patch.set_alpha(1) plt.subplot(1, 1, 1) plt.hist(rxy_list, bins=10) plt.xlabel("rxy") plt.ylabel("count") plt.title("3.4 (iii)")
上記のプログラムを実行すると、次のような図が表示されます。
【統計学入門(東京大学出版会)】第2章 練習問題 解答
機械学習や深層学習を勉強する中で、その基礎となる統計学を抑えていないのはよくないと思い、東京大学出版会から出版されている統計学入門(基礎統計学Ⅰ)を読んでいます。 執筆時点では第10章の練習問題を解いている途中ですが、本書は間違いなく良書だと思います。 体系的に統計情報を学べるのはもちろんのこと、各章の最後にある練習問題はその章の内容を理解していないと解けない問題が多いため、手を動かすことでより深く理解できます。 問題の中には、解いた結果の意味について考察するものもあり、本書の中で紹介された内容がどのように現実問題で役立つかを理解できます。 自分は本書のおかげで、χの二乗分布が何に役立つのか理解できました。
しかしこの本、本の名前に「入門」と書いてはいますが、難易度は高めであることに注意が必要です。 自分は大学が物理学科専攻で数式と格闘する毎日であったおかげか、数式で詰まることはほとんどありませんでしたが、大学教養レベルの数学の知識がないと読むのは厳しいと思います。
章末の練習問題の解答は、問題によっては答えのみしか書かれていないため不親切だと思いました。 せっかく良問が揃っている中で解説がないのは、初学者にとって厳しいです。 そこで、あとで問題を解き直したときに困らないように、練習問題の解答の詳解を記事としてまとめることにしました。 第1章の練習問題など、自由研究のような問題を除いて解答に至るまでの途中の計算式などを書いていこうと思います。 また、電卓を用いて値を求めるような問題に関しては、Pythonでプログラムを書いて求めています。
本章以外の解答
本章以外の練習問題の解答は別の記事で公開しています。
必要に応じて参照してください。
2.2
データA, B, Cを、平均差とジニ係数の式にそれぞれ代入すれば求まります。
平均差
平均差を求める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
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年前と本年における学生の出身地の分布データを、エントロピー の式に代入して値を確認します。
( は、確率変数が となる確率です)
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を、標準得点と偏差値得点の式に代入します。
標準得点
は平均、 は標準偏差、 は標準得点になります。
偏差値得点
は標準得点、 は偏差値得点になります。
これらの式を使って、データ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]
Qiitaからはてなブログへ移行しました
これまで技術関連の記事をQiitaに投稿していましたが、今後ははてなブログを使っていきたいと思います。 Qiitaに投稿した記事と同様、機械学習関連の技術記事を投稿していく予定です。
記念すべき最初の記事では、Qiitaの移行先としてはてなブログを選んだ理由について書きます。
Qiitaへの記事投稿をやめた理由
QiitaはSEOに対して強く、エンジニアで利用されている方も多いため、投稿した記事を多くのエンジニアから見てもらえる可能性が高いというメリットがありました。 実際に私がQiitaに記事を投稿していたときも多くの方からLGTMをもらうことができ、そのたびに執筆のモチベーションが上がりました。
一方で最近では技術記事とは呼べない記事や、読まれることを前提としていないメモ書き程度の記事もよく見かけるようになりました(もちろん、素晴らしい技術記事を書かれている方は多数いますのであくまで一例です)。 このような背景もあってQiitaに純粋な技術記事を投稿する意欲がなくなり、Qiitaへの記事投稿をやめて別のブログサービスへの移行を決めました。
ブログサービスの比較
noteやMediumなど個人でブログを開設する方法は多岐にわたるため、Qiitaの移行先としてどのブログサービスを選ぶか非常に悩みました。 ここでは、著名なブログサービスの特徴を調べて理解した内容と、はてなブログを選ぶことになった理由を書きたいと思います。
note
手軽に記事を書けるところが良いと評判なブログサービスです。 ユーザのつながりが強く、記事を見てもらいやすいところが利点であると、他の方が書かれたブログサービスの比較記事に書かれていました。 noteを本格的に利用していないため確かなことは言えませんが、noteを選ぶ1つのきっかけになるかもしれません。
また、noteでは有料記事や投げ銭システムなど、記事の収益化に便利な機能が提供されています。 複数の記事をまとめることができるマガジン機能も有料化に対応しており、連載記事をまとめて販売するのもおもしろそうです。 noteの記事収益化に興味がある一方で、自分のような無名ユーザがいきなり有料記事を書いて収益を上げるのは難しそうだと感じました。
一方で技術系ブログを執筆するには、エディタが貧弱で厳しいものがありました。 辛うじてソースコードのシンタックスハイライト機能があるものの、見出しレベルが1つしか設定できなかったり、リストが使えなかったり・・・といろいろなところで制約があります。 機械学習関係の記事を書くとなると数式も多用することになるため、数式を画像化してアップロードして・・・という作業が繰り返されることになると思うと地獄を見られそうです。
Medium
海外のユーザが多いブログサービスです。 海外ユーザが多いことから、英語で記事を執筆することでより多くの人に記事を見てもらえるというコメントも見られました。
海外の企業が公式のブログとしてMediumを利用していることも多く、品質の高い記事を読むことができる点も特徴でしょう。 著名な機械学習ライブラリPyTorchもMediumを使っていますし、独自のブログに移行する前はTensorFlowもMediumを利用していました。
Mediumは、clap(QiitaのLGTMに相当)の数に対して収益が得られる仕組みが面白いと思いました。 QiitaでLGTMをもらえるだけでも記事を執筆するモチベーションが上がりましたが、それに加えて収益も得られるとなるとさらにモチベーションが上がりそうです。
WordPress
WordPressは、ブログの枠組みを超えてさまざまなコンテンツを管理できるソフトウェアです。
カスタマイズの自由度が高いことがWordPressのメリットです。 一方で、WordPressを動作させるためのレンタルサーバやWordPress自体のメンテナンスに時間を割かれることがデメリットになります。 WordPressをメンテナンスするコストのほうが、記事を書くコストよりも大きくなる可能性があるため、ある程度本格的にWebコンテンツを作ることを想定していない人にとっては導入の敷居が高いように思えます。
はてなブログ
はてなブログは、はてなダイアリーが前身ということもあり、技術系のブログとして採用されることが多い印象です。
技術系のブログを採用するにあたってエディタは大切な要素ですが、技術系のブログが多いはてなブログではあまりその心配はなさそうです。 また、(個人的な印象で)はてなブログは収益化が難しいと感じていましたが、最近広告による収入も可能であることを知り、ブログのアクセス数が増えれば収益化も不可能ではないと感じました。
まとめ
代表的なブログサービスについて、その特徴をまとめると次のようになります。
ブログサービス | 特徴 |
---|---|
note | ・記事投稿までの流れがシンプル ・記事収益化の手続きが簡単 ・ユーザ間のつながりが強い(?) ・エディタが貧弱 |
Medium | ・海外ユーザが多い ・企業の公式ブログとして利用されている ・clapによる収益化が可能 ・日本では知名度が低い |
WordPress | ・カスタマイズの幅が広い ・メンテナンスコストが高い |
はてなブログ | ・技術系のブログ多い ・広告による収益化が可能 |
自分は次の理由から「はてなブログ」を選びました。
- 技術系の記事を中心に投稿する予定である(技術系ブログとしての実績やエディタが重要)
- ブログ開設時点では個人としての知名度が低く、有料記事として利益を上げられる見込みがない
- 日本国内を対象としている
- 現時点でブログの収益化は考えていないが、知名度が高くなったときのことも踏まえて収益化できる仕組みが欲しい
なお、Qiitaに投稿した記事はそのまま残しますが、今後ははてなブログに技術記事を投稿していこうと思います。 もし投稿した記事が役立った方は、スターやブクマしてもらえると執筆のモチベーションが上がります!