• 15 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 18/02/2020

Entraînez-vous à réaliser des analyses bivariées

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

À vous de jouer

L'un des jeux de données les plus utilisés dans les cours et tutoriels de statistiques est appelé "iris". C'est un échantillon contenant des mesures prises sur des fleurs de la variété iris. Chaque individu représente une fleur dont on a mesuré :

  • la longueur du pétale

  • la largeur du pétale

  • la longueur du sépale

  • la largeur du sépale

La 5e variable disponible est l'espèce de la fleur, il y en a 3 : Setosa, Versicolor et Virginica.

Le jeu de données original a été modifié : quelques valeurs ont été supprimées. Il y a donc des valeurs manquantes. Certaines valeurs ont également été modifiées.
Le but de cette activité ne sera pas de retrouver ces valeurs exactes, mais de les approcher en utilisant les méthodes d'analyse bivariée que vous avez vues lors des derniers chapitres.

Voici les diagrammes de dispersion des variables qualitatives prises 2 à 2. Sur ces graphiques, les points ont été colorés en fonction de la variable qualitative  Espèce  .

Voici le code Python destiné à charger le jeu de données :

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# Chargement
iris = pd.read_csv("iris_dataset.csv")

# On renomme les colonnes
iris.columns = ["id","sepal_length","sepal_width","petal_length","petal_width","species"]

# On supprime l'identifiant des iris
del iris["id"]

# On supprime les individus contenant au moins une valeur manquante
iris_dna = iris.dropna(axis=0, how='any')
print("iris : {} individus, iris_dna : {} individus".format(len(iris),len(iris_dna)))

# Affichage des diagrammes de dispersion
sns.pairplot(iris_dna,hue="species")
plt.show()

On sépare également iris_dna en 3 échantillons ; un pour chaque espèce :

iris_setosa = iris_dna[iris_dna["species"] == "setosa"]
iris_virginica = iris_dna[iris_dna["species"] == "virginica"]
iris_versicolor = iris_dna[iris_dna["species"] == "versicolor"]

Voici 2 diagrammes de dispersion :

  • celui de petal_width en fonction de petal_length

  • celui de sepal_width en fonction de petal_width

 

Questions

Question 1 :

Sur le dataframe iris_dna, calculez les coefficients de corrélation linéaires suivants :
- petal_width en fonction de petal_length
- sepal_width en fonction de petal_width

Question 2 :

Commentez les résultats de la question 1 grâce aux 2 diagrammes de dispersion donnés dans l'énoncé.

Ensuite, gardez en tête le coefficient de corrélation linéaire de sepal_width en fonction de petal_width. Celui-ci est calculé sur l'ensemble des iris. Quand on calcule les coefficients de corrélation linéaire de ces mêmes variables, mais en les séparant par espèce, on obtient les résultats suivants :

  • sepal_width en fonction de petal_width sur iris_setosa : 0,753

  • sepal_width en fonction de petal_width sur iris_virginica : 0,685

  • sepal_width en fonction de petal_width sur iris_versicolor : 0,825

NB : Vous n'avez pas besoin de refaire ce calcul.

Comparez (dans votre tête) ces 3 résultats à celui obtenu sur l'ensemble des iris (question 1).

NB: Vous n'avez pas à répondre à cette question dans votre rendu.

Ces résultats sont mieux interprétables quand on colore les points selon l'espèce d'iris :

Question 3 :

Réalisez 4 régressions linéaires (avec la méthode des moindres carrés). Nous utiliserons la notation suivante : Y = aX + b + epsilon .

a et b sont les réels que vous devez estimer, epsilon le terme d'erreur (vous n'avez pas à vous en soucier), X et Y sont 2 variables.

Les 4 régressions linéaires correspondent à chacun de ces 4 cas :
cas 1/ X est la variable petal_length et Y la variable petal_width, sur le dataframe iris_dna
cas 2/ X est la variable petal_width et Y la variable sepal_width, sur le dataframe iris_setosa
cas 3/ X est la variable petal_width et Y la variable sepal_width, sur le dataframe iris_virginica
cas 4/ X est la variable petal_width et Y la variable sepal_width, sur le dataframe iris_versicolor
Remarque : ce sont les 4 cas que nous étudions depuis le début.

