Up

多項式による回帰分析

小学生の人身交通事故の分析例

 

警視庁のホームページ「各種交通事故発生状況(令和6年上半期)」からダウンロードしたPDFファイル「小学生の交通人身事故発生状況(令和6年上半期)更新日:2024718日から月単位曜日単位のデータを読み取り、多項式による回帰分析を適用してみた。ファイルは、まとめて圧縮ファイルpolynregfiles.zipとした。

回帰モデルの設定は、岡本(2014p.23に説明されているモデル設定を用い、解はムーア・ペンローズ逆行列を用いる方法(岡本、2009p.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.2Windowを閉じると、図A.3が表示される。回帰多項式は、各月での値を繋いだ折れ線で描かれている。

A.3  3次の多項式による回帰分析

 

 

 

リストA.1  月単位の事故の分析スクリプト

 

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.2Windowを閉じると、図B.3のグラフが表示される。

B.3  3次多項式による回帰分析

 

3次多項式の回帰曲線は、各曜日での値を繋ぐ折れ線として描かれている。

 

 

 

リストB.1  図B.1のデータの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()

 

 

 

Home