自分でデータを収集してjupyternotebook上で重回帰分析をしたのですが教科書や講座で用意された資料ではないため様々な苦労がありました。
まずはコマンドプロンプトで以下のコマンドを打つとブラウザが起動します。
jupyter notebook
僕はchrome使っているのでchromeが起動しました。
分析に必要なpandasをインポートして略称をpdに、numpyはnpに。matplotlibはpltにします。
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline
from sklearn.linear_model import LinearRegression as LR
独自に作ったcsvを出力します。最初encodingを書かないで出力したら文字化けしました。
train = pd.read_csv("ベルマーレ観客動員数(2010-2017).csv", encoding="shift-jis")
test = pd.read_csv("ベルマーレ観客動員数(2018).csv", encoding="shift-jis")
sample = pd.read_csv("sample.csv", encoding="shift-jis")
encodingをutf-8にしたところ、こんなエラーが出ました。
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x94 in position 0: invalid start byte
最終的にはutf-8で使いたいんですけど仕方がないのでencoding="shift-jis"に。
ここら辺の文字形式の変換は今後大いに学ぶ必要性があると感じています。
以下のように書くことでtrainに代入されたベルマーレ観客動員数(2010-2017).csvのカラムである観客動員数を導き出したいというように定義します。
y = train["観客動員数"]
質的データは重回帰分析では使えないのでダミー変数を使うことで量的なデータに置き換えます。
pd.get_dummies(train[["home","away","stadium","weather"]])
もしも欠損値があった場合0に置き換えます。欠損値があると重回帰分析は出来ません。
trainX = trainX.fillna(0)
回帰モデルの箱を用意します。
model = LR()
重回帰モデルを作ります。
model.fit(trainX, y)
trainXには分析で使用する説明変数が、yには目的変数が代入されています。
trainXのデータを使用して、yである観客動員数を予測するモデルを作る。
という言い方がよいですかね。
続いてtestの方もこんな感じで書き換えます。
testX = pd.get_dummies(test[["相手チーム","曜日","天気","降水量","スター", "開幕戦", "産能大スペシャルデー"]])
testX = testX.fillna(0)
testは実際に分析したい年度のデータ。
それより前の年度を利用して以下のようにモデルは作ってあるので
model.fit(trainX, y)
変数 = model.predict(実際に分析したい年度のデータ)のように書くと実際に分析したいデータで重回帰分析を行ってくれます。
なので以下のように書く。
pred = model.predict(testX)
えらーーーーーーーーーーーーーーーーーー!!!
ValueError: shapes (313,40) and (43,) not aligned: 40 (dim 1) != 43 (dim 0)
なんでこのようなエラーが出るのかというと。結論から言うとmodelで使うデータと実際に分析したいデータのカラム数が違うとこんな風にエラーが出るんですよ。
僕の場合分析に対戦チームの名前や試合をする曜日を使っていたんですが、昇格降格の影響でmodelで使ったデータにはいなかったチームが実際に分析するデータには存在していたり、modelでは水曜日に開催した日があったのに実際に分析するデータには存在しなかったり。
そんな理由でエラーが出たのです。
自分でデータを収集するとそういうエラーが出るんですね。
ちなみに僕は手作業でデータを消しましたが多分jupyter notebook上で削除したり別のデータを便利に結合することができると思います。 そこら辺は今後学んでいきたいですね。
エラーが出なくなったら以下でcsv出力できます。
sample[1] = pred
sample.to_csv("出力したい名前.csv",index=None, header=None)
以下余談。 どうやって分析するための説明変数を決めるのかというと、modelで使用した「ベルマーレ観客動員数(2010-2017).csv」を今回と同じ手順で分析しました。 その際に説明変数は色々変更を加えて。 それでいい値が出たものを実際に説明変数として使用するのです。 でも、ほかにもいろんな方法があるんだと思うのでそこも勉強したいですね。