boB Rudis
5 years ago
commit
ee27983c34
7 changed files with 5419 additions and 0 deletions
@ -0,0 +1,8 @@ |
|||||
|
.Rproj.user |
||||
|
.Rhistory |
||||
|
.RData |
||||
|
.Rproj |
||||
|
.DS_Store |
||||
|
src/*.o |
||||
|
src/*.so |
||||
|
src/*.dll |
@ -0,0 +1,12 @@ |
|||||
|
--- |
||||
|
title: "README" |
||||
|
author: "@hrbrmstr" |
||||
|
date: September 14, 2019 |
||||
|
output: rmarkdown::github_document |
||||
|
--- |
||||
|
|
||||
|
Twitter account analysis like [this one](https://rud.is/dl/hrbrmstr-account-analysis.html). |
||||
|
|
||||
|
![](account-analysis-header.png) |
||||
|
|
||||
|
A lesser, static version of [accountanalysis](https://accountanalysis.app). |
@ -0,0 +1,12 @@ |
|||||
|
README |
||||
|
================ |
||||
|
@hrbrmstr |
||||
|
September 14, 2019 |
||||
|
|
||||
|
Twitter account analysis like [this |
||||
|
one](https://rud.is/dl/hrbrmstr-account-analysis.html). |
||||
|
|
||||
|
![](account-analysis-header.png) |
||||
|
|
||||
|
A lesser, static version of |
||||
|
[accountanalysis](https://accountanalysis.app). |
After Width: | Height: | Size: 423 KiB |
@ -0,0 +1,274 @@ |
|||||
|
--- |
||||
|
output: |
||||
|
flexdashboard::flex_dashboard: |
||||
|
orientation: rows |
||||
|
vertical_layout: scroll |
||||
|
params: |
||||
|
username: hrbrmstr |
||||
|
n_tweets_to_retrieve: 3000 |
||||
|
title: "Account Analysis of `r params$username`" |
||||
|
editor_options: |
||||
|
chunk_output_type: console |
||||
|
--- |
||||
|
|
||||
|
<!-- NOTE THE PARAMETERS ^^ --> |
||||
|
<!-- you can use rmarkdown::render() with this to generate a report for an individual --> |
||||
|
|
||||
|
```{r setup, include=FALSE} |
||||
|
knitr::opts_chunk$set(echo = FALSE, message = FALSE, warning = FALSE, out.width='100%') |
||||
|
``` |
||||
|
|
||||
|
```{r libs} |
||||
|
library(DT) |
||||
|
library(rtweet) |
||||
|
library(ISOcodes) |
||||
|
library(hrbrthemes) |
||||
|
library(urltools) |
||||
|
library(tidyverse) |
||||
|
``` |
||||
|
|
||||
|
<!-- You might want to add cache=TRUE for the data block if you're tweaking the aestehtics --> |
||||
|
|
||||
|
```{r data} |
||||
|
user <- lookup_users(params$username) |
||||
|
|
||||
|
tl <- get_timeline(params$username, params$n_tweets_to_retrieve) |
||||
|
attr(tl$created_at, 'tzone') = 'EST5EDT' |
||||
|
tl <- mutate(tl, tsday = as.Date(created_at)) |
||||
|
tl <- mutate(tl, dow = lubridate::wday(created_at, label=TRUE, abbr=FALSE)) |
||||
|
tl <- mutate(tl, hr = lubridate::hour(created_at)) |
||||
|
``` |
||||
|
|
||||
|
Row {data-height=750} |
||||
|
------------------------------------- |
||||
|
|
||||
|
### `r params$username` Account Overview {data-width=33%} |
||||
|
|
||||
|
```{r user_info} |
||||
|
select( |
||||
|
user, |
||||
|
screen_name, name, |
||||
|
statuses_count, friends_count, followers_count, favourites_count, listed_count, |
||||
|
description, account_created_at, user_id, |
||||
|
profile_expanded_url, location |
||||
|
) %>% |
||||
|
gather(field, value) %>% |
||||
|
DT::datatable(options = list(pageLength = nrow(.))) |
||||
|
``` |
||||
|
|
||||
|
|
||||
|
### Daily Rhythm {data-width=66%} |
||||
|
|
||||
|
```{r daily-rhythm, fig.width=1200/72, fig.height=500/72} |
||||
|
count(tl, dow, hr) %>% |
||||
|
mutate(hr = sprintf("%02d:00", hr)) %>% |
||||
|
complete(dow, hr=sprintf("%02d:00", 0:23)) %>% |
||||
|
ggplot(aes(hr, dow)) + |
||||
|
geom_tile(aes(fill=n, color=n)) + |
||||
|
scale_colour_viridis_c(name = "Tweet\nCount", direction = -1, na.value="white", option = "magma") + |
||||
|
scale_fill_viridis_c(name = "Tweet\nCount", direction = -1, na.value="white", option = "magma") + |
||||
|
scale_x_discrete(position = "top") + |
||||
|
scale_y_discrete() + |
||||
|
coord_equal() + |
||||
|
labs(x = NULL, y = NULL) + #, title = "Daily Rhythm") + |
||||
|
theme_ipsum_rc(grid="") |
||||
|
``` |
||||
|
|
||||
|
Row {data-height=350} |
||||
|
------------------------------------- |
||||
|
|
||||
|
### Tweet Volume by Date {data-width=33%} |
||||
|
|
||||
|
```{r tweet-volume-day, fig.width=800/72, fig.height=350/72} |
||||
|
count(tl, tsday) %>% |
||||
|
ggplot(aes(tsday, n)) + |
||||
|
geom_col(width=0.55, fill = ft_cols$blue) + |
||||
|
scale_y_comma() + |
||||
|
labs(x = NULL, y = "Tweets") + #, title = "Tweet Volume by Date") + |
||||
|
theme_ipsum_rc(grid="Y") |
||||
|
``` |
||||
|
|
||||
|
### Day of Week {data-width=33%} |
||||
|
|
||||
|
```{r tweet-volume-dow, fig.width=800/72, fig.height=350/72} |
||||
|
count(tl, dow) %>% |
||||
|
ggplot(aes(dow, n)) + |
||||
|
geom_col(width=0.55, fill = ft_cols$blue) + |
||||
|
scale_y_comma() + |
||||
|
labs(x = NULL, y = "Tweets") + #, title = "Tweet Volume by Day of Week") + |
||||
|
theme_ipsum_rc(grid="Y") |
||||
|
``` |
||||
|
|
||||
|
Row {data-height=500} |
||||
|
------------------------------------- |
||||
|
|
||||
|
### Tweet Type {data-width=33%} |
||||
|
|
||||
|
```{r tweet-type, fig.height=500/72, fig.width=400/72} |
||||
|
mutate(tl, tweet_type = case_when( |
||||
|
is_retweet ~ "Retweet", |
||||
|
is_quote ~ "Quote", |
||||
|
reply_to_user_id == user_id ~ "Self-Reply", |
||||
|
!is.na(reply_to_user_id) ~ "Reply", |
||||
|
TRUE ~ "Tweet" |
||||
|
)) %>% |
||||
|
count(tweet_type, sort=TRUE) %>% |
||||
|
mutate(tweet_type = fct_inorder(tweet_type) %>% fct_rev()) %>% |
||||
|
ggplot(aes(tweet_type, n)) + |
||||
|
geom_col(width=0.55, fill = ft_cols$blue) + |
||||
|
scale_y_comma(position = "right") + |
||||
|
labs(x = NULL, y = "Tweets") + #, title = "Tweet Type") + |
||||
|
coord_flip() + |
||||
|
theme_ipsum_rc(grid="X") |
||||
|
``` |
||||
|
|
||||
|
### Language of Tweets {data-width=33%} |
||||
|
|
||||
|
```{r languag-of-tweets, fig.height=500/72, fig.width=400/72} |
||||
|
count(tl, lang, sort=TRUE) %>% |
||||
|
left_join(ISOcodes::ISO_639_2, c("lang"="Alpha_2")) %>% |
||||
|
mutate(Name = gsub(";.*$", "", ifelse(is.na(Name), "Unknown", Name))) %>% |
||||
|
mutate(Name = fct_inorder(Name) %>% fct_rev()) %>% |
||||
|
ggplot(aes(Name, n)) + |
||||
|
geom_col(width=0.55, fill = ft_cols$blue) + |
||||
|
scale_y_comma(position = "right") + |
||||
|
coord_flip() + |
||||
|
labs(x = NULL, y = "Tweets") + #, title = "Language of Tweets") + |
||||
|
theme_ipsum_rc(grid="X") |
||||
|
``` |
||||
|
|
||||
|
### Used Interface {data-width=33%} |
||||
|
|
||||
|
```{r used-interface, fig.height=500/72, fig.width=400/72} |
||||
|
count(tl, source, sort=TRUE) %>% |
||||
|
mutate(source = fct_inorder(source) %>% fct_rev()) %>% |
||||
|
ggplot(aes(source, n)) + |
||||
|
geom_col(width=0.55, fill = ft_cols$blue) + |
||||
|
scale_y_comma(position = "right") + |
||||
|
coord_flip() + |
||||
|
labs(x = NULL, y = "Tweets") + #, title = "Used Interface") + |
||||
|
theme_ipsum_rc(grid="X") |
||||
|
``` |
||||
|
|
||||
|
Row {data-height=500} |
||||
|
------------------------------------- |
||||
|
|
||||
|
### Used Hashtags {data-width=50%} |
||||
|
|
||||
|
```{r used-hashtags, fig.height=500/72, fig.width=600/72} |
||||
|
unlist(tl$hashtags) %>% |
||||
|
discard(is.na) %>% |
||||
|
tolower() %>% |
||||
|
fct_lump(n = 10, ties = "first") %>% |
||||
|
table(dnn="hashtag") %>% |
||||
|
broom::tidy() %>% |
||||
|
arrange(desc(n)) %>% |
||||
|
mutate(hashtag = factor(hashtag, levels = c(setdiff(hashtag, "Other"), "Other")) %>% fct_rev()) %>% |
||||
|
ggplot(aes(hashtag, n)) + |
||||
|
geom_col(width=0.55, fill = ft_cols$blue) + |
||||
|
scale_y_comma(position = "right") + |
||||
|
coord_flip() + |
||||
|
labs(x = NULL, y = "Tweets") + #, title = "Used Hashtags") + |
||||
|
theme_ipsum_rc(grid="X") |
||||
|
``` |
||||
|
|
||||
|
### URL Apex Domains {data-width=50%} |
||||
|
|
||||
|
```{r apex-domains, fig.height=500/72, fig.width=600/72} |
||||
|
unlist(tl[,c("urls_url", "urls_expanded_url")], use.names = FALSE) %>% |
||||
|
discard(is.na) %>% |
||||
|
discard(~grepl("pbs\\.twimg\\.com|twitter\\.com|t\\.co", .)) %>% |
||||
|
urltools::domain() %>% |
||||
|
urltools::suffix_extract() %>% |
||||
|
as_tibble() %>% |
||||
|
mutate(apex = glue::glue("{domain}.{suffix}")) %>% |
||||
|
mutate(apex = fct_lump(apex, n = 10, ties = "first")) %>% |
||||
|
count(apex, sort=TRUE) %>% |
||||
|
mutate(apex = factor(apex, levels = c(setdiff(apex, "Other"), "Other"))) %>% |
||||
|
ggplot(aes(apex, n)) + |
||||
|
geom_col(width=0.55, fill = ft_cols$blue) + |
||||
|
coord_flip() + |
||||
|
scale_y_comma(position = "right") + |
||||
|
labs(x = NULL, y = "Tweets") + #, title = "URL Apex Domains") + |
||||
|
theme_ipsum_rc(grid="X") |
||||
|
``` |
||||
|
|
||||
|
Row {data-height=500} |
||||
|
------------------------------------- |
||||
|
|
||||
|
### Replied Users {data-width=33%} |
||||
|
|
||||
|
```{r replied-users, fig.height=500/72, fig.width=400/72} |
||||
|
unlist(tl$reply_to_screen_name) %>% |
||||
|
discard(is.na) %>% |
||||
|
discard(`==`, "hrbrmstr") %>% |
||||
|
tolower() %>% |
||||
|
fct_lump(n = 10, ties = "first") %>% |
||||
|
table(dnn="replied_to_users") %>% |
||||
|
broom::tidy() %>% |
||||
|
arrange(desc(n)) %>% |
||||
|
mutate(replied_to_users = factor(replied_to_users, levels = c(setdiff(replied_to_users, "Other"), "Other")) %>% fct_rev()) %>% |
||||
|
ggplot(aes(replied_to_users, n)) + |
||||
|
geom_col(width=0.55, fill = ft_cols$blue) + |
||||
|
coord_flip() + |
||||
|
scale_y_comma(position = "right") + |
||||
|
labs(x = NULL, y = "Tweets") + #, title = "Replied Users") + |
||||
|
theme_ipsum_rc(grid="X") |
||||
|
``` |
||||
|
|
||||
|
### Retweeted Users {data-width=33%} |
||||
|
|
||||
|
```{r retweeted-users, fig.height=500/72, fig.width=400/72} |
||||
|
unlist(tl$retweet_screen_name) %>% |
||||
|
discard(is.na) %>% |
||||
|
discard(`==`, "hrbrmstr") %>% |
||||
|
tolower() %>% |
||||
|
fct_lump(n = 10, ties = "first") %>% |
||||
|
table(dnn="retweeted_users") %>% |
||||
|
broom::tidy() %>% |
||||
|
arrange(desc(n)) %>% |
||||
|
mutate(retweeted_users = factor(retweeted_users, levels = c(setdiff(retweeted_users, "Other"), "Other")) %>% fct_rev()) %>% |
||||
|
ggplot(aes(retweeted_users, n)) + |
||||
|
geom_col(width=0.55, fill = ft_cols$blue) + |
||||
|
coord_flip() + |
||||
|
scale_y_comma(position = "right") + |
||||
|
labs(x = NULL, y = "Tweets") + #, title = "Retweeted Users") + |
||||
|
theme_ipsum_rc(grid="X") |
||||
|
``` |
||||
|
|
||||
|
### Quoted Users {data-width=33%} |
||||
|
|
||||
|
```{r quoted-users, fig.height=500/72, fig.width=400/72} |
||||
|
unlist(tl$quoted_screen_name) %>% |
||||
|
discard(is.na) %>% |
||||
|
discard(`==`, "hrbrmstr") %>% |
||||
|
tolower() %>% |
||||
|
fct_lump(n = 10, ties = "first") %>% |
||||
|
table(dnn="quoted_users") %>% |
||||
|
broom::tidy() %>% |
||||
|
arrange(desc(n)) %>% |
||||
|
mutate(quoted_users = factor(quoted_users, levels = c(setdiff(quoted_users, "Other"), "Other")) %>% fct_rev()) %>% |
||||
|
ggplot(aes(quoted_users, n)) + |
||||
|
geom_col(width=0.55, fill = ft_cols$blue) + |
||||
|
coord_flip() + |
||||
|
scale_y_comma(position = "right") + |
||||
|
labs(x = NULL, y = "Tweets") + #, title = "Quoted Users") + |
||||
|
theme_ipsum_rc(grid="X") |
||||
|
``` |
||||
|
|
||||
|
Row {data-height=750} |
||||
|
------------------------------------- |
||||
|
|
||||
|
### Tweets |
||||
|
|
||||
|
```{r} |
||||
|
mutate(tl, tweet_type = case_when( |
||||
|
is_retweet ~ "Retweet", |
||||
|
is_quote ~ "Quote", |
||||
|
reply_to_user_id == user_id ~ "Self-Reply", |
||||
|
!is.na(reply_to_user_id) ~ "Reply", |
||||
|
TRUE ~ "Tweet" |
||||
|
)) %>% |
||||
|
select(created_at, tweet_type, text) %>% |
||||
|
DT::datatable() |
||||
|
``` |
@ -0,0 +1,15 @@ |
|||||
|
Version: 1.0 |
||||
|
|
||||
|
RestoreWorkspace: Default |
||||
|
SaveWorkspace: Default |
||||
|
AlwaysSaveHistory: Default |
||||
|
|
||||
|
EnableCodeIndexing: Yes |
||||
|
UseSpacesForTab: Yes |
||||
|
NumSpacesForTab: 2 |
||||
|
Encoding: UTF-8 |
||||
|
|
||||
|
RnwWeave: Sweave |
||||
|
LaTeX: pdfLaTeX |
||||
|
|
||||
|
StripTrailingWhitespace: Yes |
File diff suppressed because one or more lines are too long
Loading…
Reference in new issue