Cómo eliminar valores atípicos en R

Un valor atípico es una observación que se encuentra anormalmente alejada de otros valores en un conjunto de datos. Los valores atípicos pueden ser problemáticos porque pueden afectar los resultados de un análisis.

Este tutorial explica cómo identificar y eliminar valores atípicos en R.

Cómo identificar valores atípicos en R

Antes de poder eliminar los valores atípicos, primero debe decidir qué es lo que considera un valor atípico. Hay dos formas habituales de hacerlo:

1. Utilice el rango intercuartílico.

El rango intercuartil (IQR) es la diferencia entre el percentil 75 (Q3) y el percentil 25 (Q1) en un conjunto de datos. Mide la dispersión del 50% medio de los valores.

Puede definir una observación como un valor atípico si es 1,5 veces el rango intercuartílico mayor que el tercer cuartil (Q3) o 1,5 veces el rango intercuartílico menor que el primer cuartil (Q1).

Valores atípicos = Observaciones> Q3 + 1.5 * IQR o <Q1 – 1.5 * IQR

2. Utilice puntuaciones z.

Un puntaje z le dice cuántas desviaciones estándar tiene un valor dado de la media. Usamos la siguiente fórmula para calcular una puntuación z:

z = (X – μ) / σ

dónde:

  • X es un único valor de datos sin procesar
  • μ es la media de la población
  • σ es la desviación estándar de la población

Puede definir una observación como un valor atípico si tiene una puntuación z menor que -3 o mayor que 3.

Valores atípicos = observaciones con puntuaciones z> 3 o <-3

Cómo eliminar valores atípicos en R

Una vez que decida lo que considera un valor atípico, puede identificarlos y eliminarlos de un conjunto de datos. Para ilustrar cómo hacerlo, usaremos el siguiente marco de datos:

#Haga que este ejemplo sea reproducible 
set.seed (0)

# crear un marco de datos con tres columnas A ',' B ',' C ' 
df <- data.frame (A = rnorm (1000, mean = 10, sd = 3),
                 B = rnorm (1000, media = 20, sd = 3),
                 C = rnorm (1000, media = 30, sd = 3))

#ver las primeras seis filas del marco de datos
cabeza (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

Luego, podemos definir y eliminar valores atípicos utilizando el método de puntuación z o el método de rango intercuartílico:

Método de puntuación Z:

El siguiente código muestra cómo calcular la puntuación z de cada valor en cada columna en el marco de datos y luego eliminar las filas que tienen al menos una puntuación z con un valor absoluto mayor que 3:

# encontrar el valor absoluto de z-score para cada valor en cada columna 
z_scores <- as.data.frame (sapply (df, function (df) (abs (df-mean (df)) / sd (df))))

#ver las primeras seis filas del encabezado del marco de datos
 z_scores (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

# solo mantenga las filas en el marco de datos con todas las puntuaciones z inferiores al valor absoluto de 3 
no_outliers <- z_scores [! rowSums (z_scores> 3),]

#ver el recuento de filas y columnas del nuevo marco de datos
tenue (no_outliers)

[1] 994 3

El marco de datos original tenía 1000 filas y 3 columnas. El nuevo marco de datos tiene 994 filas y 3 columnas, lo que nos dice que se eliminaron 6 filas porque tenían al menos una puntuación z con un valor absoluto mayor que 3 en una de sus columnas.

Método de rango intercuartílico:

En algunos casos, es posible que solo estemos interesados ​​en identificar valores atípicos en una columna de un marco de datos. Por ejemplo, supongamos que solo queremos eliminar las filas que tienen un valor atípico en la columna ‘A’ de nuestro marco de datos.

El siguiente código muestra cómo eliminar filas del marco de datos que tienen un valor en la columna ‘A’ que es 1,5 veces el rango intercuartil mayor que el tercer cuartil (Q3) o 1,5 veces el rango intercuartil menor que el primer cuartil (Q1) .

#Busque Q1, Q3 y el rango intercuartílico para los valores en la columna A
Q1 <- cuantil (gl $ A, .25)
Q3 <- cuantil (gl $ A, .75)
IQR <- IQR (gl $ A)

# solo mantenga las filas en el marco de datos que tengan valores dentro de 1.5 * IQR de Q1 y Q3
no_outliers <- subconjunto (df, df $ A> (Q1 - 1.5 * IQR) & df $ A <(Q3 + 1.5 * IQR))

#ver el recuento de filas y columnas del nuevo marco de datos
 dim (no_outliers)

[1] 994 3

El marco de datos original tenía 1000 filas y 3 columnas. El nuevo marco de datos tiene 994 filas y 3 columnas, lo que nos dice que se eliminaron 6 filas porque tenían al menos un valor atípico en la columna A.

Cuándo eliminar valores atípicos

Si hay uno o más valores atípicos, primero debe verificar que no sean el resultado de un error de entrada de datos. A veces, una persona simplemente ingresa el valor de datos incorrecto al registrar datos.

Si el valor atípico resulta ser el resultado de un error de entrada de datos, puede decidir asignarle un nuevo valor, como la media o la mediana del conjunto de datos.

Si el valor es un valor atípico verdadero, puede optar por eliminarlo si tendrá un impacto significativo en su análisis general. Solo asegúrese de mencionar en su informe o análisis final que eliminó un valor atípico.

Recursos adicionales

En este tutorial usamos rnorm () para generar vectores de variables aleatorias distribuidas normalmente dada una longitud de vector n , una media poblacional μ y una desviación estándar poblacional σ . Puede leer más sobre esta función aquí .

También usamos sapply () para aplicar una función en cada columna en un marco de datos que calcula las puntuaciones z. Puede leer más sobre esa función aquí .

  • https://r-project.org
  • https://www.python.org/
  • https://www.stata.com/

Deja un comentario

Una tabla z es una tabla que le indica qué porcentaje de valores caen por debajo de un determinado puntaje…
statologos comunidad-2

Compartimos información EXCLUSIVA y GRATUITA solo para suscriptores (cursos privados, programas, consejos y mucho más)

You have Successfully Subscribed!