機械学習初心者の学習ノート② 〜技術は見て盗め編①〜

# 0. 前回までのあらすじ
前回→ https://qiita.com/Kiro02/items/07de61680c0f6b5a8aeb
とりあえず見よう見まねで分析したものの、精度はダメダメでした。

# 1. で、どうする？
**技術は見て盗むもの！**ということで、今回のコンペで上位に入っているソースコードを公開している人を探して、どのような手法を使っているのか見てみます。
自分がやらなかったことや、重要そうなことをまとめるのが今回の目的です。使えそうなコードもここで覚えてしまいたいですね。
英語の記事を適当に和訳しながら、どういった狙いがあるのかなどを考察・メモしていきます。英語の勉強にもなりますね！（英弱）
以下のURLの記事と並行して読む感じを想定してます。細かいコードはブログにあるGithubのリンクから見てください。https://github.com/viveksrinivasanss/blogs/blob/master/bike_sharing_demand/.ipynb_checkpoints/eda_%26_ensemble_model-checkpoint.ipynb

参考にしたのはこちら↓
・How to finish top 10 percentile in Bike Sharing Demand Competition In Kaggle? (part -1)
https://medium.com/@viveksrinivasan/how-to-finish-top-10-percentile-in-bike-sharing-demand-competition-in-kaggle-part-1-c816ea9c51e1

どうやら、この人のやり方に従えば上位10％に入れるみたいです。前回自力で行なったやり方は上位45％だったので、大躍進ですね。

# 2. 記事読み・分析
今回はデータの前処理・分析の部分までをみます。
##Part - 1
###About The Competition（コンペについて）
コンペの概要が書いてあります。これは省略。
###Data Summary（データの要約）
前回、**前処理が大事**といったことを堂々と書いたものの、そもそも初心者は**どういったことから確認すべきか**がわからなくてつまずくことが多いです。この記事によると
・データセットのサイズの確認: **.shape()**
・データのうちのいくつかをさっと見る: **.head()**
・データの変数の型の確認： **.dtypes()**
をすれば良いようです。これは僕もだいたい似たようなことをやってました。

###Feature Engineering（特徴選択）
「**EDA**（Exploratory data analysis:探索的データ分析）を始めるためにデータセットに手を加えよう」と書いてありますね。
データセットにある変数（特徴）を、データ分析に使えるように加工したり、使えるものを取捨選択したりする工程です。
・"datetime"列から、新しく"date", "hour", "weekday", "month" 列を作成。
・"season","holiday","workingday","weather"をカテゴリー型に変換する。（Coreceとは「強いる」という意味）
・新しく列を作るのに使った"datetime"列は削除しておく。

EDAについては↓を参照
https://www.msi.co.jp/splus/products/eda.html

