初心者がデータ分析コンペにチャレンジしてみた!【SIGNATE】【自動車の走行距離予測】

コンペ

こんにちは、しゃおろんです。

今回は、SIGNATEというサイトで開催されているデータ分析コンペに参加してみましたので、そのレポートをしたいと思います。

順位は大してよくないのですが、最後まで終えることはできました。

 

・少し勉強してみたから、データ分析コンペにチャレンジしてみたい

・よくわからないけど、データ分析面白そうと思っている

といった方は是非参考にしてみてください!

 

※注意

主は勉強を始めたばかりの初心者です。考え方など間違っている部分があると思います。もし気づいた方はコメントにて指摘いただけると助かります。

機密情報保持の観点から、提供された生データは記載していません。(グラフ等で実際の数値は分からない形にしています。)

コードは全て記載しているわけではありません。

投稿者のスペック

最初に簡単に自己紹介をしておきたいと思います。

・独学で機械学習を勉強中(1カ月)

・業務でのプログラミング経験はなし(自己学習を過去に数カ月程度)

・統計は大学時代に軽く学んだ(覚えているとは言ってない)

 

こんな自分でもなんとかコンペに参加することができたので、敷居はそんなに高くないんだよということを知ってもらいたいです。

 

ちなみに、参加するにあたって参考になったのがUdemy(オンライン学習)の講座です。以下の2つを受けてからコンペに挑みました。どちらも分かりやすくておすすめです。

【ゼロから始めるデータ分析】 ビジネスケースで学ぶPythonデータサイエンス入門

【キカガク流】人工知能・機械学習 脱ブラックボックス講座 – 初級編 –

 

テーマの確認

SIGNATEには色々な分析コンペがあるのですが、今回参加したのは「自動車の走行距離予測」です。

【練習問題】自動車の走行距離予測

自動車の属性情報(重さ、車種、年式、排気量、etc..)を使って、ガソリン1ガロン当たりの走行距離(いわゆる燃費)を予測してくださいねというのが課題です。

練習問題と書いてあることからも分かりますが、どこかの企業が賞金を出して募集をしている課題ではなく、分析コンペを体感したい方向けに用意された問題です。

こういう練習問題がいくつも用意されているのは非常にありがたいですね。

 

データは「学習用データ」「評価用データ」「応募用サンプルファイル」の3つが用意されていました。コンペで提供されるデータは基本的にこの3つのようです。

学習用データ:モデルを学習させるために使用するデータ(自動車の属性情報と燃費が含まれる)

評価用データ:実際に予測をするために使用するデータ(属性情報はあるが、燃費は含まれない)

応募用ファイル:予測した値を記載するためのファイル

 

分析に使う環境とモデル

今回の分析では、Python及びJupyterNotebookを使いました。上で紹介した講座で使われていたからというのが理由ですが、Pythonで分析をするなら結構メジャーな環境みたいです。

また、今回の分析には重回帰モデル(重回帰分析)を使用します。理由は単純で、私が知っている分析手法がそれくらいしかないからです。今回の目的変数である燃費は連続する数値なので、回帰モデルである重回帰モデルを使うことができます。

 

データ読み込み~確認

最初に必要なライブラリをインストールします

 

次に与えられたデータをインポートします(pandasというライブラリを使います)。sample_submitファイルはヘッダーがないので、読み込む時に注意です。

 

インポートが終わったら、head関数を使ってデータの中身をざっと確認します。

 

データの中身は見せられないのですが、項目は以下の通りです。

idはインデックス、いわば目次のようなものですね。各行を識別するのに使うものです。

mpgは今回の目的変数ですね。1ガロン当たりの走行距離と書いてあるので、燃費と同義と思われます。これ以外のデータを使って、燃費を予測するというのが今回の問題です。

cylinders~car nameまでが説明変数の候補となるデータです。自動車に詳しくない自分には、よく分からない項目もいくつかあるのですが、燃費に関係ありそうだなーという項目もいくつかあります。

データの型に着目すると、量的な変数もあれば質的な変数もあることが分かります。

 

仮説を立てる

データをざっと見て雰囲気は掴めたので、次に仮説を立てていきます。

