Notebook description: Basic data wrangling and data visualization practice
Data source: Tidy Tuesday Historical Phone Usage from OurWorldInData.org Technology Adoption
Load packages
library(tidyverse)
library(readr)
library(Hmisc)
library(skimr)
library(ggsci)
Import data
mobile <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2020/2020-11-10/mobile.csv')
landline <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2020/2020-11-10/landline.csv')
Join mobile and landline dataframes
df <- inner_join(mobile, landline, by=c("code", "year", "entity", "continent", "gdp_per_cap"))
head(df)
UAE phone subscriptions over 30 years (inspired by tessaeagle)
df2 <- df %>%
filter(entity == "United Arab Emirates") %>%
gather(key = "phoneType", value = "subs", -entity, -code, -total_pop.x, -total_pop.y, -gdp_per_cap, -continent, -year)
#find the inverse to plot divergent bars
df2$inv <- ifelse(df2$phoneType =="landline_subs",df2$subs+1,df2$subs)
df2 <- df2 %>% mutate(inv = ifelse(phoneType =="mobile_subs",subs,subs*-1))
df2 %>%
ggplot(aes(x = year, y = inv, fill = phoneType))+
geom_bar(stat = "identity", position = "identity")+
geom_hline(yintercept = 0, color = "white")+
scale_y_continuous(breaks = seq(from = -100, to = 240, by = 20), labels=abs(seq(from = -100, to = 240, by = 20)))+
scale_x_continuous(breaks = seq(from = 1990, to = 2017, by = 5))+
scale_fill_manual(name = "Phone Type", labels = c("Landline", "Mobile"), values = c("#606c38", "#003f88"))+
labs(
x = "Year",
y = "Phone Subs per 100 People",
fill = "Phone Type",
title ="UAE Phone Subscriptions over Time",
subtitle = "Comparison of Landline vs. Mobile Phone Subscriptions \n (per 100 people) in the UAE from 1990 to 2017"
)+
theme(
axis.text = element_text(size = 11),
axis.title = element_text(size = 12),
axis.ticks.y = element_blank(),
panel.grid = element_blank(),
plot.title = element_text(size = 16, hjust = .5, face = "bold"),
plot.subtitle = element_text(size = 11, hjust = .5),
legend.background = element_blank(),
legend.text = element_text(size = 11),
legend.title = element_text(size = 11),
legend.key = element_blank()
)

Mobile subs by continent
df %>% group_by(year, continent) %>% tally(mobile_subs) %>% ggplot(aes(x=year, y=n, color=continent)) + geom_line() +
theme(
plot.background = element_rect(fill = "#2D2D2D"),
panel.background = element_rect(fill = "#2D2D2D"),
axis.text = element_text(color = "white", size = 11),
axis.title = element_text(color = "white", size = 12),
axis.ticks.y = element_blank(),
axis.ticks.x = element_line(color = "white"),
panel.grid = element_blank(),
axis.line.x = element_line(color="white"),
axis.line.y = element_line(color="white"),
plot.title = element_text(color = "white", size = 16, hjust = .5, face = "bold"),
plot.subtitle = element_text(color = "white", size = 11, hjust = .5),
legend.background = element_blank(),
legend.text = element_text(color = "white", size = 11),
legend.title = element_text(color = "white", size = 11),
legend.key = element_blank()
) + labs(x="Year", y="Mobile subs per 100 people", title = "Mobile subscriptions over the years", subtitle = "Comparing continents mobile subscriptions \n (per 100 people) from 1990 to 2017 ") + scale_color_tron()

Landline subs by continent
df %>% group_by(year, continent) %>% tally(landline_subs) %>% ggplot(aes(x=year, y=n, color=continent)) + geom_line() +
theme(
plot.background = element_rect(fill = "#2D2D2D"),
panel.background = element_rect(fill = "#2D2D2D"),
axis.text = element_text(color = "white", size = 11),
axis.title = element_text(color = "white", size = 12),
axis.ticks.y = element_blank(),
axis.ticks.x = element_line(color = "white"),
panel.grid = element_blank(),
axis.line.x = element_line(color="white"),
axis.line.y = element_line(color="white"),
plot.title = element_text(color = "white", size = 16, hjust = .5, face = "bold"),
plot.subtitle = element_text(color = "white", size = 11, hjust = .5),
legend.background = element_blank(),
legend.text = element_text(color = "white", size = 11),
legend.title = element_text(color = "white", size = 11),
legend.key = element_blank()
) + labs(x="Year", y="Landline subs per 100 people", title = "Landline subscriptions over the years", subtitle = "Comparing continents landline subscriptions \n (per 100 people) from 1990 to 2017 ") + scale_color_tron()

