install.packages("rtweet")
Installing package into ‘/home/rstudio-user/R/x86_64-pc-linux-gnu-library/3.5’
(as ‘lib’ is unspecified)
trying URL 'http://package-proxy/src/contrib/rtweet_0.7.0.tar.gz'
Content type 'application/x-tar' length 3532713 bytes (3.4 MB)
==================================================
downloaded 3.4 MB
* installing *binary* package ‘rtweet’ ...
* DONE (rtweet)
The downloaded source packages are in
‘/tmp/RtmprPYeGr/downloaded_packages’
library(rtweet)
Attaching package: ‘rtweet’
The following object is masked from ‘package:purrr’:
flatten
library(tidyverse)
library(DT)
library(plotly) # This package does interactive graphs
Attaching package: ‘plotly’
The following object is masked from ‘package:ggplot2’:
last_plot
The following object is masked from ‘package:stats’:
filter
The following object is masked from ‘package:graphics’:
layout
library(rtweet) # This package accesses Twitter data
library(lubridate)
token <- create_token(
app = "stats540",
consumer_key = "mOOwgFuei1k7BMus9Npk7uxRO",
consumer_secret = "imRNe9YNu6DQdrzFUqJZxqnXKFfV7yql6CirFl49fVSBQDGFKJ",
access_token = "57791348-HX5KqTO8JJ6BzEaliTDdiLR8l11amFKlzeIi3MIrp",
access_secret = "8cRMgADYkz1CA4zfZJUmI52DlZcRu8ykCcqoE0kwnyYAm")
get_token()
<Token>
<oauth_endpoint>
request: https://api.twitter.com/oauth/request_token
authorize: https://api.twitter.com/oauth/authenticate
access: https://api.twitter.com/oauth/access_token
<oauth_app> stats540
key: mOOwgFuei1k7BMus9Npk7uxRO
secret: <hidden>
<credentials> oauth_token, oauth_token_secret
---
- Get Trump’s tweets (realDonaldTrump) using get_timeline(). (You won’t need to use search_tweets() for this assignment.)
trump_tweets <- get_timeline("realDonaldTrump", n = 10000)
Here is the variable created for Donald Trump’s latest 10,000 tweets, annotated as “trump_tweets”.
- Find which hashtags he uses most and make a table.
trump_tweets %>%
select(hashtags) %>%
unnest() %>%
mutate(hastags = tolower(hashtags)) %>%
count(hashtags, sort = TRUE) %>%
datatable()
Here is a datatable highlighting Trump’s most-used hashtags. As of today (February 18th) he tweets without any hashtags more often than any other hashtag. When he does tweet with hashtags, “MAGA” is his most used, followed by “2A” (most likely for the Second Amendment) and “PelosiTantrum” (highlighting his maturity) coming in third.
- Make a table of the number of tweets each day, and find the overall average number of tweets per day.
trump_tweets %>%
group_by(day = date(created_at)) %>%
summarize(tweets_per_day = n())
Here is a table showing how often Trump has tweeted in 2020. His most-tweeted day was on January 25th with 69 tweets, and his least-tweeted day was February 19th, with only a single tweet.
trump_tweets %>%
group_by(day = date(created_at)) %>%
summarize(tweets_per_day = n()) %>%
summarize(mean(tweets_per_day))
Over the course of 2020 so far, Trump averages about 34 tweets per day.
- Create a plotly graphic of the number of tweets per day.
trump_tweets %>%
mutate(day = date(created_at)) %>%
plot_ly(x = ~day) %>%
add_histogram() %>%
layout(title = "Number of Tweets by Trump per day", xaxis = list(title = "Day", yaxis = list(title = "Tweets Per Day")))
Here is a plotly graphic of the number of times Trump tweets per day. It seems as though he tweets a lot on a single day or two, and then drops sharply down.
- Create a table and a plotly histogram of the hour of the day that Trump tweets.
trump_tweets %>%
mutate(time = with_tz(created_at, "America/New_York")) %>%
mutate(time = hour(time)) %>%
count(time) %>%
datatable(options = (list(pagelength = 24)), rownames = F)
Here is a datatable showing the time of day Trump tweets, with “0” being midnight. He’s most active at 7 am and 11 pm, with tweets dispersed in between thoughout the day.
- Create a table and a plotly histogram of the week days that Trump tweets.
trump_tweets %>%
mutate(Day = wday(created_at, label = T)) %>%
count(Day) %>%
datatable(rownames = F)
According to this datatable, Trump’s most active day on Twitter is Saturday, although each day besides Monday and Thursday are nearly the same.
trump_tweets %>%
mutate(Day = wday(created_at, label = T)) %>%
plot_ly(x = ~Day) %>%
add_histogram() %>%
layout(title = "Number of tweets each day from @realDonaldTrump in a week", yaxis = list(title = "Tweets per day"))
Here is an interactive visualization of the amount Donald Trump tweets in a week, by each day.
- Create a plotly heatmap of the weekday and time of day that Trump tweets.
trump_tweets %>%
mutate(Day = wday(created_at, label = T)) %>%
mutate(hour = hour(with_tz(created_at, "America/New_York"))) %>%
plot_ly(x = ~Day, y = ~hour) %>%
add_histogram2d(nbinsx = 7, nbinsy = 24) %>%
layout(title = "When does @realDonaldTrump tweet?", xaxis = list(title = "Day", yaxis = list(title = "Hour")))
Here is a heatmap of Donald Trump’s tweets in a week, shown by the amount of tweets during the hour each day. Hours are grouped in military time, so hour 15 is the same as 3 pm, with hour 0 equaling midnight. Regarding the color scheme, the lighter the color is, the higher number of tweets are sent out during that hour. The map is most dense on Friday mornings and Sunday nights, while it’s much more evenly spread out throughout the week.
- Annotate the analysis and publish to rpubs.com.
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKCmBgYHtyfQppbnN0YWxsLnBhY2thZ2VzKCJydHdlZXQiKQpsaWJyYXJ5KHJ0d2VldCkgCmBgYAoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KERUKQpsaWJyYXJ5KHBsb3RseSkgICAgICAgICAgICAgICAjIFRoaXMgcGFja2FnZSBkb2VzIGludGVyYWN0aXZlIGdyYXBocwpsaWJyYXJ5KHJ0d2VldCkgICAgICAgICAgICAgICAjIFRoaXMgcGFja2FnZSBhY2Nlc3NlcyBUd2l0dGVyIGRhdGEKbGlicmFyeShsdWJyaWRhdGUpCmBgYAoKYGBge3J9CnRva2VuIDwtIGNyZWF0ZV90b2tlbigKICBhcHAgPSAic3RhdHM1NDAiLAogIGNvbnN1bWVyX2tleSA9ICJtT093Z0Z1ZWkxazdCTXVzOU5wazd1eFJPIiwKICBjb25zdW1lcl9zZWNyZXQgPSAiaW1STmU5WU51NkRRZHJ6RlVxSlp4cW5YS0ZmVjd5cWw2Q2lyRmw0OWZWU0JRREdGS0oiLAogIGFjY2Vzc190b2tlbiA9ICI1Nzc5MTM0OC1IWDVLcVRPOEpKNkJ6RWFsaVREZGlMUjhsMTFhbUZLbHplSWkzTUlycCIsCiAgYWNjZXNzX3NlY3JldCA9ICI4Y1JNZ0FEWWt6MUNBNHpmWkpVbUk1MkRsWmNSdTh5a0NjcW9FMGt3bnlZQW0iKQoKZ2V0X3Rva2VuKCkgICAgICAgIApgYGAKCgoxLiBHZXQgVHJ1bXAncyB0d2VldHMgKHJlYWxEb25hbGRUcnVtcCkgdXNpbmcgZ2V0X3RpbWVsaW5lKCkuIChZb3Ugd29uJ3QgbmVlZCB0byB1c2Ugc2VhcmNoX3R3ZWV0cygpIGZvciB0aGlzIGFzc2lnbm1lbnQuKSAgIAoKYGBge3J9CnRydW1wX3R3ZWV0cyA8LSBnZXRfdGltZWxpbmUoInJlYWxEb25hbGRUcnVtcCIsIG4gPSAxMDAwMCkKYGBgCkhlcmUgaXMgdGhlIHZhcmlhYmxlIGNyZWF0ZWQgZm9yIERvbmFsZCBUcnVtcCdzIGxhdGVzdCAxMCwwMDAgdHdlZXRzLCBhbm5vdGF0ZWQgYXMgInRydW1wX3R3ZWV0cyIuCgoyLiBGaW5kIHdoaWNoIGhhc2h0YWdzIGhlIHVzZXMgbW9zdCBhbmQgbWFrZSBhIHRhYmxlLiAgCgpgYGB7cn0KdHJ1bXBfdHdlZXRzICU+JSAKICBzZWxlY3QoaGFzaHRhZ3MpICU+JSAKICB1bm5lc3QoKSAlPiUgCiAgbXV0YXRlKGhhc3RhZ3MgPSB0b2xvd2VyKGhhc2h0YWdzKSkgJT4lIAogIGNvdW50KGhhc2h0YWdzLCBzb3J0ID0gVFJVRSkgJT4lIAogIGRhdGF0YWJsZSgpCmBgYApIZXJlIGlzIGEgZGF0YXRhYmxlIGhpZ2hsaWdodGluZyBUcnVtcCdzIG1vc3QtdXNlZCBoYXNodGFncy4gQXMgb2YgdG9kYXkgKEZlYnJ1YXJ5IDE4dGgpIGhlIHR3ZWV0cyB3aXRob3V0IGFueSBoYXNodGFncyBtb3JlIG9mdGVuIHRoYW4gYW55IG90aGVyIGhhc2h0YWcuIFdoZW4gaGUgZG9lcyB0d2VldCB3aXRoIGhhc2h0YWdzLCAiTUFHQSIgaXMgaGlzIG1vc3QgdXNlZCwgZm9sbG93ZWQgYnkgIjJBIiAobW9zdCBsaWtlbHkgZm9yIHRoZSBTZWNvbmQgQW1lbmRtZW50KSBhbmQgIlBlbG9zaVRhbnRydW0iIChoaWdobGlnaHRpbmcgaGlzIG1hdHVyaXR5KSBjb21pbmcgaW4gdGhpcmQuIAoKMy4gTWFrZSBhIHRhYmxlIG9mIHRoZSBudW1iZXIgb2YgdHdlZXRzIGVhY2ggZGF5LCBhbmQgZmluZCB0aGUgb3ZlcmFsbCBhdmVyYWdlIG51bWJlciBvZiB0d2VldHMgcGVyIGRheS4gIAoKYGBge3J9CnRydW1wX3R3ZWV0cyAlPiUgCiAgZ3JvdXBfYnkoZGF5ID0gZGF0ZShjcmVhdGVkX2F0KSkgJT4lIAogIHN1bW1hcml6ZSh0d2VldHNfcGVyX2RheSA9IG4oKSkKYGBgCkhlcmUgaXMgYSB0YWJsZSBzaG93aW5nIGhvdyBvZnRlbiBUcnVtcCBoYXMgdHdlZXRlZCBpbiAyMDIwLiBIaXMgbW9zdC10d2VldGVkIGRheSB3YXMgb24gSmFudWFyeSAyNXRoIHdpdGggNjkgdHdlZXRzLCBhbmQgaGlzIGxlYXN0LXR3ZWV0ZWQgZGF5IHdhcyBGZWJydWFyeSAxOXRoLCB3aXRoIG9ubHkgYSBzaW5nbGUgdHdlZXQuIAoKYGBge3J9CnRydW1wX3R3ZWV0cyAlPiUgCiAgZ3JvdXBfYnkoZGF5ID0gZGF0ZShjcmVhdGVkX2F0KSkgJT4lIAogIHN1bW1hcml6ZSh0d2VldHNfcGVyX2RheSA9IG4oKSkgJT4lIAogIHN1bW1hcml6ZShtZWFuKHR3ZWV0c19wZXJfZGF5KSkKYGBgCk92ZXIgdGhlIGNvdXJzZSBvZiAyMDIwIHNvIGZhciwgVHJ1bXAgYXZlcmFnZXMgYWJvdXQgMzQgdHdlZXRzIHBlciBkYXkuIAoKCjQuIENyZWF0ZSBhIHBsb3RseSBncmFwaGljIG9mIHRoZSBudW1iZXIgb2YgdHdlZXRzIHBlciBkYXkuICAKCmBgYHtyfQp0cnVtcF90d2VldHMgJT4lIAogIG11dGF0ZShkYXkgPSBkYXRlKGNyZWF0ZWRfYXQpKSAlPiUgCiAgcGxvdF9seSh4ID0gfmRheSkgJT4lIAogIGFkZF9oaXN0b2dyYW0oKSAlPiUgCiAgbGF5b3V0KHRpdGxlID0gIk51bWJlciBvZiBUd2VldHMgYnkgVHJ1bXAgcGVyIGRheSIsIHhheGlzID0gbGlzdCh0aXRsZSA9ICJEYXkiLCB5YXhpcyA9IGxpc3QodGl0bGUgPSAiVHdlZXRzIFBlciBEYXkiKSkpCmBgYApIZXJlIGlzIGEgcGxvdGx5IGdyYXBoaWMgb2YgdGhlIG51bWJlciBvZiB0aW1lcyBUcnVtcCB0d2VldHMgcGVyIGRheS4gSXQgc2VlbXMgYXMgdGhvdWdoIGhlIHR3ZWV0cyBhIGxvdCBvbiBhIHNpbmdsZSBkYXkgb3IgdHdvLCBhbmQgdGhlbiBkcm9wcyBzaGFycGx5IGRvd24uIAoKCjUuIENyZWF0ZSBhIHRhYmxlIGFuZCBhIHBsb3RseSBoaXN0b2dyYW0gb2YgdGhlIGhvdXIgb2YgdGhlIGRheSB0aGF0IFRydW1wIHR3ZWV0cy4gIAoKYGBge3J9CnRydW1wX3R3ZWV0cyAlPiUgCiAgbXV0YXRlKHRpbWUgPSB3aXRoX3R6KGNyZWF0ZWRfYXQsICJBbWVyaWNhL05ld19Zb3JrIikpICU+JSAKICBtdXRhdGUodGltZSA9IGhvdXIodGltZSkpICU+JSAKICBjb3VudCh0aW1lKSAlPiUgCiAgZGF0YXRhYmxlKG9wdGlvbnMgPSAobGlzdChwYWdlbGVuZ3RoID0gMjQpKSwgcm93bmFtZXMgPSBGKQpgYGAKSGVyZSBpcyBhIGRhdGF0YWJsZSBzaG93aW5nIHRoZSB0aW1lIG9mIGRheSBUcnVtcCB0d2VldHMsIHdpdGggIjAiIGJlaW5nIG1pZG5pZ2h0LiBIZSdzIG1vc3QgYWN0aXZlIGF0IDcgYW0gYW5kIDExIHBtLCB3aXRoIHR3ZWV0cyBkaXNwZXJzZWQgaW4gYmV0d2VlbiB0aG91Z2hvdXQgdGhlIGRheS4gIAoKNi4gQ3JlYXRlIGEgdGFibGUgYW5kIGEgcGxvdGx5IGhpc3RvZ3JhbSBvZiB0aGUgd2VlayBkYXlzIHRoYXQgVHJ1bXAgdHdlZXRzLiAgCgpgYGB7cn0KdHJ1bXBfdHdlZXRzICU+JSAKICBtdXRhdGUoRGF5ID0gd2RheShjcmVhdGVkX2F0LCBsYWJlbCA9IFQpKSAlPiUgCiAgY291bnQoRGF5KSAlPiUgCiAgZGF0YXRhYmxlKHJvd25hbWVzID0gRikKYGBgCkFjY29yZGluZyB0byB0aGlzIGRhdGF0YWJsZSwgVHJ1bXAncyBtb3N0IGFjdGl2ZSBkYXkgb24gVHdpdHRlciBpcyBTYXR1cmRheSwgYWx0aG91Z2ggZWFjaCBkYXkgYmVzaWRlcyBNb25kYXkgYW5kIFRodXJzZGF5IGFyZSBuZWFybHkgdGhlIHNhbWUuIAoKYGBge3J9CnRydW1wX3R3ZWV0cyAlPiUgCiAgbXV0YXRlKERheSA9IHdkYXkoY3JlYXRlZF9hdCwgbGFiZWwgPSBUKSkgJT4lIAogIHBsb3RfbHkoeCA9IH5EYXkpICU+JSAKICBhZGRfaGlzdG9ncmFtKCkgJT4lIAogIGxheW91dCh0aXRsZSA9ICJOdW1iZXIgb2YgdHdlZXRzIGVhY2ggZGF5IGZyb20gQHJlYWxEb25hbGRUcnVtcCBpbiBhIHdlZWsiLCB5YXhpcyA9IGxpc3QodGl0bGUgPSAiVHdlZXRzIHBlciBkYXkiKSkKYGBgCkhlcmUgaXMgYW4gaW50ZXJhY3RpdmUgdmlzdWFsaXphdGlvbiBvZiB0aGUgYW1vdW50IERvbmFsZCBUcnVtcCB0d2VldHMgaW4gYSB3ZWVrLCBieSBlYWNoIGRheS4gCgo3LiBDcmVhdGUgYSBwbG90bHkgaGVhdG1hcCBvZiB0aGUgd2Vla2RheSBhbmQgdGltZSBvZiBkYXkgdGhhdCBUcnVtcCB0d2VldHMuICAKCmBgYHtyfQp0cnVtcF90d2VldHMgJT4lIAogIG11dGF0ZShEYXkgPSB3ZGF5KGNyZWF0ZWRfYXQsIGxhYmVsID0gVCkpICU+JSAKICBtdXRhdGUoaG91ciA9IGhvdXIod2l0aF90eihjcmVhdGVkX2F0LCAiQW1lcmljYS9OZXdfWW9yayIpKSkgJT4lIAogIHBsb3RfbHkoeCA9IH5EYXksIHkgPSB+aG91cikgJT4lIAogIGFkZF9oaXN0b2dyYW0yZChuYmluc3ggPSA3LCBuYmluc3kgPSAyNCkgJT4lIAogIGxheW91dCh0aXRsZSA9ICJXaGVuIGRvZXMgQHJlYWxEb25hbGRUcnVtcCB0d2VldD8iLCB4YXhpcyA9IGxpc3QodGl0bGUgPSAiRGF5IiwgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkhvdXIiKSkpCmBgYApIZXJlIGlzIGEgaGVhdG1hcCBvZiBEb25hbGQgVHJ1bXAncyB0d2VldHMgaW4gYSB3ZWVrLCBzaG93biBieSB0aGUgYW1vdW50IG9mIHR3ZWV0cyBkdXJpbmcgdGhlIGhvdXIgZWFjaCBkYXkuIEhvdXJzIGFyZSBncm91cGVkIGluIG1pbGl0YXJ5IHRpbWUsIHNvIGhvdXIgMTUgaXMgdGhlIHNhbWUgYXMgMyBwbSwgd2l0aCBob3VyIDAgZXF1YWxpbmcgbWlkbmlnaHQuIFJlZ2FyZGluZyB0aGUgY29sb3Igc2NoZW1lLCB0aGUgbGlnaHRlciB0aGUgY29sb3IgaXMsIHRoZSBoaWdoZXIgbnVtYmVyIG9mIHR3ZWV0cyBhcmUgc2VudCBvdXQgZHVyaW5nIHRoYXQgaG91ci4KVGhlIG1hcCBpcyBtb3N0IGRlbnNlIG9uIEZyaWRheSBtb3JuaW5ncyBhbmQgU3VuZGF5IG5pZ2h0cywgd2hpbGUgaXQncyBtdWNoIG1vcmUgZXZlbmx5IHNwcmVhZCBvdXQgdGhyb3VnaG91dCB0aGUgd2Vlay4gCgo4LiBBbm5vdGF0ZSB0aGUgYW5hbHlzaXMgYW5kIHB1Ymxpc2ggdG8gcnB1YnMuY29tLiAgCg==