Pythonで学ぶ初歩からの統計学(ヒストグラムを作るまで)
Pythonを使って統計学のおさらいをします。手始めに度数分布表とヒストグラムを作ります。 度数分布表の作り方は以下の通り。
- データの範囲(最大値と最小値の差)を求める
- 階級(Class)の数を定める
- 階級の幅(Class Interval)を決める
- 度数(Frequency)を集計する
まずデータの範囲を求めますが、なにはともあれ対象となる数値列を作成しましょう。Pythonのリストにデータを叩き込みます。
list = [67,58,75,89,46,62,56,79,60,30,76, 64,52,66,42,81,63,59,65,77,38,86,64,70,50, 93,78,76,57,68,98,64,55,66,53,82,62,73,60, 51,49,67,56,75,85,61,58,44,79,65]
最大値と最小値はmax,minで呼び出せます。入力と出力がわかりやすいので、Ipythonコンソールを使った例を記載しています。
In [1]: max(list) Out[1]: 98 In [2]: min(list) Out[2]: 30
とても分かりやすい。最大値、最小値の差からデータの範囲を求めます。
In [3]:value_width = max(list) - min(list) In [4]:print(value_width) Out[4]:68
階級の数を決めますが、これはスタージェスの公式(Sturges' formula)を参考にして求めます。 スタージェスの公式は対数計算が必要なので、mathモジュールからlogを呼び出してインポートします。
In [5]:from math import log In [6]:class_size = 1 + log(len(list), 2) In [7]:print(class_size) Out[7]:6.643856189774724
階級の数はきりが良い数字にするので、小数点以下を切り上げて7ですね。データの範囲を階級の数で割ることで、階級の幅を求めます。 小数点切り上げはmathモジュールのceilを使います。
In [8]:from math import ceil In [9]:print(ceil(class_size) Out[9]:7 In [10]:class_width = value_width / ceil(class_size) In [11]:print(class_width) Out[11]:9.714285714285714
これも切り上げてきりの良い数字(10)にします。ヒストグラムを作ろうと思ったら度数分布表を作らないといけませんが、この辺はPythonがよしなにやってくれます。 numpyモジュールとmatplotlibのpyplotを使います。
In [12]:import numpy as np In [13]:import matplotlib.pyplot as plt In [14]:plt.hist(list)
WinPythonを使っていれば以下の様なグラフが出力されます。
なんかズレている。。集計の単位も変ですね。これは階級の幅をplt.histがよしなに決めてくれているからですね。補正をします。
In [15]:plt.hist(list, bins=np.arange(20, 120, 10))
グラフの体裁を整えるために、最小値20,最大値120の10刻みでヒストグラムを生成します。
できました!