多項式による回帰分析
小学生の人身交通事故の分析例
警視庁のホームページ「各種交通事故発生状況(令和6年上半期)」からダウンロードしたPDFファイル「小学生の交通人身事故発生状況(令和6年上半期)更新日:2024年7月18日から月単位と曜日単位のデータを読み取り、多項式による回帰分析を適用してみた。ファイルは、まとめて圧縮ファイルpolynregfiles.zipとした。
回帰モデルの設定は、岡本(2014)、p.23に説明されているモデル設定を用い、解はムーア・ペンローズ逆行列を用いる方法(岡本、2009、p.26)により求めた。。
月単位のデータをCSVファイルとした(図A.1)。
図A.1 月単位の事故件数(警視庁ホームページより)
図A.1のデータの棒グラフを描くと、図A.2のようになった。
図A.2 図A.1のデータの棒グラフ
棒グラフの高さが波打っているので、3次多項式による回帰分析を試みた。独立変数は、1月から6月までに、1から6までの整数値を割り当てた。回帰分析のためのスクリプトをリストA.1のように作成した。
リストA.1の実行により、まず図A.2のグラフが表示されるが、図A.2のWindowを閉じると、図A.3が表示される。回帰多項式は、各月での値を繋いだ折れ線で描かれている。
図A.3 3次の多項式による回帰分析
import pandas as pd
import numpy
as np
import matplotlib.pyplot
as plt
import japanize_matplotlib
fin_nm = 'DataMonth.csv'
data_frm = pd.read_csv(fin_nm, encoding='shift-jis')
print(data_frm.keys().values)
data = data_frm.values[0]
print(data)
v_month = np.arange(1,
7, 1)
print(v_month)
plt.bar(data_frm.keys().values,
data)
plt.xticks(fontsize=16)
plt.ylabel('件数', fontsize=16)
plt.title('小学生の交通人身事故', fontsize=16)
plt.show()
X = np.vstack((np.ones(6), v_month, v_month**2, v_month**3)).T
print(X)
b = np.linalg.pinv(X)
@ np.reshape(data, (6,1))
print(b)
y_hat = np.reshape(X
@ b, (6))
print(y_hat)
plt.bar(v_month,
data, alpha=0.5)
plt.plot(v_month, y_hat, color='r', label='回帰多項式')
plt.xticks(v_month, data_frm.keys().values, fontsize=16)
plt.ylabel('件数', fontsize=16)
plt.title('小学生の交通人身事故', fontsize=16)
plt.legend()
plt.show()
曜日単位のデータを読み取り、CSVファイルとした(図B.1)。
図B.1 曜日単位の事故件数(警視庁ホームページより)
図B.1のデータの棒グラフは、図B.2のようになる。
図B.2 図B.1のデータの棒グラフ
棒の高さが波打っているので、3次多項式による回帰分析を試みる。独立変数の曜日は、月曜日から日曜日までに、1から7までの整数値を割り当てた。回帰分析のためのリストB.1に示すスクリプトを作成した。
リストB.1のスクリプトを実行すると、まず図B.2のグラフが表示される。図B.2のWindowを閉じると、図B.3のグラフが表示される。
図B.3 3次多項式による回帰分析
3次多項式の回帰曲線は、各曜日での値を繋ぐ折れ線として描かれている。
import pandas as pd
import numpy
as np
import matplotlib.pyplot
as plt
import japanize_matplotlib
fin_nm = 'DataWeek.csv'
data_frm = pd.read_csv(fin_nm, encoding='shift-jis')
print(data_frm.keys().values)
data = data_frm.values[0]
print(data)
v_week = np.arange(1,
8, 1)
print(v_week)
plt.bar(data_frm.keys().values,
data)
plt.xticks(fontsize=16)
plt.ylabel('件数', fontsize=16)
plt.title('小学生の交通人身事故', fontsize=16)
plt.show()
X = np.vstack((np.ones(7), v_week, v_week**2, v_week**3)).T
print(X)
b = np.linalg.pinv(X)
@ np.reshape(data, (7,1))
print(b)
y_hat = np.reshape(X
@ b, (7))
print(y_hat)
plt.bar(v_week,
data, alpha=0.5)
plt.plot(v_week, y_hat, color='r', label='回帰多項式')
plt.xticks(v_week, data_frm.keys().values, fontsize=16)
plt.ylabel('件数', fontsize=16)
plt.title('小学生の交通人身事故', fontsize=16)
plt.legend()
plt.show()