甘味処。

甘いものの話はたぶんしません。

ゼミの夏期課題の話

はじめに

今日も暑いですね。夏休みに頑張っていたゼミ課題の話をします。

春学期は指定された教科書を使ってR言語に触れていました。

課題は「Rでオリジナルのデータを扱う。」ということで、Twitterのデータを取得して遊びました。

Rによるデータサイエンス データ解析の基礎から最新手法まで

Rによるデータサイエンス データ解析の基礎から最新手法まで

動機

Twitterを使おうということは早い段階から決めていました。 自分はTwitterのリスト機能をよく利用するのですが、極度の面倒くさがりなので、

  • リストにユーザー追加を自動化したい

  • ツイートを見ずに概要を把握したい

という動機に基づいて「フォローユーザーのクラスタ分析」及び「ツイートの形態素解析」を行いました。

手法

フォローユーザーを分類するための手法として2パターン考えました。

  • 同じ傾向のツイートがあるかどうかで判別する

  • ユーザー同士につながり(フォロー関係)があるかどうかで判別する

    • ネットワーク分析

順番に手順と結果を述べていきます。

ツイートの傾向で判別する

手順

1. データを収集する
  • タイムラインのツイートを1週間分遡って取得しました。

  • TwitterRを使う手もあったのですが、慣れていたのもあってpython3+Tweepyでタイムラインのツイート収集を行いました。

2. Rで形態素解析
  • 取得したツイートから名詞に絞って形態素解析を行います。

  • RMeCabに含まれる関数、docMatrix()を用いました。

library(RMeCab)

data<-docMatrix("data/",pos=c("名詞"))

data.d<-dist(t(data))

clust<-hclust(d=data.d)

plot(clust)

3. 返り値をplotする
  • デンドログラムに表しました(結果を黒塗りにしています)。

f:id:kanzarashi:20171202222814p:plain

結論

上の図のようにうまくいきませんでした。原因として、

  • フォローしている人同士の話題が近く、違うカテゴリに入れたい人が似たような話をしている

  • あまりツイートが少ない人は分析が行いづらい

等が挙げられると思います。

ユーザー同士につながり(フォロー関係)があるかどうかで判別

手順

1. データを収集する
  • 自分のフォローしたユーザーそれぞれについてフォローしているユーザーの情報を収集しました。

  • データの収集はpython3+Tweepyで行いました。

2. Rでネットワーク分析
  • 自分がフォローしているユーザーについて、フォロー関係の有無を調べました。

  • パッケージのigraphを用いて、コミュニティ分析を行いました。分割には辺媒介性分割を用いました。

library(igraph)

d <- read.table("clustdata.txt")

g <- graph.data.frame(d,directed = FALSE)

plot(g, vertex.label="",vertex.size=10)

eb <- edge.betweenness.community(g)

V(g)$color <- eb$membership

plot(g,vertex.label="",vertex.size=10)

結果

f:id:kanzarashi:20171202222801p:plain

先ほどよりも良い感じに分かれているような気がします。

それぞれに名前を付けると多少誤差はあるものの、以下のようになりました

A(緑)  先輩、教授などFMS関連の人

B(黄橙) 他のクラスタに含まれなかった人(デザイナーさんやbot)

C(赤橙) 学外の友人(オタク)

D(濃青) 高校の友人とbot

E(薄青) 後輩(5期生)

F(黄)  同期(4期生)

クラスタ内のトレンドを取得

フォロー関係でのクラスタ分析がうまくいった(主観)ので、当初の目標だったトレンド取得をします。

手順

1.クラスタ内のユーザーをリストに登録

eb1<-RMeCabFreq("eb1.txt")

eb1<-eb1[eb1$Info1=="名詞",]

eb1<-eb1[eb1$Info2=="一般"|eb1$Info2=="固有名詞",]

eb1<-eb1[order(eb1$Freq,decreasing = T),]

2.成形したデータを用いてリストを作成

https://github.com/aukkeyikon/list_share/addListUser_fromText.py

3.リスト内のタイムラインを取得
4.取得したデータから頻度分析

eb1<-RMeCabFreq("eb1.txt")

eb1<-eb1[eb1$Info1=="名詞",]

eb1<-eb1[eb1$Info2=="一般"|eb1$Info2=="固有名詞",]

eb1<-eb1[order(eb1$Freq,decreasing = T),]

結果

A B C D E F
オタク 自分 口座 S 成績
自分 たより 残高 バイト GPA
メッキ イケ 先生 バイト
感じ 大人 自分 GPA 基礎
あと Twitter グラブル 余裕 中野 自分

結果がわかりやすいように大学の成績発表の日程にトレンド取得しました。

以上の内容をゼミ合宿で発表したところ、教授からTF-IDF法について調べてはどうかという話がありました。

TF-IDF法を利用したトレンド抽出

当初提案された使い道は、グループ内の共通要素の削除でしたが、最終的に全トレンド要素が失われてしまいました。

原因としてはデータが少なかったためにトレンドも共通要素に含まれてしまったことが挙げられます。

そこで、データ数を補うためにも、全グループに共通する要素を削除します。

data<- as.data.frame( docMatrix( "作業用ディレクトリ", pos=("名詞"), weight = "tf*idf" ) )

ここで抽出されたデータ上位20件をクラスタ別の頻度分析用のデータから除外しました。

結果

A B C D E F
シナリオ メッキ イケ 入金 統計 基礎
ポスター 自分 たより GPA 成績
オタク 信頼 ショット 口座 S 去年
映像 セカンド 残高 概論 GPA
スタフィー 油田 中野 自分

先ほどよりも話している内容が想像できそうなトレンドになりました。

B,Cのグループについては個々人のツイートの頻度が少ないこともあって、特定のbot*1*2の影響が強くなっています。

まとめのようなポエム

ツイートの取得限界(APIでは1週間分)もあって、なかなか思うようにデータを取ることができませんでした。

時報のように「今何が話題だよ」と通知させる機構なども考えていたのですが、思ったよりも皆がツイートをしていないことを知りました。

夏休みの宿題、遅くなってしまいましたがこれにて完了です。

参考にさせていただいたサイト

ネットワーク分析をもうちょっと勉強 - でたぁっ 感動と失敗の備忘録

RパッケージRMeCabで用意されている関数

Rでネットワーク分析。指定Twitterユーザーのフォロー関係を可視化する。 - Qiita