見出し画像

Pythonでヒストグラム(2)

(1)ヒストグラムをきれいに描く

 前回の続きです。

(2)使うデータ

 これまでと同じく、irisデータを使います。

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

 今回のコードは下記のとおりです。前半は前回と同じです。追加した部分を紹介します。
 その前に、私は毎回print(df)df.describeでデータの確認をしています。これは癖をつけることをおすすめします。どのデータを使っているのか?古いデータを指定していないか?といったミスを減らすことにつながります。
では、今回のコードの説明を始めます。

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

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

#binsなどの計算に必要な変数を指定します。
start = 4
end = 8
interval = 0.5
bins_count = ((end - start)*2 + 1)

#binsを指定します。
bins = np.linspace(start, end, bins_count)

#グリッド線をつけます。
plt.grid(True, linestyle='dotted', linewidth=1)

#グラフのタイトルをつけます。
plt.title('Histgram')

#x軸、y軸の名前を決めます。
plt.xlabel('sepal.length')
plt.ylabel('count')

#横軸の範囲を指定します。
plt.xticks(np.arange(start, end+interval, interval))
plt.xlim(start, end)

#縦軸の範囲を指定します。
plt.yticks(np.arange(0, 41, 5))
plt.ylim(0, 40)

#グラフを出力します。
plt.hist(df['sepal.length'], bins=bins, rwidth=0.9, align='mid')
plt.show()

 出来上がりのグラフはこちらです。

画像1

 15~21行目

#グリッド線をつけます。
plt.grid(True, linestyle='dotted', linewidth=1)

#グラフのタイトルをつけます。
plt.title('Histgram')

#x軸、y軸の名前を決めます。
plt.xlabel('sepal.length')
plt.ylabel('count')

 コメントで記載しているとおりですが、それぞれ、グリッド線、タイトル、軸名を描く処理です。タイトルや軸名は日本語でもOKです。

#グラフのタイトルをつけます。
plt.title('ヒストグラム')

#x軸、y軸の名前を決めます。
plt.xlabel('がく片の長さ')
plt.ylabel('頻度')

画像2

 他の部分はほとんど変わりません。次に、ヒストグラムに累積相対度数を追加する方法をアーカイブします。

(4)累積相対度数を打ち込む

 コードはこちらです。

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

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

#binsなどの計算に必要な変数を指定します。
start = 4
end = 8
interval = 0.5
bins_count = ((end - start)*2 + 1)

#binsを指定します。
bins = np.linspace(start, end, bins_count)

#グリッド線をつけます。
plt.grid(True, linestyle='dotted', linewidth=1)

#グラフのタイトルをつけます。
plt.title('ヒストグラム')

#x軸、y軸の名前を決めます。
plt.xlabel('がく片の長さ')
plt.ylabel('頻度')

#横軸の範囲を指定します。
plt.xticks(np.arange(start, end+interval, interval))
plt.xlim(start, end)

#縦軸の範囲を指定します。
plt.yticks(np.arange(0, 41, 5))
plt.ylim(0, 40)

#ここからが若干違う部分です。-------------------------------------------------------

#グラフを出力します。
n, bins, patches = plt.hist(df['sepal.length'], bins=bins, rwidth=0.9,align='mid')

# 第2軸用値の算出
y2 = np.add.accumulate(n) / n.sum()
x2 = np.convolve(bins, np.ones(2) / 2, mode="same")[1:]

# 第2軸のプロット
ax2 = plt.twinx()

#折れ線グラフとしてプロットします。
plt.plot(x2, y2, ls='--', color='k', marker='o')

#上述のとおりです。
plt.yticks(np.arange(0, 1.1, 0.2))
plt.ylim(0, 1)#軸の表示範囲

ax2.set(ylabel='累積相対度数')

plt.show()

 また図は下記のとおりです。

画像3

修正30行目

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

 plt.hist()では、x軸、y軸の値をそれぞれを抽出することができます。この数字を使って、累積相対度数を計算し、折れ線グラフで打ち込むことができます。

修正31~33行目

# 第2軸用値の算出
y2 = np.add.accumulate(n) / n.sum()
x2 = np.convolve(bins, np.ones(2) / 2, mode="same")[1:]

 ここを説明し始めると、若干長くなるので、NumPyの解説をご覧ください。やっていることは、割合を計算しリストの作成になります(若干正しくはないですが…)。

修正34~37行目

# 第2軸のプロット
ax2 = plt.twinx()

#折れ線グラフとしてプロットします。
plt.plot(x2, y2, ls='--', color='k', marker='o')

 plt.twinx()で、ここ以降は第2軸の処理であることを指定します。
plt.plot()は新しいコードです。これまではヒストグラムしか説明してきませんでしたが、matplotlibでは、あらゆるグラフを描くことができます。今回使用するplt.plot()では、折れ線グラフを打ち込めます。le='--'は、折れ線グラフを点線で描くことを、marker='o'は、各ポイントを●で描く指定です。

■修正41行目

ax2.set(ylabel='累積相対度数')

 第2軸のラベル名を指定します。ちなみに、axという変数を用いていますが、matplotlibを本気で使い始めると、axという変数をよく使うことになります。ここは別の機会に説明したいと思います。

(5)まとめ

 長くなったので、今回はここまでです。次回でヒストグラムは最後にしようかな。
 今回、最後に作成した図はパレート図と呼ばれます。データの特徴を把握するうえで、大変わかりやすいグラフです。
 まだ、統計解析の第1歩が続いていますが、結局、この辺りの基本が重要だと思います。高度な統計解析をするまえに、まずは基本データを整理し、特徴を明らかにしたうえで、次のステップに行くべきだと思います。p値や相関係数を出さないと何も語れない、と勘違いする人が結構いますが、基本データの整理でも語れることはたくさんあります。地味ですが、気長に分析をしていきたいと思います。

(6)参考

■matplotlib
https://matplotlib.org/

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