Application: retards d’avions#

Problème : Prédire les retards d’arrivée des vols

À propos des données#

Dans cet exemple sur les compagnies aériennes, l’ensemble de données flight_delay est généré de manière synthétique et est utilisé pour développer le modèle de régression linéaire multiple afin de prédire les retards d’arrivée des vols.

L’ensemble de données contient au total 3 593 observations et 11 variables ; 10 variables sont numériques et 1 variable est catégorique. Arr_Delay est la variable dépendante ou variable cible qui est continue dans la nature et toutes les autres variables sont indépendantes ou variables explicatives dans les données.

Lire les données à partir du répertoire de travail, créez votre propre répertoire de travail directement pour lire l’ensemble de données.

Hide code cell source
data1 <- read.csv("flight_delay.csv", header=TRUE, sep=",")

Afficher les 6 premières lignes de l’ensemble de données pour voir à quoi ressemblent les données

Hide code cell source
head(data1)
A data.frame: 6 × 11
CarrierAirport_DistanceNumber_of_flightsWeatherSupport_Crew_AvailableBaggage_loading_timeLate_Arrival_oCleaning_oFueling_oSecurity_oArr_Delay
<chr><int><int><int><int><int><int><int><int><int><int>
1UA437413005 83171915263158
2UA451415165 82171915223248
3AA425374045175161714282916
4B6454447986 49181913293181
5DL455406436 55171918263762
6UA4163970751461619 6283134

Décrire la structure des données#

Hide code cell source
str(data1)
'data.frame':	3593 obs. of  11 variables:
 $ Carrier               : chr  "UA" "UA" "AA" "B6" ...
 $ Airport_Distance      : int  437 451 425 454 455 416 439 446 441 456 ...
 $ Number_of_flights     : int  41300 41516 37404 44798 40643 39707 45627 40415 42248 43453 ...
 $ Weather               : int  5 5 5 6 6 5 5 5 6 6 ...
 $ Support_Crew_Available: int  83 82 175 49 55 146 141 145 58 3 ...
 $ Baggage_loading_time  : int  17 17 16 18 17 16 16 17 17 18 ...
 $ Late_Arrival_o        : int  19 19 17 19 19 19 19 18 19 19 ...
 $ Cleaning_o            : int  15 15 14 13 18 6 15 9 9 10 ...
 $ Fueling_o             : int  26 22 28 29 26 28 21 25 17 24 ...
 $ Security_o            : int  31 32 29 31 37 31 39 39 53 36 ...
 $ Arr_Delay             : int  58 48 16 81 62 34 63 47 39 122 ...

Nom de la colonne (variables)#

Afficher le nom de la colonne (variables) des données

Hide code cell source
names(data1)
  1. 'Carrier'
  2. 'Airport_Distance'
  3. 'Number_of_flights'
  4. 'Weather'
  5. 'Support_Crew_Available'
  6. 'Baggage_loading_time'
  7. 'Late_Arrival_o'
  8. 'Cleaning_o'
  9. 'Fueling_o'
  10. 'Security_o'
  11. 'Arr_Delay'

Statistiques descriptives#

Afficher les statistiques descriptives des données

Hide code cell source
summary(data1$Arr_Delay)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    0.0    49.0    70.0    69.8    90.0   180.0 

Valeurs manquantes#

Vérifions les valeurs manquantes présentes dans les données

Hide code cell source
sum(is.na(data1))
0

Corrélation entre les variables#

Déterminer la corrélation entre les variables

Hide code cell source
corr <- cor.test(data1$Arr_Delay,data1$Number_of_flights, method = "pearson" )
Hide code cell source
corr
	Pearson's product-moment correlation

data:  data1$Arr_Delay and data1$Number_of_flights
t = 86.823, df = 3591, p-value < 2.2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 0.8121611 0.8332786
sample estimates:
     cor 
0.823004 

La méthode de corrélation des moments de Pearson est utilisée pour découvrir la corrélation entre deux variables. Il existe une forte corrélation positive (82 %) entre Arr_Delay et Number_of_Flights, ce qui signifie que les deux variables sont directement proportionnelles l’une à l’autre. Arr_Delay augmente avec l’augmentation de Number_of_Flights. Pour déterminer si la corrélation entre les variables est significative, nous devons comparer la valeur p avec le niveau de signification (0.05). Dans ce cas, la valeur p pour la corrélation entre Arr_Delay et Number_of_Flights est inférieure au niveau de signification de 0.05, ce qui indique que le coefficient de corrélation est significatif.

4 en 1#

Pour ajouter quatre graphiques dans une seule fenêtre ou un panneau de tracé

Hide code cell source
par(mfrow = c(2, 2))

Quelques graphiques#

Pour tracer la variable dépendante et la variable indépendante

# install.packages("gridExtra")
Hide code cell content
plot(data1$Arr_Delay, data1$Number_of_Flights)
plot(data1$Arr_Delay, data1$Security_o)
plot(data1$Arr_Delay, data1$Support_Crew_Available)
plot(data1$Arr_Delay, data1$Airport_Distance)
../../_images/b336d015acc6cbc518c5cdca1f6278b18f690796881c916d9e0b2f44e037931c.png ../../_images/febd8acbbc426705fa69f39fe6a7f285492caeaa9952659a94c7b0921d480564.png ../../_images/c4f0f637155714ebbd389b35b5347f8c1f633c697b772aca07c3a7f2d7aa2ef4.png ../../_images/96598b788af4b2396eb82346143f12a09a190fbe2b18251a0aed8e8958e824c0.png
Hide code cell source
library(ggplot2)
library(gridExtra)
Error in library(gridExtra): there is no package called gridExtra
Traceback:

1. stop(packageNotFoundError(package, lib.loc, sys.call()))
Hide code cell source
p1 <- ggplot(data1, aes(x = Arr_Delay, y = Number_of_flights)) + 
  geom_point() + 
  theme_bw() + 
  ggtitle("Retard d'arrivée vs Nombre de vols")
Hide code cell source
p2 <- ggplot(data1, aes(x = Arr_Delay, y = Security_o)) + 
  geom_point() + 
  theme_bw() + 
  ggtitle("Retard d'arrivée vs Sécurité_o")
Hide code cell source
p3 <- ggplot(data1, aes(x = Arr_Delay, y = Support_Crew_Available)) + 
  geom_point() + 
  theme_bw() + 
  ggtitle("Retard d'arrivée vs Disponibilité de l'équipage de soutien")
Hide code cell source
p4 <- ggplot(data1, aes(x = Arr_Delay, y = Airport_Distance)) + 
  geom_point() + 
  theme_bw() + 
  ggtitle("Retard d'arrivée vs Distance de l'aéroport")
# Utiliser grid.arrange pour arranger les graphiques
grid.arrange(p1, p2, p3, p4, ncol = 2, nrow = 2)
../../_images/46bc62a8ff19873193b8bace40613aa7cef01370134058ef333922fb29ab4ec3.png

Pour supprimer la première variable (Carrier) de data1

Hide code cell source
data2 <- data1[-c(1)]

Division de l’ensemble de données#

en un ensemble de données d”entrainement et un ensemble de données de test

Les données sont divisées en deux parties, l’ensemble de données de train et l’ensemble de données de test, au moyen d’un échantillonnage aléatoire stratifié, et le ratio de division est de 70:30, ce qui signifie que 70 % des données contribuent à l’ensemble de données de train et 30 % des données contribuent à l’ensemble de données de test.

L’ensemble de données de train est utilisé pour construire le modèle et l’ensemble de données de test est utilisé pour tester la performance du modèle.

Hide code cell source
#Installation de caTools pour division des données
library(caTools)
set.seed(3035)
sample <- sample.split(data2$Arr_Delay,SplitRatio=0.70)
train_data <- subset(data2,sample==TRUE)
test_data <- subset(data2,sample==FALSE)
Updating HTML index of packages in '.Library'

Making 'packages.html' ...
 done

L’ensemble de données Train_data est utilisé pour construire le modèle et l’ensemble de données Test_ est utilisé pour tester la performance du modèle. #Construction d’un modèle de régression linéaire multiple à l’aide de lm sur l’ensemble de données

Hide code cell source
model <- lm(Arr_Delay ~., data = train_data)
summary(model)
Call:
lm(formula = Arr_Delay ~ ., data = train_data)

Residuals:
    Min      1Q  Median      3Q     Max 
-35.780  -8.151  -0.583   8.230  70.332 

Coefficients:
                         Estimate Std. Error t value Pr(>|t|)    
(Intercept)            -5.801e+02  8.943e+00 -64.861  < 2e-16 ***
Airport_Distance        1.751e-01  1.613e-02  10.852  < 2e-16 ***
Number_of_flights       4.418e-03  1.281e-04  34.486  < 2e-16 ***
Weather                 4.721e+00  5.403e-01   8.737  < 2e-16 ***
Support_Crew_Available -5.113e-02  6.398e-03  -7.991 2.03e-15 ***
Baggage_loading_time    1.353e+01  5.238e-01  25.835  < 2e-16 ***
Late_Arrival_o          6.999e+00  3.931e-01  17.804  < 2e-16 ***
Cleaning_o              1.176e-01  7.106e-02   1.654   0.0982 .  
Fueling_o              -1.016e-01  7.086e-02  -1.433   0.1519    
Security_o              8.947e-03  3.505e-02   0.255   0.7985    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 12.38 on 2504 degrees of freedom
Multiple R-squared:  0.8213,	Adjusted R-squared:  0.8206 
F-statistic:  1279 on 9 and 2504 DF,  p-value: < 2.2e-16

Dans le code ci-dessus, l’ajustement lm (modèle linéaire) est utilisée pour construire le modèle de régression linéaire multiple. Arr_Delay est la variable dépendante ou cible dans les données et toutes les autres variables sont des variables indépendantes ou explicatives.

L’ensemble de données Train_data est utilisé pour entraîner le modèle et le sommaire du modèle affiche le tableau des coefficients et les statistiques du modèle. La liste 6-1 affiche le tableau des coefficients et les statistiques du modèle.

En examinant les coefficients dans le résultat, on constate que certaines variables ont une valeur p inférieure à 0,001 et sont donc des variables significatives du modèle, mais que d’autres variables comme Cleaning_o, Fueling_o et Security_o ont une valeur p supérieure à 0,001 et ne sont donc pas des variables significatives du modèle. Supprimons toutes les variables non significatives du modèle et réexécutons le modèle.

Modèle final#

de régression linéaire multiple avec les variables significatives variables significatives sur l’ensemble de données train_data

Hide code cell source
model_sig<-lm(Arr_Delay~Airport_Distance+Number_of_flights
+Weather+Support_Crew_Available+Baggage_loading_time
+Late_Arrival_o, data= train_data)
model_sig
summary(model_sig)
Call:
lm(formula = Arr_Delay ~ Airport_Distance + Number_of_flights + 
    Weather + Support_Crew_Available + Baggage_loading_time + 
    Late_Arrival_o, data = train_data)

Residuals:
    Min      1Q  Median      3Q     Max 
-36.224  -8.213  -0.677   8.295  70.468 

Coefficients:
                         Estimate Std. Error t value Pr(>|t|)    
(Intercept)            -5.809e+02  8.705e+00 -66.734  < 2e-16 ***
Airport_Distance        1.754e-01  1.613e-02  10.877  < 2e-16 ***
Number_of_flights       4.424e-03  1.280e-04  34.570  < 2e-16 ***
Weather                 4.688e+00  5.400e-01   8.683  < 2e-16 ***
Support_Crew_Available -5.171e-02  6.394e-03  -8.087 9.38e-16 ***
Baggage_loading_time    1.350e+01  5.232e-01  25.804  < 2e-16 ***
Late_Arrival_o          7.007e+00  3.930e-01  17.828  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 12.39 on 2507 degrees of freedom
Multiple R-squared:  0.8209,	Adjusted R-squared:  0.8205 
F-statistic:  1916 on 6 and 2507 DF,  p-value: < 2.2e-16

Analyse du modèle final#

Le code ci-dessus montre les coefficients (étiquetés Estimates), leurs erreurs standard, les valeurs t et les valeurs P. Les coefficients pour Airport_Distance, Number_of_flights, Weather, Support_Crew_Available, Baggage_loading_time et Late_Arrival_o sont statistiquement significatifs puisque leurs valeurs P sont inférieures à 0.001.

Dans un modèle de régression linéaire, pour une augmentation d’une unité dans les variables prédictives ou indépendantes, cela affichera le changement (augmentation ou diminution) dans le résultat ou la variable dépendante. Cela peut être expliqué comme suit :

  1. Pour chaque augmentation d’une unité dans Number_of_flights, cela augmente l’Arr_Delay de (0.004)

  2. De même pour Support_Crew_Available qu’une diminution d’une unité dans Support_Crew_Available augmente l’Arr_Delay de (-0.05)

  3. De même pour Late_Arrival_o qu’une augmentation d’une unité dans Late_Arrival_o augmente l’Arr_Delay de (7.007)

Le nombre de valeurs ajustées est de 2514 et le nombre d’observations dans l’ensemble de données de formation est également de 2514 ; cela signifie que les valeurs ajustées sont les valeurs prédites de l’ensemble de données de formation.

Prédiction#

Prédire les valeurs ajustées de l’ensemble train_data

Hide code cell source
pred_train<- model_sig$fitted.values
head(pred_train)
1
60.2568422827843
3
8.64335007903944
4
98.6611402872728
10
95.4403625639632
11
72.9357821621781
12
104.410995049311

Valeurs résiduelles#

resed_train <- model_sig$residuals
head(resed_train)
1
-2.25684228278431
3
7.35664992096056
4
-17.6611402872728
10
26.5596374360368
11
-13.9357821621781
12
17.589004950689

Les valeurs résiduelles sont la différence entre les valeurs réelles et les valeurs prédites. Si les valeurs réelles sont supérieures aux valeurs prédites, les valeurs résiduelles sont positives et si les valeurs réelles sont inférieures aux valeurs prédites, les valeurs résiduelles sont négatives.

pred_test<- predict(model_sig,newdata = test_data)
head(pred_test)
pred_test1<- data.frame(pred_test)
2
63.71967746594
5
66.6435915949123
6
32.7674359735601
7
63.250599522936
8
47.7067054176122
9
71.1335707505437
Hide code cell source
plot (test_data$Arr_Delay,col="red",type ="l",lty=1.8)
lines(pred_test1,col="blue",type ="l",lty=1.4)
../../_images/8359f2be4ef8a62ff3cf6e4afc1754c28fa5e53dcb506032b4e1e85a6f83e67d.png

La figure ci-dessus présente le graphique des résultats réels par rapport aux résultats prévus. Les lignes rouges représentent les valeurs réelles de l’ensemble des données de test et les lignes bleues représentent les valeurs prédites.

On peut remarquer que la plupart des lignes bleues et rouges se chevauchent, à l’exception de quelques cas. Dans ce cas, on constate que la plupart des valeurs prédites suivent de près les valeurs réelles, ce qui indique qu’il s’agit d’un bon modèle silencieux.