用R語言爬取美國新總統-川普的twitte進行數據分析

Twitter是一個流行的社交網路,這裡有大量的數據等著我們分析。Twitter R包是對twitter數據進行文本挖掘的好工具。 本文是關於如何使用Twitter R包獲取twitter數據並將其導入R,然後對它進行一些有趣的數據分析。

第一步是註冊一個你的應用程序。

為了能夠訪問Twitter數據編程,我們需要創建一個與Twitter的API交互的應用程序。

註冊後你將收到一個密鑰和密碼:

獲取密鑰和密碼後便可以在R裡面授權我們的應用程序以代表我們訪問Twitter:

根據不同的搜索詞,我們可以在幾分鐘之內收集到成千上萬的tweet。 這裡我們測試一個關鍵詞littlecaesars的twitter結果:

抓取最新的1000條相關twitter

由於默認的抓取結果是json格式,因此使用twlisttodf函數將其轉換成數據框

然後我們做一些簡單的文本清理

從得到的數據里,我們可以看到有twitter發表時間,內容,經緯度等信息

在清理數據之後,我們對twitter內容進行分詞,以便進行數據可視化

分詞之後可以得到相關twitter的高頻辭彙,然後將其可視化

除此之外,還可以結合數據中的時間戳數據和地理數據進行可視化分析

推特和FB其實也是科研討論的重鎮。但是要怎麼來分析推特上都討論啥呢?光用Mendeley的話,只能有隻言片語,這次又要帶你打開新世界的大門了。

首先推薦用一款推特分析工具網站,叫做推特分析家,功能是實時分析推特上的動態。這是一款基於R語言Shiny的網頁,由於這個是德國人做的,所以,會分析德語和英語兩種語言。

所用到的數據分析的資源,其實就是推特上的人家的東西。會對這些文字,進行文本挖掘,然後來分析你要的東西。比如,我分析一下LncRNA哈。

左側的是文本數據的來源,可以發現,這最近的推特還是前幾天剛發的。也就是說這個網站分析的數據都是實時數據。

那這些推特具體講的內容有些啥呢?主要是來自於LncRNA的論文和一些雜誌的推送。反正推特就好比國外科研狗的票圈,轉一下雜誌上的牛逼文章的話,可能會顯得更上等次,也是在跟老闆說:看我很勤奮,有在看文獻哦!

在WordCloud里,就會顯示在推特上,討論的最多的和lncRNA有關的辭彙。比如:表達,變化,剪切,模式,腫瘤等等,說實話是沒有什麼特別大的用處哈。

接著是詞頻的分簇,可以看得到大概這個詞在所有的句子中出現頻率的分簇分析。但我不懂「httpstcodadiagxfh」有啥關係「not so junk dna」,要麼是個網站啥的……好吧,不管怎麼樣,好像推特上熱議的應該是lncRNA的剪切。

接下去看一下network,這個是推送這些推特的賬號之間的聯繫,可以看得,有蠻多是雜誌,還有一些是誰?有可能就是痴迷於lncRNA研究的那些人了,有機會的話,可以考慮關注一下。

此外還有些付帶功能,比如,我們會巧妙地發現,在國外研究lncRNA的安卓狗主要是上班前和下班後會推送lncRNA的內容。而蘋果狗則集中在下午和午夜……

網址:longhowlam.shinyapps.io

還順便分析了一下別的關鍵詞,比如:機器學習、深度學習。

這種網站基本都是要翻牆才能進去的呢,畢竟要調用推特的數據。不過作為愛國少年的我,也想看看推特上都在討論中國什麼,於是我搜了一下「China」調整到推特內容1000,結果:

好吧,最近川普大爺贏了……

近日,一直以「推特治國」聞名的川普正式宣誓就任了美國第 45 任總統。

川普這次在美國大選中勝出,他的推特也發揮了巨大的作用。相比大多數總統競選人來說,他們都沒時間自己發推。但推特玩的風生水起的川普卻表示,他的推特都是自己發的……

那麼事實真的是這樣嗎?

有個美國網友發現川普發推特有兩個客戶端。一個安卓,另一個是 iPhone 。

而且這位細心的網友還發現,一些言辭激烈的推都來自安卓;而畫風比較正常的推都來自 iPhone

這一發現,也引起了數據分析師 David Robinson 的注意。David 注意到當川普發祝賀內容時,是通過 iPhone ;而當他抨擊競選對手時而是通過安卓。而且兩個不同客戶端通常發推的時間也不太相同。

本著科學嚴謹的態度,程序員小哥決定讓數據說話,於是做了程序,抓取分析了川普發過的推,終於發現了一些模式。並且通過統計,圖表,最終他基本確定,川普的推特並不是他一個人寫的。

數據證明,安卓端和iPhone發的推分別是兩個人所寫的。而且發推時間,使用標籤,加鏈接,轉發的方式也截然不同。同時,安卓端發的內容更加激烈和消極。

