Statistiche riassuntive: variabili demografiche

Distribuzione per caratteristiche demografiche

# Import data
df <-  read_excel("G:/My Drive/IRVAPP/Biblioteca/quest.xlsx", skip = 1)

# Prepare data for demographics table 
demo <- df %>% mutate(
  sesso = factor(Q12, c(1, 2), c("Femina", "Maschio")),
  eta = factor(Q13, 1:4, c("18-25", "26-35", "36-55", "56 oltre")),
  occup = factor(
    Q14, 1:5, 
    c("Studente/essa", "Occupato/a", "Disoccupato/a", "Pensionato/a", "Ritirato/a")),
  istruz = factor(
    Q15, c(1, 3, 4), 
    c("Secondaria I grado", "Secondaria II grado", "Laurea o più"))
)

# Table 1 - count observation by demographic variable
demo %>% select(sesso:istruz) %>%
  # Pivot to longer and compute the count
  pivot_longer(everything(),
               names_to = "var", values_to = "label"
               ) %>%
  group_by(var, label) %>%
  summarise(Totale = n()) %>%
  filter(!is.na(label)) %>%
  # Arrange by Total (desc)
  arrange(match(var, c("sesso", "eta", "occup", "istruz")),
          desc(Totale)) %>%
  ungroup() %>%
  # Format Totale to have a ligthgreen bar depending on its value
  mutate(Totale = color_bar("lightblue")(Totale)) %>%
  select(label, Totale) %>% 
  rename(Variabile = label) %>%
  # Format the final table
  kable(escape = F) %>% 
  kable_styling("hover", full_width = T) %>% 
  pack_rows("Sesso", 1, 2) %>%
  pack_rows("Età", 3, 6) %>%
  pack_rows("Condizione occupazionale
", 7, 10) %>%
  pack_rows("Livello di istruzione
", 11, 13)
Variabile Totale
Sesso
Maschio 47
Femina 44
Età
18-25 37
26-35 25
36-55 17
56 oltre 11
Condizione occupazionale
Studente/essa 58
Occupato/a 29
Pensionato/a 3
Disoccupato/a 1
Livello di istruzione
Laurea o più 59
Secondaria II grado 30
Secondaria I grado 3

Ricodifica delle variabili demografiche

  • Livello di istruzione
    • 1: Laurea o più
    • 0: Secondaria (grado I o II)
  • Condizione occupazionale
    • 1: Studente/essa
    • 0: Occupato/a, Pensionato/a o Disoccupato/a
  • Età
    • 1: 18-25
    • 2: 26-35
    • 3: 36 oltre
df_a <- df %>% 
  select(ID:Q1_2, Q2:Q5, Q6:Q15) %>%
  mutate_at(vars(Q1_1:Q11), ~ifelse(. > 10, NA_real_, .)) %>%
  mutate_at(vars(Q4_3, Q7), ~ifelse(. > 3, NA_real_, .)) %>%
  mutate(
    q2_piu_1_mese = ifelse(Q2 < 3, 1, 0), 
    q5_no_cambio = ifelse(Q5 == 1, 1, 0),
    q6_ottimo = ifelse(Q6 == 1, 1, 0),
    q8_abast = ifelse(Q8 %in% c(1, 2), 1, 0),
    q9_si = ifelse(Q9 %in% c(1, 2, 3), 1, 0),
    q10_abast = ifelse(Q10 %in% c(1, 2), 1, 0),
    q11_piu_1_mese = ifelse(Q11 < 3, 1, 0)
  ) %>%
  mutate(
    fem = ifelse(Q11 == 1, 1, 0),
    laur_o_piu = ifelse(Q15 == 4, 1, 0),
    stud = ifelse(Q14 == 1, 1, 0),
    age = case_when(
      Q13 == 1 ~ 1,
      Q13 == 2 ~ 2,
      Q13 > 2  ~ 3,
      TRUE ~ NA_real_
    )) %>%
  select(Q1_1:Q1_2, q2_piu_1_mese, Q3_1:Q3_2, Q4_1:Q4_3, q5_no_cambio, q6_ottimo, 
         Q7, q8_abast:age)

Cross tabulation: occupazione, genere, età

df_a %>%
  group_by(fem, stud, age) %>%
  summarise(count = n()) %>%
  na.omit() %>%
  ggplot(
    aes(x = factor(age, labels = c("18-25", "26-35", "36 oltre")), y = count, 
        fill = factor(stud,labels = c(
                             "Occupato/a, Pensionato/a o Disoccupato/a", "Studente/essa"))
        )
    ) +
  geom_bar(stat = "identity", alpha = 0.7) +
  scale_fill_viridis(NULL, discrete = TRUE, option = "D") +
  facet_wrap(~ factor(fem, labels = c("Maschio", "Femina"))) +
  xlab("") + 
  scale_y_continuous("Numero", breaks = seq(0, 30, 5)) +
  theme(legend.position = "bottom") 

Variabili dipendenti per caratteristiche demografiche

order_vars <- df_a %>% select(Q1_1:q11_piu_1_mese) %>% colnames() %>% rev()

label_y <- c(
  "Ambiente ideale per lo studio",
  "Materiale utile per la ricerca",
  "Accede più di 1 volta al mese",
  "Prevalentemente risorse cartacee",
  "Prevalentemente risorse digitali",
  "Prevalentemente sezione storia",
  "Prevalentemente sezione scienze religiose",
  "Prevalentemente sezione scientifica",
  "L'orario modificato nessun impatto",
  "Ottimo servizio di distribuzione e di reference",
  "Interessata/o prestito a domicilio",
  "Molto o abasstanza importante garantare la constanta disponibilita",
  "Usufrito del servizio di prestito interbibliotecario",
  "Molto o abasstanza soddisfatta/o servizio Internet",
  "Accede altre Biblioteche più di 1 volta al mese"
) %>% rev()

summarise_for_plot <- function(data) {
  # plot
  data %>% 
    pivot_longer(Q1_1:q11_piu_1_mese, names_to = "var_y", values_to = "val_y") %>%
    group_by(var_y) %>%
    summarise(
      mean = sum(val_y == 1, na.rm = T)/n())

}


summaries <- df_a %>%
  pivot_longer(fem:age, names_to = "var", values_to = "val") %>%
  group_by(var, val) %>%
  nest %>% 
  mutate(df_sum = map(data, summarise_for_plot)) %>%
  select(-data) %>%
  unnest(df_sum) %>%
  filter(!is.na(val))
  
  # summaries %>%
  # ggplot() +
  # geom_point(size = 5, alpha = 0.7, aes(x = var_y, y = mean, color = factor(val), group = factor(val))) +
  # scale_color_viridis(discrete = TRUE, option = "D") +
  # geom_segment(aes(x = var_y,
  #                  xend = var_y,
  #                  y = 0,
  #                  yend = 1),
  #              linetype="dashed",
  #              size = 0.1) +
  # coord_flip() +
  # facet_wrap(~ var)





plot_y_by_demo <- function(x, labels) {
  demo <- enquo(x)
  
  df_a %>% 
    # Tidy data
    pivot_longer(Q1_1:q11_piu_1_mese, names_to = "var", values_to = "val") %>%
    # Compute share by each value of demographic variable
    group_by(var, !! demo) %>%
    summarise(
      mean = sum(val == 1, na.rm = T)/n()
      ) %>% 
    filter(!is.na(!! demo)) %>% ungroup() %>%
    # Arrange to have first variable on top in the figure
    arrange(match(var, order_vars)) %>%
    # Add proper lables to variables
    mutate(
      var = factor(var, levels = order_vars, labels = label_y),
      !! demo := factor(!! demo, labels = labels)
      ) %>%
    # Plot
    ggplot() +
    # Add geom points
    geom_point(size = 3, alpha = 0.5, 
               aes(x = var, y = mean, color = !! demo, group = !! demo)
               ) +
    # Add intrerupted line from 0% to 100$
    geom_segment(
      aes(x = var, xend = var, y = 0, yend = 1),
      linetype="dashed", size = 0.1
      ) +
    # Format as percentage
    scale_y_continuous(NULL, labels = scales::percent) +
    scale_x_discrete(NULL) +
    # Color scale for categories
    scale_color_viridis(NULL, discrete = TRUE, option = "D") +
    theme(legend.position = "bottom") +
    # Remove axis
    theme(
      #axis.text.y = element_blank(),
      axis.ticks.y = element_blank(),
      axis.line.x = element_blank(),
      axis.line.y = element_blank()
        ) +
    # Flip figure horizontally
    coord_flip() 
}

Variabili dipendenti per genere

plot_y_by_demo(fem, c("Maschio", "Femina"))

Variabili dipendenti per età

plot_y_by_demo(age, c("18-25", "26-35", "36 oltre"))

Variabili dipendenti per condizione occupazionale

plot_y_by_demo(stud, c("Occupato/a, Pensionato/a o Disoccupato/a", "Studente/essa"))

Variabili dipendenti per livello di istruzione

plot_y_by_demo(laur_o_piu, c("Secondary degree", "Tertiary degree"))

 # p1 <- plot_y_by_demo(fem, c("Maschio", "Femina"))
 # p2 <- plot_y_by_demo(age, c("18-25", "26-35", "36 oltre")) +
 #   theme(axis.text.y = element_blank(),
 #         axis.ticks.y = element_blank(),
 #         axis.line.y = element_blank(),
 #         axis.title.y = element_blank())
 # p3 <- plot_y_by_demo(stud, c("Non-student", "Student"))
 # p4 <- plot_y_by_demo(laur_o_piu, c("Secondary degree", "Tertiary degree")) +
 #     theme(axis.text.y = element_blank(),
 #         axis.ticks.y = element_blank(),
 #         axis.line.y = element_blank(),
 #         axis.title.y = element_blank())
 # grid.arrange(p1,p2, p3, p4,  ncol = 2,
 #              widths = c(2.9, 2.2))

Tabella di regressione

Nota esplicativa:

  • I numeri nelle celle indicano differenze di punti percentuali
  • Se la cella è in grassetto e colorata, la differenza è statisticamente diversa da zero. Altrimenti, la differenza non è statisticamente diversa da zero.
mod_out <- df_a %>% 
  pivot_longer(Q1_1:q11_piu_1_mese, names_to = "dv", values_to = "val") %>%
  group_by(dv) %>%
  do(tidy(lm(val ~ fem + factor(age) + stud + laur_o_piu, data = .))) %>%
  ungroup() %>%
  mutate(p.value = round(p.value, 3),
         estimate = round(100* estimate, 2)
         ) %>%
  mutate(
    estimate = case_when(
      p.value < 0.1 & estimate > 0 ~ cell_spec(estimate, "html", color = "green", bold = T),
      p.value < 0.1 & estimate < 0 ~ cell_spec(estimate, "html", color = "red", bold = T),
      TRUE ~ cell_spec(estimate, "html",  bold = F)
      )
    ) %>%
  filter(term != "(Intercept)") %>%
  select(dv, term, estimate) %>%
  pivot_wider(names_from = term, values_from = estimate) %>%
  arrange(match(dv, rev(order_vars))) %>%
  mutate(dv = rev(label_y)) %>%
  rename_all(~c("Variabile dipendente", "Femina/Maschio", "26-35/18-25", "36 oltre/18-25", "Studente/Occupato, Pensionato o Disoccupato", "Laureato o più/Non laureato"))
    
mod_out %>% kable(escape = F, align = c("l", rep("c", ncol(.) - 1))) %>% kable_styling() %>%
  add_header_above(c(" " = 1, "Variabili indipendente" = 5))
Variabili indipendente
Variabile dipendente Femina/Maschio 26-35/18-25 36 oltre/18-25 Studente/Occupato, Pensionato o Disoccupato Laureato o più/Non laureato
Ambiente ideale per lo studio -12.58 -9.05 -39.82 15.61 2.6
Materiale utile per la ricerca 18.5 14.77 37.01 -5.04 17.98
Accede più di 1 volta al mese -0.24 5.9 -17.13 5.19 9.48
Prevalentemente risorse cartacee 9.9 -1.05 1.45 -16.46 -27.31
Prevalentemente risorse digitali -6.55 -5.57 -6.16 20.58 34.29
Prevalentemente sezione storia 1.52 1.02 -21.07 -9.96 -2.93
Prevalentemente sezione scienze religiose -4.94 -12.99 19.49 3.88 10.44
Prevalentemente sezione scientifica 2.49 14.88 11.51 11.52 -3.61
L’orario modificato nessun impatto -0.91 10.49 -1.7 8.66 5.98
Ottimo servizio di distribuzione e di reference -9.47 8.98 12.35 -2.5 18.07
Interessata/o prestito a domicilio -0.16 6.87 -2.13 24.65 -33.79
Molto o abasstanza importante garantare la constanta disponibilita -38.11 1.83 -10.97 -6.45 5.55
Usufrito del servizio di prestito interbibliotecario 5.58 11.69 5.03 -12.11 1.82
Molto o abasstanza soddisfatta/o servizio Internet 5.19 11.49 -1.47 6.36 6.03
Accede altre Biblioteche più di 1 volta al mese 34.38 -24.46 -18.86 1.98 15.21
# mod_out %>% mutate(
#   arrow = ifelse(
#     estimate < 0,
#      paste0("<a href=\"", "www.google.com", "\">", as.character(fa("angle-double-down")), "</a>"),
#     paste0("<a href=\"", "www.google.com", "\">", as.character(fa("angle-double-up")), "</a>")
#   )
# ) %>% select(arrow) %>% kable(escape = F) %>% kable_styling()