LinkedIn profile: https://www.linkedin.com/in/gaetano-caira-4216ba93

1.OBIETTIVO E PREMESSE PROGETTO

L’obiettivo di questo lavoro è indagare la correllazione tra il numero di posti letto accreditati per singola regione/comune (fonte dato: Ministero della salute) e il numero di morti della popolazione (fonte dato: Istat).

Per lo studio di questa relazione sono state indagate due dimensioni:

Tale correllazione se appurata e affidabile permetterebbe di predire l’effetto del numero di morti al variare dei posti letto accreditati, in quanto quest’ultimi rappresentativi del livello di servizio dell’assistenza sanitaria.

Si procederà dapprima analizzando la dimensione spaziale delle Regioni, poi quella dei Comuni e infine si tenterà di portarle avanti contemporneamente attrvaerso una normalizzazione dei dati mediante la popolazione residente.

L’attività preliminare di pulizia, formattazione e unione dei database è stata svolta in SQL in ambiente BigQuery.

2. ANALISI REGIONI

library("tidyverse")
library("caret")

# normalizzazione da 0 a 1
x <- preProcess(as.data.frame(PL_Totali_Regione_Anno), method=c("range"))
PL_Totali_Regione_Anno_Norm <- predict(x, as.data.frame(PL_Totali_Regione_Anno))
y <-preProcess(as.data.frame(db), method=c("range"))
PL_Totali_Comune_Anno_Norm <- predict(y, as.data.frame(db))

ggplot(data=PL_Totali_Regione_Anno)+geom_line(mapping=aes(x=Anno,y=PL_Totali),color="purple")+geom_line(mapping=aes(x=Anno,y=Morti))+labs(title="Posti Letto Totali (viola) e Morti (nero) negli anni - Dati Non Normalizzati")+facet_wrap(~Regione)

ggplot(data=PL_Totali_Regione_Anno_Norm)+geom_line(mapping=aes(x=Anno,y=PL_Totali),color="purple")+geom_line(mapping=aes(x=Anno,y=Morti))+labs(title="Posti Letto Totali (viola) e Morti (nero) negli anni - Dati Normalizzati")+facet_wrap(~Regione)

Sulla base di questi 2 grafici possiamo facilmente raggurppare le Regioni in due blocchi:

  1. quelle che hanno variabilità sai sui PL Totali che sui Morti totali: Lazio, Piemonte, Toscana, Campania, Lombardia, Puglia, Sicilia, Veneto ed Emilia-Romagna

  2. quelle che non hanno nè variabilità sui PL Totali nè contemporaneamente sui Morti totali (tutte le altre)

Verranno quindi approfondite le correlazione delle Regioni appartenenti al primo raggruppamento che chiameremo per semplicità “Regioni Variabili”

Per conferma, oltre al metodo grafico, verrà calcolato e visualizzato di seguito per ogni Comune la standard deviation sia dei PL Totali che dei Morti e successivamente la covarianza di questi.

library("tidyverse")
library("caret")

Dev_std_Regioni <- group_by(PL_Totali_Regione_Anno, Regione) %>% summarize(st_dv_PL=sd(PL_Totali),st_dv_Morti=sd(Morti),cov_PL_Morti=cor(PL_Totali, Morti))

ggplot(Dev_std_Regioni, aes(x=st_dv_PL,y=st_dv_Morti))+ geom_point()+ geom_text(Dev_std_Regioni,mapping = aes(label=Regione), stat="identity",position_dodge(width = 1),size=3)+labs(title="Standard Deviation Posti Letto vs. Standard Deviation Morti - Regioni")

ggplot(Dev_std_Regioni,aes(x=Regione, y=cov_PL_Morti))+ geom_bar(stat = "identity")+labs(title="Covarianza Posti Letto e Morti - Regioni")+coord_flip()

Il primo grafico conferma una correlazione positiva tra la varianza di una dimensione con l’altra e quindi conferma che tutte le regioni che hanno un alta variabilità sui posti letto hanno anche una maggiore variabilità sul numero di morti.

