前提
djangoでゴルフのwebアプリを作っています。
その中で重回帰分析をしているのですが、一つの項目だけやたら大きい値になってしまいます。
エクセルやスプレッドシートでも重回帰分析をしてみたのですが、そちらでは正しい値になります。
Statモデルにスコア(目的変数)とパット数など(説明変数)があり、データベースに登録されたそれらの情報をもとに重回帰分析で影響度を計算しようとしています。
該当のソースコード
views.py
1df = pd.DataFrame(Stat.objects.filter(player_id=pk).values()) 2 df.columns = ["id", "player_id", "date", "total_score", "ob", "penalty", "fw", "par_on", "putt", "stat_number"] 3 x = df.drop(['id','player_id','date','total_score','stat_number'], axis=1) 4 y = df['total_score'] 5 6 reg = LinearRegression() 7 results = reg.fit(x,y) 8 coef = reg.coef_.round(4) 9 n = x.shape[0] 10 p = x.shape[1] 11 12 y_hat = reg.predict(x) 13 sse = np.sum((y - y_hat) **2, axis=0) 14 sse = sse / (n - p - 1) 15 s = np.linalg.inv(np.dot(x.T, x)) 16 std_err = np.sqrt(np.diagonal(sse * s)).round(4) 17 18 t_values = (coef/ std_err).round(4)
csvデータ(total_scoreが目的変数です)
1total_score ob penalty fw par_on putt bunker 283 1 1 57 55 34 1 385 1 3 85 55 38 0 481 0 0 64 50 36 0 590 1 1 53 27 37 1 686 1 1 42 27 34 1 786 0 0 57 33 31 0 885 2 2 78 55 36 1 986 3 0 50 22 31 0 1087 0 0 71 27 32 1 1186 0 2 42 22 33 0 1282 0 2 57 66 37 1 1393 2 1 28 11 33 0 1488 1 0 50 16 31 0 1590 2 0 46 27 33 1 1681 0 1 50 27 31 0 1780 0 0 57 38 29 0 1885 1 0 85 33 31 0 1985 0 1 71 22 33 0 2089 0 0 57 33 37 0 2183 1 0 64 50 32 0
#スプレッドシートでの計算結果 ob 2.0533 penalty -0.822 fw 0.1249 par_on -4.1637 putt 3.1677 bunker 0.7899
#現在作っているアプリ上での計算結果 ob 2.1573 - penalty -0.9684 fw 0.1144 par_on -4.7625 putt 12.6963 bunker 0.8931
#Djangoを使用しない、google colab上での計算結果 ob 2.1573 - penalty -0.9684 fw 0.1144 par_on -4.7625 putt 12.6963 bunker 0.8931 (アプリ上と完全に同じになりました)
google colabではcsvファイルを読み込む方法と、csvと同じデータを手書きでリストを作る方法の両方を試しましたが、どちらも同じ値になりました。
puttの値が大きくなり過ぎてしまいます。他の項目("total_score", "ob", "penalty", "fw")は全て正しく計算できています。
計算部分のみ載せています。
試したこと
puttの値だけ上手く変数に入れられていないのではと思い、xをテンプレートに渡し値を確認しましたが問題ありませんでした。
同じくcoefとstd_errの値を確認しましたが、どちらともおかしい値でした(エクセルなどで確認した値と比較して)。
補足情報(FW/ツールのバージョンなど)
django3
python3
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー