knitr::opts_chunk$set(
  eval = TRUE,    # Ensure all chunks execute
  echo = TRUE,    # Show the code in the output
  warning = FALSE, # Suppress warnings
  message = FALSE  # Suppress messages
)

Data Exploration

# Set the working directory
setwd('/Users/_ilarossi/Documents/LUISS/Corsi/Magistrale/II semestre/Analisi dei dati/PW')

# Import the dataset
df = read.csv("Puglia.csv", header=T, sep=',')
## SELEZIONE E DESCRIZIONE DELLE VARIABILI DI INTERESSE

#POPOLAZIONE TOTALE
summary(df$pop_total)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     172    3684    7626   15708   15919  315933
#ETA' MEDIA DELLA POPOLAZIONE PER COMUNE
age_cols <- c(
  "pop_under5", "pop_5to9",   "pop_10to14", "pop_15to19",
  "pop_20to24", "pop_25to29", "pop_30to34", "pop_35to39",
  "pop_40to44", "pop_45to49", "pop_50to54", "pop_55to59",
  "pop_60to64", "pop_65to69", "pop_70to74", "pop_over74"
)
age_labels <- c(
  "0–4", "5–9",  "10–14", "15–19",
  "20–24", "25–29","30–34", "35–39",
  "40–44", "45–49","50–54", "55–59",
  "60–64", "65–69","70–74", "75+"
)

df_long <- df %>%
  dplyr::select(COMUNE, all_of(age_cols)) %>% 
  pivot_longer(
    cols      = all_of(age_cols),
    names_to  = "fascia",
    values_to = "pop"
  )

# Calcolo della fascia con popolazione più alta per ciascun comune
df_dom <- df_long %>%
  group_by(COMUNE) %>%
  slice_max(pop, with_ties = FALSE) %>%  # se due fasce ex aequo prende la prima
  ungroup()

# Tabella riassuntiva: quanti comuni per fascia dominante
df_summary <- df_dom %>%
  count(fascia) %>%
  arrange(desc(n))

