Prévision du prix des billets d’avion

Introduction

L’objectif de cette étude est d’analyser l’ensemble de données relatives aux réservations de vols provenant du site web « Ease My Trip » prédire le prix des vols en s’appuyant sur des méthodes de machin learning et divers tests d’hypothèses statistiques afin d’en tirer des informations pertinentes.

L’algorithme statistique de « régression linéaire » serait utilisé pour entraîner l’ensemble de données et prédire une variable cible price`

Au total, \(300 261\) options de réservation de vol distinctes ont été extraites du site. La collecte des données s’est étalée sur \(50\) jours, du \(11\) février au \(31\) mars \(2022\).

L’ensemble de données nettoyé contient \(11\) variables.

I. Collecte des données et compréhension des données

Les données sont rassemblées à partir de différentes sources (bases de données, fichiers, API, enquêtes). Une première exploration permet d’évaluer leur structure, leur qualité, leur volume et leur pertinence par rapport au problème posé

Description des variables

Les différentes caractéristiques de l’ensemble de données nettoyé sont expliquées ci-dessous :

  1. airline : le nom de la compagnie aérienne est enregistré dans la colonne « airline ». Il s’agit d’une caractéristique catégorielle comprenant 6 compagnies aériennes différentes.

  2. flight : la colonne « flight » contient des informations relatives au code de vol de l’avion. Il s’agit d’une caractéristique catégorielle.

  3. source_city : Ville d’où le vol décolle. Il s’agit d’une caractéristique catégorielle comprenant 6 villes distinctes.

  4. departure_time : Il s’agit d’une caractéristique catégorielle dérivée obtenue en regroupant des plages horaires dans des classes. Elle stocke des informations sur l’heure de départ et comporte 6 étiquettes horaires distinctes.

  5. stops : Caractéristique catégorielle comportant 3 valeurs distinctes qui stocke le nombre d’escales entre la ville de départ et la ville de destination.

  6. arrival_time : il s’agit d’une caractéristique catégorielle dérivée créée en regroupant des intervalles de temps en classes. Elle comporte six étiquettes de temps distinctes et contient des informations sur l’heure d’arrivée.

  7. destination_city : ville où le vol atterrira. Il s’agit d’une caractéristique catégorielle comprenant 6 villes distinctes.

  8. class : caractéristique catégorielle contenant des informations sur la classe de siège ; elle comporte deux valeurs distinctes : Classe affaires et Classe économique.

  9. duration : caractéristique continue indiquant la durée totale du trajet entre les villes, exprimée en heures.

  10. days_left : caractéristique dérivée calculée en soustrayant la date de voyage de la date de réservation.

  11. price : variable cible contenant des informations sur le prix du billet.

Tableau des données

Nous avons ci-dessous un apperçu de nos données, qui nécessite d’etre néttoyer et préparées pour une analyse

II. Nettoyage et préparation des données

Cette étape vise à traiter les valeurs manquantes, corriger les erreurs, gérer les les valeurs aberrantes,transformer les variables (normalisation, encodage) et rendre les données exploitables par les modèles.

La première colonne sera supprimée, n’apportant aucune information. notre jeu de données ne comporte aucune valeur manquante comme vous pouvez l’appercevoir ici.

##                  missing %
## ...1                   0 0
## airline                0 0
## flight                 0 0
## source_city            0 0
## departure_time         0 0
## stops                  0 0
## arrival_time           0 0
## destination_city       0 0
## class                  0 0
## duration               0 0
## days_left              0 0
## price                  0 0

Travailler avec cette dataset sera très lourd pour notre analyse, nous allons extraire un échantillon d’ \(1\%\) de chacune des strates , ainsi qu’un autre aléatoirement, afin d’avoir notre échantillon représentatif de notre jeu de données,

Pour ce faire, il faut :

  1. Définir la (ou les) variable(s) de stratification.

  2. Tirer un échantillon proportionnel dans chaque strate.

  3. Comparer la distribution des variables entre la population et l’échantillon.

  4. Produire des graphiques et des indicateurs quantitatifs.

Nous appelerons notre nouveau jeu de données stratifié Clean_Dataset_stratif`, et celui de nos données tirés aléatoirement Clean_Dataset_random`

vérifions leur représentativité vis-a-vis de notre jeu de données Clean_Dataset`