Nel secondo grafico invece si vede come tutte le regioni, tranne il caso anomalo dell’Umbria seppur con valore contenuto e prossimo allo zero, hanno una covarianza con valore negativo, mediamente di a -0,62. Questo significa che oltre a variare insieme, se una aumenta l’altra diminuisce.

Proviamo col seguente grafico a focalizzare l’attenzione solo sulle regioni che manifestano maggiore variabilità

library("tidyverse")
library("caret")
Regioni_variabili<- filter(PL_Totali_Regione_Anno,Regione=="Lazio"|Regione=="Sicilia"|Regione=="Piemonte"|Regione=="Toscana"|Regione=="Campania"|Regione=="Lombardia"|Regione=="Puglia"|Regione=="Veneto"|Regione=="Emilia-Romagna")
Regioni_variabili_norm<- filter(PL_Totali_Regione_Anno_Norm,Regione=="Lazio"|Regione=="Sicilia"|Regione=="Piemonte"|Regione=="Toscana"|Regione=="Campania"|Regione=="Lombardia"|Regione=="Puglia"|Regione=="Veneto"|Regione=="Emilia-Romagna")

RV <-mutate(Regioni_variabili,R10=ifelse(Anno==2017,Regione,""))

ggplot(data=RV, aes(x=PL_Totali,y=Morti, color=Regione))+geom_line()+
  geom_text(RV,mapping = aes(label=R10), stat="identity",position_dodge(width = 1),size=3)+
  labs(title="Morti vs. Posti Letto Totali - Regioni Variabili - Dati Non Normalizzati")

Ora proveremo a verificare la possibilità di sovrapporre i dati delle Regioni variabili, normalizzando il dato dei morti e dei posti Letto dividendo entrambi i valori per la popolazione complessiva in quella regione in quell’anno.

library("tidyverse")
library("caret")
ggplot(data=RV, aes(x=PL_per_abitante*10000,y=Morti_per_abitante*10000,color=Regione))+geom_point()+geom_smooth(method = lm)+
  geom_text(RV,mapping = aes(label=R10), stat="identity",position_dodge(width = 1),size=3)+
  labs(title="Morti per abitante vs. Posti Letto per abitante")

Dal grafico sembra evidenziarsi come la pendenza del modello di regressione lineare tende ad essere minore per le regioni con una soglia di posti letto accreditati per 10.000 abitanti >= 23 (Emilia-Romagna, Toscana e Lazio).

Nello specifico Toscana e Lazio hanno una pendenza equivalente fra loro, ovvero molto bassa e le altre regioni invece molto pronunciata.

Ora invece porteremo avanti l’analisi aumentando il drill-down nella dimensione spaziale a quella dei singoli Comuni.

3. ANALISI COMUNI

library("tidyverse")
library("caret")
ggplot(data=db)+geom_line(mapping=aes(x=Anno,y=PL_Totali),color="purple")+  geom_line(mapping=aes(x=Anno,y=Morti))+labs(title="Posti Letto Totali (viola) e Morti (nero) negli anni - Dati Non Normalizzati")+facet_wrap(~Comune)

ggplot(data=PL_Totali_Comune_Anno_Norm)+geom_line(mapping=aes(x=Anno,y=PL_Totali),color="purple")+geom_line(mapping=aes(x=Anno,y=Morti))+labs(title="Posti Letto Totali (viola) e Morti (nero) negli anni - Dati Normalizzati")+facet_wrap(~Comune)

Sulla base di questi 2 grafici, anche qua come nel caso delle Regioni, possiamo facilmente raggurppare i Comuni in due blocchi:

  1. quelle che hanno variabilità sai sui PL Totali che sui Morti totali: Napoli, Roma, Torino, Bari e Milano

  2. quelle che non hanno nè variabilità sui PL Totali nè contemporaneamente sui Morti totali (tutti gli altri)

Verranno quindi approfondite le correlazione dei Comuni appartenenti al primo raggruppamento che chiameremo per semplicità Comuni Variabili.

Per conferma oltre al metodo grafico calcoliamo di seguito per ogni Comune la standard deviation sia dei PL Totali che dei Morti e la covarianza.

library("tidyverse")
library("caret")

Dev_std_Comuni <- group_by(db, Comune) %>% summarize(st_dv_PL=sd(PL_Totali),st_dv_Morti=sd(Morti),cov_PL_Morti=cor(PL_Totali, Morti))

ggplot(Dev_std_Comuni, aes(x=st_dv_PL,y=st_dv_Morti))+geom_point()+geom_text(Dev_std_Comuni,mapping=aes(label=Comune),stat="identity",position_dodge(width = 1),size=3)+labs(title="Standard Deviation Posti Letto vs. Standard Deviation Morti - Comune")

ggplot(Dev_std_Comuni,aes(x=Comune, y=cov_PL_Morti))+geom_bar(stat = "identity")+
  labs(title="Covarianza Posti Letto e Morti - Comune")+
  coord_flip() + theme_grey(base_size = 5)

Nel primo grafico si può vedere come anche nel caso dei Comuni dove è più alta la variabilità sui posti letto contemporaneamente è anche alta sui morti. Nel secondo grafico, come nel caso delle Regioni, si vede come tutti i Comuni, tranne una decina di casi, hanno anche qui una covarianza con valore negativo pari mediamente a -0,42.

library("tidyverse")
library("caret")
Comuni_variabili<-filter(db,Comune=="Napoli"|Comune=="Roma"|Comune=="Torino"|Comune=="Bari"|Comune=="Milano")
Comuni_variabili_norm<-filter(PL_Totali_Comune_Anno_Norm, Comune=="Lecce"|Comune=="Napoli"|Comune=="Roma"|Comune=="Torino"|Comune=="Bari"|Comune=="Milano")

RS <-mutate(Comuni_variabili,R10=ifelse(Anno==2019,Comune,""))

ggplot(data=RS, aes(x=PL_Totali,y=Morti, color=Comune))+geom_line()+
  geom_text(RS,mapping = aes(label=R10), stat="identity",position_dodge(width = 1),size=3)+
  labs(title="Morti vs. Posti Letto Totali - Regioni Variabili - Dati Non Normalizzati")

Ora proveremo a verificare la possibilità di sovrapporre i dati dei Comuni variabili, normalizzando il dato dei morti e dei posti Letto dividendo entrambi i valori per la popolazione complessiva in quel comune in quell’anno.

library("tidyverse")
library("caret")
ggplot(data=RS, aes(x=PL_per_abitante*10000,y=Morti_per_abitante*10000,color=Comune))+
  geom_point()+geom_smooth(method = lm)+
  geom_text(RS,mapping = aes(label=R10), stat="identity",position_dodge(width = 1),size=3)+
  labs(title="Morti per abitante vs. Posti Letto per abitante")

Dal grafico sembra evidente come la pendenza del modello di regressione lineare tende ad essere minore per i Comuni con una soglia di posti letto accreditati per 10.000 abitani pari a 25 circa.

Infatti Milano e Roma hanno una pendenza equivalente fra loro, ovvero molto bassa e gli altri Comuni invece molto pronunciata.

Avendo normalizzato la dimensione spaziale con la relativa popolazione residente è possibile a questo punto integrare in modo appropriato sullo stesso grafico sia i Comuni che le Regioni variabili.

4. ANALISI COMUNI+REGIONI VARIABILI

library("tidyverse")
library("caret")
A1<- select(RV,Anno,Regione,Morti_per_abitante,PL_per_abitante,R10)
A1<-rename(A1, Territorio=Regione)
A2<-select(RS,Anno,Comune,Morti_per_abitante,PL_per_abitante,R10)
A2 <-rename(A2, Territorio=Comune)
R <- rbind(A1,A2)

