Análisis Exploratorio de Datos e Intervalos de Confianza

Author

Carlos Lopez Perez

1. Carga y exploración inicial

En este documento trabajaremos con el conjunto de datos iris, incluido en R. Primero realizaremos un análisis exploratorio de datos (EDA) sencillo y posteriormente construiremos, manualmente, cuatro intervalos de confianza:

  • intervalo para una media;
  • intervalo para una proporción;
  • intervalo para la diferencia de dos medias;
  • intervalo para la diferencia de dos proporciones.

En los cuatro casos se calcularán los intervalos a partir de sus fórmulas estadísticas, sin utilizar t.test() ni prop.test().

# Cargar paquetes
library(ggplot2)

# Cargar el dataset
data(iris)

# Revisar la estructura de los datos
str(iris)
'data.frame':   150 obs. of  5 variables:
 $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
 $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
 $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

Microdatos

Los microdatos permiten observar directamente algunas de las unidades de análisis que componen el conjunto de datos.

# Primeras 10 observaciones
head(iris, 10)
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1           5.1         3.5          1.4         0.2  setosa
2           4.9         3.0          1.4         0.2  setosa
3           4.7         3.2          1.3         0.2  setosa
4           4.6         3.1          1.5         0.2  setosa
5           5.0         3.6          1.4         0.2  setosa
6           5.4         3.9          1.7         0.4  setosa
7           4.6         3.4          1.4         0.3  setosa
8           5.0         3.4          1.5         0.2  setosa
9           4.4         2.9          1.4         0.2  setosa
10          4.9         3.1          1.5         0.1  setosa

También podemos consultar las últimas observaciones:

# Últimas 6 observaciones
tail(iris)
    Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
145          6.7         3.3          5.7         2.5 virginica
146          6.7         3.0          5.2         2.3 virginica
147          6.3         2.5          5.0         1.9 virginica
148          6.5         3.0          5.2         2.0 virginica
149          6.2         3.4          5.4         2.3 virginica
150          5.9         3.0          5.1         1.8 virginica

Resumen descriptivo

# Resumen de las variables
summary(iris)
  Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
 Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
 1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
 Median :5.800   Median :3.000   Median :4.350   Median :1.300  
 Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
 3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
 Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
       Species  
 setosa    :50  
 versicolor:50  
 virginica :50  
                
                
                

2. Análisis Exploratorio de Datos (EDA)

Histogramas

Histograma de la longitud del sépalo

ggplot(iris, aes(x = Sepal.Length)) +
  geom_histogram(
    bins = 15,
    fill = "#4C78A8",
    color = "white"
  ) +
  labs(
    title = "Distribución de la longitud del sépalo",
    x = "Longitud del sépalo",
    y = "Frecuencia"
  ) +
  theme_minimal()

Histograma del ancho del pétalo

ggplot(iris, aes(x = Petal.Width)) +
  geom_histogram(
    bins = 12,
    fill = "#F58518",
    color = "white"
  ) +
  labs(
    title = "Distribución del ancho del pétalo",
    x = "Ancho del pétalo",
    y = "Frecuencia"
  ) +
  theme_minimal()

Diagramas de caja

Boxplot de la longitud del sépalo

ggplot(iris, aes(y = Sepal.Length)) +
  geom_boxplot(
    fill = "#54A24B",
    color = "#2F4F2F",
    width = 0.35
  ) +
  labs(
    title = "Boxplot de la longitud del sépalo",
    y = "Longitud del sépalo",
    x = NULL
  ) +
  theme_minimal()

Boxplot de la longitud del pétalo por especie

ggplot(iris, aes(x = Species, y = Petal.Length, fill = Species)) +
  geom_boxplot() +
  labs(
    title = "Longitud del pétalo según especie",
    x = "Especie",
    y = "Longitud del pétalo"
  ) +
  theme_minimal() +
  theme(legend.position = "none")

Gráfico de barras: tipo de flor

ggplot(iris, aes(x = Species, fill = Species)) +
  geom_bar() +
  labs(
    title = "Número de flores por especie",
    x = "Especie",
    y = "Frecuencia"
  ) +
  theme_minimal() +
  theme(legend.position = "none")

3. Intervalos de confianza

