計量政治学・NLPでAmazonのユーザーがどんな情報を求めているのかを可視化する

## はじめに

テキストデータが結果変数に対してどのような効果があるのかを可視化するのは、ビジネスや政策の意思決定において重要である。例えば、ユーザーが興味を示しやすい内容をモデルで可視化し、これをTVCMやOOH広告の内容設定に活用すれば、広告施策のROIの向上が期待される。また、SNS広告でも、ユーザーが好きそうな内容を投稿した方がエンゲージメントが高くなるので、テキストの効果の可視化は重要である。

## 手法紹介

テキストデータの結果変数に対する効果を分析する手法は色々あるが、本記事では、Fong and Grimmer（2016）で提案された、教師ありインドビュッフェ過程モデル（supervised Indian Buffet Process、以下ではsIBPと略す）を紹介する。

sIBPの発想は単純で、まずテキストデータの中からトピックを特定して、トピックを処置変数（特徴量）として使えば、テキストデータ（実際はトピック）の結果変数への効果を測定できるという考えである。

単語自体の効果を測定する考えもあるが、大量の効果の高い単語の羅列より、単語のまとめであるトピックの方が解釈しやすいという理由が考えられる。

sIBPはトピックモデルの一種だが、LDAとSTM（https://qiita.com/Gotoubun_taiwan/items/9a7667c98443f2beef3d ）とは本質的に異なる部分がある。LDAとSTMなどの一般的なトピックモデルでは、一つの文書は複数のトピックの混合から生成されたと仮定するが、トピックの割合は足したら必然的に1になるという弱みがある。具体的にいうと、トピック数が3の時、トピック1の割合が上がったら、トピック2とトピック3の割合がは必然的に下がり、トピック同士の割合に相関が発生し、個々のトピックの単独の効果の測定は難しくなる。この問題は、文書のランダムな割り当てで解決できない数学的な運命である。

Fong and Grimmer（2016）は、トピックを全部足し合わせたら1になる単体（simplex）の形式ではなくバイナリベクトルの形式にし、かつ普通のインドビュッフェ過程モデルとは違って結果変数も考慮できる手法として、sIBPを提案した。

詳細はFong and Grimmer（2016）のp. 1604辺りを確認することを強くお勧めするが、概念を簡単に説明すると、全ての文書には潜在変数としてトピックが存在し、そのトピックによって文書と結果変数が生成されたというベイズモデルである。

sIBPが測定するのは、個々のトピックのAverage Marginal Component Specific Effect（AMCE）で、言葉で簡潔にいう言うと、例えば5つのトピックがある場合、トピック1がある時とない時の結果変数の平均的な差をトピック1のAMCEとする。詳細の式と平均の取り方はFong and Grimmer（2016）のp. 1602にある。

sIBPの応用例は主に政治学にあり、例えばFong and Grimmer（2019）で紹介された、アメリカの有権者はトランプ前大統領のツイートの内容をどう評価するかの分析や、Esberg（2020）で紹介された、どんな映画が政府に禁止されやすいのかの分析がある。

sIBPに関する議論に興味ある方はEgami et al.（2018）とGrimmer, Roberts, and Stewart（2022）を強くお勧めする。

## 分析
本記事では、事例としてAmazonのどんなレビューが他のユーザーからの「役に立った」につながりやすいのかを分析する。また、データ量を減らすため、対象をモバイルアプリ類の商品に対するレビューのみにする。

データの準備や別手法で実行しら似たような分析は筆者の以前の記事を参照していただきたい。

https://qiita.com/Gotoubun_taiwan/items/777f537c315cd9e59757

```r
library(RMeCab)
library(tidyverse)
library(quanteda)
library(texteffect)
url  <- 'https://s3.amazonaws.com/amazon-reviews-pds/tsv/amazon_reviews_multilingual_JP_v1_00.tsv.gz'
amazon_df <- read_tsv(url)

amazon_sub_df <- amazon_df %>%
  filter(product_category == "Mobile_Apps")
```

次に、MeCabを利用して名詞だけ残した上で、Quantedaに入れやすい形式に整形して、Quantedaを利用して文書行列を作成する。

```r
review_mecabbed <- c()

for (i in 1:nrow(amazon_sub_df)){
  this_review <- str_replace_all(amazon_sub_df$review_body[i], "[^一-龠ぁ-んーァ-ヶー]", " ")
  mecab_output <- unlist(RMeCabC(this_review, 1))
  review_mecabbed[i] <- str_c(mecab_output[which(names(mecab_output) == "名詞")], collapse = " ")
}

sibp_sub_review_dfm <- review_mecabbed %>%
  phrase() %>%
  tokens() %>%
  dfm() %>%
  dfm_trim(min_termfreq = 50, max_termfreq = 400)
```
続いてモデルの推定であるが、ハイパーパラメーターとしてトピック数Kの他に、alphaとsigmasq.nがある。alphaは一つの文書が持つトピックの数の期待値で（Doshi et al., 2009）、sigmasq.nはトピックのテキストに対する解釈力である。ここは本来緻密なチューニングをお請わないといけないが、本記事では一旦K = 3、alpha = 1、sigmasq.n = 0.8でモデルを実行してみる。

