4  Análisis de variables individuales

Published

June 29, 2026

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):

Table 4.1: Primeros registros del fichero de ejemplo
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

La función expss::fre() calcula la distribución de frecuencias. Sin etiquetas de valor:

Code
expss::fre(expss::unvl(df$CIUDAD))
Table 4.2: Recuento de frecuencias (sin etiquetas)
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)
Table 4.3: Recuento de frecuencias (con etiquetas)
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
TipInline R en Quarto

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())
Figure 4.1: Diagrama de caja de la variable UNIDADES

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)
Table 4.4: Tabla de estadísticos descriptivos
# 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")
Figure 4.2: Histograma de la variable UNIDADES

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")
Figure 4.3: Diagrama de caja de UNIDADES por CIUDAD

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")
Figure 4.4: Histograma de consumo en autopista (mpg)

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())
Figure 4.5: Diagrama de caja — consumo en autopista

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())
Figure 4.6: Diagrama de caja del subconjunto de 20 observaciones

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.

TipDetección multivariante de atípicos

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:

Figure 4.7