Comment supprimer les valeurs aberrantes dans R



Une valeur aberrante est une observation anormalement éloignée des autres valeurs d’un ensemble de données. Les valeurs aberrantes peuvent poser problème car elles peuvent affecter les résultats d’une analyse.

Ce didacticiel explique comment identifier et supprimer les valeurs aberrantes dans R.

Comment identifier les valeurs aberrantes dans R

Avant de pouvoir supprimer les valeurs aberrantes, vous devez d’abord décider de ce que vous considérez comme une valeur aberrante. Il existe deux manières courantes de procéder :

1. Utilisez l’intervalle interquartile.

L’intervalle interquartile (IQR) est la différence entre le 75e centile (Q3) et le 25e centile (Q1) dans un ensemble de données. Il mesure la répartition des 50 % moyens des valeurs.

Vous pouvez définir une observation comme étant aberrante si elle est 1,5 fois l’intervalle interquartile supérieur au troisième quartile (Q3) ou 1,5 fois l’intervalle interquartile inférieur au premier quartile (Q1).

Valeurs aberrantes = Observations > Q3 + 1,5*IQR ou < Q1 – 1,5*IQR

2. Utilisez les scores z.

Un score z vous indique le nombre d’écarts types d’une valeur donnée par rapport à la moyenne. Nous utilisons la formule suivante pour calculer un z-score :

z = (X – μ) / σ

où:

  • X est une valeur de données brutes unique
  • μ est la moyenne de la population
  • σ est l’écart type de la population

Vous pouvez définir une observation comme étant aberrante si son score z est inférieur à -3 ou supérieur à 3.

Valeurs aberrantes = Observations avec des scores z > 3 ou < -3

Comment supprimer les valeurs aberrantes dans R

Une fois que vous avez décidé de ce que vous considérez comme une valeur aberrante, vous pouvez ensuite les identifier et les supprimer d’un ensemble de données. Pour illustrer comment procéder, nous utiliserons le bloc de données suivant :

#make this example reproducible 
set.seed(0)

#create data frame with three columns A', 'B', 'C' 
df <- data.frame(A=rnorm(1000, mean=10, sd=3),
                 B=rnorm(1000, mean=20, sd=3),
                 C=rnorm(1000, mean=30, sd=3))

#view first six rows of data frame
head(df)
         A        B        C
1 13.78886 19.13945 31.33304
2  9.02130 25.52332 30.03579
3 13.98940 19.52971 29.97216
4 13.81729 15.83059 29.09287
5 11.24392 15.58069 31.47707
6  5.38015 19.79144 28.19184

Nous pouvons ensuite définir et supprimer les valeurs aberrantes à l’aide de la méthode du z-score ou de la méthode de l’intervalle interquartile :

Méthode du score Z :

Le code suivant montre comment calculer le score z de chaque valeur dans chaque colonne du bloc de données, puis supprimer les lignes qui ont au moins un score z avec une valeur absolue supérieure à 3 :

#find absolute value of z-score for each value in each column
z_scores <- as.data.frame(sapply(df, function(df) (abs(df-mean(df))/sd(df))))

#view first six rows of z_scores data frame
head(z_scores)

          A          B          C
1 1.2813403 0.25350805 0.39419878
2 0.3110243 1.80496734 0.05890232
3 1.3483190 0.12766847 0.08112630
4 1.2908343 1.32044506 0.38824414
5 0.4313316 1.40102642 0.44450451
6 1.5271674 0.04327186 0.70295309

#only keep rows in dataframe with all z-scores less than absolute value of 3 
no_outliers <- z_scores[!rowSums(z_scores>3), ]

#view row and column count of new data frame
dim(no_outliers)

[1] 994    3

Le bloc de données d’origine comportait 1 000 lignes et 3 colonnes. Le nouveau bloc de données comporte 994 lignes et 3 colonnes, ce qui nous indique que 6 lignes ont été supprimées car elles avaient au moins un score z avec une valeur absolue supérieure à 3 dans l’une de leurs colonnes.

Méthode de l’intervalle interquartile :

Dans certains cas, nous pouvons uniquement souhaiter identifier les valeurs aberrantes dans une colonne d’un bloc de données. Par exemple, supposons que nous souhaitions uniquement supprimer les lignes comportant une valeur aberrante dans la colonne « A » de notre bloc de données.

Le code suivant montre comment supprimer les lignes du bloc de données dont la valeur dans la colonne « A » est 1,5 fois la plage interquartile supérieure au troisième quartile (Q3) ou 1,5 fois la plage interquartile inférieure au premier quartile (Q1). .

#find Q1, Q3, and interquartile range for values in column A
Q1 <- quantile(df$A, .25)
Q3 <- quantile(df$A, .75)
IQR <- IQR(df$A)

#only keep rows in dataframe that have values within 1.5*IQR of Q1 and Q3
no_outliers <- subset(df, df$A> (Q1 - 1.5*IQR) & df$A< (Q3 + 1.5*IQR))

#view row and column count of new data frame
dim(no_outliers) 

[1] 994   3

Le bloc de données d’origine comportait 1 000 lignes et 3 colonnes. Le nouveau bloc de données comporte 994 lignes et 3 colonnes, ce qui nous indique que 6 lignes ont été supprimées car elles contenaient au moins une valeur aberrante dans la colonne A.

Quand supprimer les valeurs aberrantes

Si une ou plusieurs valeurs aberrantes sont présentes, vous devez d’abord vérifier qu’elles ne résultent pas d’une erreur de saisie de données. Parfois, un individu saisit simplement une mauvaise valeur de données lors de l’enregistrement des données.

Si la valeur aberrante s’avère être le résultat d’une erreur de saisie de données, vous pouvez décider de lui attribuer une nouvelle valeur telle que la moyenne ou la médiane de l’ensemble de données.

Si la valeur est réellement aberrante, vous pouvez choisir de la supprimer si elle aura un impact significatif sur votre analyse globale. Assurez-vous simplement de mentionner dans votre rapport ou analyse final que vous avez supprimé une valeur aberrante.

Ressources additionnelles

Dans ce didacticiel, nous avons utilisé rnorm() pour générer des vecteurs de variables aléatoires normalement distribuées étant donné une longueur de vecteur n , une moyenne de population μ et un écart type de population σ . Vous pouvez en savoir plus sur cette fonction ici .

Nous avons également utilisé sapply() pour appliquer une fonction à chaque colonne d’un bloc de données qui calculait les scores z. Vous pouvez en savoir plus sur cette fonction ici .

Ajouter un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *