見出し画像

Pythonでヒストグラム(1)

(1)データのグラフ化

 前回は基本統計量を算出しました。ここで紹介しているものの他にも、重要な統計量はあります。ただ、統計量を算出するだけではつまらないので、データのグラフ化についてアーカイブします。
 今回は、ヒストグラムを作成します。実は基本統計量を確認する方法として、ヒストグラムは大変重要なものになります。

(2)使うデータ

 前回と同じく、irisデータを使います。

(3)実際に計算してみる

 前回と同じく、irisデータを使います。今回のコードは下記のとおりです。これまでに説明した部分は割愛します。

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv('iris.csv')
ax = df.describe()
print(ax)

plt.hist(df['sepal.length'])
plt.show()

■2行目 ​

import matplotlib.pyplot as plt

 初めて出てきましたが、グラフを作成する最強のライブラリです。4~5行目は第1回目の記事と同じコードです。グラフを作るにしても、まずはどのようなデータなのかを確認するための処理です。もちろん、4~5行目がなくてもグラフは書けます。

■6~7行目

plt.hist(df['sepal.length'])
plt.show()

 この1行でヒストグラムが作れます。df['sepal.length']は、sepal.lengthという列だけをグラフ化する、という宣言です。df['列名']で指定できます。plt.show()は、作成した図を閉じる、という処理になります。実際に動かしてみると下記図になります。

画像1
…なんか横軸が気持ち悪いですね。横軸の調整をしましょう。

(4)グラフの微修正

 修正版のコードはこちらです。

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv('iris.csv')
ax = df.describe()
print(ax)

plt.hist(df['sepal.length'])
plt.show()

#ここまでは同じ---------------------------------------------------------------

import numpy as np

start = 4
end = 10
interval = 1
bins_count = end - start + 1

bins = np.linspace(start, end, bins_count)

plt.xticks(np.arange(start, end+interval, interval))
plt.xlim(start, end)

plt.hist(df['sepal.length'], bins=bins, rwidth=0.9,align='mid')
plt.show()

 また、修正版のコードを動かしてみると、下記図になります。1.0間隔になりました。だいぶ見やすくなりましたし、データの解釈もしやすくなりましたね。

画像2

■修正版9行目

 ​import numpy as np

 NumPyという数値計算を行なうライブラリです。これもよく使うライブラリです。

■修正版10~13行目

start = 4
end = 10
interval = 1.0
bins_count = (end - start) + 1

 各変数の指定です。

start:x軸の始まりの値です。
end:x軸の終わりの値です。
interval:x軸の間隔です。
bins_count:これは、start~endまでに何個の数字があるのかを確認します。この後の処理に使います。


■修正版14行目

bins = np.linspace(start, end, bins_count)

binsの間隔を指定します。
このnp.limspaceは、要素数を指定する処理です。
今回の例では、4,5,6,7,8,9(start以上、end未満)となります。

■修正版15~16行目

plt.xticks(np.arange(start, end+interval, interval))#頻度の間隔をそろえるための処理
plt.xlim(start, end)#軸の表示範囲

 xticksは、横軸の目盛線を表示する値を指定します。xlimは横軸の最小値・最大値を指定する処理です。今回の例では、intervalを0.5に変更すると下記図になります。なお縦軸の範囲の指定はylim、縦軸の目盛り線を表示する指定はyticksです。

画像4

 今回は、np.arangeで目盛り線の範囲を指定しましたが、もちろん下記のようなコードでも可能です。

plt.xticks(4,5,6,7,8,9,10)

■修正版17行目

plt.hist(df['sepal.length'], bins=bins, rwidth=0.9,align='mid')

 binsという変数を指定することで個数をカウントする範囲を指定します。rwidthを指定することで、棒と棒の間に隙間を作ります。alignは、棒をプロットする位置を指定します。binsは直感的にわかりにくいので、ちょっとだけ詳しく説明します。

(5)binsの考え方

 今回、個数をカウントしている範囲は1.0間隔で、下記の6個の範囲内にあるデータの個数を計算します。

・4以上5未満
・5以上6未満
・6以上7未満
・7以上8未満
・8以上9未満
・9以上10未満

 これを指定するのが、np.linspace(start, end, bins_count)になります。これをprintすると、[ 4. 5. 6. 7. 8. 9. 10.]というリストが得られます。つまり、4から10の範囲で、1.0間隔の等差数列を計算していることになります。もちろん直接リストを指定しても良いです。
 この考え方を理解すると、例えば0.5間隔でカウントすることも可能です。0.5間隔にしたグラフが下記になります。

画像3

 大変読みやすいグラフになりました。

(6)まとめ

 長くなったので、今回はここまでです。次回はこの続きで、さらにグラフをきれい(論文に使えるように)に描く方法をアーカイブします。

(7)参考

■matplotlib
https://matplotlib.org/

■numpy
https://numpy.org/doc/stable/contents.html