Preparation

# List of packages
packages <- c("tidyverse", "fst", "modelsummary") # loading in necessary packages 

# Installing packages 
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") #loading in ESS data
dim(ess) #number of observations and variables
## [1] 490555   2665

Task 1

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.

Code for average Belgium levels of happiness

belgium_happy <- ess %>% 
  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 (refual), 88 (don't know), 99 (no answer) or else will alter results

# 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

Code for average Norway levels of happiness

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
# need to remove 77(refusal) and 88 (don't know) or else will alter result

# Recoding values 77 through 88 to NA
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

The average level of happiness in Belgium is 7.737334, and 7.975005 for Norway.

This implies that the average happiness of Norway is higher than that of Belgium, though only by around a value of 0.25. Overall, their averages are very close, but Norway is still higher than Belgium.

Task 2

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.

Code for finding the mode of Irish Binge Drinking

ireland_fbdrinking <- ess %>%
  filter(cntry == "IE") %>%
  select(alcbnge)

ireland_fbdrinking$y <- ireland_fbdrinking$alcbnge

table(ireland_fbdrinking$y)
## 
##   1   2   3   4   5   6   7   8 
##  65 650 346 417 239 641  26   6
# Recode values 6 through 8 to NA. 6: not applicable, 7: refusal to answer, 8: do not know 
ireland_fbdrinking$y[ireland_fbdrinking$y %in% 6:8] <- NA

#checking again 
table(ireland_fbdrinking$y)
## 
##   1   2   3   4   5 
##  65 650 346 417 239
# Converting to categories to get mode as a category instead of a number
df <- ireland_fbdrinking %>%
  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),  ### order of the categories made
                             "Daily or almost daily", 
                             "Weekly", 
                             "Monthly", 
                             "Less than monthly", 
                             "Never")
  )

# To confirm the conversion:
table(df$y_category)
## 
## Daily or almost daily                Weekly               Monthly 
##                    65                   650                   346 
##     Less than monthly                 Never 
##                   417                   239
# Determining the mode of category:

get_mode <- function(v) {
  tbl <- table(v)
  mode_vals <- as.character(names(tbl)[tbl == max(tbl)])
  return(mode_vals)
}

mode_values <- get_mode(df$y_category)
cat("Mode of y category:", paste(mode_values, collapse = ", "), "\n")
## Mode of y category: Weekly

The most common category selected under binge drinking in Ireland is ‘Weekly’

This implies that it is most common for Irish people who answered and who drink to binge drink weekly, not daily, monthly, less than monthly or never.

Task 3

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 %>% #filtering and selecting to the value of plnftr for portugal 
  filter(cntry == "PT") %>% 
  select(plnftr)
summary(portugal_plnftr$plnftr) #summarizing the results 
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##   0.000   3.000   5.000   6.426   8.000  88.000   14604
portugal_plnftr$plnftr[portugal_plnftr$plnftr %in% 88] <- NA #filtering out 88 as it means "don't know"

#checking again 
summary(portugal_plnftr$plnftr)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##   0.000   3.000   5.000   5.418   8.000  10.000   14644
serbia_plnftr <- ess %>% #repeating process for Serbia
  filter(cntry == "RS") %>% 
  select(plnftr)
summary(serbia_plnftr$plnftr)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##   0.000   0.000   4.000   4.983   8.000  88.000    1505
serbia_plnftr$plnftr[serbia_plnftr$plnftr %in% 77:88] <- NA #filtering out 77 as it means "refusal" and 88 as it means "don't know"

#checking again 
summary(serbia_plnftr$plnftr)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##   0.000   0.000   4.000   4.143   8.000  10.000    1526

An answer of 0 means “I plant for my future as much as possible”, while 10 means “I just take each day as it comes”, with 1-9 being everything in between. Portugal has a filtered mean of 5.418, while Serbia has a filtered mean of 4.143. This implies that more people in Portugal lean towards taking each day as it comes than those in Serbia, while people in Serbia prefer to plan. This is also reflected in the 1st quartile values, where it is 3 for Portugal (showing more people chose higher value) and 0 for Serbia (showing more people chose lower values) while they both have 8 for their 3rd quartile. However, the mean of Portugal is very much near the middle, so within themselves, they are almost evenly split between planning and just coasting along. The medians are also reflective of the filtered values, being 5 for Portugal and 4 for Serbia, and therefore being quite close and even with the mean.

Overall, Portugal is quite set in the middle ground between planning and taking each day as it comes, and Serbia leans a little more towards planning.

Task 4

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")

# Converting gender and lrscale (representing pol ID self-placement from left to right)
italy_data <- italy_data %>%
  mutate(
    gndr = case_when(
      gndr == 1 ~ "Male",
      gndr == 2 ~ "Female",
      TRUE ~ as.character(gndr)
    ),
    lrscale = ifelse(lrscale %in% c(77, 88), NA, lrscale)  # Converting lrscale values
  )
# Computing average of lrscale by gender
means_by_gender <- italy_data %>%
  group_by(gndr) %>% # grouping by second group
  summarize(lrscale = mean(lrscale, na.rm = TRUE)) # summarizing variable of interest 

print(means_by_gender)
## # A tibble: 3 × 2
##   gndr   lrscale
##   <chr>    <dbl>
## 1 9         4.6 
## 2 Female    5.09
## 3 Male      5.20

Here it can be seen that the average for men is higher than that of women. In this data, 10 means “extremely satisfied” with the democracy in Italy, and 0 means “extremly dissastified. Both averages are quite close to the middle, meaning that both men and women of Italy are not quite satisfied nor dissatisfied. #### Men on average are a little more satisfied with democracy than women are, however, by around ~0.12.

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.

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 <- ess %>% 
  filter(cntry == "FR")

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)", title = "Boxplot of satisfaction with the state of education vs. health services") +
  theme_minimal()
## Warning: Removed 364 rows containing non-finite values (`stat_boxplot()`).

The median french person is happier with the health system (right) than the education system (left).

This can be seen in the thick black line in the middle of the boxes, wherein it can be seen that the median for the satisfaction of the education system is ~5, while the median for satisfaction with the health system is ~7. This means that more people selected higher values of satisfaction with the health system than the education system.