| CIUDAD | CIUDADESP | CIUDADAGR |
|---|---|---|
| A Coruña | 1 | 1 |
| Madrid | 2 | 2 |
| Valencia | 3 | 3 |
| Barcelona | 4 | 4 |
| Bilbao | 5 | 5 |
| Lleida | 6 | 6 |
| Jaén | 7 | 7 |
| Santander | 8 | 8 |
| A Coruña | 1 | 1 |
| Madrid | 2 | 2 |
| Barcelona | 4 | 4 |
| Bilbao | 5 | 5 |
| Jaén | 7 | 7 |
| Barcelona | 4 | 4 |
| 4 | 4 | |
| A Coruña | 1 | 1 |
| Madrid | 2 | 2 |
| Bilbao | 5 | 5 |
| A Coruña | 1 | 1 |
| 1 | 1 | |
| Madrid | 2 | 2 |
| Bilbao | 5 | 5 |
| Barcelona | 4 | 4 |
| A Coruña | 1 | 1 |
| 1 | 1 | |
| Madrid | 2 | 2 |
| A Coruña | 1 | 1 |
| 1 | 1 | |
| Barcelona | 4 | 4 |
| Bilbao | 5 | 5 |
| Jaén | 7 | 7 |
| 7 | 7 | |
| Barcelona | 4 | 4 |
| A Coruña | 1 | 1 |
| 1 | 1 | |
| Madrid | 2 | 2 |
| Bilbao | 5 | 5 |
| Barcelona | 4 | 4 |
| Jaén | 7 | 7 |
| 7 | 7 | |
| Bilbao | 5 | 5 |
| Barcelona | 4 | 4 |
| A Coruña | 1 | 1 |
| 1 | 1 | |
| Madrid | 2 | 2 |
| 2 | 2 | |
| Bilbao | 5 | 5 |
| Barcelona | 4 | |
| 4 | ||
| Jaén | 7 |
4 Análisis de variables individuales
El capítulo anterior estableció la distinción entre variables cualitativas (escala nominal y ordinal) y cuantitativas (escala de intervalo y razón). Esa distinción determina directamente qué estadísticos son válidos e interpretables en el análisis univariante, es decir, cuando se analiza cada variable de forma individual.
El analista necesita caracterizar la distribución de sus datos antes de aplicar cualquier técnica más avanzada. Esa caracterización incluye tres dimensiones: la tendencia central (¿alrededor de qué valor se concentran los datos?), la dispersión (¿cuánto varían los datos respecto a ese centro?) y la forma de la distribución (¿es simétrica?, ¿tiene colas largas?, ¿hay valores atípicos?).
4.1 Descriptivos básicos
4.1.1 Frecuencias
La distribución de frecuencias es el análisis univariante más básico y es válido para cualquier tipo de variable. Informa sobre los valores que ha tomado la variable, cuántas veces ha aparecido cada uno (frecuencia absoluta) y qué porcentaje representa sobre el total (frecuencia relativa).
En investigación de mercados, el análisis de frecuencias es el punto de partida habitual para variables nominales y ordinales: distribución por sexo, nivel de estudios, marca elegida, grado de satisfacción, etc.
Se cargan los datos de ejemplo, un fichero en formato SPSS con variable CIUDAD (ciudad de residencia del entrevistado, codificada del 1 al 8):
La función expss::fre() calcula la distribución de frecuencias. Sin etiquetas de valor:
Code
expss::fre(expss::unvl(df$CIUDAD))| expss::unvl(df$CIUDAD) | Count | Valid percent | Percent | Responses, % | Cumulative responses, % |
|---|---|---|---|---|---|
| 1 | 13 | 26 | 26 | 26 | 26 |
| 2 | 8 | 16 | 16 | 16 | 42 |
| 3 | 1 | 2 | 2 | 2 | 44 |
| 4 | 11 | 22 | 22 | 22 | 66 |
| 5 | 8 | 16 | 16 | 16 | 82 |
| 6 | 1 | 2 | 2 | 2 | 84 |
| 7 | 7 | 14 | 14 | 14 | 98 |
| 8 | 1 | 2 | 2 | 2 | 100 |
| #Total | 50 | 100 | 100 | 100 | |
| <NA> | 0 | 0 |
La salida muestra: valor, frecuencia absoluta, porcentaje sobre el total, porcentaje válido (excluye los NA) y porcentaje acumulado. La diferencia entre Percent y Valid percent aparece cuando existen valores perdidos: lo habitual es interpretar siempre el Valid percent.
Con las etiquetas de valor definidas en SPSS:
Code
expss::fre(df$CIUDAD)| df$CIUDAD | Count | Valid percent | Percent | Responses, % | Cumulative responses, % |
|---|---|---|---|---|---|
| A Coruña | 13 | 26 | 26 | 26 | 26 |
| Madrid | 8 | 16 | 16 | 16 | 42 |
| Valencia | 1 | 2 | 2 | 2 | 44 |
| Barcelona | 11 | 22 | 22 | 22 | 66 |
| Bilbao | 8 | 16 | 16 | 16 | 82 |
| Lleida | 1 | 2 | 2 | 2 | 84 |
| Jaén | 7 | 14 | 14 | 14 | 98 |
| Santander | 1 | 2 | 2 | 2 | 100 |
| #Total | 50 | 100 | 100 | 100 | |
| <NA> | 0 | 0 |
Las etiquetas de valor almacenadas en el fichero .sav se pueden consultar con:
Code
expss::val_lab(df$CIUDAD) A Coruña Madrid Valencia Barcelona Bilbao Lleida Jaén Santander
1 2 3 4 5 6 7 8
4.1.2 Estadísticos básicos puntuales
Para los estadísticos numéricos se carga un segundo fichero con una variable cuantitativa (UNIDADES):
Code
df <- expss::read_spss('https://drive.google.com/uc?export=download&id=1e4LdCD_pXppt7PQqFVrwZaZ5zwFpZ064')
head(df, n = 10) PUNTO UNIDADES
1 201 17
2 202 77
3 203 62
4 204 53
5 205 85
6 206 44
7 207 26
8 208 30
9 209 85
10 210 34
Los estadísticos más básicos se calculan con funciones de R base. Se guardan en objetos con nombres descriptivos para integrarlos en el texto del informe:
Code
total_sum <- paste('Suma:', sum(df$UNIDADES, na.rm = TRUE))
val_max <- paste('Máximo:', max(df$UNIDADES, na.rm = TRUE))
val_min <- paste('Mínimo:', min(df$UNIDADES, na.rm = TRUE))- total_sum: Suma: 5054
- val_max: Máximo: 87
- val_min: Mínimo: 17
La expresión ‘r nombre_objeto’ (apóstrofos en lugar de comilla simple) dentro del texto de un documento .qmd publica el valor del objeto directamente en el párrafo. Es una forma limpia de integrar resultados numéricos en el texto narrativo sin tener que copiarlos manualmente.
4.2 Tendencia central
Las medidas de tendencia central resumen la distribución en un único valor representativo. Las más relevantes en investigación de mercados son la media aritmética, la mediana y los cuantiles.
4.2.1 Media aritmética
La media aritmética es la suma de todos los valores dividida por el número de casos. Es la medida de tendencia central más informativa cuando la distribución es aproximadamente simétrica y no hay valores extremos que la distorsionen:
\[\overline{x} = \frac{\sum_{i=1}^{n} x_i}{n}\]
Dos propiedades fundamentales de la media: la suma de las desviaciones de cada caso respecto a la media es siempre cero, y la suma de los cuadrados de esas desviaciones es mínima respecto a cualquier otro valor (propiedad de mínimos cuadrados, que reaparecerá en la regresión lineal).
Code
mean(df$UNIDADES, na.rm = TRUE)[1] 50.54
4.2.2 Mediana y cuantiles
La mediana es el valor que divide la distribución en dos mitades iguales: el 50% de los casos está por debajo y el 50% por encima. Es equivalente al percentil 50, al segundo cuartil (Q2) o al quinto decil (D5).
La mediana es preferible a la media cuando la distribución es asimétrica o contiene valores atípicos, ya que no se ve afectada por los extremos. En variables de ingresos, precios o tiempos de espera, es habitual reportar ambas.
Los cuantiles generalizan el concepto de mediana:
- Cuartiles (Q1, Q2, Q3): dividen la distribución en cuatro partes iguales.
- Deciles (D1 a D9): dividen en diez partes iguales.
- Percentiles (P1 a P99): dividen en cien partes iguales.
Las fórmulas para su cálculo en datos agrupados son análogas a la de la mediana:
\[Q_1 = l + \frac{I}{f} \cdot \left(\frac{N}{4} - f_i\right) \qquad Q_3 = l + \frac{I}{f} \cdot \left(\frac{3N}{4} - f_i\right)\]
donde \(l\) es el límite inferior de la clase, \(I\) la amplitud del intervalo, \(f\) la frecuencia de la clase y \(f_i\) la frecuencia acumulada anterior.
En R, quantile() calcula cualquier cuantil especificando la probabilidad correspondiente:
Code
# Median and quantiles
val_median <- median(df$UNIDADES, na.rm = TRUE)
val_q1 <- quantile(df$UNIDADES, probs = 0.25, na.rm = TRUE)
val_q3 <- quantile(df$UNIDADES, probs = 0.75, na.rm = TRUE)
val_d1 <- quantile(df$UNIDADES, probs = 0.10, na.rm = TRUE)
val_d9 <- quantile(df$UNIDADES, probs = 0.90, na.rm = TRUE)
val_p45 <- quantile(df$UNIDADES, probs = 0.45, na.rm = TRUE)
cat("Mediana (Q2):", val_median, "\n")Mediana (Q2): 47.5
Code
cat("Q1:", val_q1, " Q3:", val_q3, "\n")Q1: 31 Q3: 69.25
Code
cat("D1:", val_d1, " D9:", val_d9, "\n")D1: 22 D9: 83.1
Code
cat("P45:", val_p45, "\n")P45: 40.55
4.2.3 Diagrama de caja
El diagrama de caja (boxplot) representa visualmente los cinco resúmenes principales de una distribución: mínimo, Q1, mediana, Q3 y máximo, junto con cualquier observación identificada como valor atípico potencial según el criterio del rango intercuartílico.
Code
ggplot2::ggplot(df, ggplot2::aes(y = UNIDADES)) +
ggplot2::geom_boxplot(fill = "#076fa2", color = "#333333",
outlier.colour = "#c40000", outlier.size = 2) +
ggplot2::theme_minimal() +
ggplot2::labs(y = "Unidades", x = NULL) +
ggplot2::theme(axis.text.x = ggplot2::element_blank(),
axis.ticks.x = ggplot2::element_blank())
La caja abarca desde Q1 hasta Q3 (el rango intercuartílico, IQR). Los bigotes se extienden hasta 1,5 · IQR por encima de Q3 y por debajo de Q1. Las observaciones fuera de ese intervalo se representan como puntos individuales y son candidatas a ser valores atípicos:
\[[Q_1 - 1{,}5 \cdot IQR \;;\; Q_3 + 1{,}5 \cdot IQR]\]
4.3 Tratamientos de variabilidad o dispersión
Las medidas de dispersión cuantifican cuánto varían los datos respecto a la tendencia central. Dos distribuciones pueden tener la misma media y ser muy diferentes en forma y variabilidad.
4.3.1 Desviación típica y varianza
La varianza es la media de los cuadrados de las desviaciones respecto a la media aritmética:
\[S^{2} = \frac{\sum_{i=1}^{n}(x_i - \overline{x})^{2}}{n-1}\]
La división por \(n-1\) (en lugar de \(n\)) produce el estimador insesgado de la varianza poblacional cuando se trabaja con una muestra (corrección de Bessel). SPSS aplica esta convención por defecto, al igual que R.
La desviación típica es la raíz cuadrada positiva de la varianza, y tiene la ventaja de expresarse en las mismas unidades que la variable original:
\[S = \sqrt{\frac{\sum_{i=1}^{n}(x_i - \overline{x})^{2}}{n-1}}\]
Una propiedad fundamental cuando la distribución es aproximadamente normal: el intervalo \([\overline{x} \pm 1S]\) contiene aproximadamente el 68% de los casos, \([\overline{x} \pm 2S]\) el 95% y \([\overline{x} \pm 3S]\) el 99,7%.
Code
cat("Varianza:", var(df$UNIDADES, na.rm = TRUE), "\n")Varianza: 503.6651
Code
cat("Desviación típica:", sd(df$UNIDADES, na.rm = TRUE), "\n")Desviación típica: 22.44248
4.3.2 Coeficiente de variación
El coeficiente de variación (CV) es un indicador adimensional de dispersión relativa: expresa la desviación típica como porcentaje de la media. Su utilidad principal es comparar la variabilidad de dos distribuciones que tienen medias o unidades diferentes.
\[CV = \frac{S}{\overline{x}} \times 100\]
Code
cv <- (sd(df$UNIDADES, na.rm = TRUE) / mean(df$UNIDADES, na.rm = TRUE)) * 100
cat("Coeficiente de variación:", round(cv, 2), "%\n")Coeficiente de variación: 44.41 %
4.3.3 Rango y rango intercuartílico
El rango es la diferencia entre el valor máximo y el mínimo. Es la medida de dispersión más simple, pero muy sensible a valores extremos:
\[R = x_{max} - x_{min}\]
El rango intercuartílico (IQR) es la diferencia entre Q3 y Q1. Al basarse en los cuartiles centrales, es robusto frente a valores atípicos y es la base del criterio de detección que usa el diagrama de caja:
\[IQR = Q_3 - Q_1\]
Code
cat("Rango:", diff(range(df$UNIDADES, na.rm = TRUE)), "\n")Rango: 70
Code
cat("IQR:", IQR(df$UNIDADES, na.rm = TRUE), "\n")IQR: 38.25
4.3.4 Error estándar e intervalo de confianza de la media
El error estándar de la media cuantifica la precisión con la que la media muestral estima la media poblacional. Se define como la desviación típica dividida por la raíz del tamaño muestral:
\[SE = \frac{S}{\sqrt{n}}\]
Cuanto mayor es la muestra, menor es el error estándar y más precisa es la estimación. Esta relación es la base matemática de la teorema central del límite.
A partir del error estándar se construye el intervalo de confianza de la media. Para muestras grandes (\(n > 30\)) se usa el valor crítico de la normal (\(z\)); para muestras pequeñas (\(n \leq 30\)), el valor crítico de la distribución \(t\) de Student:
\[IC_{95\%} = \overline{x} \pm t_{\alpha/2, \, n-1} \cdot \frac{S}{\sqrt{n}}\]
Code
# 95% confidence interval for the mean
stats::t.test(df$UNIDADES)$conf.int[1] 46.08692 54.99308
attr(,"conf.level")
[1] 0.95
4.4 Medidas de caracterización de la distribución
Estas medidas indican si la distribución se ajusta a la forma de la curva normal, lo que es un requisito previo para muchas pruebas de inferencia estadística.
4.4.1 Asimetría
La asimetría (skewness) mide el grado de simetría de la distribución respecto a la media. El coeficiente de Fisher (\(\gamma_1\)) es el más habitual:
\[\gamma_1 = \frac{\mu_3}{\sigma^3}\]
donde \(\mu_3\) es el tercer momento central y \(\sigma\) la desviación típica.
- \(\gamma_1 = 0\): distribución simétrica.
- \(\gamma_1 > 0\): asimetría positiva (cola larga a la derecha; la media supera a la mediana).
- \(\gamma_1 < 0\): asimetría negativa (cola larga a la izquierda; la media es inferior a la mediana).
En investigación de mercados, variables como el gasto por ticket, el número de visitas o los ingresos suelen presentar asimetría positiva.
Code
# Skewness (Fisher's g1, same algorithm as SPSS)
moments::skewness(df$UNIDADES, na.rm = TRUE)[1] 0.1929939
4.4.2 Curtosis o apuntamiento
La curtosis (kurtosis) mide la concentración de valores en torno a la media comparada con la distribución normal. El coeficiente más habitual es \(g_2\), que usa la distribución normal como referencia (valor 0):
\[g_2 = \frac{\mu_4}{\sigma^4} - 3\]
- \(g_2 = 0\): distribución mesocúrtica (igual de apuntada que la normal).
- \(g_2 > 0\): distribución leptocúrtica (más apuntada, colas más pesadas que la normal).
- \(g_2 < 0\): distribución platicúrtica (más aplanada, colas más ligeras que la normal).
Code
# Excess kurtosis (g2, normal distribution = 0, same as SPSS)
moments::kurtosis(df$UNIDADES, na.rm = TRUE) - 3[1] -1.370977
4.5 Alternativa conjunta: tabla de descriptivos completa
La forma más eficiente de obtener todos los estadísticos anteriores de una vez es con rstatix::get_summary_stats():
Code
rstatix::get_summary_stats(df, UNIDADES)# A tibble: 1 × 13
variable n min max median q1 q3 iqr mad mean sd se
<fct> <dbl> <dbl> <dbl> <dbl> <labell> <lab> <dbl> <dbl> <dbl> <dbl> <dbl>
1 UNIDADES 100 17 87 47.5 31 69.25 38.2 30.4 50.5 22.4 2.24
# ℹ 1 more variable: ci <dbl>
La tabla incluye: n, min, max, median, mean, q1, q3, iqr, mad (desviación absoluta mediana), sd, se (error estándar) y ci (intervalo de confianza al 95%).
4.6 Visualización de la distribución
Antes de calcular estadísticos de forma o aplicar pruebas de normalidad, conviene visualizar la distribución. Las dos representaciones más informativas son el histograma y el diagrama de caja.
4.6.1 Histograma
El histograma divide el rango de valores en intervalos y muestra cuántos casos caen en cada uno. Es la forma más directa de apreciar la forma, la simetría y la presencia de valores extremos:
Code
ggplot2::ggplot(df, ggplot2::aes(x = UNIDADES)) +
ggplot2::geom_histogram(bins = 15, fill = "#076fa2",
color = "white", alpha = 0.85) +
ggplot2::theme_minimal() +
ggplot2::labs(x = "Unidades", y = "Frecuencia")
4.6.2 Diagrama de caja por grupos
Cuando se quiere comparar la distribución de una variable cuantitativa entre grupos (por ejemplo, unidades vendidas por ciudad), el diagrama de caja agrupado es la representación más compacta e informativa:
Code
df$CIUDAD <- sample(1:5, 100, replace=T)
ggplot2::ggplot(df, ggplot2::aes(x = factor(CIUDAD), y = UNIDADES)) +
ggplot2::geom_boxplot(fill = "#076fa2", color = "#333333",
outlier.colour = "#c40000", outlier.size = 2) +
ggplot2::theme_minimal() +
ggplot2::labs(x = "Ciudad", y = "Unidades")
4.7 Tareas del investigador: detección y análisis de valores atípicos
Un valor atípico (outlier) es una observación que se aleja significativamente del comportamiento típico de la distribución (Hawkins 1980; Aldás Manzano and Uriel Jiménez 2017). Puede deberse a tres causas muy diferentes:
- Error de registro o codificación: un peso de 786 kg cuando se midieron adultos es casi con certeza un error (posiblemente 78,6 kg). En este caso, debe corregirse o eliminarse.
- Variabilidad real del fenómeno: en datos de ventas de pymes, algunas empresas pueden facturar diez veces más que la media. Ese valor es atípico pero real y relevante.
- Caso genuinamente excepcional: un cliente que compra 500 unidades cuando la media es 20 puede ser un distribuidor o un error de negocio; el contexto determina si se mantiene o se trata.
La decisión de mantener, corregir o eliminar un valor atípico depende del contexto, de si el análisis posterior es robusto a los extremos (las pruebas no paramétricas lo son; la regresión lineal no), y siempre debe documentarse. Una buena práctica es realizar el análisis con y sin los valores atípicos y reportar ambos resultados si difieren sustancialmente.
4.7.1 Análisis básico: mínimo, máximo y rango
El primer nivel de detección es simplemente conocer los límites de la distribución y contrastarlos con el rango esperado de la variable. Se usa el fichero de ejemplo mpg de ggplot2, concretamente la variable hwy (consumo en autopista, en millas por galón):
Code
summary(mpg$hwy) Min. 1st Qu. Median Mean 3rd Qu. Max.
12.00 18.00 24.00 23.44 27.00 44.00
El valor máximo (44) y el mínimo (12) no son en sí mismos atípicos sin contexto, pero son el punto de partida.
4.7.2 Histograma
El histograma permite detectar visualmente observaciones que quedan muy alejadas de la masa central de datos:
Code
ggplot2::ggplot(mpg, ggplot2::aes(x = hwy)) +
ggplot2::geom_histogram(bins = 20, fill = "#076fa2",
color = "white", alpha = 0.85) +
ggplot2::theme_minimal() +
ggplot2::labs(x = "Consumo en autopista (mpg)", y = "Frecuencia")
Se aprecian dos observaciones en el extremo superior que podrían ser candidatas a valores atípicos.
4.7.3 Diagrama de caja y criterio IQR
El diagrama de caja aplica un criterio formal: cualquier observación que quede fuera del intervalo \([Q_1 - 1{,}5 \cdot IQR \;;\; Q_3 + 1{,}5 \cdot IQR]\) se representa como punto individual y es un candidato a valor atípico:
Code
ggplot2::ggplot(mpg, ggplot2::aes(y = hwy)) +
ggplot2::geom_boxplot(fill = "#076fa2", color = "#333333",
outlier.colour = "#c40000",
outlier.size = 3,
outlier.shape = 16) +
ggplot2::theme_minimal() +
ggplot2::labs(y = "Consumo en autopista (mpg)", x = NULL) +
ggplot2::theme(axis.text.x = ggplot2::element_blank(),
axis.ticks.x = ggplot2::element_blank())
Para identificar qué observaciones son los puntos marcados como atípicos:
Code
# Values flagged as outliers by the IQR criterion
boxplot.stats(mpg$hwy)$out[1] 44 44 41
Code
# Row indices of those observations in the dataframe
which(mpg$hwy %in% boxplot.stats(mpg$hwy)$out)[1] 213 222 223
4.7.4 Método de percentiles
Otro criterio habitual es considerar como candidatos a atípicos los valores que quedan fuera del intervalo formado por los percentiles 2,5 y 97,5 (o alternativamente 1 y 99, o 5 y 95 según la exigencia deseada):
Code
lower_bound <- quantile(mpg$hwy, 0.025)
upper_bound <- quantile(mpg$hwy, 0.975)
cat("Límite inferior (P2.5):", lower_bound, "\n")Límite inferior (P2.5): 14
Code
cat("Límite superior (P97.5):", upper_bound, "\n")Límite superior (P97.5): 35.175
Code
# Observations outside that interval
outlier_idx <- which(mpg$hwy < lower_bound | mpg$hwy > upper_bound)
outlier_idx [1] 55 60 66 70 106 107 127 197 213 222 223
Code
mpg[outlier_idx, "hwy"]# A tibble: 11 × 1
hwy
<int>
1 12
2 12
3 12
4 12
5 36
6 36
7 12
8 37
9 44
10 44
11 41
4.7.5 Filtro de Hampel
El filtro de Hampel es un método robusto que utiliza la mediana y la desviación absoluta mediana (MAD) en lugar de la media y la desviación típica, siendo por tanto insensible a los propios valores atípicos. El intervalo de aceptación es:
\[[\text{mediana} - 3 \cdot MAD \;;\; \text{mediana} + 3 \cdot MAD]\]
Code
hampel_lower <- median(mpg$hwy) - 3 * mad(mpg$hwy)
hampel_upper <- median(mpg$hwy) + 3 * mad(mpg$hwy)
cat("Límite inferior (Hampel):", round(hampel_lower, 2), "\n")Límite inferior (Hampel): 1.76
Code
cat("Límite superior (Hampel):", round(hampel_upper, 2), "\n")Límite superior (Hampel): 46.24
Code
outlier_hampel <- which(mpg$hwy < hampel_lower | mpg$hwy > hampel_upper)
cat("Número de atípicos detectados:", length(outlier_hampel), "\n")Número de atípicos detectados: 0
Según el filtro de Hampel, ninguna observación de hwy supera el umbral. El filtro de Hampel es más conservador que el criterio IQR del boxplot.
4.8 Pruebas estadísticas para valores atípicos
Los métodos gráficos y basados en percentiles son exploratorios. Para una decisión más formal existen pruebas estadísticas que contrastan si una observación es significativamente atípica. Las tres más habituales asumen que los datos (sin el atípico) siguen una distribución aproximadamente normal.
4.8.1 Prueba de Grubbs
Detecta si el valor más alto o el más bajo de la distribución es un valor atípico. Contrasta una observación a la vez. No debe aplicarse con muestras de seis o menos observaciones.
- \(H_0\): el valor extremo no es un valor atípico.
- \(H_1\): el valor extremo es un valor atípico.
Code
# Test for the maximum value
outliers::grubbs.test(mpg$hwy)
Grubbs test for one outlier
data: mpg$hwy
G = 3.45274, U = 0.94862, p-value = 0.05555
alternative hypothesis: highest value 44 is an outlier
Code
# Test for the minimum value
outliers::grubbs.test(mpg$hwy, opposite = TRUE)
Grubbs test for one outlier
data: mpg$hwy
G = 1.92122, U = 0.98409, p-value = 1
alternative hypothesis: lowest value 12 is an outlier
El valor \(p\) superior a 0,05 en ambos casos indica que no se rechaza \(H_0\): ni el máximo ni el mínimo son estadísticamente atípicos al nivel de significación del 5%.
4.8.2 Prueba de Dixon
Similar a la de Grubbs, pero más apropiada para muestras pequeñas (\(n \leq 25\)). Se aplica sobre un subconjunto de las primeras 20 observaciones para respetar ese requisito:
Code
subdat <- mpg[1:20, ]
# Test for the minimum value
outliers::dixon.test(subdat$hwy)
Dixon test for outliers
data: subdat$hwy
Q = 0.57143, p-value = 0.006508
alternative hypothesis: lowest value 15 is an outlier
Code
# Test for the maximum value
outliers::dixon.test(subdat$hwy, opposite = TRUE)
Dixon test for outliers
data: subdat$hwy
Q = 0.25, p-value = 0.8582
alternative hypothesis: highest value 31 is an outlier
Code
ggplot2::ggplot(subdat, ggplot2::aes(y = hwy)) +
ggplot2::geom_boxplot(fill = "#076fa2", color = "#333333",
outlier.colour = "#c40000",
outlier.size = 3) +
ggplot2::theme_minimal() +
ggplot2::labs(y = "Consumo en autopista (mpg)", x = NULL) +
ggplot2::theme(axis.text.x = ggplot2::element_blank(),
axis.ticks.x = ggplot2::element_blank())
En este subconjunto, el valor más bajo (15) sí resulta estadísticamente atípico (\(p = 0{,}007\)); el más alto (31) no lo es (\(p = 0{,}858\)).
Para comprobar si el segundo candidato (valor 20, visible en el diagrama) también lo es, se elimina el valor extremo detectado y se repite la prueba:
Code
# Remove the lowest value and retest
subdat2 <- subdat[-which.min(subdat$hwy), ]
outliers::dixon.test(subdat2$hwy)
Dixon test for outliers
data: subdat2$hwy
Q = 0.44444, p-value = 0.1297
alternative hypothesis: lowest value 20 is an outlier
El valor 20 no es estadísticamente atípico (\(p = 0{,}13\)), aunque el criterio IQR del boxplot lo marcara como candidato. Esto ilustra que el boxplot es un criterio visual y explorador, menos restrictivo que las pruebas formales.
4.8.3 Prueba de Rosner
La prueba de Rosner tiene tres ventajas sobre las anteriores: detecta varios atípicos simultáneamente, evita el problema de enmascaramiento (un atípico que oculta a otro cercano) y es más apropiada para muestras grandes (\(n \geq 20\)). Se especifica el número máximo de atípicos sospechosos (\(k\)):
Code
EnvStats::rosnerTest(mpg$hwy, k = 3)$distribution
[1] "Normal"
$statistic
R.1 R.2 R.3
3.452739 3.552586 3.131909
$sample.size
[1] 234
$parameters
k
3
$alpha
[1] 0.05
$crit.value
lambda.1 lambda.2 lambda.3
3.652091 3.650836 3.649575
$n.outliers
[1] 0
$alternative
[1] "Up to 3 observations are not\n from the same Distribution."
$method
[1] "Rosner's Test for Outliers"
$data
[1] 29 29 31 30 26 26 27 26 25 28 27 25 25 25 25 24 25 23 20 15 20 17 17 26 23
[26] 26 25 24 19 14 15 17 27 30 26 29 26 24 24 22 22 24 24 17 22 21 23 23 19 18
[51] 17 17 19 19 12 17 15 17 17 12 17 16 18 15 16 12 17 17 16 12 15 16 17 15 17
[76] 17 18 17 19 17 19 19 17 17 17 16 16 17 15 17 26 25 26 24 21 22 23 22 20 33
[101] 32 32 29 32 34 36 36 29 26 27 30 31 26 26 28 26 29 28 27 24 24 24 22 19 20
[126] 17 12 19 18 14 15 18 18 15 17 16 18 17 19 19 17 29 27 31 32 27 26 26 25 25
[151] 17 17 20 18 26 26 27 28 25 25 24 27 25 26 23 26 26 26 26 25 27 25 27 20 20
[176] 19 17 20 17 29 27 31 31 26 26 28 27 29 31 31 26 26 27 30 33 35 37 35 15 18
[201] 20 20 22 17 19 18 20 29 26 29 29 24 44 29 26 29 29 29 29 23 24 44 41 29 26
[226] 28 29 29 29 28 29 26 26 26
$data.name
[1] "mpg$hwy"
$bad.obs
[1] 0
$all.stats
i Mean.i SD.i Value Obs.Num R.i+1 lambda.i+1 Outlier
1 0 23.44017 5.954643 44 213 3.452739 3.652091 FALSE
2 1 23.35193 5.812124 44 222 3.552586 3.650836 FALSE
3 2 23.26293 5.663340 41 223 3.131909 3.649575 FALSE
attr(,"class")
[1] "gofOutlier"
Los resultados muestran, en la columna Outlier, qué observaciones resultan estadísticamente atípicas. Solo la observación con el valor más extremo supera el umbral.
Los métodos presentados en este capítulo son univariantes: analizan una variable a la vez. Existe también la detección multivariante de atípicos, que identifica observaciones que son anómalas en la combinación de varias variables simultáneamente (aunque no lo sean en ninguna individualmente). Se abordará en los capítulos de análisis multivariante, donde es especialmente relevante antes de aplicar técnicas como el análisis clúster o la regresión múltiple.
4.9 Tabla resumen de pruebas para variables categóricas
Para completar el mapa de técnicas univariantes y bivariantes sobre variables cualitativas, el siguiente diagrama resume los principales test según el número y tipo de variables implicadas: