Skip to the content.

Data Analyse:

Dispensé par Monsieur Mbiguidi en section DATASCIENCE, école Epsi, Nantes:

Exercice/Contrôle sur Dataset Libre.


← Retour à la base du wiki


Régression linéaire multiple: analyse du dataset Boston Housing

Nous allons utiliser le dataset Boston Housing, qui contient des informations sur des maisons à Boston. Ces données faisaient initialement partie du Machine Learning Repository de l’UCI, mais ont été retirées. Elles étaient également accessibles via la bibliothèque scikit-learn, mais cette méthode deviendra obsolète. Nous allons donc les récupérer à partir de ce lien : http://lib.stat.cmu.edu/datasets/boston.

Le dataset contient 506 échantillons et 13 variables. Nous allons réaliser deux analyses différentes pour cet exercice.

Une première analyse liée au prix des habitations, et une deuxième liée à la criminalité.

Nous essaierons, dans cet exercice, de créer et d’explorer deux modèles différents en faisant des variations de tests.

Chargement des bibliothèques

Tout d’abord, nous chargeons les différentes bibliothèques. Pour ce faire, nous allons coder en utilisant le langage R.

if (!require("dplyr")) install.packages("dplyr")
if (!require("corrplot")) install.packages("corrplot")
if (!require("ggplot2")) install.packages("ggplot2")

library(dplyr)
library(corrplot)
library(ggplot2)

Importation du data set:

Le dataset est actuellement accessible via cette adresse :

http://lib.stat.cmu.edu/datasets/boston

Comme je souhaite l’avoir en local dans mon environnement de travail, j’exécute un code Python que j’ai déjà en ressource, qui me permet de récupérer l’ensemble de la base de données et de l’enregistrer en local dans mon dossier de travail lié aux données, le tout au format CSV

Importation et visualisation du dataset dans R

Dans un premier temps, nous importons le dataset dans R, puis à l’aide de la commande head, nous effectuons une première visualisation afin de prévisualiser ce dataset et de se faire une idée de ce qu’il contient.

boston <- read.csv("~/OFwiki/Other_frequencies_Wiki/Code/R/Dev_R/boston_housing.csv", header = TRUE)

head(boston)

On observe une liste de colonnes et voici la méta liée à chacune de ces colonnes:

Voici la visualisation du set de donnée:

![[image.png]]

Analyse du taux de criminalité:

Je suis particulièrement sensible à ce qui influence les environnements sociaux. La criminalité est souvent considérée comme un indicateur des minima sociaux. J’aimerais donc explorer cette direction pour comprendre les éléments de l’environnement social et géographique ayant un impact sur le taux de criminalité.

Tout d’abord, nous allons créer une matrice de corrélations:

Mise en place et étude de la matrice de corrélations

boston_corel <- boston %>% select_if(is.numeric)
cor_matrix <- cor(boston_corel)
corrplot(cor_matrix, method = "circle", type = "upper")

![[image 1.png]]

Pour résumer: Je vais exclure de mes observations les variable B, CHAS et je reviendrais sur la variable PTRATIO un peu plus tard dans cette exploration.

Visualisation de la distribution

Dans un second temps, nous allons faire un histogramme de la variable Y (CRIM)

ggplot(boston, aes(x = CRIM)) +
  geom_histogram(binwidth = 1, fill = "blue", alpha = 0.7) +
  labs(title = "Distribution du taux de criminalité (CRIM)", x = "CRIM", y = "Fréquence")

ce qui nous donne ceci:

image.png

En observant la distribution de votre graphique, voici quelques points que l’on peut déduire sur la variable y CRIM (taux de criminalité) :

  1. Distribution asymétrique avec un pic élevé :
    • La majorité des villes ont un taux de criminalité très bas, concentré autour de 0.
    • Cela indique que les zones à faible criminalité sont dominantes dans l’échantillon.
  2. Queue longue à droite (positivement asymétrique) :
    • Il existe quelques villes avec des taux de criminalité très élevés (outliers ou valeurs extrêmes).
    • Cela pourrait refléter des quartiers très spécifiques avec des problèmes de criminalité nettement plus importants.
  3. Analyse des valeurs extrêmes :
    • Ces valeurs extrêmes pourraient être influencées par des facteurs spécifiques comme la densité urbaine, le revenu moyen, ou d’autres caractéristiques particulières de ces quartiers.

Le taux de criminalité est très inégalement réparti dans l’échantillon, avec une concentration autour de faibles valeurs et quelques cas de criminalité élevée qui méritent une analyse plus approfondie.

Graphiques de dispersion:

En explorant les graphiques de dispersions, nous allons essayer d’obtenir d’autres informations nous permettant d’affiner notre approche de la problématique initiale:

