PyLearnST04: ヒストグラムによるデータ分析

ヒストグラムは、特定の1次元データの変数から、様々な情報を取り出す分析手法です。いくつか使用方法はありますが、一般的には異なる複数のグループで同じ変数のヒストグラムを構成し、比較する、という分析を行います。例えば、ダイエットに効果のある薬を飲んだグループと飲んでいないグループで、1ヶ月後の体重の変動量をヒストグラムで見てみる、勉強をしなかったグループとたくさんしたグループで試験得点によるヒストグラムを構成し比較する、などです。

まず、乱数データを生成します。ここは深く考えないでコピペして構いません。1次元データのDat01とDat02が生成されます。Dat01は勉強をしなかったグループの試験得点、Dat02は勉強を良くしたグループの試験得点、だとでも思ってください。

In [1]:
import numpy as np

# 毎回同じ乱数を生成するためのシード設定
np.random.seed(1)

# 平均0, 標準偏差0.1に従う正規乱数の生成
Dat01=[]
Dat02=[]
for i in range(0,100):
    Dat01.append(np.random.normal(30, 10))
    Dat02.append(np.random.normal(60, 15))

1次元データのヒストグラム

まずは、Dat01のデータをヒストグラムにして見ます。以下のようにかけばokです。

In [3]:
import matplotlib.pyplot as plt
plt.hist(x=Dat01, bins=5, rwidth=0.9, color='red', label='red dat')
plt.xlabel("x-label")
plt.ylabel("y-label")
plt.title("histogram")
plt.legend()
Out[3]:
<matplotlib.legend.Legend at 0x116616320>

hist関数は以下の引数を持ちます。

  • x: ヒストグラムを生成するデータ。通常は1次元ですが、[x1, x2]のように複数列分与えると、複数のヒストグラムを重ねてくれます。
  • bins: ビンの数(ビンとは棒のことです)。規定値は10です。
  • range: 最小値と最大値を指定します。規定値はデータの最小最大のため、ここは書かない場合が多いです。
  • normed: (そのうち消えるらしいです)Trueにすると、総和が1になります(すなわち、確率密度関数)。規定値はFalseです。
  • cumulative: Trueにすると、累積ヒストグラムになります。規定値はFalse
  • bottom: 各棒の下側の余白(ビンが上に浮きます)
  • orientation: 横向き:horizontal, 縦向き:vertical(規定値)
  • rwidth: ビンの幅
  • log: 横軸を対数スケールにしたい場合はTrueします。
  • color: ビンの色です。
  • label: 凡例
  • stacked: 複数のデータを与え、それを積み上げ型のヒストグラムにしたいとき、True に設定します。

多次元データのヒストグラム

次に、複数のデータのヒストグラムを描いて見ます。与えるデータ列、色、ラベルなどをそれぞれリストにより渡せばokです。分析の練習のために、具体的な課題にして見ます。

In [4]:
import matplotlib.pyplot as plt
plt.hist(x=[Dat01, Dat02], bins=20, rwidth=0.9,
         color=['red', 'blue'], label=['Not studying group', 'Hard studying group'])
plt.xlabel("Academic Score")
plt.ylabel("Number of Students")
plt.title("histogram")
plt.legend()
Out[4]:
<matplotlib.legend.Legend at 0x116768898>

Dat01は勉強をしなかったグループ、Dat02が勉強をよくしたグループになります。横軸が試験得点、縦軸が学生の人数です。ヒストグラムを見てみると、勉強をしていないと、30点付近である学生が多く、最大でも50点程度しか取れないことがわかります。また、30点台に集中していることも読み取れます。一方、勉強をよくしたグループは、60から70点のとる学生が最も多く、点数の分布も広いことがわかります。このように、複数のグループの特定の変数をヒストグラム化し、比較することで、いろいろな情報を読み取ることができます。

ヒストグラムの詳細なデータを知りたいとき

hist関数の返り値を変数として受け取ると、ヒストグラムを構成した際の詳細なデータを知ることができます。以下のコードは、HistDatが返り値を受け取っています。

In [5]:
import matplotlib.pyplot as plt
HistDat = plt.hist(x=[Dat01, Dat02], bins=20, rwidth=0.9,
                   color=['red', 'blue'], label=['red dat', 'blue dat'])
plt.xlabel("x-label")
plt.ylabel("y-label")
plt.title("histogram")
plt.legend()
Out[5]:
<matplotlib.legend.Legend at 0x116894a90>

実際にHistDatの中身をみてみます。以下の情報が入っています。

  • HistDat[0][0]: Dat01の各ビンのデータ数
  • HistDat[0][1]: Dat02の各ビンのデータ数
  • HistDat[1]: 各ビンの具体的な数値
In [6]:
print("Dat01の各ビンのデータ数: ", HistDat[0][0])
print("Dat02の各ビンのデータ数: ", HistDat[0][1])
print("各ビンの座標", HistDat[1])
Dat01の各ビンのデータ数:  [ 1.  9.  7. 11. 19. 22. 14.  8.  5.  3.  1.  0.  0.  0.  0.  0.  0.  0.
  0.  0.]
Dat02の各ビンのデータ数:  [ 0.  0.  1.  1.  3.  2.  1.  5.  7.  9.  9. 11. 11. 11. 11.  6.  7.  1.
  1.  3.]
各ビンの座標 [11.42018136 15.48940702 19.55863269 23.62785836 27.69708403 31.76630969
 35.83553536 39.90476103 43.9739867  48.04321236 52.11243803 56.1816637
 60.25088936 64.32011503 68.3893407  72.45856637 76.52779203 80.5970177
 84.66624337 88.73546904 92.8046947 ]

11.42点以上から92.80点以下までの範囲がヒストグラム化されています。各値は区切りの値ですので、11.42点から15.49点までに、Dat01は1つ、Dat02は0つのデータがあったことを意味しています。一つだけ結果を読み取ってみると、 19.55点から23.63点の範囲にいる学生数は、勉強しないグループは7人もいるのに、勉強したグループは1人しかいません。このように、ヒストグラムを数字としてみることで、具体的な結果がわかります。