a) Choix de la variable de stratification

Pour construire un échantillon stratifié efficace, on cherche une variable de stratification qui maximise la variance entre les groupes (les strates doivent être les plus différentes possibles les unes des autres), ce qui permet de minimiser la variance à l’intérieur de chaque groupe (les individus au sein d’une même strate doivent être très homogènes).

Les varable qui ont les plus grandes variances sont price et days_left`.

b) Echantillons tirés

- stratifié

Nous avons extrait 3944 lignes de notre jeu de données

- aléatoirement

Nous avons extrait 3001 lignes de notre jeu de données

c) Comparaison des distributions du prix des vols

🔵 Courbe du jeu de données Clean_Dataset_new`

🔴 Courbe du jeu de données Clean_Dataset_stratif`

🟢 Courbe du jeu de données Clean_Dataset_random`

Distributions et fonction de répartition

Distribution

Les distributions de la variable price` issue respectivement des données stratifiées et aléatoires, sont quasi-identiques. Elles le sont également avec celle du prix des données issue du jeu de données initial.

Seule exception, une densité de la courbe bleue plus élevée pour des valeurs du prix des vols comprises entre \(0\) et \(3000\)

Fonction de repartition

C’est le cas des \(3\) courbes de la fonction de répartition du prix des vols , elles sont quasi-identiques.

d) Que nous dit le test de Kolmogorov-Smirnov ?

Le test statistique

Nous allons tester si les distributions sont identiques. pour ce faire on posera

Hypothèses du test de Kolmogorov-Smirnov :

  • \(H_0 : F_1(x) = F_2(x)\) pour tout \(x\) (les deux distributions sont identiques)

  • \(H_1 : F_1(x) \neq F_2(x)\) pour au moins un \(x\) (les distributions sont différentes)

Concernant les p_values

  • \(p_{value}\) > \(0.05\) → pas de différence significative

  • \(p_{value}\) < \(0.05\) → distributions différentes

## 
##  Asymptotic two-sample Kolmogorov-Smirnov test
## 
## data:  Clean_Dataset_new$price and Clean_Dataset_statif$price
## D = 0.055063, p-value = 1.12e-10
## alternative hypothesis: two-sided
## 
##  Asymptotic two-sample Kolmogorov-Smirnov test
## 
## data:  Clean_Dataset_new$price and Clean_Dataset_random$price
## D = 0.017351, p-value = 0.3327
## alternative hypothesis: two-sided

Le test de Kolmogorov-Smirnov indique une différence significative entre la population et l’échantillon stratifié (D = \(0.055\)), tandis que l’échantillon aléatoire ne présente pas de différence statistiquement détectable. Toutefois, la statistique D doit être privilégiée pour l’interprétation pratique, et la valeur plus élevée observée pour l’échantillon stratifié suggère une légère déformation locale de la distribution malgré une meilleure structure globale.

Ce test est très sensible aux micro-différences de valeurs, nous constatons néanmoins que

  • les deux échantillons sont très proches de la population
  • les différences sont négligeables en pratique
  • KS détecte juste des micro-différences dues à la taille

KS seul n’est PAS un bon critère pour juger la qualité d’un échantillonnage sur un gros dataset du fait justement de ces micro-différences dues à la tailles.

La fonction de répartition ECDF est plus appropirée pour cette situation.

##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1105    4783    7425   20890   42521  123071
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1105    4500    6634   22422   49294   89729
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1105    4756    7277   20172   40843   95741

Conclusion sur le choix final de l’échantillon

Ce que montrent tes résultats

Pour la variable price :

  • L’échantillon aléatoire reproduit mieux les quartiles, la médiane et la moyenne.

  • Le test KS ne rejette pas l’hypothèse d’égalité des distributions (p = 0.3327).

  • L’échantillon stratifié présente des écarts visibles sur plusieurs statistiques descriptives.

  • Le test KS rejette l’égalité des distributions pour l’échantillon stratifié (p < 0.05). Dans ces conditions, l’objectif étant de construire un sous-échantillon représentatif de la distribution de price, l’échantillon aléatoire apparaît meilleur.

Et pour toutes les autres variables du jeu de donnée tiré aléatoirement ?

Comparaison des \(P_{value}\) avec un K.S test

##  duration days_left     price 
## 0.3445254 0.5398588 0.3326890

Les \(P_{value}\) sont toutes > \(0.05\) , on ne rejète pas l’hypothèse \(H_0\) qui dit qu’il y’a pas différence significative entre les distributions des variables duration`, days_left` du dataset Clean_Dataset_random`avec celui de Clean_Dataset_new` .

Comparaison des proportions par variable

Comparaison proportions des \(3\) datsets Clean_Dataset_new`, Clean_Dataset_stratif`, Clean_Dataset_random`