Choix des features

  1. DIS (Distance aux centres d’emploi) : Influence possible de l’éloignement des centres économiques sur la criminalité.
  2. LSTAT (% de population faible) : Hypothèse qu’un statut socio-économique faible pourrait être corrélé avec une criminalité élevée.
  3. AGE (Proportion de logements anciens) : Les zones avec des logements anciens pourraient être associées à des environnements spécifiques influençant la criminalité.
  4. NOX (Concentration d’oxydes nitriques) : Les zones industrielles, souvent associées à une pollution élevée, pourraient aussi avoir un lien avec le taux de criminalité.
  5. TAX (Taux d’imposition) : Les zones avec des impôts élevés pourraient être associées à des revenus plus élevés et une augmentation de criminalité.

Relation entre CRIM et DIS :

ggplot(boston, aes(x = DIS, y = CRIM)) +
  geom_point(alpha = 0.4) +
  geom_smooth(method = "lm", color = "red")

Une plus grande distance (DIS) pourrait indiquer des zones résidentielles éloignées avec moins de criminalité, ou au contraire un isolement favorisant certains comportements criminels.

image.png

Relation entre CRIM et LSTAT :

ggplot(boston, aes(x = LSTAT, y = CRIM)) +
geom_point(alpha = 0.4) +
geom_smooth(method = "lm", color = "red")

Un pourcentage élevé de population à faible statut socio-économique pourrait être corrélé avec un taux de criminalité plus élevé.

image.png

Je vais essayer d’affiner l’observation à l’aide d’une dummy pour les groupes socio-économiques :

Cr&ation d’une dummy pour identifier les zones avec un pourcentage de population défavorisée (LSTAT) supérieur à un seuil critique, par exemple 20 %.


boston$High_LSTAT <- ifelse(bostong$LSTAT > 20, 1, 0)
lin_reg_high_lstat <- lm(CRIM ~ High_LSTAT, data = boston)
summary(lin_reg_high_lstat)

Interprétation : Si le coefficient associé à cette dummy est significatif, cela indiquerait que les zones avec une forte proportion de population défavorisée ont un taux de criminalité significativement différent.

image.png

###

Résumé du modèle

Je décide donc d’ajouter une nouvelle colone à mon dataset et d’enlever l’ancienne colone Lstat:

boston <- boston %>%
mutate(High_LSTAT = ifelse(LSTAT > 20, 1, 0)) %>%
select(-LSTAT)

Relation entre CRIM et AGE :

ggplot(boston, aes(x = AGE, y = CRIM)) +
  geom_point(alpha = 0.4) +
  geom_smooth(method = "lm", color = "red")

image.png

Hypothèses possibles :

  1. Quartiers anciens et criminalité :
    • Les quartiers avec une forte proportion de logements anciens pourraient être associés à des conditions socio-économiques spécifiques (par exemple, manque de rénovation, faible attractivité économique), contribuant à un taux de criminalité plus élevé.
  2. Autres facteurs en jeu :
    • La relation entre AGE et CRIM est loin d’être forte. Cela suggère que d’autres variables (comme LSTAT ou DIS) pourraient expliquer davantage la variation de CRIM.

Je décide de faire CUT ainsi que DUMMY:

La variable AGE est une variable continue (proportion de logements anciens). Cependant, il peut être difficile d’interpréter ou de modéliser cette variable telle qu’elle est. En utilisant un cut, je peu diviser AGE en groupes, ce qui permettra de mieux comprendre les relations (discrétes) non linéaires.

Un dummy (variable binaire) peut être utile pour capturer un effet spécifique, comme par exemple :


boston <- boston %>%
  mutate(AGE_category = cut(AGE, 
                            breaks = c(0, 25, 50, 75, 100), 
                            labels = c("0-25%", "26-50%", "51-75%", "76-100%"),
                            include.lowest = TRUE))

ggplot(boston_housing, aes(x = AGE_category, y = CRIM)) +
  geom_boxplot(fill = "skyblue") +
  labs(title = "Relation entre les catégories d'AGE et CRIM",
       x = "Catégories de logements anciens (AGE)", 
       y = "Taux de criminalité (CRIM)")

image.png

On observe que plus les proportions de maison jeune par rapport au qaurtier sont fort (entre 0 et 25% max d’apartement ancien) le taux de criminalité est faible. PLus l’age général augmente, plus la disparitée est grande. On peut globalement en déduire que les quartier avec plus de 75 de vielles maisons sont les quartier avec le plus fort taux de criminalité. Toutefois, on observe également une grande disparité: certains quartiers sont proche de zero, contrairement à d’autre. Cela signifie que cette variable à bien un impacte,

On remarque que la valeur médiane reste proches des autres tranches d’age. On peut en déduire que globalement, la violence se concentre sur quelques quartier ciblé, dans la tranche d’age de plus de 75 ans.


boston <- boston %>%
  mutate(AGE_old_dummy = ifelse(AGE > 75, 1, 0))

ggplot(boston, aes(x = factor(AGE_old_dummy), y = CRIM)) +
  geom_boxplot(fill = "orange") +
  scale_x_discrete(labels = c("AGE <= 75%", "AGE > 75%")) +
  labs(title = "Relation entre AGE_old_dummy et CRIM",
       x = "Ancienneté des logements (AGE_old_dummy)", 
       y = "Taux de criminalité (CRIM)")

