ページ

2016年9月2日金曜日

【R】 東日本大震災復興の調査データ分析(8)


日本の新聞は全部書いていることが同じなのか?トピック分析で見る新聞社説|CodeIQ MAGAZINE

前回までオーソドックスなLSA(潜在意味分析)を実際のデータに適用してみた。まあまあの結果であったと思う。

今回はLSAをさらに先に進めたLDA(潜在ディリクレ・アロケーション・別名:トピックモデル)に取り組んでいきたい。

参考文献としては、右の本と上のリンクを使ってみる。



LDAとは

言ってみれば、数量データにおいて主成分分析と因子分析の違いに対応するものが、テキスト分析におけるLSAとLDAの違い、ということが出来るだろう。さらに、ベイズ推定を積極的に使っている、というところに特徴がある。そのため、ベイズ統計/機械学習に特有の言い回しが頻出するが、それが本質なのではない。そうではなく、確率モデルとして明示されているかどうか、が重要である。(機械学習的側面については、別稿で解説しよう。)

LDAに取り組むには、LSAの仕組みを頭に入れておいた方が良い。というのも使うデータ(=文書・ターム行列)は共通で、出てくる出力の意味合いも本質的には同じだから。

【準備1】 トピックとは


命題A「(同じ)タームでもトピックによって出現頻度は異なる」
↓↑
命題B「(同じ)タームの出現頻度の違い、がトピックを特徴づける」

命題Aと命題Bは同じことを言っている。しかし、命題Bは実質、トピックの定義を述べているのと同じだ。

あるトピックkにおけるタームvの出現確率をφkvと表現する。
\[
\phi_{kv} ; k=1 \cdots K, v=1 \cdots V
\]
これを束ねたものを考える(ターム分布)。
\[
\phi_{k} = \{ \phi_{k1}, \phi_{k2}, \cdots, \phi_{kv}, \cdots , \phi_{kV} \}
\]
ここで、
  1. トピックkは観測できない潜在変数である。トピック数Kがいくつになるのかは、集められた文書によって異なる。
  2. 高いφkvを持つタームvがトピックkを特徴づける。
  3. φkはディリクレ分布に従う確率変数である。
\[
\phi_{k} \sim \mbox{Dir}(\beta)
\]

【準備2】 トピック分布とは

ある文書dでトピックkが出現する確率をθdkとする。トピック分布θdはこれを束ねたものである。
\[
\theta_{d} = \{ \theta_{d1}, \theta_{d2}, \cdots, \theta_{dk}, \cdots , \theta_{dK} \}
\]
θdはディリクレ分布に従う確率変数である。
\[
\theta_{d} \sim \mbox{Dir}(\alpha)
\]

【準備3】 ある文書におけるタームとトピックの対応

(例)
play : 音楽関係の文書中において「演奏する/演奏」
play : 演劇関係の文書中において「上演する/演劇」
play : スポーツ関係の文書中において「試合する」

文書d中のi番目のタームをwdiとする。
wdiというタームに対応するトピックをzdiとする。

ここで、次の原則を決める。

トピックk=zdiが同一 ⇒ タームwdiの出現確率は等しい

zdiとwdiは次のように、それぞれ多項分布に従って発生するものと考える。

\[
\begin{eqnarray} & z_{di} & \sim \mbox{Multi}(\theta_{d}) \\ w_{di} \sim & \mbox{Multi}(\phi_{z_{di}}) & \end{eqnarray}
\]

【全体像】 以上の準備を一つにまとめると次のような定式化が得られる。これがLDAである。


wdiはターム文書行列であり、これをうまく説明する潜在変数トピックをベイズ的に推定していくのである。

RにおけるLDA:topicmodelsパッケージ
topicmodels
topicmodels: An R Package for Fitting Topic Models

LDAをR上で使うには現時点で選択肢が二つほどあるそうだが、今回はその一つtopicmodelsパッケージを活用する。インストールはCRANで他のパッケージと同様のやり方で出来る。主要な関数としてLDA(latent Dirichlet allocation)とCTM(correlated topics model)の二つがあるそうだ。今回はLDAだけ使ってみる。

分析の実際

冒頭で紹介しているサイトとまったく同じようにやってみた。文書ターム行列は整数以外のものが入っているとエラーが出るようなので、今回は重み無しで計算している。また、行和、列和が0の場合もエラーが出るので該当する行または列を削除しておく必要がある。デフォルトの推定方法VEMというのは、VariableEM法という一種のEMアルゴリズムである。トピック数は10を指定しているが、これは特に根拠があるわけではない。

>o <- LDA(t(dt), 10, control=list(verbose=1))
> terms(o,5)
     Topic 1 Topic 2  Topic 3  Topic 4 Topic 5 Topic 6 Topic 7    Topic 8
[1,] "水産"  "回復"   "工事"   "ない"  "高台"  "地元"  "再建"     "生活" 
[2,] "業"    "多い"   "防潮堤" "年"    "世帯"  "ない"  "完成"     "者"   
[3,] "ない"  "震災前" "道路"   "復興"  "場所"  "店"    "住宅"     "町"   
[4,] "不足"  "ない"   "建設"   "震災"  "避難"  "仕事"  "公営住宅" "不安" 
[5,] "沿岸"  "関係"   "津波"   "復旧"  "移転"  "高い"  "仮設"     "家"   
     Topic 9      Topic 10
[1,] "ない"       "整備"  
[2,] "防災"       "ない"  
[3,] "目"         "回復"  
[4,] "災害"       "活気"  
[5,] "まちづくり" "良い

上で、各トピックについて、出現頻度の高いタームを表示させている。「ない」というのが重要なタームに位置付けられており、これまでのLSAとは異なる様相を見せている。また、今回は単なる類似度ではなくトピックとの対応関係が直接得られているので、ネットワークのような形で見るよりもより明瞭に区分が出来ている。

