川普Twitter超多维度分析
获取Trump最近的Twitter
除了用爬虫去获取Twitter之外,还有一个简单稳定的方案就是通过官方的API,不过最近Twitter官方比较严格,很难申请开放平台很难通过。好在笔者之前申请过一个Twitter的开发者账号。
- 安装第三方获取Twitter的库python-twitter
pip install python-twitter
- 把Trump最近的Twitter dump 下来
import twitter
proxies = {
'http': '',
'https': ''
}
api = twitter.Api(consumer_key='',
consumer_secret='',
access_token_key='',
access_token_secret='', proxies=proxies)
count = 200
max_id = None
fp = open('Trump-twitter.txt', encoding='utf-8', mode='w')
while True:
statuses = api.GetUserTimeline(screen_name="realDonaldTrump", count=count, max_id=max_id)
if len(statuses) < 1:
break
for s in statuses:
print(s)
fp.write(str(s) + "\n")
max_id = s.id
max_id = max_id - 1
fp.close()
需要注意的是, 这个API需要再可以访问Twitter的网络环境下使用,所以配置了proxy
目前,Twitter 的API做了限制,只能获取到最近的3200条的推文,实际获取到的量会有一些出入,不过差异不大。
导出的数据,大概是这样:
数据预处理
- 使用
pandas
可以很方便处理表格, 这里主要把重要的信息,处理成表格字段,方便后面的统计分析 - 这里重点关注以下字段
|字段名|字段解释| |--|--| |id|Twitter ID https://twitter.com/i/web/status/{id}| |createdat|发布时间| |favoritecount|点赞数| |hashtags|话题TAG| |retweetcount|转发数| |source|发布来源,比如来自iPhone| |text|推文内容| |mediatype|内容媒体类型,比如video| |retusername|原文的发布者| |retuserverified|原文的发布者是否认证| |quotedusername|被引用的推文的作者| |quoteduserverified|被引用的推文作者是否认证| |createdday|发布日期,方便按天统计| |createddayhour|发布日期,精确到小时,比如:2020-06-14 02| |createdhour|发布小时,方便统计发文时间规律|
- 代码片段
# 把发布时间转换成特定的格式
def get_created_info(row):
created_at = row.created_at
day,time_str = created_at.split(' ')
hour = time_str.split(':')[0]
day_hour = day+" "+hour
return day,day_hour,hour
# 应用到多个字段上
DF[['created_day','created_day_hour','created_hour']] = DF.apply(get_created_info,axis=1,result_type='expand')
推文分析
首先加载在上一步预处理后的数据,转成pandas
的DataFrame
,方便之后的处理
df = pd.read_excel('./Trump-twitter.xlsx')
后面进入超多维度的分析
每天发文量统计
df[['id','created_day']].groupby(by=['created_day']).count().sort_values(by=['id'],ascending=False).head(20).plot.bar(figsize=(12,4))
按照每日发文总量的top 20,进行绘图
可以发现在2020-06-05 这天的发文最多,发了153条。我们详细看一下,这一天的每小时的发文量
df1 = df[df.created_day=='2020-06-05']
df1[['id','created_hour']].groupby(by=['created_hour']).count().plot.bar(figsize=(12,4))
在一天在11、12点这两个小时发文最多, 对这天的所有推文内容,进行分析,绘制词云图, 这里使用WordCloud
一个比较好用的绘制词云图的库
对推文内容进行情感分析
def get_sentiment(row):
polarity = tb(row.text).polarity
if polarity < 0:
tag = 'negative'
elif polarity < 0.3:
tag = 'neutral'
else:
tag = 'positive'
return tag,polarity
df[['text_polarity','polarity_prob']] = df.apply(get_sentiment,axis=1,result_type='expand')
这里使用了textblob库,一个简单的文本处理库,可以比较方便的对英文文本进行情感分析、词性标注、拼写纠错等
可以看出Trump的推文以中性为主,当然负面占比也不少,这里不展开 ……
发文时间段统计
df[['id','created_hour']].groupby(by=['created_hour']).count().plot.bar(figsize=(12,4))
从图上可以很直观的看出,Trump 24小时都有发文,在12点左右,发Twitter量最多,不愧面向Twitter治国,发推量令人发指。
对这段时间所有的推文进行分析,绘制词云图
从词云图上可以看出,“白宫”、“新冠病毒”、“奥巴马”、“拜登”是他经常提及的对象,同时不忘“Great American” ……
对推文中提到的“FAKE NEWS”进行词云统计
不解释
转发与原创统计
explode = (0, 0.1)
df[['id','tweet_status']].groupby(by=['tweet_status']).count()\
.plot.pie(y='id',figsize=(5,5),explode=explode,autopct='%1.1f%%',shadow=True, startangle=0,label='')
转发跟原创占比都不少
被转的作者统计
rt_df = df[['id','ret_user_name']].groupby(by=['ret_user_name']).count().sort_values(by=['id'],ascending=False)
rt_df.head(20).plot.bar(figsize=(16,4))
- 主要转发白宫的推文,其次是转发他自己的
发布来源统计
explode = (0, 0.1)
df[['id','source']].groupby(by=['source']).count()\
.plot.pie(y='id',figsize=(5,5),explode=explode,autopct='%1.1f%%',shadow=True, startangle=0,label='')
主要还是来自iPhone
推文主题TAG统计分析
- 可以看出,这段时间Trump关注的比较多还是新冠疫情,以及跟疫情相关的“薪水保护计划”
- 其次是MAGA (Make Ameraica Greate Again)
推文内容聚类
对Trump的推文聚了10个类,从图上看,Trump的推文内容的类型多集中在某几个方面
对推文内容做
word2vec
model.similar_by_word('Trump')
# output
[('coronavirus', 0.6097418069839478),
('great', 0.5778061151504517),
('realDonaldTrump', 0.554646909236908),
('Great', 0.5381245613098145),
('National', 0.49641942977905273),
('America', 0.47522449493408203),
('today', 0.4736398458480835),
('people', 0.469297856092453),
('Democrats', 0.45948123931884766),
('time', 0.4551768898963928)]
点赞数直方图
df[df.favorite_count > 0][['id','favorite_count']].plot.hist(y='favorite_count',bins=50,figsize=(12,4))
点赞数主要集中在5w左右
转发数直方图
df[df.retweet_count > 0][['id','retweet_count']].plot.hist(y='retweet_count',bins=50,figsize=(12,4))
转发数主要集中在1w左右
结语
本文主要从多维度客观统计为主,不做过多解读。算是抛砖引玉,读者朋友可以发挥想象,做更多维度的分析与深刻的解读。