En los siguientes ejemplos utilizaremos un nivel de confianza del 95 %.

La idea será construir cada intervalo directamente a partir de sus componentes:

  • media muestral: mean();
  • desviación estándar muestral: sd();
  • tamaño de muestra: length();
  • cuantiles de la distribución normal: qnorm();
  • error estándar;
  • margen de error.

Nota: en los ejemplos de medias se considera que la varianza poblacional es desconocida, por lo que se utiliza la desviación estándar muestral s. Además, aunque el dataset iris no representa una población normal en todas sus variables, los tamaños muestrales utilizados son suficientemente grandes para utilizar la aproximación normal basada en el Teorema Central del Límite.

3.1. Intervalo de confianza para una media

Queremos estimar la longitud media del sépalo.

La fórmula utilizada será:

\[ IC_{95\%}=\bar{x}\pm z_{\alpha/2}\frac{s}{\sqrt{n}} \]

donde:

  • \(\bar{x}\) es la media muestral;
  • \(s\) es la desviación estándar muestral;
  • \(n\) es el tamaño de muestra;
  • \(z_{\alpha/2}\) es el valor crítico de la distribución normal.

Paso 1: calcular los estadísticos muestrales

# Variable de interés
x <- iris$Sepal.Length

# Estadísticos muestrales
media <- mean(x)
s <- sd(x)
n <- length(x)

media
[1] 5.843333
s
[1] 0.8280661
n
[1] 150

Paso 2: calcular el valor crítico

Para un intervalo de confianza del 95 %:

\[ \alpha=0.05 \]

y por tanto:

\[ z_{\alpha/2}=z_{0.975} \]

# Nivel de confianza
confianza <- 0.95

# Nivel de significancia
alpha <- 1 - confianza

# Valor crítico de la distribución normal
z <- qnorm(1 - alpha/2)

z
[1] 1.959964

Paso 3: calcular el error estándar y el margen de error

# Error estándar de la media
error_estandar <- s / sqrt(n)

# Margen de error
margen_error <- z * error_estandar

error_estandar
[1] 0.06761132
margen_error
[1] 0.1325157

Paso 4: construir el intervalo

# Límites del intervalo de confianza
limite_inferior <- media - margen_error
limite_superior <- media + margen_error

c(limite_inferior, limite_superior)
[1] 5.710818 5.975849

Interpretación

Con un 95 % de confianza, estimamos que la media poblacional de la longitud del sépalo se encuentra entre 5.71 y 5.97 centímetros.


3.2. Intervalo de confianza para una proporción

Ahora queremos estimar la proporción de flores que pertenecen a la especie setosa.

Primero calcularemos la proporción muestral utilizando prop.table().

La fórmula del intervalo será:

\[ IC_{95\%} = \hat{p} \pm z_{\alpha/2} \sqrt{\frac{\hat{p}(1-\hat{p})}{n}} \]

Paso 1: obtener la proporción mediante prop.table()

# Frecuencias absolutas
frecuencias <- table(iris$Species)

frecuencias

    setosa versicolor  virginica 
        50         50         50 
# Proporciones de cada especie
proporciones <- prop.table(frecuencias)

proporciones

    setosa versicolor  virginica 
 0.3333333  0.3333333  0.3333333 
# Proporción muestral de Setosa
p <- proporciones["setosa"]

# Tamaño de muestra
n <- length(iris$Species)

p
   setosa 
0.3333333 
n
[1] 150

Paso 2: calcular el valor crítico

# Nivel de confianza
confianza <- 0.95

# Nivel de significancia
alpha <- 1 - confianza

# Valor crítico
z <- qnorm(1 - alpha/2)

z
[1] 1.959964

Paso 3: calcular el error estándar y el margen de error

# Error estándar de una proporción
error_estandar <- sqrt(p * (1 - p) / n)

# Margen de error
margen_error <- z * error_estandar

error_estandar
    setosa 
0.03849002 
margen_error
    setosa 
0.07543905 

Paso 4: construir el intervalo

# Límites del intervalo
limite_inferior <- p - margen_error
limite_superior <- p + margen_error

c(limite_inferior, limite_superior)
   setosa    setosa 
0.2578943 0.4087724 

