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)