データ分析⑥

 # PART1 簡単な予測モデルを作ってみよう
 # おまじない
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline
from sklearn.linear_model import LinearRegression as LR
 # 線形回帰による予測を行うクラスとして、sklearn.linear_model.LinearRegression が用意
 # 線形回帰モデル (Linear Regression) 
 # データの読み込み
 # train.csvとtest.csvとsample.csvの3つのファイルを読み込みましょう
 # それぞれを読み込んだものは変数はtrain, test, sampleに代入しましょう
 # sampleを読み込む時は、header=Noneというオプションを忘れないようにしましょう
 
train = pd.read_csv("train.csv")
test = pd.read_csv("test.csv")
sample = pd.read_csv("sample.csv",header=None)

 # trainの先頭行を見てみましょう
train.head()
datetime	y	week	soldout	name	kcal	remarks	event	payday	weather	precipitation	temperature
0	2013-11-18	900	厚切りイカフライ	NaN	NaN	NaN	NaN	快晴	--	19.8
1	2013-11-19	1011	手作りヒレカツ	NaN	NaN	NaN	NaN	快晴	--	17.0
2	2013-11-20	1180	白身魚唐揚げ野菜あん	NaN	NaN	NaN	NaN	快晴	--	15.5
3	2013-11-21	1201	若鶏ピリ辛焼	NaN	NaN	NaN	NaN	快晴	--	15.2
4	2013-11-22	1301	ビッグメンチカツ	NaN	NaN	NaN	NaN	快晴	--	16.1

 # trainから説明変数と目的変数となるデータを取り出しましょう
 # 説明変数はtrainからtemperatureを選択し、変数名をtrainXとして代入しましょう
 # 目的変数はtrainからyを選択し、変数名をyとして代入しましょう
trainX = train["temperature"]
y = train["y"]

 # testから説明変数となるデータを取り出しましょう
 # 説明変数はtrainと同じtemperatureを選択し、変数名をtestXとして代入しましょう
testX = test["temperature"]

 # 単回帰の場合のみ、説明変数に対しておまじないが必要となります
 # 単回帰の場合はややこしいですが、train,testの説明変数ともに、データの形を整える必要があります
 # 具体的にはvalues.reshape(-1,1)というおまじないをします
 # 整えた後、再び変数Xに代入します
trainX = trainX.values.reshape(-1,1)
testX = testX.values.reshape(-1,1)

 # 回帰のモデルの箱を用意しましょう
 # モデルを作る為にはまず、モデルを表す箱が必ず必要になります
 # 変数名をmodel1として、LR()を代入しましょう
model1 =  LR()
 # 単回帰モデルを作りましょう
 # fit関数を使います
 # カッコの中に、説明変数、目的変数の順番に書きます
model1.fit(trainX,y)
LinearRegression()
 # 作ったモデルの傾きや切片を確かめてみましょう
 # 傾きはcoef_を使います
 # 切片はintercept_を使います
model1.coef_
array([-2.5023821])
model1.intercept_
134.79948383749922

 # 予測をしましょう
 # predict関数を使います
 # 予測結果は変数predに代入しましょう
pred = model1.predict(testX)
pred
array([ 84.25136537,  74.99255159,  62.9811175 ,  80.99826864,
       79.49683938,  76.49398085,  78.49588653,  69.48731097,
       67.73564349,  95.76232304,  88.25517673,  77.24469548,
       74.99255159,  84.25136537,  96.01256125,  98.01446693,
       88.00493852,  77.99541011,  87.00398568,  85.75279463,
       85.75279463,  87.75470031,  87.5044621 ,  94.7613702 ,
       86.75374747,  84.50160358,  81.74898327,  98.01446693,
       98.76518156,  86.00303284,  95.26184662,  99.01541977,
       94.51113199,  97.51399051, 108.52447176,  97.51399051,
      106.27232787, 111.7775685 ,  97.01351409,  96.51303767])
      
 # sampleの中身を確認してみましょう
 # sample.head()
0	1
0	2014-10-1	24
1	2014-10-2	71
2	2014-10-3	25
3	2014-10-6	32
4	2014-10-7	60

 # sample[1]に予測結果を代入しましょう
 # sample[1] = pred
 # sample.head()
