---
title: "Análisis Exploratorio de Datos e Intervalos de Confianza"
author: "Carlos Lopez Perez"
format:
html:
self-contained: true
toc: true
code-fold: false
code-tools: true
execute:
echo: true
warning: false
message: false
---
# 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()`.
```{r}
# Cargar paquetes
library(ggplot2)
# Cargar el dataset
data(iris)
# Revisar la estructura de los datos
str(iris)
```
## Microdatos
Los microdatos permiten observar directamente algunas de las unidades de análisis que componen el conjunto de datos.
```{r}
# Primeras 10 observaciones
head(iris, 10)
```
También podemos consultar las últimas observaciones:
```{r}
# Últimas 6 observaciones
tail(iris)
```
## Resumen descriptivo
```{r}
# Resumen de las variables
summary(iris)
```
# 2. Análisis Exploratorio de Datos (EDA)
## Histogramas
### Histograma de la longitud del sépalo
```{r}
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
```{r}
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
```{r}
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
```{r}
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
```{r}
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
```{r}
# Variable de interés
x <- iris$Sepal.Length
# Estadísticos muestrales
media <- mean(x)
s <- sd(x)
n <- length(x)
media
s
n
```
### 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}
$$
```{r}
# 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
```
### Paso 3: calcular el error estándar y el margen de error
```{r}
# Error estándar de la media
error_estandar <- s / sqrt(n)
# Margen de error
margen_error <- z * error_estandar
error_estandar
margen_error
```
### Paso 4: construir el intervalo
```{r}
# Límites del intervalo de confianza
limite_inferior <- media - margen_error
limite_superior <- media + margen_error
c(limite_inferior, limite_superior)
```
### 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()`
```{r}
# Frecuencias absolutas
frecuencias <- table(iris$Species)
frecuencias
```
```{r}
# Proporciones de cada especie
proporciones <- prop.table(frecuencias)
proporciones
```
```{r}
# Proporción muestral de Setosa
p <- proporciones["setosa"]
# Tamaño de muestra
n <- length(iris$Species)
p
n
```
### Paso 2: calcular el valor crítico
```{r}
# Nivel de confianza
confianza <- 0.95
# Nivel de significancia
alpha <- 1 - confianza
# Valor crítico
z <- qnorm(1 - alpha/2)
z
```
### Paso 3: calcular el error estándar y el margen de error
```{r}
# Error estándar de una proporción
error_estandar <- sqrt(p * (1 - p) / n)
# Margen de error
margen_error <- z * error_estandar
error_estandar
margen_error
```
### Paso 4: construir el intervalo
```{r}
# Límites del intervalo
limite_inferior <- p - margen_error
limite_superior <- p + margen_error
c(limite_inferior, limite_superior)
```
### 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
```{r}
# 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
```{r}
# 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
s_1
n_1
media_2
s_2
n_2
```
### Paso 3: calcular la diferencia de medias
```{r}
# Diferencia de medias
diferencia_medias <- media_1 - media_2
diferencia_medias
```
### Paso 4: calcular el error estándar
```{r}
# Error estándar de la diferencia de medias
error_estandar <- sqrt(
(s_1^2 / n_1) +
(s_2^2 / n_2)
)
error_estandar
```
### Paso 5: calcular el margen de error
```{r}
# 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
margen_error
```
### Paso 6: construir el intervalo
```{r}
# Límites del intervalo
limite_inferior <- diferencia_medias - margen_error
limite_superior <- diferencia_medias + margen_error
c(limite_inferior, limite_superior)
```
### 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
```{r}
# 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
```{r}
# Tabla de especie y condición
tabla_prop <- table(
iris$Species,
iris$Petal_Width_Mayor_1
)
tabla_prop
```
### Paso 3: obtener las proporciones mediante `prop.table()`
```{r}
# Proporciones dentro de cada especie
proporciones <- prop.table(
tabla_prop,
margin = 1
)
proporciones
```
Para cada especie necesitamos la proporción correspondiente a `TRUE`.
```{r}
# 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
p_2
```
### Paso 4: calcular los tamaños de muestra
```{r}
# Tamaños de muestra
n_1 <- length(iris[iris$Species == "setosa", ]$Petal.Width)
n_2 <- length(iris[iris$Species == "versicolor", ]$Petal.Width)
n_1
n_2
```
### Paso 5: calcular la diferencia de proporciones
```{r}
# Diferencia de proporciones
diferencia_proporciones <- p_1 - p_2
diferencia_proporciones
```
### Paso 6: calcular el error estándar
```{r}
# 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
```
### Paso 7: calcular el margen de error
```{r}
# Valor crítico
alpha <- 0.05
z <- qnorm(1 - alpha/2)
# Margen de error
margen_error <- z * error_estandar
z
margen_error
```
### Paso 8: construir el intervalo
```{r}
# Límites del intervalo
limite_inferior <- diferencia_proporciones - margen_error
limite_superior <- diferencia_proporciones + margen_error
c(limite_inferior, limite_superior)
```
### 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.