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 

クラスタとなりました。


散布図にしてみると、

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))


眠いので、今日はここまで。