川普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条的推文,实际获取到的量会有一些出入,不过差异不大。

导出的数据,大概是这样:

IMAGE

数据预处理

  • 使用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')  

推文分析

首先加载在上一步预处理后的数据,转成pandasDataFrame,方便之后的处理

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左右

结语

本文主要从多维度客观统计为主,不做过多解读。算是抛砖引玉,读者朋友可以发挥想象,做更多维度的分析与深刻的解读。