image.png

Ce boxplot compare le taux de criminalité (CRIM) entre deux groupes de quartiers :

  1. AGE ≤ 75% : Quartiers où moins de 75% des logements sont anciens.
  2. AGE > 75% : Quartiers où plus de 75% des logements sont anciens.

Il y a une grande disparité dans la colonne AGE > 75%.

nous allons faire analyser un peu plus cette collone et la divisée en trois parties et faire trois nouvelles colonne dummy:

image.png

Relation entre CRIM et TAX

ggplot(boston, aes(x = TAX, y = CRIM)) +
geom_point(alpha = 0.6) +
geom_smooth(method = "lm", color = "orange") +
labs(title = "Relation entre TAX et Criminalité (CRIM)",
x = "Taux d'imposition foncière (TAX)", y = "Taux de criminalité (CRIM)")

image.png

La relation est plutôt évidente: Nous avons deux zone bien distincte, une bande grise (taux des 95%) très resserrée et la relation est croissante: Plus les TAXES sont élevée, plus le taux de criminalitées augmente. On peut associer ce phénomène au fait que les quartier les plus taxés sont ceux où s’ynstallent les personnes ayant une capacité financiére, et donc matérielle plus importante.

Relation entre CRIM et NOX

image.png

Création du modèle de régression linéaire:

Régréssion avant modification et explroation du dataset:

Ici, nous faisons une première régréssion linéaire en utilisant toutes les datas afin d’avoir un aperçu général.

#regression avant traitement du data set
lin_reg1 <- lm(CRIM ~ ., data = boston)
summary(lin_reg1)
lin_reg2 <- step(lin_reg1, direction = "backward", )
summary(lin_reg2)

résultat:

image.png

Intercept (Intercept)

Residual Standard Error

image.png

Pour évaluer si le RSE est “bon” ou “mauvais”, il faut le mettre en contexte avec l’échelle de la variable cible (CRIM).

Si on regarde le boxplot et l’ histogramme, la majorité des valeurs de CRIM semblent être proches de 0 avec une longue traîne allant jusqu’à 88.

Si j’ai bien compris, résidual standar error étant compris dans la partie proche de la médianne, alors cela signifie que les erreurs moyennes de 6.428 unités peuvent être significatives, surtout si beaucoup de valeurs se situent dans une plage basse (ex. : 0-10).

image.png

Il se peut erreur moyenne de 6.428 pourrait indiquer que le modèle a du mal à bien prédire les valeurs basses.

F-statistic est de 50.92 et sa p-value associée est < 2.2e-16.

Estimate

On observe un estimate de -12,75 pour la variable NOX. Cela signifie que cette variable a un impact significatif et important sur la cibleCRIM. Pour une augmentation de 1 unité de NOX, et toutes les autres variables restant constantes, la variable cible CRIM est estimée diminuer de 12,75 unités.

Analyse des variables

Voici un résumé rapide basé sur les données et le résumé du modèle vu dans les captures :

Variables significatives (p-value < 0.05) : À garder

Variables non significatives (p-value > 0.05)

Voici le résultat après enlevé ces variables:

image.png

Globalement le modéle est moins performant (adjusted R-Squared est plus bas)

Faisons une autre régrassion en utilisant seulement les valeur aillant une valeur significative r lin_reg_simplified <- lm(CRIM ~ DIS + RAD, data = boston) summary(lin_reg_simplified)

image.png

Le modèle simplifié avec les variables DIS et RAD reste globalement significatif (F-statistic = 166.1, p-value < 2.2e-16) et explique 39,5 % de la variance de CRIM (Adjusted R² = 0.3954). Les deux variables sont statistiquement significatives :

Le Residual Standard Error (RSE) est de 6.688, similaire au modèle précédent, mais avec moins de variables. Ce modèle est donc plus simple à interpréter, bien qu’il soit légèrement moins performant.

image.png

Le modèle avec les variables LSTAT, NOX, RAD, et TAX explique 41,7 % de la variance de CRIM (Adjusted R² = 0.417) avec une erreur moyenne (RSE) de 6.568. Le modèle est globalement significatif (F-statistic = 91.29, p-value < 2.2e-16).

Parmi ces variables :

Une version simplifiée avec uniquement LSTAT et RAD conserverait probablement des performances similaires tout en étant plus interprétable.

CONCLUSION:

Nous disposons d’un modèle de régression linéaire relativement efficace, mais manquant de précision.

Il semble qu’en général, des variables supplémentaires seraient nécessaires pour affiner le modèle, notamment dans les zones à faible criminalité où les données semblent potentiellement insuffisantes.

De plus, il est probable que d’autres facteurs influencent le taux de criminalité, mais qu’ils ne sont pas encore pris en compte dans notre modèle actuel.

Pour améliorer le modèle, nous pourrions :

Ces ajustements pourraient permettre une meilleure modélisation et une interprétation plus précise des résultats.