0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

回帰分析 - 「レンタル自転車の利用者予測」を題材に

Last updated at Posted at 2022-08-08

目的

SIGNATEさんの練習問題として公開されている「レンタル自転車の利用者予測」 に挑戦します。レンタル自転車の利用者数を予測します。

目的変数と説明変数を選択する

「データを理解する - データを解析する前にすること」でデータの特徴や傾向を表やグラフを作りながら確認しました。

利用者数を予測するコンペですので、説明変数は自動的に利用者数('cnt')になります。

説明変数は、利用者数('cnt')と相関や関係がありそうな変数を選びます。時間('hr'),温度('temp'),体感温度('atemp')が利用者数('cnt')と相関や傾向がありそうでした。それに加えて、天気('weathersit')も追加します。天気('weathersit')はカテゴリーデータなので相関関係を確認していませんが、関係あると思って投入します。

目的変数・・・利用者('cnt')
説明変数・・・時間('hr')、温度('temp')、体感温度('atemp')、天気('weathersit')
で回帰分析を実施します。

カテゴリーデータの天気('weathersit')をダミー変数に変換する

天気('weathersit')は
1=晴,やや曇り
2=薄い霧+曇り,霧+千切れ曇,霧+やや曇り,薄い霧
3=小雪,小雨+雷雨+千切れ曇,小雨+千切れ曇
4=大雨+凍雨+雷雨+霧,雪+濃い霧
というデータ構成になっています。データ形式は整数(int)ですが、そのまま投入しても意味がありません。1から4をそれぞれゼロイチ(0,1)の2値にしてダミー変数にします。

One-Hot Encodingというのを使います。

df_one_hot_encoded = pd.get_dummies(df,columns=['weathersit'])

こんなイメージです。weathersit_1からweathersit_4まで作られました。
output_table_2.PNG

もし0,1に分かれているか確認したければ、value_counts()をやってみましょう。

df_one_hot_encoded[['weathersit_2']].value_counts()

weathersit_2は0が6427件、1が2218件あります。合計が8645ですので、train dataの件数と合致します。

回帰分析

いよいよ回帰分析です。

回帰分析で使うモジュールをインストールします。

from sklearn.linear_model import LinearRegression as LR
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split

説明変数(X)と目的変数(y)を用意します。使うデータはダミーデータを作ったdf_one_hot_encodedを使います。

X = df_one_hot_encoded[['hr','temp','atemp','weathersit_1','weathersit_2','weathersit_3','weathersit_4']]
y = df_one_hot_encoded['cnt']

角括弧に使用する変数名を入れます。Xには複数の変数を投入しているので、重回帰分析を行うことになります。

# train dataをtrain dataとtest dataに分けます。
train_X, test_X, train_y, test_y = train_test_split(X, y, random_state=42, shuffle=False)

# 線形回帰モデルを作成する(実はこれは機械学習です)
model = LR()

# trainの説明変数('train_X')と目的変数('train_y')をモデルに投入します。
model.fit(train_X, train_y)

# モデルの精度を確認します。
model.score(test_X, test_y)

0.3493 ん...あまり高くないですね。

test dataもtrain dataと同じフォーマットにします。つまり天気の'weathersit'をダミー変数に変換します。

df_one_hot_encoded_t = pd.get_dummies(df_test,columns=['weathersit'])

test dataにモデルを適用します。

X_test = df_one_hot_encoded_t[['hr','temp','atemp','weathersit_1','weathersit_2','weathersit_3','weathersit_4']] 
X_test_pred = model.predict(X_test)

予測結果をcsvに保存する

予測された利用者数はX_test_predに反映されています。これを提出用のフォーマットに保存して投稿します。

sample = pd.read_csv('パスをコピペします/sample_submit.csv', header=None)
sample[1] = X_test_pred
sample.to_csv('保存したい場所のパスをコピペします/ファイル名.csv',index=None, header=None)

結果と考察

暫定評価は198でした。精度が良い結果を得られませんでした。うまく学習できていないようですので、Deep learningを試したいと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?