airline

## 
##  Air_India    AirAsia   GO_FIRST     Indigo   SpiceJet    Vistara 
## 0.26950255 0.05363265 0.07720396 0.14366007 0.03002136 0.42597942
## 
##  Air_India    AirAsia   GO_FIRST     Indigo   SpiceJet    Vistara 
## 0.24695740 0.06059838 0.08291075 0.11840771 0.02484787 0.46627789
## 
##  Air_India    AirAsia   GO_FIRST     Indigo   SpiceJet    Vistara 
## 0.28390536 0.05798067 0.07197601 0.14128624 0.03065645 0.41419527

source_city

## 
## Bangalore   Chennai     Delhi Hyderabad   Kolkata    Mumbai 
## 0.1734482 0.1289342 0.2043724 0.1359507 0.1544113 0.2028832
## 
## Bangalore   Chennai     Delhi Hyderabad   Kolkata    Mumbai 
## 0.1810345 0.1196755 0.2086714 0.1341278 0.1498479 0.2066430
## 
## Bangalore   Chennai     Delhi Hyderabad   Kolkata    Mumbai 
## 0.1599467 0.1282906 0.2182606 0.1379540 0.1616128 0.1939354

arrival_time

## 
##     Afternoon Early_Morning       Evening    Late_Night       Morning 
##    0.12706520    0.05136380    0.26094359    0.04664621    0.20901007 
##         Night 
##    0.30497113
## 
##     Afternoon Early_Morning       Evening    Late_Night       Morning 
##    0.10902637    0.05704868    0.25000000    0.05527383    0.22261663 
##         Night 
##    0.30603448
## 
##     Afternoon Early_Morning       Evening    Late_Night       Morning 
##    0.13095635    0.04665112    0.26157947    0.05631456    0.20693102 
##         Night 
##    0.29756748

Interprétation

Les proportion sont pratiquement identiques pour toutes ces autres variables.

Les analyses réalisées sur la variable cible price montrent que l’échantillon aléatoire reproduit plus fidèlement la distribution observée dans la population que l’échantillon stratifié. Les statistiques descriptives sont plus proches de celles de la population et le test de Kolmogorov-Smirnov ne met pas en évidence de différence significative entre les distributions. Les proportions issues de différents dataset sont pratiquement identiques.

Pour la suite des analyses, l’échantillon aléatoire est donc définitivement retenu.

III. Analyse exploratoire des données (EDA)

L’analyse exploratoire permet de comprendre les distributions, les relations entre variables, de détecter des anomalies et de formuler ou vérifier des hypothèses à l’aide de statistique et de visualisations.

1. Analyse univariée

Variables quantitatives

Notre varible cible est price` continue , nous allons avions précédememnt commencé à l’anylser

Ce que nous allons obtenir:

Pour chaque variable :

  • histogramme

  • densité implicite

  • moyenne

  • médiane

  • IC

  • skewness

  • test de normalité

    👉 c’est un rapport descriptif automatique complet

Histogrammes

duration

days_left

price

Histogramme et densité

duration

days_left

price

Vérification de la Normalité

QQ-plot : duration

QQ-plot : days_left

QQ-plot : price

Results:

Ces résultats montrent que:

  • \(50 \%\) des prix de billets de vols sont inférieurs à 7277 roupies indiens.
  • les prix de billets de vols sont assymétriques du fait que la médiane et la moyenne soient très éloignées l’une de l’autre.
  • qu’aucune des variables quantitative ne suit une loi normale.

Variables qualitatives

Barplots

airline

source_city

departure_time

stops

arrival_time

destination_city

class

interprétation

  • on remarque que les compagnies aeriènnes les plus sollicitées sont Vistana, Sprice_jet et Air _india.

  • Les destinations préférées des voyageurs sont Munba’i , Delhi et Bangalore.

  • \(70.2\%\) des clients voyagent en classe Economy

  • les clients aiment voyager le matin et le soir

2. Analyse bivariée

Variable price` en fonction des variables qualitatives