LS0tCnRpdGxlOiAiUGhvbmUgU3Vic2NyaXB0aW9ucyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKKipOb3RlYm9vayBkZXNjcmlwdGlvbioqOiBCYXNpYyBkYXRhIHdyYW5nbGluZyBhbmQgZGF0YSB2aXN1YWxpemF0aW9uIHByYWN0aWNlCgoqKkRhdGEgc291cmNlKio6IFRpZHkgVHVlc2RheSBbSGlzdG9yaWNhbCBQaG9uZSBVc2FnZV0oaHR0cHM6Ly9naXRodWIuY29tL3Jmb3JkYXRhc2NpZW5jZS90aWR5dHVlc2RheS9ibG9iL21hc3Rlci9kYXRhLzIwMjAvMjAyMC0xMS0xMC9yZWFkbWUubWQpIGZyb20gT3VyV29ybGRJbkRhdGEub3JnIFtUZWNobm9sb2d5IEFkb3B0aW9uXShodHRwczovL291cndvcmxkaW5kYXRhLm9yZy90ZWNobm9sb2d5LWFkb3B0aW9uKQoKTG9hZCBwYWNrYWdlcwpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KGdnc2NpKQpgYGAKCkltcG9ydCBkYXRhCmBgYHtyLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRX0KbW9iaWxlIDwtIHJlYWRyOjpyZWFkX2NzdignaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3Jmb3JkYXRhc2NpZW5jZS90aWR5dHVlc2RheS9tYXN0ZXIvZGF0YS8yMDIwLzIwMjAtMTEtMTAvbW9iaWxlLmNzdicpCmxhbmRsaW5lIDwtIHJlYWRyOjpyZWFkX2NzdignaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3Jmb3JkYXRhc2NpZW5jZS90aWR5dHVlc2RheS9tYXN0ZXIvZGF0YS8yMDIwLzIwMjAtMTEtMTAvbGFuZGxpbmUuY3N2JykKYGBgCgpKb2luIG1vYmlsZSBhbmQgbGFuZGxpbmUgZGF0YWZyYW1lcwpgYGB7cn0KZGYgPC0gaW5uZXJfam9pbihtb2JpbGUsIGxhbmRsaW5lLCBieT1jKCJjb2RlIiwgInllYXIiLCAiZW50aXR5IiwgImNvbnRpbmVudCIsICJnZHBfcGVyX2NhcCIpKQpoZWFkKGRmKQpgYGAKVUFFIHBob25lIHN1YnNjcmlwdGlvbnMgb3ZlciAzMCB5ZWFycyAoaW5zcGlyZWQgYnkgdGVzc2FlYWdsZSkKYGBge3J9CmRmMiA8LSBkZiAlPiUKICBmaWx0ZXIoZW50aXR5ID09ICJVbml0ZWQgQXJhYiBFbWlyYXRlcyIpICU+JQogIGdhdGhlcihrZXkgPSAicGhvbmVUeXBlIiwgdmFsdWUgPSAic3VicyIsIC1lbnRpdHksIC1jb2RlLCAtdG90YWxfcG9wLngsIC10b3RhbF9wb3AueSwgLWdkcF9wZXJfY2FwLCAtY29udGluZW50LCAteWVhcikKI2ZpbmQgdGhlIGludmVyc2UgdG8gcGxvdCBkaXZlcmdlbnQgYmFycwpkZjIkaW52IDwtICBpZmVsc2UoZGYyJHBob25lVHlwZSA9PSJsYW5kbGluZV9zdWJzIixkZjIkc3VicysxLGRmMiRzdWJzKQpkZjIgPC0gZGYyICU+JSBtdXRhdGUoaW52ID0gaWZlbHNlKHBob25lVHlwZSA9PSJtb2JpbGVfc3VicyIsc3VicyxzdWJzKi0xKSkKYGBgCgpgYGB7cn0KZGYyICU+JQogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBpbnYsIGZpbGwgPSBwaG9uZVR5cGUpKSsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiaWRlbnRpdHkiKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvciA9ICJ3aGl0ZSIpKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoZnJvbSA9IC0xMDAsIHRvID0gMjQwLCBieSA9IDIwKSwgbGFiZWxzPWFicyhzZXEoZnJvbSA9IC0xMDAsIHRvID0gMjQwLCBieSA9IDIwKSkpKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoZnJvbSA9IDE5OTAsIHRvID0gMjAxNywgYnkgPSA1KSkrCiAgc2NhbGVfZmlsbF9tYW51YWwobmFtZSA9ICJQaG9uZSBUeXBlIiwgbGFiZWxzID0gYygiTGFuZGxpbmUiLCAiTW9iaWxlIiksIHZhbHVlcyA9IGMoIiM2MDZjMzgiLCAiIzAwM2Y4OCIpKSsKICBsYWJzKAogICAgIHggPSAiWWVhciIsCiAgICAgeSA9ICJQaG9uZSBTdWJzIHBlciAxMDAgUGVvcGxlIiwKICAgICBmaWxsID0gIlBob25lIFR5cGUiLAogICAgIHRpdGxlID0iVUFFIFBob25lIFN1YnNjcmlwdGlvbnMgb3ZlciBUaW1lIiwKICAgICBzdWJ0aXRsZSA9ICJDb21wYXJpc29uIG9mIExhbmRsaW5lIHZzLiBNb2JpbGUgUGhvbmUgU3Vic2NyaXB0aW9ucyBcbiAocGVyIDEwMCBwZW9wbGUpIGluIHRoZSBVQUUgZnJvbSAxOTkwIHRvIDIwMTciCiAgICkrCiAgIHRoZW1lKAogICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTEpLAogICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwKICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgcGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiwgaGp1c3QgPSAuNSwgZmFjZSA9ICJib2xkIiksCiAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTEsIGhqdXN0ID0gLjUpLAogICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMSksCiAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMSksCiAgICAgbGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKQogICApCmBgYAoKTW9iaWxlIHN1YnMgYnkgY29udGluZW50IApgYGB7cn0KZGYgJT4lIGdyb3VwX2J5KHllYXIsIGNvbnRpbmVudCkgJT4lIHRhbGx5KG1vYmlsZV9zdWJzKSAlPiUgZ2dwbG90KGFlcyh4PXllYXIsIHk9biwgY29sb3I9Y29udGluZW50KSkgKyBnZW9tX2xpbmUoKSArCiAgIHRoZW1lKAogICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiMyRDJEMkQiKSwKICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiIzJEMkQyRCIpLAogICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJ3aGl0ZSIsIHNpemUgPSAxMSksCiAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJ3aGl0ZSIsIHNpemUgPSAxMiksCiAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpLAogICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJ3aGl0ZSIpLAogICAgIHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoY29sb3I9IndoaXRlIiksCiAgICAgYXhpcy5saW5lLnkgPSBlbGVtZW50X2xpbmUoY29sb3I9IndoaXRlIiksCiAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJ3aGl0ZSIsIHNpemUgPSAxNiwgaGp1c3QgPSAuNSwgZmFjZSA9ICJib2xkIiksCiAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJ3aGl0ZSIsIHNpemUgPSAxMSwgaGp1c3QgPSAuNSksCiAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAid2hpdGUiLCBzaXplID0gMTEpLAogICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJ3aGl0ZSIsIHNpemUgPSAxMSksCiAgICAgbGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKQogICApICsgbGFicyh4PSJZZWFyIiwgeT0iTW9iaWxlIHN1YnMgcGVyIDEwMCBwZW9wbGUiLCB0aXRsZSA9ICJNb2JpbGUgc3Vic2NyaXB0aW9ucyBvdmVyIHRoZSB5ZWFycyIsIHN1YnRpdGxlID0gIkNvbXBhcmluZyBjb250aW5lbnRzIG1vYmlsZSBzdWJzY3JpcHRpb25zIFxuIChwZXIgMTAwIHBlb3BsZSkgZnJvbSAxOTkwIHRvIDIwMTcgIikgKyBzY2FsZV9jb2xvcl90cm9uKCkKCmBgYAoKTGFuZGxpbmUgc3VicyBieSBjb250aW5lbnQgCmBgYHtyfQpkZiAlPiUgZ3JvdXBfYnkoeWVhciwgY29udGluZW50KSAlPiUgdGFsbHkobGFuZGxpbmVfc3VicykgJT4lIGdncGxvdChhZXMoeD15ZWFyLCB5PW4sIGNvbG9yPWNvbnRpbmVudCkpICsgZ2VvbV9saW5lKCkgKwogICB0aGVtZSgKICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjMkQyRDJEIiksCiAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiMyRDJEMkQiKSwKICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAid2hpdGUiLCBzaXplID0gMTEpLAogICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAid2hpdGUiLCBzaXplID0gMTIpLAogICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICBheGlzLnRpY2tzLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAid2hpdGUiKSwKICAgICBwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yPSJ3aGl0ZSIpLAogICAgIGF4aXMubGluZS55ID0gZWxlbWVudF9saW5lKGNvbG9yPSJ3aGl0ZSIpLAogICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAid2hpdGUiLCBzaXplID0gMTYsIGhqdXN0ID0gLjUsIGZhY2UgPSAiYm9sZCIpLAogICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAid2hpdGUiLCBzaXplID0gMTEsIGhqdXN0ID0gLjUpLAogICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLAogICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gIndoaXRlIiwgc2l6ZSA9IDExKSwKICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAid2hpdGUiLCBzaXplID0gMTEpLAogICAgIGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCkKICAgKSArIGxhYnMoeD0iWWVhciIsIHk9IkxhbmRsaW5lIHN1YnMgcGVyIDEwMCBwZW9wbGUiLCB0aXRsZSA9ICJMYW5kbGluZSBzdWJzY3JpcHRpb25zIG92ZXIgdGhlIHllYXJzIiwgc3VidGl0bGUgPSAiQ29tcGFyaW5nIGNvbnRpbmVudHMgbGFuZGxpbmUgc3Vic2NyaXB0aW9ucyBcbiAocGVyIDEwMCBwZW9wbGUpIGZyb20gMTk5MCB0byAyMDE3ICIpICsgc2NhbGVfY29sb3JfdHJvbigpCmBgYAoKCgo=