Interpretación

Con un 95 % de confianza, estimamos que la proporción poblacional de flores que pertenecen a la especie setosa se encuentra entre 0.25 y 0.41 o entre el 25% y 41%


3.3. Intervalo de confianza para la diferencia de dos medias

Ahora compararemos la longitud media del sépalo entre setosa y versicolor.

La diferencia que queremos estimar es:

\[ \mu_{\text{setosa}}-\mu_{\text{versicolor}} \]

Para obtener los datos utilizaremos indexación básica de R, sin utilizar filtros de dplyr.

La fórmula será:

\[ (\bar{x}_1-\bar{x}_2) \pm z_{\alpha/2} \sqrt{ \frac{s_1^2}{n_1} + \frac{s_2^2}{n_2} } \]

Esta fórmula utiliza las desviaciones estándar muestrales porque las varianzas poblacionales son desconocidas.

Paso 1: separar las dos muestras

# Datos de Setosa
setosa_sepal <- iris[iris$Species == "setosa", ]$Sepal.Length

# Datos de Versicolor
versicolor_sepal <- iris[iris$Species == "versicolor", ]$Sepal.Length

Paso 2: calcular los estadísticos muestrales

# Setosa
media_1 <- mean(setosa_sepal)
s_1 <- sd(setosa_sepal)
n_1 <- length(setosa_sepal)

# Versicolor
media_2 <- mean(versicolor_sepal)
s_2 <- sd(versicolor_sepal)
n_2 <- length(versicolor_sepal)

media_1
[1] 5.006
s_1
[1] 0.3524897
n_1
[1] 50
media_2
[1] 5.936
s_2
[1] 0.5161711
n_2
[1] 50

Paso 3: calcular la diferencia de medias

# Diferencia de medias
diferencia_medias <- media_1 - media_2

diferencia_medias
[1] -0.93

Paso 4: calcular el error estándar

# Error estándar de la diferencia de medias
error_estandar <- sqrt(
  (s_1^2 / n_1) +
  (s_2^2 / n_2)
)

error_estandar
[1] 0.08839475

Paso 5: calcular el margen de error

# Valor crítico para un 95 % de confianza
alpha <- 0.05
z <- qnorm(1 - alpha/2)

# Margen de error
margen_error <- z * error_estandar

z
[1] 1.959964
margen_error
[1] 0.1732505

Paso 6: construir el intervalo

# Límites del intervalo
limite_inferior <- diferencia_medias - margen_error
limite_superior <- diferencia_medias + margen_error

c(limite_inferior, limite_superior)
[1] -1.1032505 -0.7567495

Interpretación

El intervalo estima la diferencia entre las medias poblacionales de Sepal.Length para setosa y versicolor, en ese orden.

El valor 0 es el punto de referencia: si el intervalo contiene 0, significa que no ha diferencia estadística entre las medias comparadas, para este caso, con un 95 % de confianza podemos estimar que la diferencia de la longitud promedio del sépalo entre las especies setosa y versicolor se encuentra entre -1.10 centímetros y -0.76 centímetros. Dado que ambos límites son negativos (no incluyen el cero) podemos afirmar que la especie versicolor tiene una longitud de sépalo mas grande que la setosa.


3.4. Intervalo de confianza para la diferencia de dos proporciones

Finalmente, compararemos la proporción de flores con Petal.Width mayor que 1 cm entre setosa y versicolor.

La diferencia de interés será:

\[ p_{\text{setosa}}-p_{\text{versicolor}} \]

La fórmula utilizada será:

\[ (\hat{p}_1-\hat{p}_2) \pm z_{\alpha/2} \sqrt{ \frac{\hat{p}_1(1-\hat{p}_1)}{n_1} + \frac{\hat{p}_2(1-\hat{p}_2)}{n_2} } \]

Paso 1: crear la variable indicadora

# TRUE si Petal.Width es mayor que 1 cm
iris$Petal_Width_Mayor_1 <- iris$Petal.Width > 1

Paso 2: construir la tabla de frecuencias

# Tabla de especie y condición
tabla_prop <- table(
  iris$Species,
  iris$Petal_Width_Mayor_1
)