如果就像川普採訪中所說他使用的手機是三星 Galaxy ,我們可以確信用安卓發推的是川普本人,用 iPhone 發的大概是他的團隊助理。

發推時間對比

首先用 twitteR 包中的 userTimeline 函數導入川普發推的時間數據:

? library ( dplyr )

? library ( purrr )

? library ( twitteR )

# Youd need to set global options with an authenticated appsetup_twitter_oauth(getOption("twitter_consumer_key"),

getOption("twitter_consumer_secret"),

getOption("twitter_access_token"),

getOption("twitter_access_token_secret"))

# We can request only 3200 tweets at a time; it will return fewer

# depending on the APItrump_tweets <- userTimeline("realDonaldTrump", n = 3200)trump_tweets_df <- tbl_df(map_df(trump_tweets, as.data.frame))

# if you want to follow along without setting up Twitter authentication,

# just use my dataset:load(url("varianceexplained.org/f"))

稍微清理下數據,提取源文件。(在此只分析來自 iPhone 和 Android tweet 的數據,除去很少一部分發自網頁客戶端和 iPad 的推文)。

library(tidyr)

tweets <- trump_tweets_df %>%

select(id, statusSource, text, created) %>%

extract(statusSource, "source", "Twitter for (.*?)<") %>%

filter(source %in%c("iPhone", "Android"))

分析的數據包括來自 iPhone 的 628 條推文,來自 Android 的 762 條推文

主要考慮推文是在一天內什麼時間發布的,在此我們可以發現區別:

? library(lubridate)

? library(scales)

tweets %>%

count(source, hour = hour(with_tz(created, "EST"))) %>%

mutate(percent = n /sum(n)) %>%

ggplot(aes(hour, percent, color = source)) +

geom_line() +

scale_y_continuous(labels = percent_format()) +

labs(x = "Hour of day (EST)",

y = "% of tweets",

color = "")

川普一般習慣早上發推,而他的助理會集中在下午或晚上發推。

發文習慣對比

當川普的安卓手機轉推時,習慣用雙引號引用這整句話。

而 iPhone 轉推時,一般不使用雙引號

安卓手機: 500 多條推文沒有雙引號,200 多條有雙引號

iPhone:幾乎沒有雙引號

與此同時,在分享鏈接和圖片時,安卓和 iPhone 也大不相同。

tweet_picture_counts <- tweets %>%

