機械学習初心者がテレビゲームの売上データセットを使って回帰モデル・分類モデルを作成してみた

# はじめに
先日、東大の **[松尾研究室](https://weblab.t.u-tokyo.ac.jp/education/)** が主催している **データサイエンティスト育成講座** というものに参加しました。
私が参加したのは企業向けにアレンジされたもので、およそ2週間に1回、合計5日間でデータサイエンスの基礎を学ぶというものです。
カリキュラムとしては、 **[「東京大学のデータサイエンティスト育成講座」](https://www.amazon.co.jp/dp/B07PD237GQ/)** という書籍をベースにして、講義半分、演習半分という感じで進んでいきました。
![51zW1M1nYOL.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/25d073d5-f687-a201-af8d-d0825af1ae10.jpeg)

機械学習初心者の私が、この講座を受けてどれくらいデータ分析っぽいことができるようになったかを書き留めておこうと思います。

# 筆者のスペック

### 機械学習の経験
私自身はITエンジニアとして十数年の経験はありますが、業務でデータ分析っぽいことをやったことはほぼありません。
ただ、この講座を受ける半年ほど前に **[CourseraのMachine Learning](https://ja.coursera.org/learn/machine-learning)** を受けたり、機械学習に関する書籍を読んだりしていたのである程度の知識はありました。
とはいえ、高校数学はほぼ忘れてますし、大学数学は勉強した記憶すらありません（一応、理系でした）

### Pythonでのコーディング経験
こちらも業務ではほぼありません。
今回の講座を受けることが決まって、少し勉強したレベルです。
**[以前のQiitaの記事](https://qiita.com/hamham/items/c3904f4b1e22aea0c2d8)** でも書いたのですが、 **コーディング自体に苦手意識** をもっており、この講座を受ける前は結構不安でした。
実際、講座を受ける前にPython・NumPyを使って解くスキルチェックテストを受けたのですが、結果は散々で **「ちゃんと勉強してきてください！」** と講座の主催部署から直々に連絡がくる始末でした・・

### 講座を受けて
そんなこんなでヒーヒー言いながら講座を受けて、演習に取り組み、そして最終日には好きなテーマでデータ分析を行って、その成果をプレゼンすることになりました。
ということで、私が取り組んだテーマを紹介することにします。


# 今回使ったデータセット

### データセットの選び方

業務に関わるところで使えそうなデータセットを検討したのですが見当たらず、自分が興味を持って取り組めそう、かつ扱いやすそうなデータセットを選ぼうということで、 **テレビゲームのデータセット** にしました。


### テレビゲームの売上データセット

データセット自体は **[Kaggle](https://www.kaggle.com/gregorut/videogamesales/)** から持ってきました。
これには、 **1980年から2016年に全世界で発売されたテレビゲームが売上順** に並んでいます。
 **全16598タイトル、11カラム** （タイトル、対象ハード、発売年、ジャンル、メーカー、地域ごとの売上本数など）のデータセットになっています。

このデータセットを眺めているだけでも結構面白いです。
![図1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/371699ce-e6f4-d93e-4471-92433dac783b.jpeg)


- グローバル売上1位は意外にも **[Wii Sports](https://www.nintendo.co.jp/wii/rspj/)で8300万本** 。
- 2位が初代ファミコンの **[スーパーマリオブラザーズ](https://www.amazon.co.jp/%E4%BB%BB%E5%A4%A9%E5%A0%82-HVC-SM-%E3%82%B9%E3%83%BC%E3%83%91%E3%83%BC%E3%83%9E%E3%83%AA%E3%82%AA%E3%83%96%E3%83%A9%E3%82%B6%E3%83%BC%E3%82%BA/dp/B000068GVY)で4000万本** 。
- なんと **売上Top15を任天堂タイトルが独占！！** 
- 17位が **[GTA5(PS3版)](https://www.amazon.co.jp/gp/product/B00B6ZBGVK)** だが、他のハードのものを合算すると **5600万本で2位相当** になる。


# 目標と実践方法

### やりたいこと
大きく2つです。講座と演習でやったことをベースに取り組みました。

- **回帰モデル**を作って評価する
    - 海外販売本数、メーカー、ジャンルなどの説明変数から、**「日本における販売本数」を予測する**
- **分類モデル**を作って評価する
    - 各地の販売本数、ジャンル、ハードなどの説明変数から、**「任天堂が発売したゲーム」を当てる**

### 使った環境

**[Google Colaboratory](https://colab.research.google.com/)** を使用しました。
環境構築不要かつ無料で好きなだけ使えるので便利です。

### 最初にやったこと

講座と演習でやったことをベースにデータの加工をしていきました

- PandasのDataFrameにCSVを読み込み
- データの確認（head()、describe()、corr()、info()など・・・）
- データの前処理
    - N/Aの除外（16598→16291タイトルに）
    - 対象を日本で発売されたものに限定（16291→6084タイトルに）
    - 発売年を年代でまとめる（"2003"だったら"2000s"といったカテゴリ値に）


# データの可視化（matplotlib、seaborn）

こんな感じでmatplotlibとseabornを使って視覚化しました。

### メーカーごとのタイトル発売数Top50をグラフ化
- 発売タイトル数は1位がバンダイナムコ、2位が任天堂、3位がコナミ。
- 合併とか社名変更とか考慮したいところだが・・（今回は断念）

![図2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/317b6501-d88a-cb00-68f9-d9b6666e327c.jpeg)

### グローバルセールスTop50をメーカー別にグラフ化
- 売上だと任天堂が圧倒！2位がEAで、3位がSCE（今の社名はSIE）

![図3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/2970d992-2f12-729f-5e35-2ac1c04e5b1d.jpeg)

### ジャンル別のセールスを地域別にグラフ化
- ジャンル別セールスだとRPGは日本（緑色の棒グラフ）で特に人気。全体的にはアクションゲームが人気っぽい。

![図4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/8de045ee-92b4-baea-2cc2-8ad3eb377849.jpeg)


### 年代別に分析
- 点が左下に寄っているということは、売れてない弱小タイトルが大半を占める（パレートの法則・・）

![図5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/7950d9ee-0f65-ee28-815b-c9cb0bf45868.jpeg)


# 日本における販売本数予測（回帰モデル）

海外販売本数、メーカー、ジャンルなどの説明変数から、「日本における販売本数」を予測するモデルを作成します。

### 試したこと
- One-hotエンコーディング
    - ジャンルは12種類だからまだいいけど、メーカーは303社・・（モデル作るには多すぎるかも）
- モデル作成
    - 全てを説明変数として使って重回帰（結果はボロボロ）

![図6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/a1d8f4b6-363c-3753-87d9-3596b28dee1b.jpeg)

- モデル作成（再）
    - **説明変数を相関が0.1以上のもの15個程度に絞る**（北米売上とか、任天堂とか、スクエニとか、RPGとか）
    - テスト分割サイズを変えてみる（0.2とか0.3とか）
    - 決定木やリッジ回帰も試す（リッジ回帰がR2スコア高めだが、重回帰とそれほど差がない）

![図7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/0ccdd2f4-67da-3f77-e348-e5ecafe8439e.jpeg)



### 評価
- 最終的に重回帰でモデル作成して評価
    - **決定係数はイマイチ**
    - ただ、**RMSEは0.3501と低くてまずまず**

![図8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/c042d996-7960-1d60-771d-2732ccc48c8a.jpeg)  ![図9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/56e46f9e-1d07-1924-ab6f-4084f1d3a6c1.jpeg)


あまり精度が高いとは言えませんが、とりあえず回帰モデルを作成することができました。

# 任天堂が発売したゲームを当てる（分類モデル）
各地の販売本数、ジャンル、ハードなどの説明変数から、「任天堂が発売したゲーム」を当てるモデルを作成します。

### 試したこと
- 分析
    - 任天堂のゲームタイトル比率を確認。約1割であることを確認

![図10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/e412ae14-45f7-3b08-e52b-11c3ed3965c9.jpeg)

- One-hotエンコーディングしてモデル作成
    - **正解率は0.9以上で意外とよい！？**

![図11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/b8695e60-c09a-fc6c-b453-f0466da9484d.jpeg)

- Confusion MatrixとF1スコアで確認
    - F1値悪い。**そもそも任天堂タイトル以外が9割占めるから正解率高いだけだった・・**

![図12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/ea2e364e-1cde-1293-c943-3edc8b3c3110.jpeg) ![図13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/2cebb778-75a7-32de-5dae-552067c966d5.jpeg)

- 元データの絞り込み
    - **任天堂タイトルは、任天堂ハードでしか出てないはずので、データを絞り込み**
    - これにより、全タイトル数6084→2192まで絞られ、任天堂タイトル比率が約3割になった

### 評価

- ロジスティック回帰でモデル作成して評価
    - **正答率はやや低下**
    - しかし、**F1値は多少上がった**

![図14.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/e83834c6-436a-9fef-396f-4aabcc0a72c7.jpeg) ![図15.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/51a1693f-c06e-869e-cdfb-2076ac74b4ae.jpeg) ![図16.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/795fdbf0-0aff-53ed-7119-d577e26b2248.jpeg)



正解率だけで評価しても意味がないことがよくわかりました。正解率が多少下がってもF1値が高いモデルのほうがよさそうです。

# （おまけ）Amazon Machine Learningを試してみた

### Amazon Machine Learningとは？
S3にデータセットを入れて、AWSのコンソールからGUIポチポチでモデル作成＆評価をしてくれるマネージドサービスです。
ただ、既にサービス終了してしまったようで、現在では代わりとして **[Amazon SageMaker](https://aws.amazon.com/jp/sagemaker/)** を使ったほうがよさそうです。
ここでは、古い方のAmazon Machine Learningを使用しています。

### 日本における販売本数予測（回帰モデル）

RMSEは0.3762とかなり低くよい値です。分布も真ん中によっていてかなりよさそうです。
![図17.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/9568116d-9ac1-4962-3024-9125a4563e39.jpeg)
![図18.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/e15111ad-ec4a-bf54-5424-8c49962cc41f.jpeg)

### 任天堂が発売したゲームを当てる（分類モデル）
F1スコアは0.878とかなりよい値です。
![図19.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/8a6f08a1-cb0e-8c18-0e0b-0c7cb7c94e82.jpeg)
![図20.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272753/1e7c1bd6-b078-99b0-d091-c9080c366ca5.jpeg)

### 結論

ほぼノンチューニングでもかなり精度がよいです！
がんばって自力でモデルを作らなくても、こういう便利なものがあるんですね。

# さいごに

### 感想

率直に面白かったです。ノートブックで色々試しているときは時間を忘れて熱中してました。
数学・統計の詳しい部分は正直理解できてませんが、ライブラリを使ってデータの可視化やモデル作成はなんとかできるようになりました。
ただ、ちょっとしたデータ加工やグラフ作ったりはExcelが便利ですね。今回はExcel使わない縛りで頑張りました。

### 今後取り組みたいこと

PythonでNumPy・Pandasなどを使いましたが、もう少し素早く扱えるようになりたいです。
データの加工処理を都度ググりながらやってたので、なかなか効率があがりませんでした。
また、数値だけでなく文字列も扱った分析ができるようになると面白いなと思いました（タイトルに"mario"や"pokemon"が入ってれば売れやすいとか分析できそう）

### 試行錯誤したノートブック

GitHubに今回分析に使ったノートブックを置いときます。
https://github.com/hamham1004/vgsales