tabla_prop
            
             FALSE TRUE
  setosa        50    0
  versicolor     7   43
  virginica      0   50

Paso 3: obtener las proporciones mediante prop.table()

# Proporciones dentro de cada especie
proporciones <- prop.table(
  tabla_prop,
  margin = 1
)

proporciones
            
             FALSE TRUE
  setosa      1.00 0.00
  versicolor  0.14 0.86
  virginica   0.00 1.00

Para cada especie necesitamos la proporción correspondiente a TRUE.

# Proporción de Petal.Width > 1 en Setosa
p_1 <- proporciones["setosa", "TRUE"]

# Proporción de Petal.Width > 1 en Versicolor
p_2 <- proporciones["versicolor", "TRUE"]

p_1
[1] 0
p_2
[1] 0.86

Paso 4: calcular los tamaños de muestra

# Tamaños de muestra
n_1 <- length(iris[iris$Species == "setosa", ]$Petal.Width)
n_2 <- length(iris[iris$Species == "versicolor", ]$Petal.Width)

n_1
[1] 50
n_2
[1] 50

Paso 5: calcular la diferencia de proporciones

# Diferencia de proporciones
diferencia_proporciones <- p_1 - p_2

diferencia_proporciones
[1] -0.86

Paso 6: calcular el error estándar

# Error estándar de la diferencia de proporciones
error_estandar <- sqrt(
  (p_1 * (1 - p_1) / n_1) +
  (p_2 * (1 - p_2) / n_2)
)

error_estandar
[1] 0.04907138

Paso 7: calcular el margen de error

# Valor crítico
alpha <- 0.05
z <- qnorm(1 - alpha/2)

# Margen de error
margen_error <- z * error_estandar

z
[1] 1.959964
margen_error
[1] 0.09617813

Paso 8: construir el intervalo

# Límites del intervalo
limite_inferior <- diferencia_proporciones - margen_error
limite_superior <- diferencia_proporciones + margen_error

c(limite_inferior, limite_superior)
[1] -0.9561781 -0.7638219

Interpretación

El intervalo estima la diferencia entre la proporción poblacional de flores con Petal.Width > 1 en setosa y la proporción correspondiente en versicolor.

El valor 0 es el punto de referencia para interpretar el intervalo. Si el intervalo contiene 0, la diferencia de proporciones poblacionales es compatible con 0 al nivel de confianza utilizado; por tanto, no se evidencia una diferencia estadísticamente significativa entre las proporciones comparadas al 5 % de significancia.

Para este caso, con un 95 % de confianza, estimamos que la diferencia entre las proporciones poblacionales de flores con pétalos de más de 1 cm de ancho de las especies setosa y versicolor se encuentra entre -0.95 y -0.76.

Dado que el intervalo no contiene el valor 0 y sus dos límites son negativos, estimamos que la proporción de flores con pétalos de más de 1 cm de ancho es mayor en la especie versicolor que en la especie setosa.

4. Resumen de los cuatro intervalos

Intervalo Parámetro de interés Componentes principales
Una media \(\mu\) de Sepal.Length mean(), sd(), length(), qnorm()
Una proporción \(p\) de flores setosa prop.table(), qnorm()
Diferencia de medias \(\mu_{setosa}-\mu_{versicolor}\) mean(), sd(), length(), qnorm()
Diferencia de proporciones \(p_{setosa}-p_{versicolor}\) prop.table(), qnorm()

5. Idea clave

Los cuatro intervalos siguen una estructura similar:

  1. Identificar el parámetro poblacional.
  2. Calcular el estimador muestral.
  3. Calcular el error estándar.
  4. Obtener el valor crítico mediante qnorm().
  5. Calcular el margen de error.
  6. Construir el intervalo.
  7. Interpretar el resultado en el contexto del problema.

En los intervalos para medias se utiliza la desviación estándar muestral sd(), ya que la varianza poblacional es desconocida.

Para las proporciones se utiliza prop.table() para obtener las proporciones observadas y posteriormente se aplica directamente la fórmula del error estándar.

Importante: en este material no se utilizan t.test() ni prop.test(). El objetivo es que tu como estudiante puedas identificar cada componente de la fórmula y reproducir manualmente el procedimiento en R.