ggplot(data=R, aes(x=PL_per_abitante*10000,y=Morti_per_abitante*10000,color=Territorio))+geom_point()+geom_smooth(method = lm)+
  geom_text(R,mapping = aes(label=R10), stat="identity",position_dodge(width = 1),size=3)+
  labs(title="Morti per abitante vs. Posti Letto per abitante - mod. regressione lineare")

Dal grafico finale di Regioni e Comuni, variabili e normalizzati, sembra evidente come:

Restringendo l’analisi come sempre alle Regioni e i Comuni variabili nella seguente tabella viene riportato per ogni territorio 2 parametri del modello linare:

library("broom")
library("tidyverse")
library("caret")
R |>
  group_by(Territorio) |>
  group_modify(~{
    tidy(lm(Morti_per_abitante ~ PL_per_abitante, data = .x))
  }) |>
  filter(term == "PL_per_abitante") |>
  rename(Tasso = estimate, Significativita = p.value) |>
  select(Territorio, Tasso, Significativita) |> arrange(Significativita)
## # A tibble: 14 × 3
## # Groups:   Territorio [14]
##    Territorio      Tasso Significativita
##    <chr>           <dbl>           <dbl>
##  1 Piemonte       -4.37         0.000126
##  2 Veneto         -4.95         0.000442
##  3 Bari           -2.88         0.00241 
##  4 Puglia         -5.25         0.00363 
##  5 Napoli         -2.05         0.00903 
##  6 Campania       -3.33         0.0117  
##  7 Torino         -4.70         0.0158  
##  8 Sicilia        -6.07         0.0236  
##  9 Lazio          -0.977        0.0342  
## 10 Lombardia      -1.69         0.0528  
## 11 Milano         -0.777        0.0669  
## 12 Roma           -0.560        0.0792  
## 13 Toscana        -1.06         0.112   
## 14 Emilia-Romagna -0.866        0.130

Essendo la tabella ordinata in base al valore crescente del p-value generato, è facile identificare negli ultimi 5 territori (Lombardia,Milano,Roma,Toscana ed Emilia-Romagna) il modello come inadeguato; tutti gli altri territori trovano signficativita predittività nel modello lineare con un coefficente angolare mediamente di -4,2.

Questo risultato analitico coincide con l’analisi grafica fatta fin’ora, in cui avevamo già indagato che su questi territori con un valora soglia di PL per 10.000 abitanti complessivamente alto (> 25) la relazione di dipendenza è meno marcata.

In ultima analisi questo significa che, se globalmente il numero di PL per 10.000 abitanti è sotto il valore soglia, allora ogni posto letto in meno accreditato a inizio anno porterà a registrare mediamente 4 morti in più a fine anno (il numero medio dipende dal tipo di Regione e Comune). Il numero effettivo cambia da territorio a territorio.

5. TERRITORI VIRTUOSI E NON

Infinte, l’ultimo quesito che si vuole rispondere, è quello relativo al posizionamento relativo di tutte le Regione (non solo quelle “variabili” oggetto di approfondimento fin’ora) rispetto ai posti letto per abitante e morti per abitante (tramite una media sui vari anni).

library("tidyverse")
library("caret")
Regioni_caratteristiche<-group_by(PL_Totali_Regione_Anno, Regione) %>%
  summarise(Morti_medie_per_abitante=mean(Morti_per_abitante),PL_medi_per_abitante=mean(PL_per_abitante))

ggplot(data=Regioni_caratteristiche, aes(x=PL_medi_per_abitante,y=Morti_medie_per_abitante))+geom_point()+
  geom_text(Regioni_caratteristiche,mapping = aes(label=Regione), stat="identity",size=3)+geom_smooth(method = lm)+  labs(title="Morti media per abitante vs. Posti Letto media per abitante- tutte le Regioni")
## `geom_smooth()` using formula = 'y ~ x'

La linea blu che identifica il trend permette di separare nella sua parte in basso le Regioni virtuose, in quanto a parità di posti letto c’è chi ha più morti (in alto) e chi meno (in basso).