feat: add linear regression analysis and visualization in Exercice 1.R

This commit is contained in:
Félix MARQUET
2025-04-01 14:07:29 +02:00
parent 5ee11308d3
commit 777ce99641

90
Big Data/TP2/Exercice 1.R Normal file
View File

@@ -0,0 +1,90 @@
# https://github.com/BreizhHardware/TD-R/tree/main/Big%20Data/TP2
# 1. Représenter le nuage de points {(<28><>ଵ, <20><>ଵ), … , (<28><>௡, <20><>௡)}. À partir de celui-ci, expliquer pourquoi on peut envisager lexistence dune liaison linéaire entre Y et X.
# Définition des données
prix <- c(420, 380, 350, 400, 440, 380, 450, 420)
ventes <- c(5.5, 6, 6.5, 6, 5, 6.5, 4.5, 5)
# Création d'un dataframe
donnees <- data.frame(prix = prix, ventes = ventes)
plot(donnees$prix, donnees$ventes,
main = "Relation entre prix et ventes",
xlab = "Prix du produit",
ylab = "Nombre de ventes",
pch = 19, col = "blue")
cat("On observe une tendance linéaire négative: quand le prix augmente, les ventes diminuent\n")
# 2. On adopte alors le modèle de régression linéaire simple : ∀<><E28880>, <20><>௜ = β଴ + βଵ<CEB2><E0ACB5>௜ +∈௜ . Les paramètres <20><>଴ et<65><74>ଵ sont des réels inconnus. On considère la forme matricielle usuelle : Y = X<><58> + <20><> , avec β = (<28><><20><>ଵ ) . Créer dans R la matrice X associée.
X <- cbind(1, prix)
print(X)
# 3. En posant y = ( ௧ <20><>ଵ, . . ., <20><>௡) , calculer <20><> = ൫ <20><><20><>൯ ିଵ <20><><20><>. Que représente b par rapport à β ?
Y <- matrix(ventes, ncol = 1)
beta <- solve(t(X) %*% X) %*% t(X) %*% Y
print(beta)
# 4. Vérifier que lon a b = ( ௧ b0 ,b1 ) , avec b1= ଵ ∑ (௫೔ି௫̅) ೙ మ ೔సభ ∑ (<28><>௜ ௡ ௜ୀଵ <20><>̅)(<28><> <20><>ത) b0 = <20><> b1<62><31>̅. Retrouver ces résultats numériques avec les commandes lm et coef
x_mean <- mean(prix)
y_mean <- mean(ventes)
# Calcul manuel de b1
numerateur <- sum((prix - x_mean) * (ventes - y_mean))
denominateur <- sum((prix - x_mean)^2)
b1_manuel <- numerateur / denominateur
# Calcul manuel de b0
b0_manuel <- y_mean - b1_manuel * x_mean
# Affichage des coefficients manuels
cat("b0 (manuel) =", b0_manuel, "\n")
cat("b1 (manuel) =", b1_manuel, "\n")
# Vérification avec lm()
modele <- lm(ventes ~ prix, data = donnees)
coef_lm <- coef(modele)
cat("b0 (lm) =", coef_lm[1], "\n")
cat("b1 (lm) =", coef_lm[2], "\n")
# 5. Tracer la droite de régression sur le nuage de points.
plot(donnees$prix, donnees$ventes,
main = "Régression linéaire: Prix vs Ventes",
xlab = "Prix du produit",
ylab = "Nombre de ventes",
pch = 19, col = "blue")
abline(modele, col = "red", lwd = 2)
# Calcul des valeurs prédites
y_pred <- predict(modele, data.frame(prix = prix))
# Ajout des traits reliant les points à la droite
for (i in 1:length(prix)) {
segments(prix[i], ventes[i], prix[i], y_pred[i], col = "purple", lty = 2)
}
# Ajout d'une légende
legend("topright",
legend = c("Observations", "Droite de régression", "Résidus"),
col = c("blue", "red", "purple"),
pch = c(19, NA, NA),
lty = c(NA, 1, 2),
lwd = c(NA, 2, 1))
# 6. Calculer "à la main" le coefficient de détermination et le coefficient de détermination ajusté. Est-ce que le modèle de régression linéaire simple est pertinent avec les données ?
y_pred <- X %*% beta # Valeurs prédites
TSS <- sum((ventes - y_mean)^2) # Somme totale des carrés
RSS <- sum((ventes - y_pred)^2) # Somme des carrés des résidus
R_carre <- 1 - RSS/TSS
cat("R² =", R_carre, "\n")
# Calcul du R² ajusté
n <- length(ventes)
p <- 1 # Nombre de variables explicatives (hors intercept)
R_carre_ajuste <- 1 - (RSS/(n-p-1))/(TSS/(n-1))
cat("R² ajusté =", R_carre_ajuste, "\n")
# 7. Retrouver les estimations précédentes avec la commande summary.
resume <- summary(modele)
print(resume)