【Python】度数分布表とヒストグラムを作る【NumPy、Pandas、Matplotlib】

  • 投稿 : 2021-02-18

今回は、Pythonで上記のような度数分布表とヒストグラムを作ってみました。成績のデータを今回は用います。

NumPy:多次元配列を扱う数値計算
Pandas:データ解析を支援する機能
Matplotlib:グラフ描画ライブラリ

最近の流行系?の処理でみかけるライブラリを使います。

NumPy、Pandas、Matplotlibの導入

pip install numpy
pip install pandas
pip install matplotlib

コマンドプロンプトで上記の3つを実行

階級

その1

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

#----------
# 階級
#----------
bins =np.array([0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100])
bins[0]=-1

print(bins)

5点刻みで作りたいので、上記のようなNumPy 配列を作成します。このままでもわかりやすくてよいのですが、10点刻みに変更するとかの時に、大変です。

その2

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

#----------
# 階級
#----------
#bins=np.array([0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100])

bins = np.arange(0,105,5) # 等差数列
bins[0]=-1
print(bins)

np.arange()を用いて書き換えます。実行結果は同じです。

あと、bins[0]=-1の処理を入れてるのは、0点が集計されないからです。もっとよい解決方法がありそうですが、わからなかったので暫定でそうしてます。

0点より大きい、5点以下
5点より大きい、10点以下
10点より大きい、15点以下

みたいな区分けになると思うのですが、この場合0点がどこにも数えられません。

データ

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

#----------
# 階級
#----------
#bins=np.array([0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100])
bins = np.arange(0,100,5) # 等差数列

bins[0]=-1
#print(bins)

#---------
# データ
#---------
# Seriesオブジェクト
sr = pd.Series([30, 0, 29, 95, 70, 67, 29])

print (sr)

Seriesオブジェクトでデータを保持します。

度数,度数分布表

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

#----------
# 階級
#----------
#bins=np.array([0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100])
bins = np.arange(0,105,5) # 等差数列

bins[0]=-1
#print(bins)

#---------
# データ
#---------
# Seriesオブジェクト
sr = pd.Series([30, 0, 29, 95, 70, 67, 29])
#print (sr)

#---------
# 度数
#---------
# データを区分け(ビン分割)
sr1 = pd.cut(sr, bins=bins)
#print (sr1)


# 区分け毎にデータ個数を集計
vc = sr1.value_counts(sort=False)
print (vc)

pd.cut()で、データを区分け(ビン分割)します。その後で、sr1.value_counts()で区分け毎にデータ個数を集計します。これで、度数分布表が作成できます。

ヒストグラム

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

#----------
# 階級
#----------
#bins=np.array([0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100])
bins = np.arange(0,105,5) # 等差数列

bins[0]=-1
#print(bins)

#---------
# データ
#---------
# Seriesオブジェクト
sr = pd.Series([30, 0, 29, 95, 70, 67, 29])
#print (sr)

#---------
# 度数
#---------
# データを区分け(ビン分割)
sr1 = pd.cut(sr, bins=bins)
#print (sr1)

# 区分け毎にデータ個数を集計
vc = sr1.value_counts(sort=False)
#print (vc)

#----------
# ヒストグラム
#----------
y, ind, pacthes = plt.hist(sr,bins = bins.size-2, range =(0,100))
print (y)
print (ind)

plt.show()

plt.hist()でヒストグラムが作成できます。戻り値の「y, ind」あたりが度数分布表にできるので、初めからこれを呼び出すだけでも良いのかも?!

CSVファイルからデータを読む

CSVファイル

https://statistics.co.jp/reference/statistical_data/statistical_data.htm

成績データseiseki.csvを入手

CSVファイル読み込みバージョン

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

#----------
# 階級
#----------
#bins=np.array([0,5,10,15,20,25,30,35,40,45,50,55,60,65,70,75,80,85,90,95,100])
bins = np.arange(0,105,5) # 等差数列

bins[0]=-1
#print(bins)

#---------
# データ
#---------
# Seriesオブジェクト
#sr = pd.Series([30, 0, 29, 95, 70, 67, 29])

df = pd.read_csv("seiseki.csv", header=0,usecols=[0])
sr = df['kokugo']
#print (sr)

#---------
# 度数
#---------
# データを区分け(ビン分割)
sr1 = pd.cut(sr, bins=bins)
#print (sr1)


# 区分け毎にデータ個数を集計
vc = sr1.value_counts(sort=False)
print (vc)

#----------
# ヒストグラム
#----------
y, ind, pacthes = plt.hist(sr,bins = bins.size-2, range =(0,100))
#print (y)
#print (ind)
plt.show()

Seriesオブジェクトでデータを保持していた部分を、CSVファイル読み込みに書き換えます。

df = pd.read_csv("seiseki.csv", header=0,usecols=[0])
sr = df['kokugo']

この2行はその部分です。pd.read_csv()はいろいろ便利にできてると思います。

動画での説明

スポンサーリンク