Barplots price

Price selon airline

Price selon source_city

Price selon departure_time

Price selon stops

Price selon arrival_time

Price selon destination_city

Price selon class

Interprétation

  • Les compagnies aériennes Air_india et Vistana ont des prix moyens de billets d’avion environs \(4\) fois plus élevés que les autres, peut-etre que le clients qui voyager ave ces compagnies ci, a plus de confort que s’il voyage avec les autres.

  • La ville de destination n’influe pas sur les prix moyen du billet d’avion.

  • le prix moyen du billet d’avion est beaucoup plus élevé ( \(83.2\%\)) pour des vols qui font une escale, les clients préfèrent donc voyager avec ces vols meme si les prix moyens des billets sont les plus élevés .

Et statistiquement ?

Nous allons voir si les tests statistiques vont confirmer nos hypothèses . A savoir s’il y’a un lien significatif entre la variable cible price` et les variables qualitatives.

Pour étudier le lien entre :

price (quantitative) une variable qualitative (airline, class, source_city, etc.)

il est préférable d’utiliser :

ANOVA si les hypothèses sont raisonnablement satisfaites ; Kruskal-Wallis (plus robuste, recommandé ici car price n’est pas normale).

Puis calculer une taille d’effet :

η² (eta carré) pour ANOVA ; ε² (epsilon carré) pour Kruskal-Wallis.

Vu nos résultats précédents, je partirais sur Kruskal-Wallis + ε².

Hypothèses du test de Kruskal–Wallis

\[ H_0 : \text{Toutes les distributions de } price \text{ sont identiques entre les groupes} \]

\[ H_1 : \text{Au moins un groupe diffère significativement} \]

Règle de décision

On fixe un seuil de significativité \(\alpha = 0.05\) :

\[ p \leq \alpha \Rightarrow \text{rejet de } H_0 \]

\[ p > \alpha \Rightarrow \text{non-rejet de } H_0 \]

##                                     variable       p_value epsilon2
## Kruskal-Wallis chi-squared6            class  0.000000e+00    0.627
## Kruskal-Wallis chi-squared           airline 3.140757e-187    0.291
## Kruskal-Wallis chi-squared3            stops  1.267758e-35    0.053
## Kruskal-Wallis chi-squared4     arrival_time  2.008375e-26    0.042
## Kruskal-Wallis chi-squared1      source_city  2.296114e-06    0.010
## Kruskal-Wallis chi-squared5 destination_city  7.003774e-05    0.007
## Kruskal-Wallis chi-squared2   departure_time  2.536492e-03    0.004

Influence des variables qualitatives sur le prix

airline

source_city

departure_time

stops

arrival_time

destination_city

class

Interprétation

Interpretation du ε²
\(ε²\) Interprétation
< \(0.01\) Effet négligeable
\(0.01\) - \(0.06\) Effet faible
\(0.06\) - \(0.14\) Effet modéré
> \(0.14\) Effet fort

Le test de Kruskal-Wallis met en évidence une association significative entre price et airline ( \(p\) < \(0.001\) ;

\(ε²\) = \(0.18\)), indiquant un effet fort de la compagnie aérienne sur le prix des billets. pareil entre le prix et la classe.

Ce qui confirme nos précédants résultats.

IV. Choix, entrainement et performance des modèles

Différents modèles statistiques ou de machine learning sont choisis en fonction du problème. ils sont entrainés sur des données d’apprentissage en ajustant leurs paramètres.

L’objectif de notre projet étant de prédire le prix (price` ) des billets d’avion , nous allons éffectuer plusieurs différentes méthodes de machine learning à savoir : une régression linéaire , une régression de Lasso, et un XGBoost. puis choisir le meilleur des trois.

