星期六, 二月 11, 2012

用twitteR包对中文推特用户的抽样分析


社会化媒体的信息量巨大,一向是数据分析的热门领域。Twitter作为最为火爆的微博网站吸引了大量用户,也蕴含了大量信息。Twitter的数据信息其实包括两个部分,一个是发推内容,一个是发推用户。本文希望对中文twitter用户的情况进行一些粗浅的分析,算是抛砖引玉。

较早的时候就有人作过Twitter中文用户调查,它是以问卷的形式收集了500人的数据,得出了一些有趣的结论。本例则是希望利用twitteR包获取更多中文Twitter用户样本加以分析。首先遇到的第一个问题就是如何分辨出中文用户,笔者是从这篇博文获得启发,思路就是先从一位中文推特界的大佬入手,那么其粉丝应该基本上就是中文用户了。本例中选择的对象是“连岳”(lianyue),他的粉丝数达到了八万人。可能会问为何不选有十二万粉丝的“艾未未”?因为他比较国际化一些,其粉丝有不少是外国友人。


我们首先加载twitteR包,然后获取“用户”对象,从lianyue的follower中抓取5000名粉丝。这一步要注意,如果你的位置正好在和谐社会内,那需要VPN翻墙才能抓到数据,而且得花点时间。之后将获得的数据转为数据框格式方便处理。
library(twitteR)
lianyue <- getUser('lianyue')
follow.lian <- lianyue$getFollowers(n=5000)
df.lian <- do.call('rbind',lapply(follow.lian,as.data.frame))
在上面这个数据中有四个可用于研究的变量,分别是:
  • statusesCount 发推数
  • followersCount 粉丝数
  • friendsCount 朋友数
  • created 开户时间
如果将上面的数据简单绘图观察就会发现存在异常点(例如个别话唠和大佬),当然你也可以对这个异常点做进一步研究。但本例只关注“乌合之众”,在去除异常点后仍有4989个样本,存入子集变量df.sub中。再将其中的开户时间转为两种方便处理的格式。

df.sub <- subset(df.lian,friendsCount<2300 & followersCount<3000 & statusesCount<10000)
df.sub$time <- as.Date(df.sub$created)
df.sub$ntime <- as.numeric(df.sub$time)

对于手头的数据,我们跳过描述性统计,首先观察这些用户的开户时间是如何分布的。加载ggplot2包绘制条形图观察。可以看到在2011年下半年新开用户出现了飙升,是翻墙手段有突破?还是国家队大规模入驻?有兴趣的同学可以进一步挖掘其原因。

library(ggplot2)
p <- ggplot(df.sub,aes(x=time))
p + geom_bar(fill='red',colour='black',binwidth=30)

第二个我们想绘制这些变量的散点图观察之间的关系。除了X和Y轴表示两个数值变量之外,点的大小表示了发推的数量,颜色的不同表示了开户时间,散点越大表示发推越多,颜色偏兰表示开户早,偏红表示开户晚。

p <- ggplot(data=df.sub,aes(x=friendsCount,y=followersCount))
p + geom_point(aes(size=statusesCount,colour=ntime),alpha=0.8)

从上图中可以观察到大部分用户聚集在左下角,有较多粉丝的用户似乎多半是发推较多,或是开户较早。为了验证这一点我们使用加性模型试一下。关于加性模型可以参照笔者之前的一篇博文

library(mgcv)
model <- gam(followersCount~s(friendsCount)+s(statusesCount)+s(ntime),data=df.sub)
par(mfrow=c(1,3))
plot(model,se=T)

我们来看最后的结果,第一个图显示你fo的人越多,那么被fo的可能性也越大,不过也有例外。第二个图显示你发推越多,被fo的可能性也越大,但没人喜欢话唠,话太多就会被unfo掉,关键还是要看发推质量。第三个图大致显示开户较早的被fo的较多。估计第一批用twitter的都是黄埔一期的精英吧。

本文只抽取了数千个数据的样本来分析中文twitter用户,抽样方法不一定科学,所以其样本不一定具有代表性。有兴趣的同学对于这些样本还可以划分细类做进一步分析,或是利用聚类分析等其它方法得出更有趣的结论。如果你觉得这篇博文有所启发,请来fo我吧(@xccds)。

没有评论:

发表评论