print(df_summary)
## # A tibble: 5 × 2
##   fascia         n
##   <chr>      <int>
## 1 pop_over74   212
## 2 pop_35to39    20
## 3 pop_40to44    16
## 4 pop_45to49     8
## 5 pop_30to34     2
# Grafico a barre: distribuzione delle fasce dominanti
ggplot(df_summary, aes(x = fascia, y = n)) +
  geom_col(fill = "steelblue") +
  labs(
    title = "Numero di comuni per fascia d'età più numerosa",
    x     = "Fascia d'età dominante",
    y     = "Numero di comuni"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

# Grafico per Comune: faceted barplot con le fasce dominanti per i primi 20 comuni
topN <- df_dom %>%
  # ordino per pop crescente per far vedere i più piccoli all'inizio
  slice_max(pop, n = 20) %>% 
  pull(COMUNE)

df_dom %>%
  filter(COMUNE %in% topN) %>%
  ggplot(aes(x = "", y = pop, fill = fascia)) +
  geom_col() +
  facet_wrap(~ COMUNE, scales = "free_y") +
  labs(
    title = "Popolazione per fascia d'età nei 20 comuni con fascia dominante più alta",
    x = NULL, y = "Popolazione"
  ) +
  theme_minimal() +
  theme(
    axis.text.x = element_blank(),
    legend.position = "bottom"
  )

library(dplyr)      # caricare PRIMA di MASS, plyr, ecc.
library(readr)
library(tidyr)
library(ggplot2)
library(scales)

# 1) Caricamento dati
df <- read_csv("Puglia.csv")

# 2) Calcolo proporzioni di maschi e femmine
df <- df %>%
  mutate(
    prop_male   = pop_male   / pop_total,
    prop_female = pop_female / pop_total
  )

# 3) Subset colonne necessarie (usando dplyr::select per sicurezza)
df_sex <- df %>%
  dplyr::select(COMUNE, pop_male, pop_female, prop_male, prop_female, pop_total)

# 4) Trasformazione in formato long per i grafici
df_long <- df_sex %>%
  pivot_longer(
    cols      = c(prop_male, prop_female),
    names_to  = "sesso",
    values_to = "proporzione"
  ) %>%
  mutate(
    sesso = recode(sesso,
                   prop_male   = "Maschi",
                   prop_female = "Femmine")
  )

# 8) Bar chart stacked per i 15 comuni più popolosi
#    creo un vettore con i nomi ordinati dal più grande al più piccolo
top15 <- df %>%
  arrange(desc(pop_total)) %>%
  slice_head(n = 15) %>%
  pull(COMUNE)

df_top15 <- df_long %>%
  filter(COMUNE %in% top15) %>%
  # imposto l'ordine dei fattori in base a pop_total
  mutate(COMUNE = factor(COMUNE, levels = top15))

ggplot(df_top15, aes(x = COMUNE, y = proporzione, fill = sesso)) +
  geom_col() +
  coord_flip() +
  scale_y_continuous(labels = percent_format(accuracy = 1)) +
  labs(
    title = "Composizione per sesso nei 15 comuni più popolosi",
    x     = "Comune",
    y     = "Proporzione"
  ) +
  theme_minimal()

library(dplyr)
library(readr)
library(tidyr)
library(ggplot2)

# 1) Definisco le colonne e le etichette
edu_cols  <- c("pop_degree_holders", "pop_high_school", 
               "pop_middle_school",  "pop_elementary")
edu_labels<- c("Laurea", "Scuola Superiore", 
               "Scuola Media", "Scuola Elementare")

# 3) Pivot in formato long e rinomina i livelli
df_long <- df %>%
  dplyr::select(COMUNE, all_of(edu_cols)) %>% 
  pivot_longer(
    cols      = all_of(edu_cols),
    names_to  = "livello",
    values_to = "pop"
  ) %>%
  mutate(
    livello = factor(livello, 
                     levels = edu_cols, 
                     labels = edu_labels)
  )

# 4) Estraggo il livello dominante per comune
df_dom <- df_long %>%
  group_by(COMUNE) %>%
  slice_max(pop, with_ties = FALSE) %>%
  ungroup()

# 5) Tabella riassuntiva: quanti comuni per livello dominante
df_summary <- df_dom %>%
  count(livello) %>%
  arrange(desc(n))
print(df_summary)
## # A tibble: 3 × 2
##   livello               n
##   <fct>             <int>
## 1 Scuola Media        209
## 2 Scuola Superiore     40
## 3 Scuola Elementare     9
# 6) Bar‐plot dei livelli dominanti
ggplot(df_summary, aes(x = livello, y = n)) +
  geom_col(fill = "steelblue") +
  labs(
    title = "Livello di istruzione dominante per comune",
    x     = "Livello di istruzione",
    y     = "Numero di comuni"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

# 7) Faceted bar‐plot: profilo completo per i 20 comuni più popolosi
top20 <- df %>%
  arrange(desc(pop_total)) %>%
  slice_head(n = 20) %>%
  pull(COMUNE)

df_top20 <- df_long %>%
  filter(COMUNE %in% top20) %>%
  # per mantenere l'ordine
  mutate(COMUNE = factor(COMUNE, levels = top20))

ggplot(df_top20, aes(x = "", y = pop, fill = livello)) +
  geom_col() +
  facet_wrap(~ COMUNE, scales = "free_y") +
  labs(
    title = "Distribuzione dei livelli di istruzione nei 20 comuni più popolosi",
    x     = NULL,
    y     = "Popolazione"
  ) +
  theme_minimal() +
  theme(
    axis.text.x   = element_blank(),
    legend.position = "bottom"
  )

library(dplyr)
library(readr)
library(tidyr)
library(ggplot2)
library(scales)

# 1) Carico i dati
df <- read_csv("Puglia.csv")

# 2) Calcolo proporzioni di occupati e disoccupati
df <- df %>%
  mutate(
    prop_occ = pop_employed    / pop_total,
    prop_dis = pop_unemployed  / pop_total
  )

# 3) Preparo il long‐format
df_long <- df %>%
  dplyr::select(COMUNE, prop_occ, prop_dis, pop_total) %>%
  pivot_longer(
    cols      = c(prop_occ, prop_dis),
    names_to  = "stato",
    values_to = "proporzione"
  ) %>%
  mutate(
    stato = recode(stato,
                   prop_occ = "Occupati",
                   prop_dis = "Disoccupati")
  )

# 4) (Facoltativo) Se vuoi limitarti ai 15 comuni più popolosi
top15 <- df %>%
  arrange(desc(pop_total)) %>%
  slice_head(n = 15) %>%
  pull(COMUNE)

df_plot <- df_long %>%
  filter(COMUNE %in% top15) %>%
  mutate(COMUNE = factor(COMUNE, levels = top15))

# 5) Bar‐chart stacked (% occupati vs disoccupati)
ggplot(df_plot, aes(x = COMUNE, y = proporzione, fill = stato)) +
  geom_col() +
  coord_flip() +
  scale_y_continuous(labels = percent_format(accuracy = 1)) +
  labs(
    title = "Proporzione di occupati vs disoccupati nei 15 comuni più popolosi",
    x     = "Comune",
    y     = "Percentuale",
    fill  = "Stato"
  ) +
  theme_minimal()

library(dplyr)     # caricalo PRIMA di altri pacchetti che definiscono select()
library(readr)
library(tidyr)
library(ggplot2)
library(scales)

# 1) Carico i dati
df <- read_csv("Puglia.csv")

# 2) Calcolo le proporzioni
df <- df %>%
  mutate(
    prop_stranieri = foreign_total / pop_total,
    prop_autoctoni  = 1 - prop_stranieri
  )

# 3) Pivot in long format
df_long <- df %>%
  dplyr::select(COMUNE, pop_total, prop_stranieri, prop_autoctoni) %>%
  pivot_longer(
    cols      = c(prop_autoctoni, prop_stranieri),
    names_to  = "categoria",
    values_to = "proporzione"
  ) %>%
  mutate(
    categoria = recode(categoria,
                       prop_autoctoni  = "Autoctoni",
                       prop_stranieri = "Stranieri")
  )

# 4) Seleziono i primi 15 comuni per popolazione
top15 <- df %>%
  arrange(desc(pop_total)) %>%
  slice_head(n = 15) %>%
  pull(COMUNE)

df_top15 <- df_long %>%
  filter(COMUNE %in% top15) %>%
  # imposto l'ordine dei comuni per coord_flip()
  mutate(COMUNE = factor(COMUNE, levels = top15))

# 5) Bar chart stacked orizzontale
ggplot(df_top15, aes(x = COMUNE, y = proporzione, fill = categoria)) +
  geom_col() +
  coord_flip() +
  scale_y_continuous(labels = percent_format(accuracy = 1)) +
  scale_fill_manual(values = c(Autoctoni = "steelblue", Stranieri = "salmon")) +
  labs(
    title = "Composizione % Stranieri vs Autoctoni\nnei 15 comuni più popolosi",
    x     = "Comune",
    y     = "Percentuale",
    fill  = NULL
  ) +
  theme_minimal()

# ------------------------------------------------------------
# 4) Pie‑chart: prendo SOLO le colonne di provenienza geo‑aggregate
continent_cols <- grep(
  "^foreign_(europe|africa|america|asia|oceania)$",
  names(df), value = TRUE
)

# 5) Sommo su tutti i comuni e riorganizzo in long
df_paesi <- df %>%
  summarise(across(all_of(continent_cols), sum, na.rm = TRUE)) %>%
  pivot_longer(
    cols      = everything(),
    names_to  = "provenienza",
    values_to = "tot_stranieri"
  ) %>%
  mutate(
    provenienza = sub("^foreign_", "", provenienza),
    pct         = tot_stranieri / sum(tot_stranieri)
  )

# 6) Seleziono i top 5 (o top N a piacere)
topN <- df_paesi %>% slice_max(tot_stranieri, n = 5)

# 7) Pie‑chart
ggplot(topN, aes(x = "", y = pct, fill = provenienza)) +
  geom_col(width = 1) +
  coord_polar(theta = "y") +
  # aggiungo le percentuali al centro di ogni fetta
  geom_text(aes(label = percent(pct, accuracy = 0.1)),
            position = position_stack(vjust = 0.5)) +
  scale_fill_brewer(palette = "Set3") +
  scale_y_continuous(labels = percent_format(accuracy = 1)) +
  labs(
    title = "Principali aree di provenienza degli stranieri",
    fill  = "Provenienza"
  ) +
  theme_void() +
  theme(legend.position = "right")

library(dplyr)     # caricalo PRIMA di eventuali altri pacchetti con select()
library(readr)
library(tidyr)
library(ggplot2)
library(scales)

# 1) Carico i dati
df <- read_csv("Puglia.csv")

# 2) Reddito pro capite medio per provincia
df_prov <- df %>%
  group_by(PROVINCIA) %>%
  summarise(
    mean_rpc = mean(reddito_pro_capite, na.rm = TRUE)
  ) %>%
  arrange(mean_rpc)

# 3) Bar‐chart: reddito pro capite medio per provincia
ggplot(df_prov, aes(x = reorder(PROVINCIA, mean_rpc), y = mean_rpc)) +
  geom_col(fill = "steelblue") +
  coord_flip() +
  scale_y_continuous(labels = comma) +
  labs(
    title = "Reddito pro capite medio per provincia (Puglia)",
    x     = "Provincia",
    y     = "Reddito pro capite medio"
  ) +
  theme_minimal()

# ------------------------------------------------------------
# 2) Calcolo il reddito pro‑capite da dipendente e da autonomo per ciascun comune
#    (totale reddito / popolazione totale)
df <- df %>% 
  mutate(
    rpc_dip = reddito_lavoro_dipendente / pop_total,
    rpc_aut = reddito_lavoro_autonomo   / pop_total
  )

# 3) A livello di regione: media ponderata sul numero di abitanti
df_region <- df %>%
  summarise(
    rpc_dip = sum(reddito_lavoro_dipendente, na.rm = TRUE) / sum(pop_total, na.rm = TRUE),
    rpc_aut = sum(reddito_lavoro_autonomo,   na.rm = TRUE) / sum(pop_total, na.rm = TRUE)
  ) %>%
  pivot_longer(
    cols      = everything(),
    names_to  = "tipo_lavoro",
    values_to = "reddito_pro_capite"
  ) %>%
  mutate(
    tipo_lavoro = recode(tipo_lavoro,
                         rpc_dip = "Dipendente",
                         rpc_aut = "Autonomo")
  )

# 4) Bar‑chart di confronto
ggplot(df_region, aes(x = tipo_lavoro, y = reddito_pro_capite, fill = tipo_lavoro)) +
  geom_col(width = 0.6) +
  scale_y_continuous(labels = comma) +
  scale_fill_manual(values = c(Dipendente = "steelblue", Autonomo = "salmon")) +
  labs(
    title = "Reddito medio pro‑capite per tipo di lavoro (Regione Puglia)",
    x     = "",
    y     = "Reddito pro‑capite medio (€)",
    fill  = NULL
  ) +
  theme_minimal() +
  theme(legend.position = "none")

## **Analisi delle componenti principali**

# 1. Caricamento del dataset
# Assicurati che il file Puglia.csv sia nella working directory o specifica il percorso completo
data <- read.csv("Puglia.csv", header = TRUE, sep = ",")

# 2. Selezione delle sole variabili numeriche e rimozione delle righe con NA
numeric_vars <- data[, sapply(data, is.numeric)]
numeric_vars <- na.omit(numeric_vars)

# 3. Rimozione delle variabili con varianza zero (costanti)
variances <- apply(numeric_vars, 2, var)
zero_var_cols <- names(variances[variances == 0])
if(length(zero_var_cols) > 0) {
  message("Rimozione delle variabili costanti: ", paste(zero_var_cols, collapse = ", "))
  numeric_vars <- numeric_vars[, variances > 0]
}

# 4. Calcolo dell'ACP direttamente con prcomp (centra e scala internamente)
pca_res <- prcomp(numeric_vars, center = TRUE, scale. = TRUE)

# 5. Calcolo della varianza spiegata e cumulata
var_explained <- pca_res$sdev^2 / sum(pca_res$sdev^2)
cum_var <- cumsum(var_explained)

# 6. Scree Plot (Elbow)
plot(var_explained, type = "b", pch = 19,
     xlab = "Componenti Principali (PC)",
     ylab = "Varianza Spiegata",
     main = "Scree Plot (Elbow)")
lines(cum_var, type = "b", pch = 19, col = "red")
legend("topright",
       legend = c("Varianza Singola", "Varianza Cumulata"),
       pch = 19, col = c("black", "red"))

# 7. Estrazione dei punteggi delle prime 4 componenti
pc_scores <- as.data.frame(pca_res$x[, 1:4])
names(pc_scores) <- paste0("PC", 1:4)

# 8. Integrazione dei punteggi nel dataset originale
# Le righe di numeric_vars conservano i nomi corrispondenti alle righe originali
rows_keep <- as.integer(rownames(numeric_vars))
data_pca4 <- cbind(data[rows_keep, ], pc_scores)

# 9. Salvataggio del dataset ridotto (opzionale)
write.csv(data_pca4, "Puglia_PCA_4components.csv", row.names = FALSE)