Oui, il est souvent très judicieux d’utiliser lm(log(y) ~ X1 + X2 + ...) au lieu du lm(y ~X1 + X2...)` pour une variable de prix, pour la raison:

Les variables de prix (comme l’immobilier, les salaires ou les produits de consommation) présentent presque toujours des caractéristiques spécifiques qui violent les hypothèses de la régression linéaire classique :

Asymétrie positive (Right-Skew) : Les prix ont une borne inférieure stricte à \(0\) et contiennent souvent quelques valeurs très élevées (longue queue à droite). Le logarithme compresse les grands écarts et symétrise la distribution.

Hétéroscédasticité : La variabilité des prix augmente souvent avec leur valeur (l’erreur de prédiction sur une maison à \(1\,000\,000\) est naturellement plus grande que sur une maison à \(50\,000\)). Le passage au log stabilise cette variance.

Relations multiplicatives : Dans la réalité, l’effet d’une caractéristique sur un prix est souvent proportionnel (ex: une chambre supplémentaire augmente le prix de \(+10\%\) plutôt que d’un montant fixe de \(+20\,000€\)).

En régression linéaire par les moindres carrés ordinaires (MCO), la variable réponse \(Y\) n’a pas besoin de suivre une loi normale. Ce sont uniquement les résidus (les erreurs de prédiction) qui doivent être normalement distribués pour valider les tests statistiques (p-values et intervalles de confiance)

Comment choisir scientifiquement ?

Ne devinez pas, vérifiez graphiquement et statistiquement sous R après avoir ajusté vos deux modèles :

Distribution des variables

Prix brut

Logarithme du Prix

Analyse des résidus

Modèle Standard

Modèle Log-Linéaire

Il est donc mieux pour la suite de modéliser le Log (price) au vu des résidus.

commençons par partitionner en deux nos données : train_Clean_Dataset_random et test_Clean_Dataset_random \(80 / 20\)

dim train_Clean_Dataset_random`

## [1] 2400   10