ここでいう仮説とは、「xxという説明変数が、目的変数に正(or負)の影響を与えているのではないか」ということを指します。つまり、実際に分析をするまえに結果を予測します。(この工程が必要なのかは分かっていないのですが、あったほうがいい気がするので行います。)

私の場合は、実際に以下のような仮説を立てました。

・重要が軽いほうが、走行距離は伸びるのではないか 
・馬力が高いと燃費が悪いのではないか
・加速度は高いと燃費が悪いのではないか
・年式は新しいほうが燃費がいいのではないか
・起源はよく分からないが、車の大まかな種類だとしたら燃費に影響がありそう
・シリンダーはエンジンにある気筒のことらしいが、多いと馬力があって燃費は悪そう
・displacement(排気量)は、多いと燃費が悪いのではないか

仮説を検証してみる(データの基礎分析)

仮説を立てたので、仮説を確かめるためにデータの基礎分析を行います。

具体的には、各説明変数と目的変数の相関を調べていきます。

上記のWeight(重量)の場合、散布図は直線に近い形になっていて相関がありそうです。

また、相関係数も-0.82と-1に近い数値となっており、相関があるのは間違いなさそうです。

 

 

こんな感じで他の変数についても仮説を検証していきました。

結果としては、以下の変数がmpg(燃費)と関係がありそうということが分かりました。

・wight(重さ)
・horsepower(馬力)
・model year(年式)
・cylinders(シリンダーの数)
・displacement(排気量)
・origin(起源) 

 

多重共線性がないかの確認

関係ありそうな変数が分かったので、いざ分析!と行きたいところなのですが、ここで多重共線性がないかを確認します。初心者の方は何それという感じだと思うのですが、私もぶっちゃけよく分かっていません。

知っている限りの知識でいうと、多重共線性というのは説明変数同士に強い相関があるときに起こる現象のことで、多重共線性が発生してしまうと分析結果が信用できないものになってしまいます。(個々の変数のパラメーターを過小or過大評価してしまうらしいです。)

要するに、「説明変数同士で強い相関があるものを一緒に使ったらダメ」というわけです。実際に調べてみましょう。

 

結構高い数値が出ているものがあります。

まとめると、以下の変数は組み合わせるとダメそうです。(0.7以上くらいを目安にしてます。なんとなく)

・weightとhorsepower
・weightとcylinders
・weightとdisplacement
・horsepowerとcylindeers
・horsepowerとdisplacement
・cylindersとdisplacement

 

これらを踏まえて、私の場合は以下を説明変数として使うことにしました。

・weight(重さ)
・model year(年式)
・origin(起源)

「重さ」「馬力」「排気量」「シリンダー」の4つはそれぞれ相関しておりどれを使うか悩んだのですが、燃費に影響ありそうなのはどれ?と言われて説明がつきやすい「重さ」を選びました。(目的変数に対する相関もかなり高かったのも理由の一つです)

 

モデルを作成する

説明変数も決まったので、やっとモデルの作成に入れます。(長かった、、)

ちなみに、origin(起源)についてはそのまま変数として利用するよりもダミー変数として使ったほうがよさそうだったので、そのようにしています。

↑散布図がこんな感じでした。originが2と3は大差ないですが、1だけ差がありそうだったので、1orその他のダミー変数としています。

 

 

学習用データを訓練データと検証データに分割します。

 

モデルを作成します。

 

無事にモデルが作成できたので、決定係数を確認してみましょう。(運命の瞬間です、、)

結果は「0.79」。

結構1に近い数値が出たので、いいのではないでしょうか。すんなり分析がうまくいってびっくりしました。

 

予測値を算出して提出!結果は…

モデルは作成できたので、予測値を算出して提出するのみです。

 

予測値を出すことができたので、結果を投稿してみます。

順位は、92/138位でした。

順位は大してよくないのですが、無事にコンペで結果を提出できたのが何より嬉しかったです。

まだまだ改良の余地はある結果となっていますが、ひとまず形にすることはできました。

 

まとめ

いかがでしたでしょうか。

初心者が初心者なりにどう分析コンペに取り組んだかを書いてみました。今後モデルを改良したり、別のモデルを使ってさらにいい結果が出せたら、投稿しようと思います。

以上、しゃおろんでした。

 

コメント

タイトルとURLをコピーしました