0	1
0	2014-10-1	84.251365
1	2014-10-2	74.992552
2	2014-10-3	62.981117
3	2014-10-6	80.998269
4	2014-10-7	79.496839

 # sampleをファイルで書きだしましょう
 # to_csv関数を使います
 # オプションは3つあり、"submit1.csv", index=None, header=Noneを書きます
sample.to_csv("submit1.csv",index=None,header=None)

 # 実習
 # 1.説明変数をkcalとして、単回帰モデルを作ろう。まず、 trainとtestのkcalに欠損値があるかないか確認しよう

 # 本当に欠損があるかどうか、head関数を使って確認しよう
train.isnull().sum()
datetime           0
y                  0
week               0
soldout            0
name               0
kcal              41
remarks          186
event            193
payday           197
weather            0
precipitation      0
temperature        0
dtype: int64
test.isnull().sum()
datetime          0
week              0
soldout           0
name              0
kcal              4
remarks          33
event            37
payday           38
weather           0
precipitation     0
temperature       0
dtype: int64

 # 2.trainのkcalの平均値を求め、変数avgに代入しよう

avg = train["kcal"].mean()
avg
404.4096385542169

 # 3.変数avgを使って、trainとtestのkcalの欠損値を補間し、それぞれを変数名trainXとtestXに代入してみよう

trainX = train["kcal"].fillna(avg)
testX = test["kcal"].fillna(avg)
trainX
0      404.409639
1      404.409639
2      404.409639
3      404.409639
4      404.409639
         ...    
202    408.000000
203    394.000000
204    404.409639
205    404.000000
206    398.000000
Name: kcal, Length: 207, dtype: float64

 # 4.trainXとtestXをvalues.reshape(-1,1)を使って形を整え、再びtrainX, testXへ代入しよう 1. 3番ではtrainXにはavgで補間されたtrain["kcal"]が代入される 2. 4番では補間されたtrainXにおまじないをかけたものがtrainXに代入されることになる
trainX = trainX.values.reshape(-1,1)
testX = testX.values.reshape(-1,1)

 # 5.trainからyを取り出し、変数yに代入しよう
y = train["y"]

 # 6.回帰モデルの箱を変数名model2として用意しよう
model2 = LR()

 # 7.trainXとyを使って単回帰のモデルを作ろう
model2.fit(trainX,y)
LinearRegression()

 # 8.作ったモデルの傾きと切片を確認しよう

model2.coef_
array([0.13195178])
model2.intercept_
33.26061577029441

 # 9.testXを使って予測をし、予測値を変数pred2に代入しよう

pred2 = model2.predict(testX)
pred2
array([88.68036439, 88.02060548, 86.70108765, 86.04132874, 89.99988221,
      88.68036439, 90.65964112, 86.62318841, 87.096943  , 92.63891786,
      86.04132874, 88.02060548, 89.47207508, 87.36084656, 88.02060548,
      89.73597865, 86.62318841, 86.96499122, 89.3401233 , 89.99988221,
      89.47207508, 90.79159291, 91.31940004, 89.3401233 , 87.36084656,
      86.62318841, 87.62475013, 89.47207508, 88.41646082, 85.51352161,
      89.60402686, 90.39573756, 87.22889478, 89.99988221, 88.81231617,
      86.62318841, 93.95843568, 88.02060548, 88.68036439, 88.15255726])
      
 # 10.sample[1]にpred2を代入しよう
sample[1] = pred2
sample.head()
0	1
0	2014-10-1	88.680364
1	2014-10-2	88.020605
2	2014-10-3	86.701088
3	2014-10-6	86.041329
4	2014-10-7	89.999882

 # 11.to_csv関数のindex=Noneがある時とない時の違い、header=Noneがある時とない時の違いは何かを考えてみよう
 # 12.sampleをファイル出力し、submit2.csvという投稿用ファイルを作ろう
sample.to_csv("submit2.csv",index=None,header=None)

 #13.submit2.csvをDeepAnalyticsに投稿して、submit1.csvのスコアを比較してみよう

この記事が気に入ったらサポートをしてみませんか?