Applicazioni pratiche di machine learning/Previsioni sul cambiamento climatico

Indice del libro

Caricamento librerieModifica

 library(ggplot2)
 library(dplyr)
 library(caret)

Parte 1: DatiModifica

Il data set tas_1901_2016_ITA scaricabile dal sito https://climateknowledgeportal.worldbank.org/download-data sotto la Creative Commons Attribution 4.0 International License (CC BY 4.0) contiene 12 X 116 = 1392 misurazioni delle temperature medie mensili in gradi centigradi in Italia dal 1901 al 2016 . Ci sono per ciascuna osservazione 5 variabili, ma le uniche che si prendono in considerazione per l'analisi del cambiamento climatico sono l'anno della misurazione e la temperatura media per ciascuno dei 12 mesi dell'anno.

Caricamento dei dati:

 tas_1901_2016_ITA<- read.csv("tas_1901_2016_ITA.csv",header=TRUE)
 tas_1991_2016_ITA<- read.csv("tas_1991_2016_ITA.csv",header=TRUE)
 CO2_kt<- read.csv("CO2_kt.csv",header=TRUE)

Parte 2: Domanda di ricercaModifica

Calcolando la media annuale delle temperature dal 1901 al 2016 si vuole valutare se è in atto un cambiamento climatico in Italia, basandosi quindi su dati di oltre 1 secolo .

Parte 3: Esplorazione dei datiModifica

Per studiare la relazione tra le 2 variabili anno e temperatura media annuale in Italia si traccia in figura uno scatterplot che è un tipo di grafico in cui ogni punto rappresenta una singola osservazione di anno e temperatura media annuale.

 df <- tas_1901_2016_ITA %>%
  group_by(Year)%>%
  summarise(media = mean(Temperature....Celsius.))

 df %>%
   ggplot(aes(Year,media))+
  geom_line()+
  ylab("Temperatura media annuale in gradi centigradi") +
  xlab("Anni") +
  ggtitle("Andamento temporale della variazione di temperatura  ",subtitle = "media annuale in Italia dal 1991 al 2016")

 df %>%
   ggplot(aes(Year,media))+
  geom_point(size=2)+
  geom_smooth() +
  scale_x_continuous(breaks=seq(1901,2016,10))+
  ylab("Temperatura media annuale in gradi centigradi") +
  xlab("Anno") +
  ggtitle("Cambiamento climatico in Italia ",subtitle = "tramite variazione temperatura media annuale dal 1901 al 2016")
 
Andamento temporale della variazione di temperatura media annuale in Italia dal 1991 al 2016
 
Cambiamento climatico in Italia tramite variazione temperatura media annuale dal 1901 al 2016

Si nota dal grafico che c'è una relazione moderata tra anno e temperatura media annuale ma la relazione non è lineare cioè una linea retta non si adatterebbe ai dati ma una linea curva ottenuta tramite la tecnica dello Smoothing con la local regression si adatta meglio ai dati. In tal modo si evidenzia un trend significativo dei dati, attenuando il rumore. In altri termini sommando graficamente lo smooth trend e il rumore si ottiene l'andamento temporale della variazione di temperatura. La zona grigia lungo la curva di smoothing rappresenta l'intervallo di confidenza al 95% che la curva rappresenti l'effettivo trend dei dati. Come si vede dal grafico la temperatura media annuale in Italia è cresciuta nel corso di più di 1 secolo da 11,01464 °C del 1901 a 13,13094 °C del 2016 .

Parte 4: ModellizazioneModifica

Applicando il modello di regressione lineare al periodo temporale che va dal 1991 al 2016 si ottiene un R^2 pari al 40% circa che rappresenta la percentuale di variabilità della temperatura media annuale espressa dal modello .

 df1 <- tas_1991_2016_ITA %>%
  group_by(Year)%>%
  summarise(media = mean(Temperature....Celsius.))

 lm_model <- lm( media ~ Year,df1)
 summary(lm_model)

 cat("R-squared=", cor(df1$media,df1$Year)^2,"\n")

 p1 <- predict(lm_model,newdata = df1)
  
 cat("RMSE_train=",sqrt((1/nrow(df1))*sum((p1-df1$media)^2)))
Call:
lm(formula = media ~ Year, data = df1)
Residuals:
   Min      1Q  Median      3Q     Max 
-0.6810 -0.2077  0.0209  0.1953  0.7737 
Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -64.939272  18.394421  -3.530 0.001709 ** 
Year          0.038715   0.009181   4.217 0.000304 ***
---

Residual standard error: 0.3511 on 24 degrees of freedom
Multiple R-squared:  0.4256,	Adjusted R-squared:  0.4017 
F-statistic: 17.78 on 1 and 24 DF,  p-value: 0.0003042
R-squared= 0.4255855 
RMSE_train= 0.3373344

Aggiungendo come predictors alla regressione lineare la CO2 emessa in Italia e nel mondo dal 1960 al 2014 si ottiene un adjusted R-squared = 0,69 e un errore RMSE = 0,30°C che danno una stima positiva del modello, infatti il 69% della variabilità della temperatura può essere espressa dalle variabili Anno, CO2_it e CO2_world . .

 df1 <- tas_1901_2016_ITA %>%
  filter(Year %in% 1960:2014) %>%
   group_by(Year)%>%
  summarise(media = mean(Temperature....Celsius.))

 df1 <- cbind(df1,CO2_it=CO2_kt$CO2_Italia)
 df1 <- cbind(df1,CO2_world=CO2_kt$CO2_Mondo)

 lm_2 <- lm( media ~ Year + CO2_world + CO2_it , df1)
 summary(lm_2)

 p1 <- predict(lm_2,newdata = df1)
  
 cat("RMSE_train=",sqrt((1/nrow(df1))*sum((p1-df1$media)^2)))
Call:
lm(formula = media ~ Year + CO2_world + CO2_it, data = df1)
Residuals:
    Min       1Q   Median       3Q      Max 
-0.64561 -0.21553  0.05704  0.21581  0.64385 
Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) -1.338e+02  3.135e+01  -4.267 8.60e-05 ***
Year         7.475e-02  1.619e-02   4.618 2.66e-05 ***
CO2_world   -7.276e-08  3.200e-08  -2.274  0.02722 *  
CO2_it      -3.053e-06  8.038e-07  -3.798  0.00039 ***
Residual standard error: 0.3204 on 51 degrees of freedom
Multiple R-squared:  0.7054,	Adjusted R-squared:  0.688 
F-statistic:  40.7 on 3 and 51 DF,  p-value: 1.432e-13
RMSE_train= 0.3084831

Condizioni per l'utilizzo della regressione lineare multipla:

  • relazioni lineare tra ciascun predictor (Anno, CO2_It,CO2_world) e la variabile di risposta (media) usando il grafici dei residui vs. predictor, dovendo ottenere uno scatterplot casuale intorno a 0
 ggplot(data = lm_2, aes(x = df1$CO2_it, y = .resid)) +
  geom_point() +
  geom_hline(yintercept = 0, linetype = "dashed") +
  xlab("CO2 italia") +
  ylab("Residuals")

 ggplot(data = lm_2, aes(x = df1$CO2_world, y = .resid)) +
  geom_point() +
  geom_hline(yintercept = 0, linetype = "dashed") +
  xlab("CO2 mondo") +
  ylab("Residuals")
  • distribuzione dei residui quasi normale con media 0
  • residui dispersi casualmente in una banda con larghezza costante intorno a 0 (nessuna forma a ventaglio)
 hist(lm_2$residuals)
 qqnorm(lm_2$residuals)
 qqline(lm_2$residuals)
 plot(lm_2$residuals)

...visualizzando i suddetti grafici tutte condizioni sono soddisfatte.

Parte 5: PrevisioniModifica

Mantenendo costante la CO2 italiana e mondiale dal 2020 al 2040 pari a quella del 2014, con questo nuovo modello la temperatura media in Italia continua a crescere :**

 for (y in 2020:2040) {
  
  new_year <- data.frame(Year=y, CO2_it=320411, CO2_world=36138285)
  print("_________________________________________________________________")
  pred <-predict(lm_2, new_year, interval = "confidence", level = 0.95)
  print(paste("Nell'anno ",y," la predetta temperatura media annuale sarà ",round(pred[1],2), "."))
  print("Siamo sicuri al 95% che la temperatura media annuale sarà ")
  print(paste("tra ",round(pred[2],2), " e " , round(pred[3],2) ,"" ))

 }


[1] "_________________________________________________________________"
[1] "Nell'anno  2020  la predetta temperatura media annuale sarà  13.61 ."
[1] "Siamo sicuri al 95% che la temperatura media annuale sarà "
[1] "tra  13.24  e  13.98 "
[1] "_________________________________________________________________"
[1] "Nell'anno  2021  la predetta temperatura media annuale sarà  13.68 ."
[1] "Siamo sicuri al 95% che la temperatura media annuale sarà "
[1] "tra  13.3  e  14.07 "
[1] "_________________________________________________________________"
[1] "Nell'anno  2022  la predetta temperatura media annuale sarà  13.76 ."
[1] "Siamo sicuri al 95% che la temperatura media annuale sarà "
[1] "tra  13.35  e  14.16 "
[1] "_________________________________________________________________"
[1] "Nell'anno  2023  la predetta temperatura media annuale sarà  13.83 ."
[1] "Siamo sicuri al 95% che la temperatura media annuale sarà "
[1] "tra  13.41  e  14.26 "
[1] "_________________________________________________________________"
[1] "Nell'anno  2024  la predetta temperatura media annuale sarà  13.91 ."
[1] "Siamo sicuri al 95% che la temperatura media annuale sarà "
[1] "tra  13.46  e  14.36 "
[1] "_________________________________________________________________"
[1] "Nell'anno  2025  la predetta temperatura media annuale sarà  13.98 ."
[1] "Siamo sicuri al 95% che la temperatura media annuale sarà "
[1] "tra  13.51  e  14.46 "
[1] "_________________________________________________________________"
[1] "Nell'anno  2026  la predetta temperatura media annuale sarà  14.06 ."
[1] "Siamo sicuri al 95% che la temperatura media annuale sarà "
[1] "tra  13.56  e  14.56 "
[1] "_________________________________________________________________"
[1] "Nell'anno  2027  la predetta temperatura media annuale sarà  14.13 ."
[1] "Siamo sicuri al 95% che la temperatura media annuale sarà "
[1] "tra  13.61  e  14.66 "
[1] "_________________________________________________________________"
[1] "Nell'anno  2028  la predetta temperatura media annuale sarà  14.21 ."
[1] "Siamo sicuri al 95% che la temperatura media annuale sarà "
[1] "tra  13.66  e  14.76 "
[1] "_________________________________________________________________"
[1] "Nell'anno  2029  la predetta temperatura media annuale sarà  14.28 ."
[1] "Siamo sicuri al 95% che la temperatura media annuale sarà "
[1] "tra  13.7  e  14.86 "
[1] "_________________________________________________________________"
[1] "Nell'anno  2030  la predetta temperatura media annuale sarà  14.36 ."
[1] "Siamo sicuri al 95% che la temperatura media annuale sarà "
[1] "tra  13.75  e  14.96 "
[1] "_________________________________________________________________"
[1] "Nell'anno  2031  la predetta temperatura media annuale sarà  14.43 ."
[1] "Siamo sicuri al 95% che la temperatura media annuale sarà "
[1] "tra  13.8  e  15.06 "
[1] "_________________________________________________________________"
[1] "Nell'anno  2032  la predetta temperatura media annuale sarà  14.51 ."
[1] "Siamo sicuri al 95% che la temperatura media annuale sarà "
[1] "tra  13.84  e  15.17 "
[1] "_________________________________________________________________"
[1] "Nell'anno  2033  la predetta temperatura media annuale sarà  14.58 ."
[1] "Siamo sicuri al 95% che la temperatura media annuale sarà "
[1] "tra  13.89  e  15.27 "
[1] "_________________________________________________________________"
[1] "Nell'anno  2034  la predetta temperatura media annuale sarà  14.66 ."
[1] "Siamo sicuri al 95% che la temperatura media annuale sarà "
[1] "tra  13.94  e  15.38 "
[1] "_________________________________________________________________"
[1] "Nell'anno  2035  la predetta temperatura media annuale sarà  14.73 ."
[1] "Siamo sicuri al 95% che la temperatura media annuale sarà "
[1] "tra  13.98  e  15.48 "
[1] "_________________________________________________________________"
[1] "Nell'anno  2036  la predetta temperatura media annuale sarà  14.81 ."
[1] "Siamo sicuri al 95% che la temperatura media annuale sarà "
[1] "tra  14.03  e  15.58 "
[1] "_________________________________________________________________"
[1] "Nell'anno  2037  la predetta temperatura media annuale sarà  14.88 ."
[1] "Siamo sicuri al 95% che la temperatura media annuale sarà "
[1] "tra  14.07  e  15.69 "
[1] "_________________________________________________________________"
[1] "Nell'anno  2038  la predetta temperatura media annuale sarà  14.95 ."
[1] "Siamo sicuri al 95% che la temperatura media annuale sarà "
[1] "tra  14.12  e  15.79 "
[1] "_________________________________________________________________"
[1] "Nell'anno  2039  la predetta temperatura media annuale sarà  15.03 ."
[1] "Siamo sicuri al 95% che la temperatura media annuale sarà "
[1] "tra  14.16  e  15.9 "
[1] "_________________________________________________________________"
[1] "Nell'anno  2040  la predetta temperatura media annuale sarà  15.1 ."
[1] "Siamo sicuri al 95% che la temperatura media annuale sarà "
[1] "tra  14.2  e  16 "