今回は、Pythonで上記のような度数分布表とヒストグラムを作ってみました。成績のデータを今回は用います。
NumPy:多次元配列を扱う数値計算
Pandas:データ解析を支援する機能
Matplotlib:グラフ描画ライブラリ
最近の流行系?の処理でみかけるライブラリを使います。
NumPy、Pandas、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()はいろいろ便利にできてると思います。
コメントを残す