【機械学習】クラウドソーシングを利用して、COTOHAに対抗した独自AIモデルを作ってみた

## 概要
文書からユーザーの特性を推定するAIを作ったため、その際の作業についてまとめる。
　
## 背景

従来のマーケティングの手法としてマスマーケティングが主流であった。しかしながら近年、消費者の価値観が多様化しており、居住地・年齢・趣向・行動パターンなど特定の属性ごとの固まりに分けるセグメンテーションを活用し、マーケティング効果の最大化を図る機械が多くなった。

一方、近年ではパソコン及びスマートフォンの普及により、誰もが情報を発信できる時代となった。この発信された情報がどのような特性を持つユーザーに支持されているのか知ることができれば、すなわち発信された情報が意識的・無意識的に関わらずどのセグメンテーションに向けた情報なのかを知ることができれば、マーケティングを最適化することができる。
ネットで調査したところ、COTOHAからユーザー推定(β版)のAPIが公開されていたものの、利用数の制限、精度、商用利用における制限から、今回独自に開発するに至った。


## セグメンテーション
マーケティングにはセグメンテーションという概念がある。これは顧客を分類する方法を指し、居住地・年齢・趣向・行動パターンなど特定の属性ごとの固まりに分けて市場を細分化する方法である。セグメンテーションには大きな分類として以下の変数がある。

- 地理的変数（ジオグラフィック変数）
  - 地域、人口、気候、文化・生活習慣、宗教、政策

- 人口動態変数（デモグラフィック変数）
  - 年齢、性別、職業、所得、家族構成

- 心理的変数（サイコグラフィック変数）
  - 価値観、趣向

- 行動変数
  - 曜日、時間、経路、頻度


## COTOHAとは

COTOHAとはNTTコミュニケーションズより提供されるAI機能のAPI群。

以下、公式ページより。
https://api.ce-cotoha.com/contents/index.html

```
COTOHAは、NTTグループの40年以上にわたる日本語処理技術から生まれた日本語ネイティブの言語AIです。
```

研究や勉強などの目的であれば、使用数に制限があるものの、基本的に無料で使うことも可能。(商用利用の場合には13万円/月)

現在、提供されているAPIは以下。

- 構文解析
- 固有表現抽出
- 固有名詞(企業名)補正
- 照応解析
- キーワード抽出
- 類似度算出
- 文タイプ判定
- ユーザ属性推定(β)
- 言い淀み除去(β)
- 音声認識誤り検知(β)
- 感情分析
- 音声認識
- 音声合成
- 要約
- テキスト分類

- ユーザ属性推定(β)
今回調査したのはこのユーザ属性推定API
以下、公式ページの説明

```
文章からユーザの年代、職業などの属性を推定します。
年代、性別、趣味、職業などの人物に関する属性を推定するRESTful API です。
twitterにおけるユーザのtweetやprofileの入力を前提とするようにチューニングをしています。
```

twitterユーザーを指定すると、以下の情報を推測することが可能。

```
{
  "result" : {
    "age" : "40-49歳",
    "civilstatus" : "既婚",
    "earnings" : "不明",
    "gender" : "不明",
    "habit" : [ "ALCOHOL" ],
    "hobby" : [ "ANIMAL", "COOKING", "FISHING", "FORTUNE", "GAMBLE", "GRUME", "GYM", "INTERNET", "MOVIE", "PAINT", "SHOPPING", "STUDY" ],
    "kind_of_business" : "不明",
    "kind_of_occupation" : "不明",
    "location" : "不明",
    "moving" : [ "RAILWAY" ],
    "occupation" : "会社員",
    "position" : "不明"
  },
  "status" : 0,
  "message" : "OK"
}
```

# 開発の流れ
今回COTOHAのユーザ属性推定(β)相当を開発するが、流れは以下。

- データ収集
- 実装
  - AI開発
  - アプリケーション化

# データ収集
AI開発にあたり、データが必要なため、収集を行う。手順は以下

1. twitterAPIを使用して、ランダムにユーザーをサンプリング
2. 各ユーザーがどのような属性を持っているか調査の上、タグ付け。なおタグの内容は地理的変数および人口動態変数に絞った以下。
  - 種別
  - 年齢
  - 職業
  - 職種
  - 婚姻
  - 地域
  - 趣味

2の作業は1人で行うと開発時間に莫大な時間がかかってしまうため、crowdworksやlancersを使ったクラウドソーシングで集めた。

