Loading packages

# List of packages
packages <- c("tidyverse", "fst", "modelsummary", "viridis") # 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
## Loading required package: viridisLite
## [[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"        
## 
## [[4]]
##  [1] "viridis"      "viridisLite"  "modelsummary" "fst"          "lubridate"   
##  [6] "forcats"      "stringr"      "dplyr"        "purrr"        "readr"       
## [11] "tidyr"        "tibble"       "ggplot2"      "tidyverse"    "stats"       
## [16] "graphics"     "grDevices"    "utils"        "datasets"     "methods"     
## [21] "base"

Task 1

Provide code and answer.

Prompt: in the tutorial, we calculated the average trust in others for France and visualized it. Using instead the variable ‘Trust in Parliament’ (trstplt) and the country of Spain (country file provided on course website), visualize the average trust by survey year. You can truncate the y-axis if you wish. Provide appropriate titles and labels given the changes. What are your main takeaways based on the visual (e.g., signs of increase, decrease, or stall)?

I think there was a typo with the variable ‘trstplt’ on the ess database that refers to ‘trust in politicians’ so I calculated that instead of parliament

1. Loading data into R

spain_data <- read.fst("spain_data.fst")

2. Cleaning Data

spain_data <- spain_data |>
  mutate(
    trstplt = ifelse(trstplt %in% c(77, 88, 99), NA, trstplt),
  )
table(spain_data$trstplt)
## 
##    0    1    2    3    4    5    6    7    8    9   10 
## 5165 1830 2329 2441 2085 2890 1154  639  355   80   71

3. Creating a new ‘year’ variable

spain_data$year <- NA
replacements <- c(2002, 2004, 2006, 2008, 2010, 2012, 2014, 2016, 2018, 2020)
for(i in 1:10){
  spain_data$year[spain_data$essround == i] <- replacements[i]
}
table(spain_data$year)
## 
## 2002 2004 2006 2008 2010 2012 2014 2016 2018 2020 
## 1729 1663 1876 2576 1885 1889 1925 1958 1668 2283

4. Calculate mean by year for ‘trust in politicians’

trust_by_year <- spain_data |>
  group_by(year) |>
  summarize(mean_trust = mean(trstplt, na.rm = TRUE))
trust_by_year
## # A tibble: 10 × 2
##     year mean_trust
##    <dbl>      <dbl>
##  1  2002       3.41
##  2  2004       3.66
##  3  2006       3.49
##  4  2008       3.32
##  5  2010       2.72
##  6  2012       1.91
##  7  2014       2.23
##  8  2016       2.40
##  9  2018       2.55
## 10  2020       1.94

5. Visualize

ggplot(trust_by_year, aes(x = year, y = mean_trust)) +
  geom_line(color = "blue", size = 1) +
  geom_point(color = "orange", size = 3) +
  labs(title = "Trust in Politicians in Spain (2002-2020)", 
       x = "Survey Year", 
       y = "Average Trust (0-10 scale)") +
  ylim(0, 10) +
  theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Conclusion

The average trust in politicians, on a scale from 0-10, with 0 being “no trust at all” and 10 being “complete trust” has declined over time in Spain from its highest in 2004 at 3.66 to 1.94 in 2020. Since 2002, the average trust has been on a consistent decline, but experienced a dip to 1.91 in 2012, a slight increase since and a sharper decline in 2020 when COVID hit.

Task 2

Provide answer only.

Prompt and question: Based on the figure we produced above called task2_plot, tell us: what are your main takeaways regarding France relative to Italy and Norway? Make sure to be concrete and highlight at least two important comparative trends visualized in the graph.

Takeaways

Proportions are a fraction of a whole and are calculated by taking an observation and dividing it by the total count of observations. France, Italy and Norway all experience a decrease overtime in proportions of saying “Yes” to feeling close to a party, thus the geom_smooth trend lines for each country show strong negative non-linear relationships.

France relative to Norway shows a mirrored relationship, where whenever Norway experiences a decrease in saying yes to feeling close to a party, France increases and vice versa, experiencing a diverge in their final proportions in 2000 at ~0.24 for France and ~0.52 for Norway. France relative to Italy shows a similar mirrored relationship, however, only from 1920 to ~1950, where whenever France increases in saying yes to feeling close to a party, Italy decreases, showcasing the inverse. After 1950, both trend lines begin to move closer together, yet still in an overall decrease of saying yes to feeling close to a party.

Task 3

Provide code and answer.

Question: What is the marginal percentage of Italian men who feel close to a particular political party?

1. Load Italy Data

italy_data <- read.fst("italy_data.fst")

2. Recode Gender and ‘clsprty’ as Categories

