En la práctica anterior, aprendimos a crear gráficos descriptivos básicos. Ahora, vamos a profundizar en uno de los más importantes: el histograma. Un histograma no solo nos muestra la forma de nuestros datos, sino que también se basa en una estructura numérica subyacente llamada tabla de distribución de frecuencias.
Esta práctica te enseñará a ir más allá de simplemente crear el gráfico. Aprenderás a construir la tabla de frecuencias que lo alimenta y a comparar la distribución de tus datos reales con un modelo teórico ideal: la curva de distribución normal (también conocida como campana de Gauss).
Al finalizar esta práctica, serás capaz de:
Interpretar un histograma para entender la distribución de una variable numérica. Calcular y construir una tabla de distribución de frecuencias completa (frecuencia absoluta, relativa y acumulada). Comprender la importancia de los “intervalos” o “clases” en un histograma. Superponer una curva de distribución normal sobre tus datos para evaluar su normalidad de forma visual. Calcular la media y la desviación estándar de una variable.
Como siempre, nuestro primer paso es cargar los paquetes necesarios y la base de datos que vamos a utilizar.
#CARGAR LIBRERÍAS (se hace en cada sesión)
library(ggplot2)
library(readxl)
Usaremos la misma base de datos de la práctica anterior. ¡RECUERDA MODIFICAR ESTA RUTA con la ubicación de tu archivo!
ruta_archivo <- "C:/Users/alumno/Desktop/equinos_modificado.xlsx"
equinos_df <- read_excel(ruta_archivo)
#Un vistazo rápido para asegurarnos de que todo está en orden.
head(equinos_df)
Pregunta: ¿Cómo se distribuye el peso de nuestros equinos? ¿La mayoría son ligeros, pesados, o se agrupan en el centro?
Vamos a crear un histograma para la variable Peso_Kg usando la función de Base R hist().
hist(equinos_df$Peso_Kg,
main = "Distribución del Peso de los Equinos",
xlab = "Peso (Kg)",
ylab = "Frecuencia",
col = "lightblue",
border = "black",
breaks = 5) # 'breaks' sugiere el número de barras (intervalos)
El gráfico nos muestra la frecuencia de caballos dentro de diferentes rangos de peso. Pero, ¿cuáles son esos rangos y cuántos animales hay exactamente en cada uno? Para responder a eso, necesitamos una tabla de frecuencias.
Esta tabla es el esqueleto numérico de nuestro histograma. Nos muestra cómo se agrupan los datos en intervalos y nos da varias medidas clave.
El objeto generado por hist() contiene toda la información que necesitamos.
#Usamos plot = FALSE para que solo nos devuelva los cálculos, sin dibujar el gráfico.
info_hist <- hist(equinos_df$Peso_Kg, breaks = 5, plot = FALSE)
#Ahora construimos un data frame para presentar la información de forma ordenada.
tabla_df <- data.frame(
Intervalo = paste("[", info_histbreaks[−length(infohistbreaks)], "-", info_hist$breaks[-1], ")"),
Frecuencia_Absoluta = info_hist$counts,
Frecuencia_Relativa = round(info_histcounts/sum(infohistcounts), 3),
Frecuencia_Acumulada = cumsum(info_hist$counts))
#Mostrar la tabla de distribución de frecuencias completa
print(tabla_df)
Frecuencia Absoluta: Es el conteo de animales en cada intervalo (la altura de las barras del histograma). Frecuencia Relativa: Es la proporción o porcentaje de animales en cada intervalo. Frecuencia Acumulada: Es el conteo acumulado de animales a medida que avanzamos por los intervalos.
En estadística, muchos fenómenos naturales siguen una distribución normal (la “campana de Gauss”). Superponer esta curva teórica sobre nuestro histograma nos ayuda a ver si nuestros datos se comportan de manera “normal”.
Para hacer esto, necesitamos dos valores importantes: la media (el promedio) y la desviación estándar (qué tan dispersos están los datos).
#CALCULAR MEDIA Y DESVIACIÓN ESTÁNDAR
media_peso <- mean(equinos_df$Peso_Kg)
sd_peso <- sd(equinos_df$Peso_Kg)
cat("La media del peso es:", round(media_peso, 2), "Kg\n")
cat("La desviación estándar del peso es:", round(sd_peso, 2), "Kg\n")
#CREAR EL HISTOGRAMA CON LA CURVA (Método ggplot2)
#ggplot2 hace que añadir una curva de densidad sea muy elegante.
ggplot(equinos_df, aes(x = Peso_Kg)) +
geom_histogram(aes(y = ..density..), binwidth = 50, fill = "lightblue", color = "black") +
stat_function(fun = dnorm, args = list(mean = media_peso, sd = sd_peso), color = "red", size = 1) +
labs(title = "Distribución del Peso vs. Curva Normal",
x = "Peso (Kg)",
y = "Densidad")
La línea roja representa cómo se vería una distribución “perfectamente normal” con la misma media y desviación estándar que nuestros datos. Al compararla con nuestras barras, podemos evaluar visualmente si nuestros datos se ajustan bien a este modelo teórico.
Pregunta 1: En la tabla de distribución de frecuencias, si la Frecuencia Absoluta de un intervalo es 4, ¿qué significa exactamente ese número?
Pregunta 2: ¿Qué información te da la Frecuencia Relativa que no te da la Frecuencia Absoluta?
Pregunta 3: Si la media del peso de los equinos es 324 Kg, ¿dónde esperarías ver el punto más alto de la campana de Gauss en el gráfico?
Pregunta 4: La desviación estándar nos habla de la dispersión de los datos. Si la desviación estándar fuera mucho mayor, ¿cómo te imaginarías la campana de Gauss: más alta y estrecha, o más baja y ancha? ¿Por qué?
Pregunta 5: Observando el último gráfico, ¿dirías que los pesos de nuestros equinos siguen una distribución aproximadamente normal? Justifica tu respuesta comparando las barras del histograma con la línea roja.
Héctor Alexander Camarena Ledesma, Jessica González Perea, Ángel Moisés Rentería López, Marco Antonio Alvarado Salas, Argelia Ximena Hernández Recio, Carlos Leonardo Pérez Cuenca, Fabiola Asunción Flores Figueroa, Braulio Herrera Ramírez, Areli Maldonado Fernández, Arenas Escamilla Daniel, Pineda Alatriste Saúl, Rogers Montoya Nathaniel Alec, Noé Orlando Juárez López, Daniel Alonso Domínguez Olvera.