dim test_Clean_Dataset_random`

## [1] 601  10

Le compromis biais-variance du Modèle

  • Le Biais du modèle : C’est l’erreur due à de mauvaises hypothèses dans l’algorithme (par exemple, modéliser par une ligne droite une tendance courbe). Un biais élevé provoque le sous-apprentissage (underfitting).

  • La Variance du modèle : C’est la sensibilité du modèle aux fluctuations des données d’entraînement. Une variance élevée signifie que le modèle s’adapte trop aux détails et au bruit. Cela provoque le surapprentissage (overfitting).

Pour obtenir le meilleur modèle, il faut trouver le point d’équilibre qui minimise la somme du biais au carré et de la variance du modèle

C’est donc dans ce but que nous rechercherons le meilleur modèle des 3 qui fera le mieux ce compromis.

Pour un modèle de régression avec \(p\) variables explicatives :

\[ Y_i​=β_0​+β_1​X_{i1}​+β_2​X_{i2}​+⋯+β_p​X_{ip}​+ε_i​ \]

Le test global de significativité du modèle (test de Fisher) s’écrit :

\[ H_0​:β_1​=β_2​=⋯=β_p​=0 \]

contre\[ H_1:\exists\, j\in\{1,\ldots,p\}\text{ tel que }\beta_j\neq 0 \]

La règle de décision est de rejeter \(H_0\) si \(P_{value}\) < \(α\)

1. Modèle Log-Linéaire

a) Modèle

## 
## Call:
## lm(formula = log(price) ~ ., data = train_Clean_Dataset_random)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.20901 -0.21808 -0.01207  0.20653  1.43791 
## 
## Coefficients:
##                               Estimate Std. Error  t value Pr(>|t|)    
## (Intercept)                 11.1443208  0.0450115  247.588  < 2e-16 ***
## airlineAirAsia              -0.4565026  0.0327306  -13.947  < 2e-16 ***
## airlineGO_FIRST             -0.0839581  0.0296227   -2.834 0.004632 ** 
## airlineIndigo               -0.2165331  0.0250307   -8.651  < 2e-16 ***
## airlineSpiceJet             -0.0178701  0.0431315   -0.414 0.678679    
## airlineVistara               0.1009821  0.0167355    6.034 1.85e-09 ***
## source_cityChennai           0.0030232  0.0254589    0.119 0.905486    
## source_cityDelhi            -0.0307131  0.0230677   -1.331 0.183174    
## source_cityHyderabad        -0.1178101  0.0252586   -4.664 3.27e-06 ***
## source_cityKolkata           0.1140918  0.0244866    4.659 3.35e-06 ***
## source_cityMumbai           -0.0880997  0.0234333   -3.760 0.000174 ***
## departure_timeEarly_Morning -0.0125367  0.0225093   -0.557 0.577610    
## departure_timeEvening       -0.0514631  0.0224535   -2.292 0.021994 *  
## departure_timeLate_Night    -0.1420997  0.1355442   -1.048 0.294578    
## departure_timeMorning       -0.0008307  0.0217922   -0.038 0.969595    
## departure_timeNight         -0.0211226  0.0246914   -0.855 0.392381    
## stopstwo_or_more             0.2006929  0.0318701    6.297 3.60e-10 ***
## stopszero                   -0.4210147  0.0245856  -17.124  < 2e-16 ***
## arrival_timeEarly_Morning   -0.1447468  0.0377972   -3.830 0.000132 ***
## arrival_timeEvening          0.0471372  0.0229779    2.051 0.040336 *  
## arrival_timeLate_Night      -0.0288945  0.0355734   -0.812 0.416729    
## arrival_timeMorning         -0.0181477  0.0242333   -0.749 0.454007    
## arrival_timeNight            0.0427152  0.0224487    1.903 0.057190 .  
## destination_cityChennai     -0.0284065  0.0248765   -1.142 0.253611    
## destination_cityDelhi       -0.0333242  0.0230376   -1.447 0.148165    
## destination_cityHyderabad   -0.0603796  0.0246742   -2.447 0.014474 *  
## destination_cityKolkata      0.0953222  0.0232842    4.094 4.38e-05 ***
## destination_cityMumbai      -0.0267881  0.0225713   -1.187 0.235417    
## classEconomy                -2.0208499  0.0163994 -123.227  < 2e-16 ***
## duration                     0.0045259  0.0012500    3.621 0.000300 ***
## days_left                   -0.0144737  0.0004984  -29.038  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.3262 on 2369 degrees of freedom
## Multiple R-squared:  0.9124, Adjusted R-squared:  0.9113 
## F-statistic: 822.8 on 30 and 2369 DF,  p-value: < 2.2e-16

Nous obtenons ici E’NORMMEMENT de facteurs de variables. la question ici serait de savoir si nous devons toute les garder.

En effet la variabilité d’une variable réponse est fixe: elle dépend de nos données réelles. Ajouter des variables explicatives au modèle permet d’expliquer une plus grande partie de cette variabilité. Plus vous ajoutez de variables, plus la variance des résidus (erreur) diminue, et plus le \(R^2\) augmente. Le seul risque est donc d’avoir trop de variables dans notre modèle, est le surapprentissage.

Et dans notre cas?

En regardant la \(P_{value}\) globale, elle est significative ( < \(2.2e-16\) ) , cela voudrait dire qu’il existe au moins un

\(\beta_i\neq 0\) . Regardons les coefficients de notre modèle de régression.

Plusieurs indicateurs clés prouvent que votre modèle est très performant :

  • Un \(R^{2}\) ajusté de \(0.9113\) ( \(91.1\%\) ) : C’est un score extrêmement élevé. Cela signifie que nos variables parviennent à expliquer plus de \(91\) % des variations du prix des billets.

  • Le \(R^{2}\) vs \(R^{2}_{ajusté}\) : Le \(R^{2}\) classique est de \(0.9124\) et le \(R^{2}_{ajusté}\) est de \(0.9113\) . Comme ils sont presque identiques, cela prouve que nous n’avons pas inclus de variables “inutiles”. Le \(R^{2}_{ajusté}\) pénalise l’ajout de variables superflues , s’il y en avait trop, il s’effondrerait par rapport au \(R^{2}\) classique.

  • La distribution des résidus : La médiane de vos résidus est de \(-0.012\) , ce qui est très proche de \(0\) . Les premier ( \(1Q :-0.21\) ) et troisième ( \(3Q : 0.20\)) quartiles sont symétriques. Le biais de vos résidus est donc pratiquement nul, ce qui est parfait.

Faut-il enlever des variables ? (Le cas des variables catégorielles)

Vous remarquez que certaines lignes (comme source_cityChennai avec une \(P_{value}\) de \(0.905\) ou departure_timeMorning avec \(0.969\) ) ne sont pas significatives (pas d’étoiles ***). On pourrait penser qu’il faut les supprimer, mais ce serait une erreur.

En régression linéaire, le logiciel R découpe les variables catégorielles (facteurs) en plusieurs variables indicatrices (dummy variables).

  • Pour la variable airline, le logiciel R a choisi une compagnie de référence (par exemple Air _ndia, qui n’apparaît pas dans la liste).

  • Le coefficient de airlineSpiceJet ( \(0.678\) , non significatif) signifie simplement que le prix de SpiceJet` n’est pas statistiquement différent de la compagnie de référence.

  • En revanche, airlineAirAsia et airlineVistara ont des p-values extrêmement faibles ( < \(2.2e-16\) ) , ce qui montre que la variable airline globale est cruciale pour le modèle.

