読者です 読者をやめる 読者になる 読者になる

Pythonで学ぶ初歩からの統計学(ヒストグラムを作るまで)

Pythonを使って統計学のおさらいをします。手始めに度数分布表とヒストグラムを作ります。 度数分布表の作り方は以下の通り。

  1. データの範囲(最大値と最小値の差)を求める
  2. 階級(Class)の数を定める
  3. 階級の幅(Class Interval)を決める
  4. 度数(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を使っていれば以下の様なグラフが出力されます。

f:id:kazutaka83:20160808232022p:plain

なんかズレている。。集計の単位も変ですね。これは階級の幅をplt.histがよしなに決めてくれているからですね。補正をします。

In [15]:plt.hist(list, bins=np.arange(20, 120, 10))

グラフの体裁を整えるために、最小値20,最大値120の10刻みでヒストグラムを生成します。

f:id:kazutaka83:20160808232828p:plain

できました!