ここから、データを様々なグラフを使って可視化していきます。
まずは変数の型ごとの棒グラフ。どういった型のデータが多いのかを可視化しています。
![ダウンロード (2).png](https://qiita-image-store.s3.amazonaws.com/0/206583/9292e2d1-b19e-e6d9-c757-4e677fa0f3bd.png)

###Missing Value Analysis（欠損値の分析）
**欠損値**（欠けているデータ）が無いかを可視化します。欠損値があると上手く分析ができないため、適宜取り除いたり、適切な値で補う必要があります。
![ダウンロード (3).png](https://qiita-image-store.s3.amazonaws.com/0/206583/884b6d87-5fc1-cd3e-d8df-a917bc2bcd42.png)

今回は欠損値は無いようです。ラッキーですね！
筆者はここで、手軽に欠損値を可視化できるライブラリとしてmissingnoを推しています。詳しくはこちら→https://qiita.com/TomoyukiAota/items/fd75c28b802bad9e6632

###Outliers Analysis（外れ値の分析）
**外れ値**とは、全体から見て突出して値が高かったり、低かったりするデータです。例えば、平均年収400万円のグループに億万長者がいるようなイメージです。外れ値は数が少ない割に大きな影響力を持つため、モデルを構築する上では取り除いたほうがいいことが多いです。また、外れ値は統計を取る際のミスなどでも生まれることがあるので注意が必要です。
![1_Ghem6VimptvyKUixSmVNeA.png](https://qiita-image-store.s3.amazonaws.com/0/206583/7fca74a5-955b-3a16-affe-8ee846f6d1b2.png)
・春は相対的に利用者が少ない
・時間別の箱ひげ図を見ると、7~8時、17~18時の利用が多い。おそらく一般的な通勤通学の時間帯だと思われる。
・右下の箱ひげ図を見ると、働いている日の方が外れ値が多いことがわかる。
＜気づき＞
**箱ひげ図を利用する**、という発想がなかったです。横に何本も箱ひげ図を並べた右上や左下のようなグラフが書けると、外れ値だけでなく色々な傾向が見えてきました。今後は箱ひげ図も有効活用していきたいです。

###Correlation Analysis(相関分析）
とりあえず、数量データから分析して行きましょう。
**相関係数**とは、変数同士の関係性の強さを表す数値です。絶対値が1に近いほど関係は強く、0に近いほど弱いです。詳しくは→https://sci-pursuit.com/math/statistics/correlation-coefficient.html
ここでは**ヒートマップ**（各変数間の相関係数をわかりやすく表示したもの）を使って、目的変数（自転車の台数）を予測するのに、どの説明変数が役に立ちそうかを分析しています。
![1_Y3TA8KyQA1XJ8yIrqP1KrQ.png](https://qiita-image-store.s3.amazonaws.com/0/206583/f913b450-4198-21ad-6475-601dd0fda1cf.png)
・humidityとtempはcount(目的変数）に対し強くはないが相関がありそう。
・windspeedはあまり役にたたなさそう。
・atempとtemp同士は強い相関関係にあるので、モデリングの際に同時に使用しない方がいい。atempを使用しないことにする。
.casualとregisteredは、countの内訳になっているので相関係数が高いのは当たり前。説明変数としては使えない。

temp、windspeed、humidityとcountで回帰直線（変数同士の関係を直線で表したもの）を描いてみますが、あまり役に立ちそうにありません。
![1_TnLt3kGTK-R1ZbJ7qzgPKg.png](https://qiita-image-store.s3.amazonaws.com/0/206583/38ac7685-a30c-fd66-7bf5-b8ab8af88309.png)
では、次は質的変数についてみてみましょう。

###Visualizing Distribution Of Independent Variable（目的変数の分布のヴィジュアル化）
目的変数であるcountがどのような分布なのかを見てみましょう。
![1_Fjtak-55cBQhGcYPRrhwKg (1).png](https://qiita-image-store.s3.amazonaws.com/0/206583/9fb98eed-c998-7dc6-de09-870c32164cdf.png)
上の図では0が突出して多いですね。こうした**外れ値**は除いておきましょう。
対数（log）を取ると、下のグラフのように、分布は少し**正規分布**に近いような分布になります。目的変数は正規分布に従っていることが望ましいと筆者は言っています。
正規分布→https://atarimae.biz/archives/9850

・Visualizing Count Vs (Month,Season,Hour,Weekday,Usertype)（月、季節、時刻、平日かどうか、ユーザーの種類と需要台数の関係）
![1_76DdfqqjYlk5aAppzeWTxA.png](https://qiita-image-store.s3.amazonaws.com/0/206583/b7673861-a382-b2b8-cd65-36f0716a30c8.png)
・夏に利用者が多いようだ。
・平日の朝と夕方に利用者が多い。通勤通学か。
・土曜日曜は午前10時と午後4時に利用者が多い傾向。
・登録済みユーザーは午前７−８時と午後５−６時に多い。

変数の様子を概観しました。次は実際のモデリングに入るようです。