Règle d’or : On ne supprime pas une catégorie isolée d’un facteur. Soit on garde toute la variable (toutes les villes, toutes les compagnies), soit on retire la variable entière. Ici, chaque groupe possède des catégories ultra-significatives : il faut donc tout garder.

Interprétation des coéfficients

Comme nous avons appliqué un log(price), les coefficients s’interprètent en pourcentage (en faisant \((e^{\beta} - 1\), ou approximativement \(\beta \times 100\) ) pour les petits coefficients) :

  1. La classe (Économique vs Business) : C’est l’effet le plus massif. classEconomy a un coefficient de \(-2.02\). Un billet en classe économique coûte environ \(86 \%\) moins cher ( \((e^{-2.02} - 1)\) ) qu’un billet en classe Business (la modalité de référence).

  2. Le moment de l’achat (days_left) : Le coefficient est de \(-0.014\) . Chaque jour qui passe (chaque jour de moins avant le vol) fait augmenter le prix du billet d’environ \(1.4 \%\). Plus on réserve tard, plus c’est cher.

  3. Les escales (stopszero) : Un vol direct (stopszero = \(-0.42\) ) coûte environ \(34 \%\) moins cher ( \((e^{-0.42} - 1)\)) qu’un vol avec une escale.

b) Prédiction

Comme nous utilisons le modèle log-linéaire, les prévisions brutes générées par la fonction predict() dans R seront à l’échelle logarithmique : nous allons obtenir \(\widehat{\log (y)}\) et non \(y\).

Pour retrouver les prévisions à l’échelle d’origine (en euros, dollars, etc.), il ne suffit pas de faire une simple exponentielle \(\exp(\hat{y})\) . Si vous faites cela, vous commettez une erreur mathématique classique qui sous-estime systématiquement le vrai prix moyen.

Nous avons utiliser la méthode de correction empirique de Smearing pour y parvenir :

C’est la méthode la plus robuste car elle ne suppose pas que vos résidus soient parfaitement normaux. Elle utilise la moyenne des exponentielles des résidus du modèle.

Comparaison du prix réel au prix prédit

Tableau

comparaison et droite \(Y=X\)

c) Qualité des prédictions (RMSE)

Notre modèle donne de bonnes prédictions, mesurons les avec quelques métrics

## [1] 8604.632

2. Modèle Lasso

Principe

Le Lasso ajoute une pénalité :

\[ \min_{\beta} \left\{ \sum_{i=1}^{n} \left(y_i-\hat{y}_i\right)^2 + \lambda \sum_{j=1}^{p} |\beta_j| \right\} \]

  • \(\alpha = 1\)

  • Peut sélectionner des variables.

  • Certains coefficients deviennent exactement nuls

Etape 1: Trouver le paramètre optimal \(\lambda_{optimal}\) via une validation croisée.