Donnez pour chacun des ces 4 cas les estimations de a et de b.

Question 4 :

Voici les 4 lignes contenant des données manquantes :

Pour chaque individu, la valeur manquante se trouve soit dans la variable petal_width soit dans la variable sepal_width. Dans ces 2 cas, on peut imputer (remplir) ces valeurs grâce aux régressions linéaires que nous avons étudiées précédemment. Ces valeurs seront approchées mais fausses.
En supposant qu'un individu n'a jamais plus d'une valeur manquante, voici le code qui remplace les valeurs manquantes grâce aux régressions linéaires. Des bouts de code ont été supprimés et remplacés par "[...]" : à vous de les retrouver.

coeffs = {
    "cas 1" : {'a': [...] , 'b':[...]},
    "cas 2" : {'a': [...] , 'b':[...]},
    "cas 3" : {'a': [...] , 'b':[...]},
    "cas 4" : {'a': [...] , 'b':[...]},
}
lignes_modifiees = []

for (i,individu) in iris.iterrows(): # pour chaque individu de iris,...
    if pd.isnull(individu["petal_width"]): #... on test si individu["petal_width"] est nul.
        a = coeffs["cas 1"]['a']
        b = coeffs["cas 1"]['b']
        X = individu["petal_length"]
        Y = a*X + b
        iris.loc[i,"petal_width"] = Y # on remplace la valeur manquante par Y
        lignes_modifiees.append(i)
        print("On a complété petal_width par {} a partir de petal_length={}".format(Y,X))
        
    if pd.isnull(individu["sepal_width"]):
        espece = individu["species"]
        X = individu["petal_width"]
        [...]
        lignes_modifiees.append(i)
        print("On a complété sepal_width par {} a partir de l'espece:{} et de petal_width={}".format(Y,espece,X))
        
print(iris.loc[lignes_modifiees])

Traduction du code en R

# Chargement
iris = read.table("iris_dataset.csv",sep=",",header=1) 
# On supprime l'identifiant des iris
iris["id"] = NULL
# On supprime les individus contenant au moins une valeur manquante
iris_dna = na.omit(iris)
sprintf("iris : %i individus, iris_dna : %i individus",nrow(iris),nrow(iris_dna))
# Affichage des diagrammes de dispersion
pairs(iris_dna[1:4], pch = 21,bg = c("red", "green3", "blue")[unclass(iris$species)])
iris_setosa = iris_dna[iris_dna["species"] == "setosa",]
iris_virginica = iris_dna[iris_dna["species"] == "virginica",]
iris_versicolor = iris_dna[iris_dna["species"] == "versicolor",]
coeffs = list(
    "cas 1" = list('a'=[...] , 'b'=[...]),
    "cas 2" = list('a'=[...] , 'b'=[...]),
    "cas 3" = list('a'=[...] , 'b'=[...]),
    "cas 4" = list('a'=[...] , 'b'=[...])
)
lignes_modifiees = c()

for(i in 1:nrow(iris)){ # pour chaque individu de iris,...
    individu = iris[i,]
    if(is.na(individu["petal_width"])){ #... on test si individu["petal_width"] est nul.
        a = coeffs[["cas 1"]][['a']]
        b = coeffs[["cas 1"]][['b']]
        X = individu["petal_length"]
        Y = a*X + b
        iris[i,"petal_width"] = Y # on remplace la valeur manquante par Y
        lignes_modifiees = c(lignes_modifiees,i)
        print(sprintf("On a complété petal_width par %f a partir de petal_length=%f",Y,X))
    }
    if(is.na(individu["sepal_width"])){
        espece = individu["species"]
        X = individu["petal_width"]
        [...]
        lignes_modifiees = c(lignes_modifiees,i)
        print(sprintf("On a complété sepal_width par %f a partir de l'espece %s et de petal_width=%f",Y,espece,X))
    }
}

print("Lignes modifiées:")
print(iris[lignes_modifiees,])

Exemple de certificat de réussite
Exemple de certificat de réussite