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 :
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.
flight : la colonne « flight » contient des informations relatives au code de vol de l’avion. Il s’agit d’une caractéristique catégorielle.
source_city : Ville d’où le vol décolle. Il s’agit d’une caractéristique catégorielle comprenant 6 villes distinctes.
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.
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.
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.
destination_city : ville où le vol atterrira. Il s’agit d’une caractéristique catégorielle comprenant 6 villes distinctes.
class : caractéristique catégorielle contenant des informations sur la classe de siège ; elle comporte deux valeurs distinctes : Classe affaires et Classe économique.
duration : caractéristique continue indiquant la durée totale du trajet entre les villes, exprimée en heures.
days_left : caractéristique dérivée calculée en soustrayant la date de voyage de la date de réservation.
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 :
Définir la (ou les) variable(s) de stratification.
Tirer un échantillon proportionnel dans chaque strate.
Comparer la distribution des variables entre la population et l’échantillon.
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 deprice, 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
| \(ε²\) | 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 dulm(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)
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+β_1X_{i1}+β_2X_{i2}+⋯+β_pX_{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 deSpiceJet` n’est pas statistiquement différent de la compagnie de référence.En revanche,
airlineAirAsiaetairlineVistaraont des p-values extrêmement faibles ( < \(2.2e-16\) ) , ce qui montre que la variableairlineglobale est cruciale pour le modèle.
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) :
La classe (Économique vs Business) : C’est l’effet le plus massif.
classEconomya 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).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.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.
Comment choisir scientifiquement ?
Ne devinez pas, vérifiez graphiquement et statistiquement sous R après avoir ajusté vos deux modèles :