Cette validation croisée nous donne le \(\lambda_{optimal}\)

## [1] 0.003108511

Etape 2: Modèle

On l’introduit maintenant dans le modèle et on obtient les coéfficients suivants :

## 32 x 1 sparse Matrix of class "dgCMatrix"
##                                       s0
## (Intercept)                 11.085234606
## (Intercept)                  .          
## airlineAirAsia              -0.436128682
## airlineGO_FIRST             -0.065697244
## airlineIndigo               -0.200357084
## airlineSpiceJet              .          
## airlineVistara               0.106406111
## source_cityChennai           0.011046718
## source_cityDelhi            -0.007211974
## source_cityHyderabad        -0.092127589
## source_cityKolkata           0.121344960
## source_cityMumbai           -0.064515573
## departure_timeEarly_Morning  .          
## departure_timeEvening       -0.036024753
## departure_timeLate_Night    -0.077199493
## departure_timeMorning        0.005154175
## departure_timeNight         -0.005463457
## stopstwo_or_more             0.186880401
## stopszero                   -0.418909705
## arrival_timeEarly_Morning   -0.140118179
## arrival_timeEvening          0.044800818
## arrival_timeLate_Night      -0.023069555
## arrival_timeMorning         -0.012495209
## arrival_timeNight            0.036787283
## destination_cityChennai     -0.002754986
## destination_cityDelhi       -0.005621701
## destination_cityHyderabad   -0.028334426
## destination_cityKolkata      0.106427131
## destination_cityMumbai       .          
## classEconomy                -2.018856345
## duration                     0.004530348
## days_left                   -0.014267365

Les variables sélectionnées par le modèle Log_lasso sont les mêmes que celles de notre modèle de régrssion Log-lineaire.

Etape 3: Métriques de performance et Prédictions

## --- Performances du modèle Lasso sur le jeu de Test ---
## RMSE :  8022.03  (Erreur moyenne au carré)
## MAE  :  4399.22  (Écart moyen en valeur absolue sur le prix d'un billet)
## R²   :  86.55 %
##    Reel   Predit    Ecart
## 1 73369 75949.83 -2580.83
## 2 75339 68617.86  6721.14
## 3  2339  2449.44  -110.44
## 4  6158  5288.66   869.34
## 5  4500  2323.24  2176.76

Ce modèle affiche une \(RMSE\) légèrement plus faible (\(8022.03\)) contre \(8604.63\)), mais un \(R^{2}\) inférieur à celui du modèle log-linéaire (\(86.55 \%\)) contre \(91.13 \%\)). Notre priorité étant de maximiser la précision des prédictions sur la variable price, nous retenons ce modèle pour sa meilleure gestion des erreurs globales.

3. Modèle Xgboost

Les paramètres optimaux de notre modèle Xgboost sont

paramètres optimaux

UTILISER LE MEILLEUR MODÈLE

En introduisant nos paramètres optimaux dans notre modèle, nous obtenons comme \(RMSE\)

Performance finale (RMSE) du modèle Xgboost

## [1] 5019.015

Conformément aux attentes et à la réputation de l’algorithme, XGBoost s’impose comme le modèle le plus performant. Il réduit drastiquement l’erreur de prédiction (\(RMSE_{XGBboost}=\) 5019.02) par rapport aux solutions log-linéaire (8604.63) et Lasso (8022.03)

Comparaison du prix du XGBoost et du prix réel

Graphe

Tableau

Conclusion

Ce projet de Data Science a permis de mettre en évidence les principaux déterminants du prix des billets d’avion sur la plateforme « Ease My Trip ». Nos analyses montrent que le tarif dépend fortement de facteurs structurels, au premier rang desquels la classe de voyage (Économique ou Business) et le type de compagnie aérienne, tandis que la ville de destination n’exerce pas d’influence significative. Face à la forte volatilité et à l’asymétrie des prix observées sur ce marché, la modélisation du logarithme de la variable (log(price)) s’est révélée être une stratégie méthodologique judicieuse. Enfin, l’approche par boosting d’arbres avec le modèle XGBoost s’impose comme la solution la plus performante, offrant une excellente qualité de prédiction pour l’estimation des tarifs.