【Kaggle】アニメデータセットの作成から分析まで：後編


![mal08.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217166/b816a78a-0419-cdd2-d585-9b0f6d40ea4d.jpeg)


本記事は、[前回の記事](https://qiita.com/Noiru_CH/items/07e3fec09232dbfbf0da)の続きとなります。

## はじめに

前回に続いてアニメデータセットを用いてデータ分析を行っていきます。

今回は人にアニメをおすすめする時というシチュエーションで分析を行っていきたいと思います。



## レシピ

～前編：データセット作成編～
1. APIアカウントの取得
2. APIを利用したスクレイピング
3. データセットとしてKaggleに公開
～後編：データ分析編～
4. [ジャンルによるグルーピング](#4-ジャンルによるグルーピング)
5. [KNNを用いたユーザベースリコメンデーション](#5-KNNを用いたユーザベースリコメンデーション)



## 4. ジャンルによるグルーピング

まず、皆さん。
人にアニメをおすすめするとしたら何をおすすめしますか？

自分の一番好きなアニメをおすすめする人もいると思いますが、その人が好きそうなジャンルで有名な作品をとりあえずおすすめしませんか？
私は相手がライトオタクの方ならそうします。

ということで、まずがアニメデータセットを用いて各ジャンルのビッグタイトルを分析していきたいと思います。

Codeは[こちら](https://www.kaggle.com/noiruuuu/stastics-animes)に記載しておりますので、こちらを参考に読み進めて頂ければと思います。
**※Qiitaには流れしか書いていないので、Codeを確認したい場合はこのリンクを必ずご確認ください。**

まず、はじめにanimes.csvのデータを読み込んでデータフレーム（以下、df）を作成していきます。

作成したdfは以下のようになりました。

![mal10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217166/0cb446e3-e903-bab3-617b-382ae8d93d3a.png)

15,220のアニメリストが作成されているのが分かりますね。
これなら網羅的にアニメのリコメンドができそうです。

次に、評価の平均値が高かった順にソートします。

![mal11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217166/fa19125c-3673-10bd-d09c-a9388fb0263d.png)

データの出典が海外のサイトなので、表記がすべて英語なのですが、鋼の錬金術師、シュタインズゲート、進撃の巨人の順に並んでいるのが分かりますね。
シュタインズゲートは個人的にも本当に好きなアニメなので嬉しいです。

次は各ジャンルのビッグタイトルを見ていきましょう。
こうすることで相手の好みのジャンルさえわかればある程度のアニメをおすすめすることが可能になりますね。

私は**スポ根**アニメが一番好きなので、スポーツのジャンルで見ていきましょう。
今度はdfから"genres"の列に"Sports"が入っているものを抽出して評価の高いアニメを取り出してみます。

![mal12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217166/e5831c81-5f48-3246-9ed3-bcaedf3f97d7.png)

1位は**ハイキュー!! 烏野高校 VS 白鳥沢学園高校**でしたね！
これはハイキューでいうと3期ですね。宮城県大会の決勝戦のクールです。
ハイキューはテニプリや黒バスみたいな異次元さはない分、心理描写を細かく描いていて素敵ですよね。

さて、他には**ちはやふる**や**風が強く吹いている**なんかもランクインしていますね。
どれもスポ根が好きな人には刺さるタイトル間違いなしだと思うのでジャンルでソートするだけでも面白い結果になったと思います。

また、トップ1000タイトルのジャンルの数をカウントして可視化してみた図がこちらになります。

![mal13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217166/b6d7c487-f153-3595-0da8-5d613717459c.png)

コメディやバトル、少年系が人気が高く、逆にSFやミステリ、少女系がトップ1000タイトルの中では出現率が低い結果となりました。
世界的に有名な少年漫画があっても、世界的に有名な少女漫画ってなさそうですもんね。らんまとか犬夜叉って有名だと思うんだけど世界っていうとまた違うのかな。
あと、SAOや攻殻機動隊はSFに入るんじゃないかと思いますが、やはりバトルモノに比べたら分かりづらいということなのでしょうか。


## 5. KNNを用いたユーザベースリコメンデーション

さて、これでライトオタクの方にはある程度おすすめするアニメの見当がつきましたが、すでに100本以上アニメを見られている方であればビッグタイトルはもう全部視聴済かもしれませんね。

そんな方にアニメをおすすめする時に参考にしたいのが**レコメンデーションシステム**ですね。
レコメンデーションシステムには大きく２つありますが、今回は協調フィルタリングの仕組みを採用したユーザベースのレコメンドシステムを構築していきます。

![mal09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217166/d33e2a57-30e6-4d2d-ec30-18697bfd112e.png)

KNNの学習に関しては、[こちら](https://www.codexa.net/collaborative-filtering-k-nearest-neighbor/)を参考にしました。

Codeは[こちら](https://www.kaggle.com/noiruuuu/anime-recommendation-using-k-nearest-neighbor)をご確認ください。

4章ではanimes.csvしか使いませんでしたが、本章ではratings.csvも同時に利用していきます。

簡単に、ratings.csvの先頭データを確認しましょう。

![mal14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217166/534df7da-e94c-8ea2-e40a-618a883937c1.png)

このようにanime_idで識別されたアニメタイトルに各ユーザが点数をつけていることがわかります。
点数は1~10点で0点は未採点を表しています。

次に、点数の分布をヒストグラムで確認していきましょう。

![mal15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217166/853a6cb2-eba7-1402-3999-a4b05a146c7f.png)

上図を見ると7点以上の評価がほとんどであることがわかりますね。皆さん好きなアニメを積極的に評価しているのでしょうか。

次にノイズを除去していきたいと思います。
membersが1万人以下のタイトルを省き、anime_idでマージした後に学習に用いる特徴量だけを抽出します。
今回の場合は[user_id, title, rating_user]を特徴量とします。

![mal16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217166/04f6aee4-fd72-9cb8-c11c-40c2d1527b98.png)

１つのタイトルごとにたくさんのユーザの評価が付いていますね。

今度はこの表を各アニメタイトルごとに全ユーザを列に取るようにピボットします。

![mal17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217166/f5a1b72a-43fb-8af5-4a58-0a24ef2aca3a.png)

このように行に全アニメ、列に全ユーザ、値に全評価データが格納されたテーブルを作成することができました。

それでは最後に**K最近傍法**というモデルを使ってリコメンドシステムを構築していきます。

ここで、k最近傍法というのは任意のデータに対して、その近傍のデータクラスの多数決を取ることによって、任意のデータのクラスを分類するというものになります。

![mal18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217166/1335af71-d8a1-16fd-d911-ae3a42fc6ec8.png)

kというのが近傍で参考にするデータの数で上図だとk=3、青が1つと赤が2つで緑のデータのクラスは赤であるという分類手法になります。

今回はあるデータ（アニメ）を分類するのではなくて、あるアニメから近い距離（コサイン類似度）にあるアニメを10個探索するモデルを作成しました。

では、早速**ちはやふる**に近いアニメを10個探索してみましょう。

![mal19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217166/8a4c5639-0d43-d379-060d-3032ce034b2b.png)

結果は、ちはやふるの他のシリーズが上位なのは当然として、他に**君に届け**、**坂道のアポロン**と少女漫画 x スポ根といった感じでとても類似するアニメが探索されたと思います！

最後に、**恋は雨上がりのように**でも探索をしてみたいと思います。
恋雨はちはやふるに比べればマイナーなのでどんなアニメと類似するかが楽しみです。
個人的に夏雪ランデブーとかがヒットするとすごいなーって思いますね。なんとなく雰囲気似てませんか？？

ということで、

<br>
<br>
<br>
<br>
<br>

結果はこんな感じでした！


![mal20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1217166/1f13534f-3705-6756-fb51-02e742ca92a0.png)

ヲタクに恋は難しいが入ってくるのが分かるとして、まさかのクズの本懐が2番目に類似すると判定されました笑

たしかに、なんとなくダーク？な感じだったんですかね。

## おわりに

以上となります！
これまでお読み頂いた方はありがとうございました。
API使うの楽しいですね。
いろんなサービスがマッシュアップ的に連携することに夢を感じます。
今回はデータセットを作るというお話でしたが、いよいよKaggleコンペの方にも参加したいですね。

それでは、また


## 参考

1. [機械学習を使って630万件のレビューに基づいたアニメのレコメンド機能を作ってみよう（機械学習 k近傍法 初心者向け）](https://www.codexa.net/collaborative-filtering-k-nearest-neighbor/)