TwitterをRで遊ぶ。
TwitteRパッケージを使ってみたくて、Twitterのアカウントを取りました。
Bob#3 (bob3bob3) on Twitter。
myuheさんの記事を参考にして、自分がフォローさせていただいている40名の人たちの分布を見てみたいと思います。
まずはフォロー数、被フォロー数、つぶやきの数のデータを吸い出して、分析用に整える。
library(twitteR) init <- initSession("bob3bob3", "**********") followlist <- userFriends("bob3bob3",init) size <- length(followlist) follow <- follower <- status <- numeric(size) name <- character(size) for (i in 1:size){ follow[i] <- followlist[[i]] @ friendsCount #フォロー数 follower[i] <- followlist[[i]] @ followersCount #被フォロー数 status[i] <- followlist[[i]] @ statusesCount #つぶやきの数 name[i] <- followlist[[i]] @ screenName #スクリーンネーム } df <- data.frame(follow, follower, status) rownames(df) <- name
これで準備完了。
まずはヒストグラムを描いてみましょう。
par(mfrow=c(2,2)) hist(df[,1], main="フォロー数", col="lightblue") hist(df[,2], main="被フォロー数", col="pink") hist(df[,3], main="つぶやきの数", col="lightgreen") par(mfrow=c(1,1))
偏ってます。対数正規分布っぽいです。
試しに対数変換してQQプロットを描いてみます。
par(mfrow=c(2,2)) qqnorm(log(df[,1]+1), main="フォロー数", pch=21, col="blue", bg="lightblue") qqline(log(df[,1]+1), col="blue") qqnorm(log(df[,2]+1), main="被フォロー数", pch=21, col="red", bg="pink") qqline(log(df[,2]+1), col="red") qqnorm(log(df[,3]+1), main="つぶやきの数", pch=21, col="darkgreen", bg="green") qqline(log(df[,3]+1), col="darkgreen") par(mfrow=c(1,1))
外れ値になっているのが誰なのか気になるので、名前をラベルにしての散布図を描いてみます。
par(mfrow=c(2,2)) plot(df[,1:2],type="n", main="フォロー数×被フォロー数") text(df[,1:2],labels=rownames(df)) plot(df[,2:3],type="n", main="被フォロー数×つぶやきの数") text(df[,2:3],labels=rownames(df)) plot(df[,c(1,3)],type="n", main="つぶやきの数×フォロー数") text(df[,c(1,3)],labels=rownames(df)) par(mfrow=c(1,1))
クラスタリングしてみます。
対数変換した値をもとに、clusterSimパッケージを使ってクラスタ数は3から9の間で探索的に決めます。
手法はPAMに限定し、指標はKrzanowski&Laiにしてみます。
library(clusterSim) CS <- cluster.Sim (df, 1, 3, 9, icq="KL", methods="m5", outputHtml="twitter091213pam", outputCsv="twitter091213pam") table(CS$optClustering) # 1 2 3 4 5 # 9 4 10 10 7
5クラスタとなりました。
散布図にしてみると、
par(mfrow=c(2,2)) plot(log(df[,1:2]+1),type="n", main="フォロー数×被フォロー数") text(log(df[,1:2]+1),labels=rownames(df),col=CS$optClustering ) plot(log(df[,2:3]+1),type="n", main="被フォロー数×つぶやきの数") text(log(df[,2:3]+1),labels=rownames(df),col=CS$optClustering ) plot(log(df[,c(1,3)]+1),type="n", main="つぶやきの数×フォロー数") text(log(df[,c(1,3)]+1),labels=rownames(df),col=CS$optClustering ) par(mfrow=c(1,1))
眠いので、今日はここまで。