TensorFlowでGoogle Playレビュー分析

## 摘要
- Google Play/App StoreのレビューにTensorFlowでタグを付けてレビューを分析
- タグを付けることでわかった傾向や知見について紹介
- 性能改善テクニックについても紹介

---
## はじめに
- アプリには大量のユーザーレビューが来るが，
    - どれから改善すればよいか分からない．
    - 何を改善すればよいか分からない．
    - 分類しようにも集計する時間が非常にかかる
- といった問題点があったので改善する社内ツールを作ってみた．

---
### やってみたこと
- Google PlayおよびApp Storeの売上上位アプリのレビューにタグ付け
- タグの種類はガチャや起動，通信，感度,音質といった改善に繋がりそうな項目17種

![image.png](https://qiita-image-store.s3.amazonaws.com/0/107399/3e937864-dfb2-efe3-b781-f6945846d798.png)

---
### タグ付けのメリット

- 人手による集計コストを削減できる．
- 共通の判断基準で集計できるので，異常に気づきやすい．
- タグごとの割合が分かるので，対策を立てやすい．
- 他タイトルとの比較もしやすい

---
### 調査概要

- Google Play/App Storeのレビューをタグ付することで傾向を分析
- 収集対象: 売上上位TOP100アプリの日本語レビュー
- 調査期間: 2015年1月 〜 2017年6月
- 調査件数: Google Play(310万), App Store(680万)

---
### 利用したタグ

| label | description |
|------|----------------|
| ポジティブ | 最高，楽しい，面白いなど好意的なレビュー |
| ネガティブ | つまらない，面白くないなど否定的なレビュー |
| 意見要望 | こういう機能を作って欲しいなど |
| バグ | 動かなくなった． 進めなくなった．など |
| 引き継ぎ | 端末を変えたので引き継ぎをしたいなど |
| 起動不備 | ゲームが立ち上がらないなど |
| ガチャ | ガチャの出が悪い．ガチャの確率がおかしいなど |
| 通信不備 | 通信エラー，ダウンロードやアップデートに失敗など |
| 音質 | 音質が悪いなど |
| 運営の対応 | 運営の対応が不誠実など |
| 容量 | ダウンロード量が多いなど |
| 感度 | タップしても反応しない/反応が悪いなど |
| パフォーマンス | カクつく |
| クラッシュ | プレイ中落ちたなど |
| バッテリー | バッテリーの減りが早い． 端末が熱くなるなど |
| 類似性 | パクリや機能が似ているなど |


---
### アプリによって改善項目は異なる！
- どこを直せばよいかはアプリによって様々
- バージョンや時期，評価値ごとに集計し可視化することが大事

---
#### 事例: タイトル1
![image.png](https://qiita-image-store.s3.amazonaws.com/0/107399/fe2f5d86-7558-1f70-0125-d75ce5e148bf.png)

- 低評価(☆3以下のレビュー)に付けられたタグの割合を表示
- リズムゲームなど反応がシビアな事例だと感度や音質，パフォーマンスといった問題が低評価要因となる．

---
#### 事例: タイトル2
![image.png](https://qiita-image-store.s3.amazonaws.com/0/107399/12b019a6-ce9e-d5b3-5563-04bc9ba3ed50.png)

- 低評価(☆3以下のレビュー)に付けられたタグの割合を表示
- 海外がメインだと通信が不安定だったりするので，別の問題が発生することが低評価要因となる．
- 注). このタイトルは海外レビューも含めています．

---
### バージョンアップ時が注意のタイミング！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/107399/94421bd3-da20-e32c-1227-c3f55501df28.png)

- 横軸:アプリのバージョン, 縦軸:当該バージョンでのタグの含まれるレビューの割合
- 問題をなるだけ早く検知して，しっかりと対策を次のバージョンでは行う．
- 不明なまま放置になるのが一番危ない
- 推移として眺めることで，慢性的な割り出せる．

---
### ひとつのタイトルのみで判断しない！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/107399/22e9fc3c-2ef3-791e-941d-288022a6bb8f.png)

- 横軸:売上順位, 縦軸:対象タグのレビューに含まれる割合
- タグの中にはどんなアプリでも，条件を満たすと一定割合含まれてしまうタグもある．
- すぐに改善しようとするのではなく一旦他タイトルと比較して落ち着いて判断することも大事．

---
### 評価値改善に繋げやすいタグは？

![image.png](https://qiita-image-store.s3.amazonaws.com/0/107399/6977f929-d3f8-af39-9ea5-386be8bb76ed.png)

- 横軸: 該当タグが含まれるレビューの割合
- レビューに付きやすいタグとしては，ガチャや起動不備，クラッシュ，運営の対応など

---
### タグごとの平均評価値は?

| label   | rating |
| -------- | ------ |
| ガチャ    | 3.16   |
| 起動不備   | <font color="Red">2.075</font> |
| クラッシュ | <font color="Red">2.642</font> |
| 運営の対応 | <font color="Red">2.473</font> |
| 通信      | <font color="Red">2.532</font> |

- レビューに付けられやすいタグTOP5の平均評価値
- 起動不備やクラッシュは致命的で，これらの問題点が発生すると一気に低評価要因となってしまう．

---
### タグごとの評価値の分布は? その1

![image.png](https://qiita-image-store.s3.amazonaws.com/0/107399/b8d0070e-e6dc-4248-4411-1139f89d1a4d.png)

- カッコ内は該当タグのレビューの平均評価値
- ポジティブな発言で低評価はあまりない(間違えて低評価などが多い)
- ネガティブな発言でも高評価はある．
- バグがあると基本的に低評価になる．

---
#### ネガティブだが高評価の例

![image.png](https://qiita-image-store.s3.amazonaws.com/0/107399/f0984b49-aa6d-8e6d-0d7a-8ece3a654167.png)

怒ってますが，評価高いです．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/107399/65c2b4cc-c3a4-18c8-6850-2f7c5a335ed9.png)

バグ?ですが当たっている気がします．

---
### タグごとの評価値の分布は? その2

![image.png](https://qiita-image-store.s3.amazonaws.com/0/107399/af03f0de-c73b-b190-5e0f-c7629e6b20cc.png)

- カッコ内は該当タグのレビューの平均評価値
- 起動しない, クラッシュがあると低評価になる傾向が強い．
- また通信(ダウンロードできない/時間がかかる)も低評価要因につながりやすい
- また運営の対応が不誠実だったりしても低評価になりやすい．

---
### データセット
- Google Play/App Storeレビューを約9万件
- 17種類のタグに対して約5000件ずつ用意し正例と負例に分ける
- 正例と負例のバランスが取れるよう重み付けを調整して学習

---
### 正答率は?
- 正例と負例を50:50にしたときの正答率は70〜95%
- バグや意見要望といった意味合いの広い問題で精度が落ちることが多い

![image.png](https://qiita-image-store.s3.amazonaws.com/0/107399/8546e777-57c3-231a-6d19-3f6f3f39494d.png)

---
## 分類してみて気づいたこと
- レビューの件名はそんなに重要ではない「あ」とか「それな」とかあまり重要ではない単語が多い．
- データ数を増やすのが一番性能改善に効果が高かった．

---
### Text Cleanは大事!
- レビューは口語が多いので，しっかりとテキストクリーニングしてあげる必要がある．

mecabで「ゲームさいこー」を変換すると，

```
$ echo "このゲームさいこー" | mecab
この	連体詞,*,*,*,*,*,この,コノ,コノ
ゲーム	名詞,一般,*,*,*,*,ゲーム,*,*
さ	名詞,接尾,特殊,*,*,*,さ,サ,サ
いこ	動詞,自立,*,*,五段・カ行促音便,未然ウ接続,いく,イコ,イコ
ー	名詞,固有名詞,組織,*,*,*,*
EOS
```

となり，どこかに行ってしまいそうな分かれ方になる．

```
$ echo "このゲーム最高" | mecab
この	連体詞,*,*,*,*,*,この,コノ,コノ
ゲーム	名詞,一般,*,*,*,*,ゲーム,*,*
最高	名詞,一般,*,*,*,*,最高,サイコウ,サイコー
EOS
```

そのため，「さいこー」を「最高」にするなど，多少手間であっても変換して上げたほうが性能が上がる．

---
### 運用時の注意点
- 共通の判断基準で集計することが大事なので，モデルを更新した場合は再度全部タグをつけ直す必要がある

---
### まとめ
- Google Play/App Storeのレビューにタグを付けて集計することで見えてくる問題について紹介
- アプリによって改善項目は異なるので，集計して見極めることが大事！
- 機械学習を用いた分類は完璧ではないかもしれないが，傾向としてみれば有用な技術
- Google Play/App Storeのレビューは異常の発見や改善状況の確認に有用
- TensorFlowを使えばレビュー分類も簡単
- 評価というものは相対的なもの．他アプリと比較して見極める．
- Google Play Developer Consoleにもアプリのレビュー分類機能があるので試してみては？

---
### References.
[1]. [いますぐ使える単語埋め込みベクトルのリスト](http://qiita.com/Hironsan/items/8f7d35f0a36e0f99752c)
[2]. [Pre-trained word vectors of 30+ languages](https://github.com/Kyubyong/wordvectors)
[3]. [fastTextの学習済みモデルを公開しました](http://qiita.com/Hironsan/items/513b9f93752ecee9e670)
[4]. [The List of Pretrained Word Embeddings](http://ahogrammer.com/2017/01/20/the-list-of-pretrained-word-embeddings/)