Kashvi Shah | 1009413706
# 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
new_packages <- packages[!(packages %in% installed.packages()[,"Package"])]
if(length(new_packages)) install.packages(new_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"
rm(list=ls()); gc()
## used (Mb) gc trigger (Mb) limit (Mb) max used (Mb)
## Ncells 1080003 57.7 2200544 117.6 NA 1450717 77.5
## Vcells 1860711 14.2 8388608 64.0 16384 2400631 18.4
ess <- read_fst("All-ESS-Data.fst")
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)?
spain_data <- read.fst("spain_data.fst")
library(ggplot2)
library(dplyr)
# Set values 77, 88, and 99 to NA in 'trstplt'
spain_data <- spain_data %>%
mutate(
trstplt = ifelse(trstplt %in% c(77, 88, 99), NA, trstplt)
)
# Check the values after modification
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
# Create a 'year' variable from the 'essround' 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]
}
# Calculate the average trust in Parliament by year
trust_by_year <- spain_data %>%
group_by(year) %>%
summarize(mean_trust_plt = mean(trstplt, na.rm = TRUE))
# Visualize the trend
ggplot(trust_by_year, aes(x = year, y = mean_trust_plt)) +
geom_line(color = "Purple", size = 1) + # Line to show the trend
geom_point(color = "orange", size = 3) + # Points to highlight each year's value
labs(title = "Trust in Parliament in Spain (2002-2020)",
x = "Survey Year",
y = "Average Trust in Parliament") +
ylim(0, 10) + # Setting the y-axis limits from 0 to 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.
The graph showed indications of a decline. From 3.75 to about 1.9, the average trust continued to decline between 2005 and 2012. Even though it had somewhat increased—by about 0.6—between 2012 and 2018, it continued to decline after that.
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.
Answer: There are several anomalies from the previous years, with Norway having extremely high proportions and Italy having very low ones. In more recent times, there has been a negative association observed in all three countries. The depiction depicting France’s early years reveals tendencies that are extremely similar to, but marginally weaker than, those of Norway, while the closest period to the 21st century has a trend that begins to resemble Italy’s slope while staying just above it.France had increased slightly between 1920 and 1940, whereas Norway had dropped. Norway has only reduced from roughly 0.75 to roughly 0.5 since 1940, while France has decreased from 0.625 to slightly less than 0.25. It demonstrates that whereas Norway has only decreased for about 0.25 percent, France has decreased for about 0.4 percent. Thus, France is superior to Italy, while Norway is superior to France.
Task 3: Provide code and answer.
Question: What is the marginal percentage of Italian men who feel close to a particular political party?
italy_data <- read_fst("italy_data.fst")
# Recode gndr and lrscale variables
italy_data <- italy_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_
)
)
lrscale_percentages <- italy_data %>% # Begin with the dataset 'italy_data'
filter(!is.na(lrscale), !is.na(gndr)) %>% # Filter out rows where 'lrscale' or 'gender' is NA (missing data)
group_by(gndr, lrscale) %>% # Group the data by 'gender' and 'lrscale' categories
summarise(count = n(), .groups = 'drop') %>% # Summarise each group to get counts, and then drop groupings
mutate(percentage = count / sum(count) * 100) # Calculate percentage for each group by dividing count by total count and multiplying by 100
lrscale_percentages # The resulting dataframe
## # A tibble: 4 × 4
## gndr lrscale count percentage
## <chr> <chr> <int> <dbl>
## 1 Female Left 930 23.9
## 2 Female Right 955 24.5
## 3 Male Left 924 23.7
## 4 Male Right 1084 27.8
Male and Right: Among all Italian respondents, 27.8% are men who lean right politically. Male and Left: Of all Italian respondents, 23.7% are male and have a left political inclination. Of Italian men, 20.5% feel a strong sense of affinity with a 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.
sweden_data <- read_fst("Sweden_data.fst")
# Recode gender and political orientation variables
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_
)
)
# Calculate percentages
lrscale_percentages_sweden <- 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_plot <- ggplot(lrscale_percentages, aes(x = lrscale, y = percentage, fill = lrscale)) +
geom_bar(stat = "identity", position = position_dodge()) + # Dodged bar chart
facet_wrap(~ gndr, scales = "fixed") +
scale_fill_brewer(palette = "Set3") +
labs(
title = "Political Orientation (Left vs. Right) by Gender in Sweden",
x = "Political Orientation",
y = "Percentage of Respondents",
fill = "Orientation"
) +
theme_minimal() +
theme(legend.position = "top")
lrscale_plot
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?
hungary_data <- read_fst("hungary_data.fst")
hungary_data <- hungary_data %>%
mutate(
geo = case_when(
domicil %in% c(1, 2) ~ "Urban", # Assuming 1 and 2 represent urban areas
domicil %in% c(3, 4, 5) ~ "Rural", # Assuming 3, 4, and 5 represent rural areas
TRUE ~ NA_character_
)
) %>%
filter(!is.na(geo), !is.na(lrscale), !lrscale %in% c(77, 88, 99)) # Removing rows with NA in geo, lrscale, and excluding 77, 88, 99
# Convert lrscale to factor
hungary_data$lrscale <- as.factor(hungary_data$lrscale)
# Calculate conditional probabilities, excluding NAs for Hungary_data
cond_hungary <- hungary_data %>%
count(lrscale, geo) %>%
group_by(geo) %>%
mutate(prob_not_feeling_close = sum(n[lrscale %in% c(0, 1)]) / sum(n))
# Print conditional probabilities for Hungary_data
print(cond_hungary)
## # A tibble: 22 × 4
## # Groups: geo [2]
## lrscale geo n prob_not_feeling_close
## <fct> <chr> <int> <dbl>
## 1 0 Rural 314 0.0566
## 2 0 Urban 234 0.0817
## 3 1 Rural 233 0.0566
## 4 1 Urban 107 0.0817
## 5 2 Rural 469 0.0566
## 6 2 Urban 215 0.0817
## 7 3 Rural 637 0.0566
## 8 3 Urban 337 0.0817
## 9 4 Rural 632 0.0566
## 10 4 Urban 332 0.0817
## # ℹ 12 more rows
# Calculate conditional probabilities, excluding NAs
cond <- hungary_data %>%
count(clsprty, geo) %>%
group_by(geo) %>%
mutate(prob = n / sum(n))
cond
## # A tibble: 10 × 4
## # Groups: geo [2]
## clsprty geo n prob
## <dbl> <chr> <int> <dbl>
## 1 1 Rural 4751 0.492
## 2 1 Urban 2162 0.518
## 3 2 Rural 4667 0.483
## 4 2 Urban 1910 0.458
## 5 7 Rural 85 0.00880
## 6 7 Urban 42 0.0101
## 7 8 Rural 159 0.0165
## 8 8 Urban 57 0.0137
## 9 9 Rural 1 0.000103
## 10 9 Urban 3 0.000719
Did it two ways to get a clear understanding. Given that they reside in a rural location, the conditional likelihood that they Do Not feel close to any particular party is 55.4%.