italy_data <- italy_data |>
  mutate(
    gndr = case_when(
      gndr == 1 ~ "Male",
      gndr == 2 ~ "Female",
      TRUE ~ NA_character_
    ),
    clsprty = case_when(
      clsprty %in% 1 ~ "Yes",
      clsprty %in% 2 ~ "No",
      TRUE ~ NA_character_
    )    
  ) 

3. Create Frequency Table of Percentages

clsprty_percentages <- italy_data |>
  filter(!is.na(clsprty), !is.na(gndr)) |>
  group_by(gndr, clsprty) |>
  summarise(count = n(), .groups = 'drop') |>
  mutate(percentage = count / sum(count) * 100)
clsprty_percentages
## # A tibble: 4 × 4
##   gndr   clsprty count percentage
##   <chr>  <chr>   <int>      <dbl>
## 1 Female No       3228       34.2
## 2 Female Yes      1686       17.9
## 3 Male   No       2593       27.5
## 4 Male   Yes      1936       20.5

Conclusion

Male and Yes: Of all Italian respondents, 20.50% are men who feel close to a particular political party.

Task 4

Provide code and output only.

Prompt: In the tutorial, we calculated then visualized the percentage distribution for left vs. right by gender for France. Your task is to replicate the second version of the visualization but for the country of Sweden instead.

1. Load in data for Sweden

sweden_data <- read.fst("sweden_data.fst")

2. Clean data and recode variables ‘gndr’ and ‘lrscale’ to categories

I decided to keep out values 4:6 because they would be considered moderate and we wanted to show 2x2 categories:

sweden_data <- sweden_data |>
  mutate(
    gndr = case_when(
      gndr == 1 ~ "Male",
      gndr == 2 ~ "Female",
      TRUE ~ NA_character_
    ),
    lrscale = case_when(
      lrscale %in% 0:3 ~ "Left",
      lrscale %in% 7:10 ~ "Right",
      TRUE ~ NA_character_
    )    
  ) 

3. Calculate percentages

lrscale_percentages <- sweden_data |>
  filter(!is.na(lrscale), !is.na(gndr)) |>
  group_by(gndr, lrscale) |>
  summarise(count = n(), .groups = 'drop') |>
  mutate(percentage = count / sum(count) * 100)
lrscale_percentages
## # A tibble: 4 × 4
##   gndr   lrscale count percentage
##   <chr>  <chr>   <int>      <dbl>
## 1 Female Left     2296       23.0
## 2 Female Right    2530       25.3
## 3 Male   Left     2062       20.6
## 4 Male   Right    3107       31.1

4. Visualization

lrscale_plot_v2 <- ggplot(lrscale_percentages, 
            aes(x = percentage,
                y = reorder(gndr, -percentage),
                fill = gndr)) +
  geom_col() +
  coord_flip() +
  guides(fill = "none") +
  facet_wrap(~ lrscale, nrow = 1) +
  labs(x = "Percentage of Respondents",
       y = NULL,
       title = "Political Orientation by Gender",
       subtitle = "Comparing the percentage distribution of left vs. right for Sweden (2002-2020)") +
  theme(plot.title = element_text(size = 16, face = "bold"),
        plot.subtitle = element_text(size = 12),
        axis.title.y = element_blank(), 
        legend.position = "bottom")
lrscale_plot_v2

Task 5

Provide code and answer: In Hungary, what is the conditional probability of NOT feeling close to any particular party given that the person lives in a rural area?

1. Load in Data for Hungary

hungary_data <- read.fst("hungary_data.fst")

2. Recoding ‘domicil’ to remove NA

hungary_data <- hungary_data |>
  mutate(
    geo = recode(as.character(domicil), 
                 '1' = "Urban", 
                 '2' = "Urban",
                 '3' = "Rural", 
                 '4' = "Rural", 
                 '5' = "Rural",
                 '7' = NA_character_,
                 '8' = NA_character_,
                 '9' = NA_character_)
  ) |>
  filter(!is.na(clsprty), !is.na(geo))

3. Recoding ‘clsprty’ to remove NA

hungary_data <- hungary_data |>
  mutate(
    clsprty = case_when(
      clsprty == 1 ~ "Yes",
      clsprty == 2 ~ "No",
      TRUE ~ NA_character_
    )
  )

3. Calculate conditional probabilities

cond <- hungary_data |>
  drop_na(clsprty) |>
  count(clsprty, geo) |>
  group_by(geo) |>
  mutate(prob = n / sum(n))
cond
## # A tibble: 4 × 4
## # Groups:   geo [2]
##   clsprty geo       n  prob
##   <chr>   <chr> <int> <dbl>
## 1 No      Rural  6275 0.554
## 2 No      Urban  2395 0.512
## 3 Yes     Rural  5055 0.446
## 4 Yes     Urban  2283 0.488

Conclusion

Given that someone in Hungary lives in a rural area, there is a 55.38% probability that they do not feel close to a political party.