トピックごとの文書数は次のようにして分かる。全部で506の文書が概ね均等に分類されているように見える。1トピックあたり50程度の文書があるので、これが多いと見るならば更にトピックを多くしてみても良いかもしれない。

> table(topics(o))

 1  2  3  4  5  6  7  8  9 10 
48 48 66 59 40 43 57 45 41 59 


続いて、各文書で何がもっとも重要なトピックとなっているかを示す。

> head(topics(o))
OBS.1 OBS.2 OBS.3 OBS.4 OBS.5 OBS.6 
    2     8     8     2     8     7 

OBS.1と4がトピック2、OBS.2、3、5がトピック8に分類されていることが分かる。元のデータでは次のようになっている。トピック2では居住環境について肯定的または知らないという回答、トピック8では周辺整備の遅れや人口流入に支障が出ていること、復興が進んでいないこと、など否定的な回答が多いようである。

> cat(docu0[c(1,4)])
/道路/居宅/復旧/進む/震災前/水準/回復
 /今年/4月/大槌町/居住/回復/分かる/ない
> 
> cat(docu0[c(2,3,5)])
/災害復興住宅/個人住宅/建設/進む/町並み/変化/周辺整備/遅れ
 /賃貸住宅/家賃/住宅/取得/費/高騰/人口流入/支障/出る
 /盛岡市/転居/率直/感想/復興/進む/ない

試みにトピック数を倍の20としてみる。

> terms(o2,5)
     Topic 1    Topic 2 Topic 3  Topic 4 Topic 5 Topic 6    Topic 7 Topic 8
[1,] "公営住宅" "完成"  "震災前" "再建"  "ない"  "者"       "現在"  "高台" 
[2,] "入居"     "年"    "回復"   "住宅"  "整備"  "仕事"     "世帯"  "造成" 
[3,] "災害"     "震災"  "本設"   "復興"  "生活"  "高齢"     "年"    "地"   
[4,] "仮設住宅" "整備"  "施設"   "自宅"  "安心"  "復興"     "月"    "家"   
[5,] "私"       "目"    "店舗"   "多い"  "先"    "基盤整備" "熊本"  "移転" 
     Topic 9  Topic 10 Topic 11 Topic 12 Topic 13   Topic 14 Topic 15
[1,] "生活"   "工事"   "避難"   "仮設"   "回復"     "地元"   "住民"  
[2,] "経済"   "防潮堤" "場所"   "店"     "水産"     "人口"   "関係"  
[3,] "事業"   "建設"   "高台"   "活気"   "業"       "情報"   "防災"  
[4,] "多い"   "海"     "漁業"   "支援"   "順調"     "あと"   "安全"  
[5,] "被災者" "水門"   "不足"   "ない"   "地域経済" "雇用"   "営業"  
     Topic 16 Topic 17 Topic 18 Topic 19   Topic 20
[1,] "道路"   "変化"   "求人"   "復興住宅" "復旧"  
[2,] "ない"   "高い"   "必要"   "津波"     "良い"  
[3,] "地区"   "時間"   "養殖"   "新しい"   "間"    
[4,] "土地"   "高齢"   "早期"   "仮設住宅" "不安"  
[5,] "嵩上げ" "被災"   "ワカメ" "建設"     "区域"  
> table(topics(o2))

 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 
27 30 23 34 31 33 16 22 22 38 22 30 25 18 25 23 23 14 26 24 

一番少ない文書数のトピックは7であり、「熊本」というタームが含まれている。被災が全国に拡大することによる影響を論じていると思われる。一番多い文書数のトピックは10であり、「防潮堤」に関わるものである。

> sort(topics(o2)[1:20])
OBS.12 OBS.16  OBS.9 OBS.18 OBS.20  OBS.6  OBS.8  OBS.1  OBS.5 OBS.14 OBS.15 
     1      1      2      2      3      4      4      6      6      6      6 
 OBS.7 OBS.13 OBS.17  OBS.4 OBS.19  OBS.2  OBS.3 OBS.10 OBS.11 
     7      8      8      9     11     12     17     17     17 

最初の20文書のトピックを示したもの。トピック6と17が多いので、元の文書を表示させてみる。これを見るとトピック17は明確に人口流出や人口減少を話題にしていることが分かる。

> cat(docu0[c(1,5,14,15)])
/道路/居宅/復旧/進む/震災前/水準/回復
 /盛岡市/転居/率直/感想/復興/進む/ない
 /移転者/住居/建築/時期/目途
 /移転者/建築費用/増える/見込む/やりくり/頭/痛める
> cat(docu0[c(3,10,11)])
/賃貸住宅/家賃/住宅/取得/費/高騰/人口流入/支障/出る
 /雇用/創出/回復/被災地域/問題/ない/一般的/社会問題/人口減少/高齢
/化/対策/取り組む/必要
 /被災/地域/被災/ない/地域/比べる/人口減少/高齢/化/速い
/進む/可能性/高い

まとめ

LDAはLSAと比べると文書とトピックとのつながりが明快であるという点では優れているように見える。トピック数を具体的にどのように設定するかは、クロス・バリデーションなどの方法があるようだが、試行錯誤することでなんとか決める方が早いかもしれない。

次はトピック情報を元のデータに戻して一覧表を作成すること。その一覧表が妥当な分類であるのかどうか判断すること。仮に妥当な分類であったとして、それと5段階の進捗度判断、生活・経済・防災の3分野区分との整合性を確認すること。仮に整合していない場合に、判断の揺らぎとして、それを回答者属性から説明できるか検討すること、などの課題が残されている。

次回、頑張る。