# Packages utiles
library(dplyr); library(ggplot2); library(readr); library(janitor); library(broom)
# (Optionnel) diagnostics
# library(car); library(performance)
# ⚠️ Adaptez le chemin vers votre CSV Kaggle
# Exemple : data/used_cars.csv
# cars_raw <- read_csv("data/used_cars.csv")
# Pour la démonstration, on crée un tibble vide si vous n'avez pas encore le fichier.
# Supprimez ce bloc une fois votre CSV chargé.
cars_raw <- tibble::tibble()Challenge — Prix de voitures
Dataset : Used Car Dataset — Kaggle (auteur: rishabhkarn).
Lien : https://www.kaggle.com/datasets/rishabhkarn/used-car-dataset
⚠️ Vérifiez la description Kaggle pour les noms exacts** de colonnes** (ils peuvent varier selon la version).
Noms courants :selling_price(réponse),year,km_driven,fuel,transmission,seller_type,owner,name.
🎯 Objectif
Construire un modèle de régression linéaire multiple lm() pour expliquer le prix d’une voiture d’occasion et interpréter au moins un effet majeur.
0) Préparation
Important — Noms de colonnes
Les champs les plus fréquents sont :
selling_price, year, km_driven, fuel, transmission, seller_type, owner, name.
Ouvrez le CSV et confirmez les noms via names(cars_raw) ou glimpse(cars_raw).
# Vérifier les colonnes disponibles
# glimpse(cars_raw)1) Nettoyage minimal
cars <- cars_raw %>%
janitor::clean_names()
# Exemple de normalisation (adaptez aux noms réels de votre fichier)
# - Si votre fichier contient bien "selling_price", "km_driven", etc., ces lignes sont OK.
# - Sinon, renommez selon la description Kaggle.
cars <- cars %>%
dplyr::rename(
price = selling_price, # <— renommer la variable réponse
mileage_km = km_driven # <— renommer le kilométrage
)
# Encodage des catégorielles (adaptez selon vos colonnes exactes)
cars <- cars %>%
mutate(
fuel = as.factor(fuel),
transmission = as.factor(transmission),
seller_type = as.factor(seller_type),
owner = as.factor(owner)
)
# Gestion simple des valeurs manquantes (à raffiner si besoin)
cars_complete <- cars %>% tidyr::drop_na(price, year, mileage_km, fuel, transmission)À faire (équipe)
- Confirmer que price est bien la réponse (sinon, adaptez).
- Vérifier l’unité de mileage_km (km).
- Choisir une référence pertinente pour fuel et transmission (ex. essence, manuelle).
2) EDA rapide
# Distribution du prix (attention aux queues)
ggplot(cars_complete, aes(price)) + geom_histogram(bins=30, alpha=.7) +
scale_x_continuous(labels = scales::label_number_si()) +
labs(title="Distribution des prix")
# Prix vs kilométrage (possible non-linéarité)
ggplot(cars_complete, aes(mileage_km, price)) + geom_point(alpha=.3) +
scale_y_continuous(labels = scales::label_number_si()) +
scale_x_continuous(labels = scales::label_number_si()) +
labs(title="Prix en fonction du kilométrage")
# Prix par transmission
ggplot(cars_complete, aes(transmission, price)) + geom_boxplot() +
scale_y_continuous(labels = scales::label_number_si()) +
labs(title="Prix par type de transmission")Piste : tester des transformations si la relation prix ~ kilométrage semble non linéaire (ex. log(price), log1p(mileage_km)).
3) Modèle de base (≤ 6 prédicteurs)
mod0 <- lm(price ~ year + mileage_km + fuel + transmission + seller_type, data = cars_complete)
summary(mod0)Questions
- Quel prédicteur a l’effet le plus fort (en valeur absolue) ?
- Interprétez l’effet de transmission (manuelle vs auto) toutes choses égales par ailleurs.
4) Variante avec transformation
mod1 <- lm(log(price) ~ year + log1p(mileage_km) + fuel + transmission + seller_type, data = cars_complete)
broom::glance(mod0)[,c("r.squared","AIC","BIC")]
broom::glance(mod1)[,c("r.squared","AIC","BIC")]
broom::tidy(mod1) %>% head()Interprétation (log-prix)
- Un coefficient sur year ≈ variation en % de prix par année supplémentaire (petite pente).
- log1p(mileage_km) : élasticité approximative au kilométrage.
5) (Option) Diagnostics rapides
par(mfrow=c(2,2)); plot(mod1); par(mfrow=c(1,1))
# car::vif(mod1)Attention
- Colinéarité possible entre year et owner (ou d’autres variables).
- Valeurs extrêmes (prix/vehicules premium) pouvant influencer fortement les coefficients.
6) Restitution (équipe)
- Expliquez un effet majeur (ex. transmission, fuel, year) avec une phrase claire pour un public non technique.
- Comparez
mod0vsmod1(AIC/BIC, R²) → quel modèle retenez-vous, et pourquoi ?
- Limites : mentionnez au moins une limite de votre modèle (données, hypothèses, variables manquantes).
⭐ Bonus
- Ajoutez
interaction(year:transmission)si vous suspectez un effet différent selon la transmission.
- Cherchez un point influent (distance de Cook) et discutez s’il faut l’exclure.
- Proposez une variable métier à ajouter (ex. historique d’entretien, accidents, options).