- 依頼シート
![bef.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573779/a79d7f5f-6dee-a4fb-e36b-d11005ac4a9f.png)

- 完成イメージ
各ユーザーの属性を埋める。
![aft.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573779/93f77cfd-1969-8c84-30c0-96705e4eb941.png)

6000件文のタグ付け作業を発注し、約4400件のデータが集まった。


# 分析
より客観的なAIを作るためには、データに偏りがあると好ましくない。データに偏りがある場合、過学習を起こす原因となる。
しかしながら上記で収集したデータを分析してみると、各要因ごとの数に大きな偏りがあることがわかる。
今回データをツイッターを通して収集したことにより、社会的な傾向、およびtwitterのユーザー層の傾向がそのまま現れる形となった。

- gender　　
男女比に若干差はあるものの、大まかには同じ数のデータの収集ができている。なお、LGBTを一定数含んでおり、現実から大きく乖離のないデータと考えられる。
![gender.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573779/7d3b4e26-e551-5f11-688c-642734f0c7ed.png)

- age　
圧倒的に20代のユーザーが多く、10代、30代がそれに続く形となっている。40代以降のユーザーデータがほとんどなく、AIに40代以上のユーザーのデータを使用した学習が行えない。よってAIが40代以上のユーザーの認識精度が大きく下がるものと推定される。

![age.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573779/3d4e7352-a918-0681-2cde-627bbc8b1f47.png)

- region　　

関東在住者が飛び抜けて多く、2番手の関西の2倍以上となっている。これは各地域の人口比と類似の傾向を示していると言える。
また気になった点として、関東在住者、関西在住者は自身の居住地について何かしらわかるような情報を記載するのに対し、地方在住者は自身の居住地について記載をしていることが少ない。
県別で調査をするとより顕著で、東京在住者のデータは数件集まるのに対し、地方都道府県に関しては1〜2件しかデータが集まらないものもあった。なお北海道在住者は自身が北海道在住であるとプロフィールに記載する人が多いという面白い傾向もあった。

![region.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573779/45169756-7187-9867-8c5f-aeca7a9d379c.png)

- job　　

現実世界での割合と比較し、twitterで集めたデータでは学生の割合が高めである。また無職の人数が自営業を超えるなど傾向に偏りがでた。

![job.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573779/34c99423-0156-77f4-d764-018917cb96e9.png)


- marriage

現実世界での割合と比較し、twitterで集めたデータでは未婚者の割合が非常に多い。


![marriage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573779/1d35af91-b86e-1e76-ecab-537681fa8d76.png)

- hobby

twitterで集めたデータ上では、ゲームを趣味としているユーザーが圧倒的に多かった。
感覚的に身の回りには、車バイク、スポーツ、音楽鑑賞を趣味にしている人も多いと感じるが、
収集データではゲームを趣味としている人の1/10程度であった。

![hobby.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573779/f7bbdc6d-4ab9-3412-1a19-16c407c1259b.png)

上述のとおり、学習を行う際にはデータの偏りに気をつける必要がある。
そのため、データ数の多すぎるものに関しては、せっかく収集したものの、学習への利用は控える。

# 実装

- AI

AI学習の手法はすぐに思いつくもので以下。

- DeepLearning
- SVM
- NaiveBayes

今回は簡単に作るため、NaiveBayesを使用。

https://qiita.com/asakbiz/items/73c552babd3bbca987f9

- アプリケーション

簡単なコンポーネント図は以下
![compo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573779/3bb62fb7-a002-7c56-7711-3b599ac8f55b.png)

アーキテクトは3層構造とし、DatabaseにはFirebaseを使用する。
本アプリでは入力にツイッターユーザーを指定し、各ユーザーのフォロワーがどのような属性を所有しているのかを推定する。

# 結果
以下は、アプリケーションを開発し、とあるtwitterユーザーのフォロワーに対して、プロフィール推定を実行し、傾向をChart.jsで表示したもの。

![chart1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573779/362c1690-999c-bcb9-bf25-f53affffd0d4.png)
![chart2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573779/35d01b79-34da-032e-1495-0ce9f67343bd.png)

# まとめ

- 大まかな実装ができ、動作確認が行えた
- 精度に課題あり。とくにtwitterではユーザー情報を記載しているユーザーが少なく、学習、推定ともに障害となっている。