This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see http://rmarkdown.rstudio.com.
When you click the Knit button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:
summary(cars)
## speed dist
## Min. : 4.0 Min. : 2.00
## 1st Qu.:12.0 1st Qu.: 26.00
## Median :15.0 Median : 36.00
## Mean :15.4 Mean : 42.98
## 3rd Qu.:19.0 3rd Qu.: 56.00
## Max. :25.0 Max. :120.00
You can also embed plots, for example:
Note that the echo = FALSE parameter was added to the
code chunk to prevent printing of the R code that generated the
plot.
# List of packages
packages <- c("tidyverse", "fst", "modelsummary") # add any you need here
# Install packages if they aren't installed already
new_packages <- packages[!(packages %in% installed.packages()[,"Package"])]
if(length(new_packages)) install.packages(new_packages)
# Load the packages
lapply(packages, library, character.only = TRUE)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.4
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.4.4 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.0
## ✔ purrr 1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
## [[1]]
## [1] "lubridate" "forcats" "stringr" "dplyr" "purrr" "readr"
## [7] "tidyr" "tibble" "ggplot2" "tidyverse" "stats" "graphics"
## [13] "grDevices" "utils" "datasets" "methods" "base"
##
## [[2]]
## [1] "fst" "lubridate" "forcats" "stringr" "dplyr" "purrr"
## [7] "readr" "tidyr" "tibble" "ggplot2" "tidyverse" "stats"
## [13] "graphics" "grDevices" "utils" "datasets" "methods" "base"
##
## [[3]]
## [1] "modelsummary" "fst" "lubridate" "forcats" "stringr"
## [6] "dplyr" "purrr" "readr" "tidyr" "tibble"
## [11] "ggplot2" "tidyverse" "stats" "graphics" "grDevices"
## [16] "utils" "datasets" "methods" "base"
ess <- read_fst("All-ESS-Data.fst")
Provide code and answer.
Prompt and question: calculate the average for the variable ‘happy’ for the country of Norway. On average, based on the ESS data, who reports higher levels of happiness: Norway or Belgium?
Note: we already did it for Belgium. You just need to compare to Norway’s average, making sure to provide the code for both.
belgium_happy <- ess %>% # note: if you work from belgium_data replace "ess" with belgium_data
filter(cntry == "BE") %>%
select(happy)
belgium_happy$y <- belgium_happy$happy
table(belgium_happy$y)
##
## 0 1 2 3 4 5 6 7 8 9 10 77 88 99
## 50 27 104 194 234 830 999 3503 6521 3402 1565 3 16 3
# need to remove 77, 88, 99 or else will alter results. See data portal for what they represent (e.g. DK, Refusal, etc.)
# Recode values 77 through 99 to NA
belgium_happy$y[belgium_happy$y %in% 77:99] <- NA
# checking again
table(belgium_happy$y)
##
## 0 1 2 3 4 5 6 7 8 9 10
## 50 27 104 194 234 830 999 3503 6521 3402 1565
mean_y <- mean(belgium_happy$y, na.rm = TRUE)
cat("Mean of 'y' is:", mean_y, "\n")
## Mean of 'y' is: 7.737334
norway_happy <- ess %>%
filter(cntry == "NO") %>%
select(happy)
norway_happy$y <- norway_happy$happy
table(norway_happy$y)
##
## 0 1 2 3 4 5 6 7 8 9 10 77 88
## 15 29 59 163 238 730 817 2617 5235 3796 2344 12 10
norway_happy$y[norway_happy$y %in% 77:88] <- NA
# checking again
table(norway_happy$y)
##
## 0 1 2 3 4 5 6 7 8 9 10
## 15 29 59 163 238 730 817 2617 5235 3796 2344
mean_y <- mean(norway_happy$y, na.rm = TRUE)
cat("Mean of 'y' is:", mean_y, "\n")
## Mean of 'y' is: 7.975005
# Answer: The average for the variable "happy" is 7.737334 in Belgium compared to 7.975005 in Norway. Overall, Norway reports slightly higher levels of happiness than Belgium.
Provide code and answer.
Prompt and question: what is the most common category selected, for Irish respondents, for frequency of binge drinking? The variable of interest is: alcbnge.
More info here: https://ess-search.nsd.no/en/variable/0c65116e-7481-4ca6-b1d9-f237db99a694.
Hint: need to convert numeric value entries to categories as specified in the variable information link. We did similar steps for Estonia and the climate change attitude variable.
ireland_ccalcbnge <- ess %>%
filter(cntry == "IE") %>%
select(wrclmch)
ireland_ccalcbnge$y <- ireland_ccalcbnge$wrclmch
table(ireland_ccalcbnge$y)
##
## 1 2 3 4 5 6 7 8
## 386 938 2080 820 217 51 3 32
# Recode values 6 through 8 to NA
ireland_ccalcbnge$y[ireland_ccalcbnge$y %in% 6:8] <- NA
# Converting to categories to get mode as a category instead of a number
df <- ireland_ccalcbnge %>%
mutate(
y_category = case_when(
y == 1 ~ "Daily or almost daily",
y == 2 ~ "Weekly",
y == 3 ~ "Monthly",
y == 4 ~ "Less than monthly",
y == 5 ~ "Never",
TRUE ~ NA_character_
),
y_category = fct_relevel(factor(y_category), ### here you would put the categories in order you want them to appear or else it will appear alphabetically
"Daily or almost daily",
"Weekly",
"Monthly",
"Less than monthly",
"Never")
)
# To confirm the conversion:
table(df$y_category)
##
## Daily or almost daily Weekly Monthly
## 386 938 2080
## Less than monthly Never
## 820 217
## Answer: For Irish respondents, the most common category selected for frequency of binge drinking is "Monthly" (2080).
Provide code and answer.
Prompt and question: when you use the summary() function for the variable plnftr (about planning for future or taking every each day as it comes from 0-10) for both the countries of Portugal and Serbia, what do you notice? What stands out as different when you compare the two countries (note: look up the variable information on the ESS website to help with interpretation)? Explain while referring to the output generated.
portugal_plnftr <- ess %>%
filter(cntry == "PT") %>%
select(plnftr)
portugal_plnftr$y <- portugal_plnftr$plnftr
table(portugal_plnftr$y)
##
## 0 1 2 3 4 5 6 7 8 9 10 88
## 114 184 313 356 264 481 262 382 345 166 370 40
portugal_plnftr$y[portugal_plnftr$y %in% 88] <- NA
# checking again
table(portugal_plnftr$y)
##
## 0 1 2 3 4 5 6 7 8 9 10
## 114 184 313 356 264 481 262 382 345 166 370
summary(portugal_plnftr)
## plnftr y
## Min. : 0.000 Min. : 0.000
## 1st Qu.: 3.000 1st Qu.: 3.000
## Median : 5.000 Median : 5.000
## Mean : 6.426 Mean : 5.418
## 3rd Qu.: 8.000 3rd Qu.: 8.000
## Max. :88.000 Max. :10.000
## NA's :14604 NA's :14644
serbia_plnftr <- ess %>%
filter(cntry == "RS") %>%
select(plnftr)
serbia_plnftr$y <- serbia_plnftr$plnftr
table(serbia_plnftr$y)
##
## 0 1 2 3 4 5 6 7 8 9 10 77 88
## 587 133 152 138 95 246 70 87 103 47 364 4 17
serbia_plnftr$y[serbia_plnftr$y %in% 77:88] <- NA
# checking again
table(serbia_plnftr$y)
##
## 0 1 2 3 4 5 6 7 8 9 10
## 587 133 152 138 95 246 70 87 103 47 364
summary(serbia_plnftr)
## plnftr y
## Min. : 0.000 Min. : 0.000
## 1st Qu.: 0.000 1st Qu.: 0.000
## Median : 4.000 Median : 4.000
## Mean : 4.983 Mean : 4.143
## 3rd Qu.: 8.000 3rd Qu.: 8.000
## Max. :88.000 Max. :10.000
## NA's :1505 NA's :1526
## Answer: For the variable "plnftr", 0 represents "I plan for the future as much as possible" while 10 represents "I just take each day as it comes". Looking at the date, we see the average response for Portugal is 5.418 and for Sebia it is 4.143. Therefore, by comparing the means we can see that Portugeuse citizens typically plan less for the future than Serbian citizens. In addition, the IQR for Portugal is 5.000 while the IQR is 8.000 for Serbia (the output generated for the first quartile is 0.000). Since IQR tells us where the middle 50% of the data lies, we know that Serbian citizens report more variability in responses than Portugeuse citizens.
Provide code and answer.
Prompt and question: using the variables stfdem and gndr, answer the following: on average, who is more dissastified with democracy in Italy, men or women? Explain while referring to the output generated.
Info on variable here: https://ess.sikt.no/en/variable/query/stfdem/page/1
italy_data <- ess %>%
filter(cntry == "IT")
italy_data <- italy_data %>%
mutate(
gndr = case_when(
gndr == 1 ~ "Male",
gndr == 2 ~ "Female",
TRUE ~ as.character(gndr)
),
stfdem = ifelse(stfdem %in% c(77, 88, 99), NA, stfdem)
)
# Compute mean for male
mean_male_stfdem <- italy_data %>%
filter(gndr == "Male") %>%
summarize(mean_stfdem_men = mean(stfdem, na.rm = TRUE))
print(mean_male_stfdem)
## mean_stfdem_men
## 1 4.782646
# Compute mean for male
mean_female_stfdem <- italy_data %>%
filter(gndr == "Female") %>%
summarize(mean_stfdem_women = mean(stfdem, na.rm = TRUE))
print(mean_female_stfdem)
## mean_stfdem_women
## 1 4.657553
##Answer: In Italy, the average score for men was 4.782646 while the average score for women was 4.657553. According to the ESS Data Portal, 0 represents "Extremely dissatisfied" while 10 represents "Extremely satisfied". Since women have a lower score than men, we know that women are slighlty more dissatisfied with democracy in Italy than men. However, both scores are below 5 (neutral), indicating dissatisfaction with democracy for both genders.
##Task 5
Provide code and answer.
Prompt: Interpret the boxplot graph of stfedu and stfhlth that we generated already: according to ESS data, would we say that the median French person is more satisfied with the education system or health services? Explain.
france_data <- read.fst("france_data.fst")
france_data %>%
# Setting values to NA
mutate(stfedu = ifelse(stfedu %in% c(77, 88, 99), NA, stfedu),
stfhlth = ifelse(stfhlth %in% c(77, 88, 99), NA, stfhlth)) %>%
# Reshaping the data
select(stfedu, stfhlth) %>%
gather(variable, value, c(stfedu, stfhlth)) %>%
# Creating the boxplot
ggplot(aes(x = variable, y = value)) +
geom_boxplot() +
labs(y = "Y-axis", x = "X-axis", title = "Boxplot of stfedu vs. stfhlth") +
theme_minimal()
## Warning: Removed 364 rows containing non-finite values (`stat_boxplot()`).
##Answer: According to ESS data, the median French person is more satisfied with health services than the education system. In a boxplot, the box represents IQR and the line within it represents the median. The median for education is 5.0, suggesting the data is normally distributed (since the value range is 0-10). However, for health services, the median is closer to 7.5, suggesting the distribution of data is skewed to the left (peak at higher values). Since 0 represents "Extremely bad" and 10 represents "Extremely good", we can safely say that the median French person's satisfaction with health services is high (median of 8) while their satisfaction with education is medium (median of 5).
Change the boxplot graph: provide the code to change some of the key labels: (1) Change the title to: Boxplot of satisfaction with the state of education vs. health services; (2) Remove the x-axis label; (3) Change the y-axis label to: Satisfaction (0-10).
Hint: copy the boxplot code above and just replace or cut what is asked.
france_data <- read.fst("france_data.fst")
france_data %>%
# Setting values to NA
mutate(stfedu = ifelse(stfedu %in% c(77, 88, 99), NA, stfedu),
stfhlth = ifelse(stfhlth %in% c(77, 88, 99), NA, stfhlth)) %>%
# Reshaping the data
select(stfedu, stfhlth) %>%
gather(variable, value, c(stfedu, stfhlth)) %>%
# Creating the boxplot
ggplot(aes(x = variable, y = value)) +
geom_boxplot() +
labs(y = "Satisfaction (0-10)", x = "", title = "Boxplot of satisfaction with the state of education vs. health services") +
theme_minimal()
## Warning: Removed 364 rows containing non-finite values (`stat_boxplot()`).