ハイパーパラメーターの他に、トピックの構造を推定する訓練テータを決めないといけない。理由としては、同じデータでトピック構造とトピックの効果を推定すると過学習やPハッキングにつながる恐れがあるからである（Fong and Grimmer, 2016）。この発想は因果機械学習でよく利用される一般化ランダムフォーレストの誠実性に近い概念で、詳細はAthey, Tibshirani and Wager（2019）とWager and Athey（2018）を参照してください。

また、39.98%のレビューに「役に立った」がついておらず、いわゆるデータの不均衡の問題があるため、本分析ではまず一つ以上の「役に立った」を得たレビューを先に抽出してから、同じ数の「役に立った」なしレビューを抽出する。

```r
set.seed(1234567)
sibp_nonzero_train_id <- sample(which(amazon_sub_df$helpful_votes != 0), 
                           round(length(which(amazon_sub_df$helpful_votes != 0)) * 0.2),
                           replace = FALSE)

sibp_zero_train_id <- sample(which(amazon_sub_df$helpful_votes == 0),
                             length(sibp_nonzero_train_id),
                             replace = FALSE)

sibp_train_id <- c(sibp_nonzero_train_id, sibp_zero_train_id)

m_sibp <- sibp(X = sibp_sub_review_dfm,
               Y = amazon_sub_df$helpful_votes, 
               K = 3,
               alpha = 1,
               sigmasq.n = 0.8,
               train.ind = sibp_train_id)

```

## 可視化

ここでは、まずsIBPが訓練データで学習した5つのトピックの内容を見てみよう。

```r
> sibp_top_words(m_sibp, colnames(sibp_sub_review_dfm), 20, verbose = TRUE)
[1] "Frequency of treatments: "
[1] 1673.8190  121.9989   40.0000
[1] "Relation between top words and treatments"
           [,1]     [,2]     [,3]
[1,] 0.05026009 1.685010 3.351490
[2,] 0.04327112 1.498575 2.954287
[3,] 0.03785673 1.454392 2.725117
[4,] 0.03732153 1.400399 2.587784
[5,] 0.03502316 1.382365 2.587777
[6,] 0.03442568 1.326079 2.566425
      [,1]         [,2]         [,3]    
 [1,] "つぶし"     "場合"       "可能"  
 [2,] "子ども"     "敵"         "辺"    
 [3,] "暇"         "それぞれ"   "ページ"
 [4,] "歳"         "キャラ"     "上記"  
 [5,] "続編"       "通信"       "月"    
 [6,] "夢中"       "作品"       "存在"  
 [7,] "暇つぶし"   "目"         "あと"  
 [8,] "暇潰し"     "部分"       "コレ"  
 [9,] "コメント"   "ジャンプ"   "ノート"
[10,] "ーー"       "個"         "興味"  
[11,] "もん"       "面"         "追記"  
[12,] "脳"         "タップ"     "改善"  
[13,] "息子"       "後"         "気持ち"
[14,] "お願い"     "効果"       "容量"  
[15,] "すぎ"       "裏"         "データ"
[16,] "毎日"       "破壊"       "自体"  
[17,] "画質"       "ロック"     "台"    
[18,] "遊び方"     "アクション" "系"    
[19,] "クラッシュ" "化"         "変更"  
[20,] "電卓"       "相手"       "サイズ"
```

トピック1は、どちらかというとあまり具体性のない個人的な感想で、トピック2は内容に関する感想で、トピック3は内容以外に対する感想と言えよう。

ではこの3つのトピックは「役に立った」の数にどう影響するかを確認する。ここで気をつけるべきこととして、sIBPのパッケージの効果量作図関数はデフォルトだと切片も描画してしまう。切片は特に興味の対象ではないので切片を除いて描画する。

```r
m_sibp_amce <- sibp_amce(m_sibp, 
                       X = sibp_sub_review_dfm, 
                       Y = amazon_df$helpful_votes)
#切片を除くため-1
sibp_amce_plot(m_sibp_amce[-1,])
```

![amce.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2257087/3f8b0d55-2922-d292-762b-c3c7983239ef.png)

ここで、内容に関する感想であるトピック2（Feature 3）の「役に立った」に対する効果が一番大きくて統計的に有意ということが確認された。


## 参考文献
Athey, Susan, Julie Tibshirani, and Stefan Wager. "Generalized random forests." The Annals of Statistics 47.2 (2019): 1148-1178.

Doshi, Finale, et al. "Variational inference for the Indian buffet process." Artificial Intelligence and Statistics. PMLR, 2009.

Egami, Naoki, et al. "How to make causal inferences using texts." arXiv preprint arXiv:1802.02163 (2018).

Esberg, Jane. "Censorship as reward: evidence from pop culture censorship in Chile." American Political Science Review 114.3 (2020): 821-836.

Fong, Christian, and Justin Grimmer. "Discovery of treatments from text corpora." Proceedings of the 54th Annual Meeting of the Association for Computational Linguistics (Volume 1: Long Papers). 2016.

Fong, Christian, and Justin Grimmer. "Causal inference with latent treatments." American Journal of Political Science (2019).

Grimmer, Justin, Margaret E. Roberts, and Brandon M. Stewart. Text as data: A new framework for machine learning and the social sciences. Princeton University Press, 2022.

Wager, Stefan, and Susan Athey. "Estimation and inference of heterogeneous treatment effects using random forests." Journal of the American Statistical Association 113.523 (2018): 1228-1242.