Up

ヒストグラムの描画

本ウェブサイトのプログラムは、圧縮ファイル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個の区間binbins = 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にまとめたので、ダウンロード展開すれば自由に利用できる。

E

 

ヒストグラムを描くコード

 

r_s = plt.hist(age_s, alpha = 0.5)

r_r = plt.hist(age_r, alpha = 0.5)

 

の関数の戻り値r_sr_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番目の配列における階級の左端は2124であり、小さい方の値は21である。階級の右端は4244であるので、大きい方の値は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のグラフが表示される。

E

 

リスト2では、ヒストグラムは1つの関数呼び出しで2つのデータのヒストグラムが描かれていて、2つのグラフは重ならずに横に並べて表示されている。

 

plt.hist([age_s, age_r], bins = vbins,

               color = ['lime', 'magenta'],

               label = [name_s, name_r])

 

ヒストグラムを描く複数のデータは、リストとして与えられ、colorとかlabelはリストにより設定されている。

 

 

なお、岡本安晴「いまさら聞けないPythonでデータ分析」丸善出版においてグラフ描画の説明も行っている。

 

Home