filter(!str_detect(text, ^")) %>%

count(source,

picture = ifelse(str_detect(text, "t.co"),

"Picture/link", "No picture/link"))

ggplot(tweet_picture_counts, aes(source, n, fill = picture)) +

geom_bar(stat = "identity", position = "dodge") +

labs(x = "", y = "Number of tweets", fill = "")

數據證明 iPhone 端 發的推文很多會附上圖片,鏈接。內容也以宣傳為主。

比如下面這條:

而川普安卓端發的推文沒有圖片、鏈接,更多是直接的文字,比如:

用詞對比

在對比安卓和 iPhone 用詞區別時,David 用到了他和 Julia Silge 一起編寫的 tidytext 包。

用 unnest_tokensfunction 把句子分解為單獨的詞:

library(tidytext)

reg <- "([^A-Za-zd#@]|(?![A-Za-zd#@]))"tweet_words <- tweets %>%

filter(!str_detect(text, ^")) %>%

mutate(text = str_replace_all(text, "t.co/[A-Za-zd]+|&", "")) %>%

unnest_tokens(word, text, token = "regex", pattern = reg) %>%

filter(!word %in% stop_words$word,

str_detect(word, "[a-z]"))

tweet_words

## # A tibble: 8,753 x 4

## id source created word

## <chr> <chr> <time> <chr>

## 1 676494179216805888 iPhone 2015-12-14 20:09:15 record

## 2 676494179216805888 iPhone 2015-12-14 20:09:15 health

## 3 676494179216805888 iPhone 2015-12-14 20:09:15 #makeamericagreatagain

## 4 676494179216805888 iPhone 2015-12-14 20:09:15 #trump2016

## 5 676509769562251264 iPhone 2015-12-14 21:11:12 accolade

## 6 676509769562251264 iPhone 2015-12-14 21:11:12 @trumpgolf

## 7 676509769562251264 iPhone 2015-12-14 21:11:12 highly

## 8 676509769562251264 iPhone 2015-12-14 21:11:12 respected

## 9 676509769562251264 iPhone 2015-12-14 21:11:12 golf

## 10 676509769562251264 iPhone 2015-12-14 21:11:12 odyssey

## # ... with 8,743 more rows

總體來說川普推文中有哪些常用詞呢?

在此基礎上我們再來分別看安卓和 iPhone 常用詞的區別。

android_iphone_ratios <- tweet_words %>%

count(word, source) %>%

filter(sum(n) >= 5) %>%

spread(source, n, fill = 0) %>%

ungroup() %>%

mutate_each(funs((. + 1) /sum(. + 1)), -word) %>%

mutate(logratio = log2(Android / iPhone)) %>%

arrange(desc(logratio))

結論

· 帶標籤的推文基本來自 iPhone 。

· iPhone 推文中常用詞有宣傳性的詞,比如:「參加」,「明天」,「晚上 7 點」。

· 安卓的推文常用有強烈情緒性的辭彙,「差勁」,「瘋了」,「軟弱」,「傻瓜」等等。

情感分析

安卓和 iPhone 推文在情感上也有很大的差異,讓我們來量化一下。用到 tidytext 當中的NRC Word-Emotion Association 詞典,主要把用詞聯繫以下十種情緒分析:積極,消極,憤怒,期待,厭惡,恐懼,快樂,悲傷,驚訝,信任。

nrc <- sentiments %>%

filter(lexicon == "nrc") %>%

dplyr::select(word, sentiment)

nrc

## # A tibble: 13,901 x 2

## word sentiment

## <chr> <chr>

## 1 abacus trust

## 2 abandon fear

## 3 abandon negative

## 4 abandon sadness

## 5 abandoned anger

## 6 abandoned fear

## 7 abandoned negative

## 8 abandoned sadness

## 9 abandonment anger

## 10 abandonment fear

## # ... with 13,891 more rows

為了分別計算安卓和 iPhone 推文的情感,可以把不同用詞分類。

sources <- tweet_words %>%

group_by(source) %>%

mutate(total_words = n()) %>%

ungroup() %>%

distinct(id, source, total_words)

by_source_sentiment <- tweet_words %>%

inner_join(nrc, by = "word") %>%

count(sentiment, id) %>%

ungroup() %>%

complete(sentiment, id, fill =list(n = 0)) %>%

inner_join(sources) %>%

group_by(source, sentiment, total_words) %>%

summarize(words =sum(n)) %>%

ungroup()

head(by_source_sentiment)

## # A tibble: 6 x 4

## source sentiment total_words words

## <chr> <chr> <int> <dbl>

## 1 Android anger 4901 321

## 2 Android anticipation 4901 256

## 3 Android disgust 4901 207

## 4 Android fear 4901 268

## 5 Android joy 4901 199

## 6 Android negative 4901 560

(比如,我們可以看到安卓推文中 4901 個詞中 321 個詞與情感「憤怒」有關。)

同時可以用 Poisson test 分析,比起 iPhone ,安卓推文更喜歡使用帶強烈情緒的詞。

library(broom)

sentiment_differences <- by_source_sentiment %>%

group_by(sentiment) %>%

do(tidy(poisson.test(.$words, .$total_words)))

sentiment_differences

## Source: local data frame [10 x 9]

## Groups: sentiment [10]

##

## sentiment estimate statistic p.value parameter conf.low

## (chr) (dbl) (dbl) (dbl) (dbl) (dbl)

## 1 anger 1.492863 321 2.193242e-05 274.3619 1.2353162

## 2 anticipation 1.169804 256 1.191668e-01 239.6467 0.9604950

## 3 disgust 1.677259 207 1.777434e-05 170.2164 1.3116238

## 4 fear 1.560280 268 1.886129e-05 225.6487 1.2640494

## 5 joy 1.002605 199 1.000000e+00 198.7724 0.8089357

## 6 negative 1.692841 560 7.094486e-13 459.1363 1.4586926

## 7 positive 1.058760 555 3.820571e-01 541.4449 0.9303732

## 8 sadness 1.620044 303 1.150493e-06 251.9650 1.3260252

## 9 surprise 1.167925 159 2.174483e-01 148.9393 0.9083517

## 10 trust 1.128482 369 1.471929e-01 350.5114 0.9597478

## Variables not shown: conf.high (dbl), method (fctr), alternative (fctr)

我們可以用 95% 的置信區間來明確二者的區別:

從而我們可知,川普安卓的推文比起 iPhone ,使用「厭惡」「悲傷」「恐懼」「憤怒」等消極情緒詞的比例高 40-80%

在數據挖掘下

川普推特背後的團隊就這麼被扒了個精光

所以,看川普的推特,只要看安卓端的就好了。

但據報道,上任後的川普必須使用一部由美國特工處認證的安全加密手機,以替換他之前使用的安卓系統手機。據稱前總統奧巴馬就無法通過安全手機發推文,那使用安全手機後,川普還能繼續愉快的「推特治國」嗎?

大家也可以加小編微信:tswenqu,進R語言中文社區 交流群,可以跟各位老師互相交流。


推薦閱讀:

猴子數據分析第四關 複雜數據分析
ggplot2 函數學習
Apache kylin的基礎運維
無人機數據收集、存儲以及深度挖掘

TAG:R编程语言 | 文本情感分析 | 大数据分析 |