ヒストグラムの描画
本ウェブサイトのプログラムは、圧縮ファイルHistPrgs.zipにまとめられている。
実データによるプログラム例を用意した(2024.03)
表1の50個の値のヒストグラムを描いてみる。
表1 50個のスコア |
66, 59, 62, 64, 63,68, 65, 59,
68, 64, 65, 51, 67, 64, 83,59, 61, 62,
57, 72, 65, 64, 54, 60, 53,65, 67, 60,
53, 79, 74, 53, 61, 68, 75,50, 57, 55,
66, 56, 55, 61, 70, 71, 49,69, 70, 80,
73, 72 |
プログラムを以下のように作成してみた。
import
numpy as np
import
matplotlib.pyplot as plt
data
= [66, 59, 62, 64, 63, 68, 65, 59, 68, 64,
65,
51, 67, 64, 83, 59, 61, 62, 57, 72,
65,
64, 54, 60, 53, 65, 67, 60, 53, 79,
74,
53, 61, 68, 75, 50, 57, 55, 66, 56,
55,
61, 70, 71, 49, 69, 70, 80, 73, 72]
plt.hist(data,
bins = 10)
plt.show()
データをリストdataに設定して、関数plt.histを
plt.hist(data, bins = 10)
と呼び出して描画を行い、plt.show()を呼び出すと描画グラフが図1のように表示される。
図1
Bin(区間)の境界点や区間内の度数についての情報は、関数plt.histの戻り値として与えられる。この戻り値を表示するために、上のプログラムを次のように変更する。
import numpy as np
import matplotlib.pyplot as plt
data = [66, 59, 62, 64, 63, 68, 65,
59, 68, 64,
65,
51, 67, 64, 83, 59, 61, 62, 57, 72,
65,
64, 54, 60, 53, 65, 67, 60, 53, 79,
74, 53,
61, 68, 75, 50, 57, 55, 66, 56,
55,
61, 70, 71, 49, 69, 70, 80, 73, 72]
a = plt.hist(data, bins = 10)
print(a[0])
print(a[1])
plt.show()
戻り値aの第0成分a[0]に各区間内の度数が与えられ、第1成分a[1]に区間の境界値が与えられる。このプログラムを実行すると、ヒストグラムは図1と同じであるが、コンソール画面での出力は図2のようになっている。
図2
a[0]の出力である、[3. 6. ・・・ 83. ]は、10個の区間bin(bins = 10)における度数を表す。
次のa[1]の出力 [ 49. 52.4 55.8 ・・・ 83. ] は、10個の区間の境界点(境界点は11個ある)である。一番左の値が49.0であり、右端の値が83.である。区間全体の範囲が指定されていないので、左橋はデータの最小値、右端は最大値になっている。
これらの値を参考にして、区間全体の範囲を40から90までに設定し、bin数5(したがって、区間の幅は10である)に設定して描画してみる。プログラムは以下のようになる。
import numpy as np
import matplotlib.pyplot as plt
data = [66, 59, 62, 64, 63, 68, 65,
59, 68, 64,
65,
51, 67, 64, 83, 59, 61, 62, 57, 72,
65, 64, 54, 60,
53, 65, 67, 60, 53, 79,
74,
53, 61, 68, 75, 50, 57, 55, 66, 56,
55,
61, 70, 71, 49, 69, 70, 80, 73, 72]
plt.hist(data, bins = 5, range = (40,
90))
plt.show()
上のプログラムを実行すると図3のヒストグラムが表示される。
図3
関数 hist についての説明は、関数helpで得ることができる(図4)。
図4
パッケージmatplotlibの説明も関数helpで得ることができる(図5)。
図5
図E1は、https://ouenbu.com/sumo/yokoduna.htmlに掲載されていたデータ(2024.03.08)を基に、Excelファイルとして作成したものである。
・
・
・
図E1 https://ouenbu.com/sumo/yokoduna.html掲載のデータより作成
第4代横綱から第72代横綱の横綱昇進が決定されたときの年齢と最終場所の年齢をまとめたものである。
図E1のデータのヒストグラムを、リストE1のプログラムで描くと、図E2を得る。2つのヒストグラムを重ねて描いているので、グラフの透明度を50%(alpha = 0.5)としている。
リストE1 ヒストグラムの作成―1
import pandas as pd
import matplotlib.pyplot as plt
#
#
Excelファイルの読み込み
#
with
pd.ExcelFile('yokodzuna_age.xlsx') as f_xlsx:
data_xlsx =
pd.read_excel(f_xlsx)
name_s = data_xlsx.keys()[2] # 3番目のキー
print(name_s)
age_s = data_xlsx[name_s].values
print(age_s)
name_r = data_xlsx.keys()[3] # 4番目のキー
print(name_r)
age_r = data_xlsx[name_r].values
print(age_r)
r_s = plt.hist(age_s, alpha = 0.5)
r_r = plt.hist(age_r, alpha = 0.5)
plt.show()
print(r_s)
print(r_r)
リストE1のプログラムファイルなどは、圧縮ファイルhistyokodzunafiles.zipにまとめたので、ダウンロード展開すれば自由に利用できる。
図E2
ヒストグラムを描くコード
r_s = plt.hist(age_s, alpha = 0.5)
r_r = plt.hist(age_r, alpha = 0.5)
の関数の戻り値r_sとr_rには、ヒストグラムの階級内の度数の情報が以下のように含まれている。
以下のprint関数
print(r_s)
print(r_r)
により出力すると、以下の内容を得る。
(array([10., 10., 10., 13., 6.,
6., 3., 4.,
6., 1.]), array([21. , 23.1,
25.2, 27.3, 29.4, 31.5, 33.6, 35.7, 37.8, 39.9, 42. ]), <BarContainer object
of 10 artists>)
(array([ 1., 1., 7., 9., 16., 10., 6., 8., 5., 6.]), array([24., 26., 28., 30., 32., 34., 36., 38., 40., 42., 44.]), <BarContainer object of 10 artists>)
最初の配列が、階級内の度数であり、2番目の配列が階級(bin)の情報である。2番目の配列における階級の左端は21と24であり、小さい方の値は21である。階級の右端は42と44であるので、大きい方の値は44である。これより、階級(bin)の左端を20、右端を45とし、階級幅を2.5とするbinを次のように作成する。
vbins =
np.arange(20, 46, 2.5)
関数np.arangeは、1番目の引数の値から2番目の値より小さい範囲で3番目の値の幅で階級が作成される。したがって、3番目の値は、右端の値45より大きく、かつ大きさは3番目の階級幅2.5を越えないように例えば46とする。
描画プログラムは、リストE2のように作成した。
リストE2 ヒストグラムの作成―2
import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib
# 描画グラフにおける日本語表示用
import numpy as np
with
pd.ExcelFile('yokodzuna_age.xlsx') as f_xlsx:
data_xlsx = pd.read_excel(f_xlsx)
name_s = data_xlsx.keys()[2]
age_s = data_xlsx[name_s].values
name_r = data_xlsx.keys()[3]
age_r = data_xlsx[name_r].values
vbins = np.arange(20, 46, 2.5)
#
binの設定
plt.title('横綱の年齢', fontsize = 16)
plt.hist([age_s, age_r], bins = vbins,
color = ['lime', 'magenta'],
label = [name_s, name_r])
plt.xlabel('年齢', fontsize = 14)
plt.ylabel('度数', fontsize = 14)
plt.yticks([0, 5, 10, 15], fontsize =
12)
# Y軸の目盛り
plt.xticks(vbins, rotation = 45,
fontsize = 12) # X軸の目盛り
plt.legend(fontsize = 14)
plt.tight_layout()
# グラフの配置を画面内に整える
plt.show()
リストE2のプログラムを実行すると、図E3のグラフが表示される。
図E3
リスト2では、ヒストグラムは1つの関数呼び出しで2つのデータのヒストグラムが描かれていて、2つのグラフは重ならずに横に並べて表示されている。
plt.hist([age_s, age_r], bins = vbins,
color = ['lime', 'magenta'],
label = [name_s, name_r])
ヒストグラムを描く複数のデータは、リストとして与えられ、colorとかlabelはリストにより設定されている。
なお、岡本安晴「いまさら聞けないPythonでデータ分析」丸善出版においてグラフ描画の説明も行っている。