R
Tutorial R: Estadística descriptiva en R
Aprende a realizar análisis estadístico por grupos en R con medidas de centro, dispersión, gráficos y tablas de contingencia para datos categóricos.
Aprende R y certifícateMedidas de centro y dispersión por grupos
Cuando analizamos datos, a menudo necesitamos comparar diferentes grupos o categorías para identificar patrones y diferencias. R nos permite calcular fácilmente medidas estadísticas separadas por grupos, lo que resulta fundamental para entender la variabilidad entre distintas categorías de nuestros datos.
Preparación de los datos
Antes de comenzar con el análisis por grupos, necesitamos un conjunto de datos adecuado. Vamos a utilizar un dataset incluido en R para nuestros ejemplos:
# Cargamos el dataset mtcars (viene incluido en R)
data(mtcars)
# Visualizamos las primeras filas
head(mtcars)
Este dataset contiene información sobre diferentes modelos de automóviles. Para nuestro análisis por grupos, convertiremos algunas variables numéricas en factores:
# Convertimos cyl (cilindros) y am (tipo de transmisión) en factores
mtcars$cyl <- as.factor(mtcars$cyl)
mtcars$am <- as.factor(mtcars$am)
# Etiquetamos los niveles de am
levels(mtcars$am) <- c("Automático", "Manual")
Cálculo de medidas por grupos con aggregate()
La función aggregate() es una herramienta versátil para calcular estadísticas por grupos. Su sintaxis básica es:
aggregate(variable_numérica ~ variable_grupo, data = dataset, FUN = función_estadística)
Veamos algunos ejemplos prácticos:
# Media del consumo de combustible (mpg) por número de cilindros
medias_por_cilindros <- aggregate(mpg ~ cyl, data = mtcars, FUN = mean)
medias_por_cilindros
También podemos calcular múltiples estadísticas para la misma agrupación:
# Desviación estándar del consumo por cilindros
desviacion_por_cilindros <- aggregate(mpg ~ cyl, data = mtcars, FUN = sd)
desviacion_por_cilindros
# Mediana del consumo por cilindros
mediana_por_cilindros <- aggregate(mpg ~ cyl, data = mtcars, FUN = median)
mediana_por_cilindros
Para calcular varias medidas de dispersión y centro en una sola operación, podemos crear una función personalizada:
# Función que calcula varias estadísticas
resumen_estadistico <- function(x) {
c(media = mean(x),
mediana = median(x),
desv_est = sd(x),
min = min(x),
max = max(x))
}
# Aplicamos la función a mpg agrupado por cilindros
resumen_mpg_por_cyl <- aggregate(mpg ~ cyl, data = mtcars, FUN = resumen_estadistico)
resumen_mpg_por_cyl
Agrupación por múltiples variables
Podemos agrupar por más de una variable para obtener un análisis más detallado:
# Media del consumo agrupado por cilindros y tipo de transmisión
medias_cyl_am <- aggregate(mpg ~ cyl + am, data = mtcars, FUN = mean)
medias_cyl_am
Este resultado nos muestra cómo varía el consumo de combustible según el número de cilindros y el tipo de transmisión simultáneamente.
Uso de dplyr para análisis por grupos
El paquete dplyr ofrece una sintaxis más intuitiva y legible para el análisis por grupos. Primero, instalamos y cargamos el paquete:
# Instalamos dplyr si no lo tenemos
# install.packages("dplyr")
# Cargamos la librería
library(dplyr)
Con dplyr, el flujo de trabajo típico utiliza las funciones group_by() y summarise():
# Calculamos múltiples estadísticas por grupo de cilindros
mtcars %>%
group_by(cyl) %>%
summarise(
n = n(),
media_mpg = mean(mpg),
mediana_mpg = median(mpg),
desv_est = sd(mpg),
min_mpg = min(mpg),
max_mpg = max(mpg)
)
El operador %>% (pipe) nos permite encadenar operaciones de manera clara y legible. La función n() cuenta el número de observaciones en cada grupo.
Para agrupar por múltiples variables con dplyr:
# Estadísticas por cilindros y tipo de transmisión
mtcars %>%
group_by(cyl, am) %>%
summarise(
n = n(),
media_mpg = mean(mpg),
desv_est = sd(mpg)
)
Medidas de dispersión relativa
A veces, es útil calcular medidas de dispersión relativa como el coeficiente de variación, que permite comparar la variabilidad entre grupos con diferentes escalas:
# Coeficiente de variación por grupo
mtcars %>%
group_by(cyl) %>%
summarise(
media = mean(mpg),
desv_est = sd(mpg),
coef_var = sd(mpg) / mean(mpg) * 100 # CV en porcentaje
)
El coeficiente de variación (CV) expresa la desviación estándar como porcentaje de la media, facilitando la comparación de la dispersión entre grupos con diferentes medias.
Análisis de múltiples variables numéricas
Podemos analizar varias variables numéricas simultáneamente:
# Medias de múltiples variables por grupo
mtcars %>%
group_by(cyl) %>%
summarise(
media_mpg = mean(mpg),
media_hp = mean(hp),
media_wt = mean(wt)
)
Para un análisis más completo, podemos usar summarise_at() para aplicar las mismas funciones a múltiples columnas:
# Aplicamos mean y sd a varias columnas numéricas
mtcars %>%
group_by(cyl) %>%
summarise_at(
vars(mpg, hp, wt),
list(media = mean, desv = sd)
)
Identificación de valores atípicos por grupo
Las medidas de dispersión nos ayudan a identificar valores atípicos (outliers) dentro de cada grupo:
# Calculamos cuartiles y rango intercuartílico por grupo
mtcars %>%
group_by(cyl) %>%
summarise(
q1 = quantile(mpg, 0.25),
mediana = median(mpg),
q3 = quantile(mpg, 0.75),
riq = IQR(mpg),
limite_inf = q1 - 1.5 * riq,
limite_sup = q3 + 1.5 * riq
)
Con estos límites, podemos identificar qué observaciones se consideran atípicas en cada grupo:
# Función para identificar outliers por grupo
mtcars %>%
group_by(cyl) %>%
mutate(
q1 = quantile(mpg, 0.25),
q3 = quantile(mpg, 0.75),
riq = IQR(mpg),
es_outlier = mpg < (q1 - 1.5 * riq) | mpg > (q3 + 1.5 * riq)
) %>%
filter(es_outlier == TRUE) %>%
select(cyl, mpg, es_outlier)
Comparación visual de estadísticas por grupo
Para complementar nuestro análisis numérico, podemos crear una tabla que muestre las principales estadísticas por grupo:
# Tabla resumen de estadísticas por cilindros
tabla_resumen <- mtcars %>%
group_by(cyl) %>%
summarise(
n = n(),
min = min(mpg),
q1 = quantile(mpg, 0.25),
mediana = median(mpg),
media = mean(mpg),
q3 = quantile(mpg, 0.75),
max = max(mpg),
desv_est = sd(mpg),
coef_var = sd(mpg) / mean(mpg) * 100
)
# Mostramos la tabla formateada
print(tabla_resumen, digits = 2)
Esta tabla nos proporciona una visión completa de cómo se distribuye el consumo de combustible en cada grupo de cilindros, permitiéndonos comparar tanto las medidas de centro como las de dispersión.
Exploración gráfica con histogramas y boxplots
La visualización de datos es una parte fundamental del análisis exploratorio en R. Mientras que las medidas numéricas nos proporcionan información precisa, los gráficos nos permiten captar patrones, tendencias y anomalías de forma intuitiva. En esta sección, exploraremos dos herramientas gráficas esenciales: histogramas y diagramas de caja (boxplots).
Histogramas: visualizando la distribución
Los histogramas nos permiten visualizar la distribución de una variable numérica, mostrando la frecuencia con que los valores caen en diferentes rangos o "bins". Vamos a utilizar el dataset mtcars
para nuestros ejemplos:
# Cargamos el dataset si no lo hemos hecho ya
data(mtcars)
# Histograma básico del consumo de combustible (mpg)
hist(mtcars$mpg)
Este histograma básico nos muestra la distribución del consumo de combustible, pero podemos personalizarlo para obtener una visualización más informativa:
# Histograma con más opciones
hist(mtcars$mpg,
breaks = 10, # Número de divisiones
col = "skyblue", # Color de las barras
main = "Distribución del consumo de combustible", # Título
xlab = "Millas por galón (mpg)", # Etiqueta eje X
ylab = "Frecuencia", # Etiqueta eje Y
border = "white") # Color del borde
El parámetro breaks
controla el número de divisiones o "bins" del histograma. Un número mayor de divisiones muestra más detalle, mientras que un número menor puede revelar patrones más generales.
Para añadir una línea que represente la densidad de la distribución:
# Histograma con curva de densidad
hist(mtcars$mpg,
breaks = 10,
col = "lightgreen",
main = "Histograma con curva de densidad",
xlab = "Millas por galón (mpg)",
probability = TRUE) # Muestra densidad en lugar de frecuencia
# Añadimos la curva de densidad
lines(density(mtcars$mpg), col = "darkred", lwd = 2)
El parámetro probability = TRUE
cambia el eje Y de frecuencias absolutas a densidad, permitiendo superponer la curva de densidad.
Comparando distribuciones con histogramas múltiples
Para comparar la distribución de una variable entre diferentes grupos, podemos crear histogramas separados:
# Convertimos cilindros a factor si no lo hemos hecho
mtcars$cyl <- as.factor(mtcars$cyl)
# Configuramos un panel de 1 fila y 3 columnas
par(mfrow = c(1, 3))
# Creamos histogramas para cada grupo de cilindros
hist(mtcars$mpg[mtcars$cyl == "4"],
main = "4 cilindros",
xlab = "MPG",
col = "lightblue",
xlim = c(10, 35)) # Mismo rango en X para todos
hist(mtcars$mpg[mtcars$cyl == "6"],
main = "6 cilindros",
xlab = "MPG",
col = "lightgreen",
xlim = c(10, 35))
hist(mtcars$mpg[mtcars$cyl == "8"],
main = "8 cilindros",
xlab = "MPG",
col = "salmon",
xlim = c(10, 35))
# Restauramos la configuración original
par(mfrow = c(1, 1))
El uso de par(mfrow = c(1, 3))
divide la ventana gráfica en una fila con tres columnas, permitiéndonos mostrar los tres histogramas juntos. Es importante usar el mismo rango en el eje X (xlim
) para facilitar la comparación visual.
Diagramas de caja (boxplots): visualizando la dispersión
Los boxplots o diagramas de caja son herramientas poderosas para visualizar la distribución y dispersión de los datos, mostrando el rango intercuartílico, la mediana y los valores atípicos.
# Boxplot básico
boxplot(mtcars$mpg,
main = "Consumo de combustible",
ylab = "Millas por galón (mpg)",
col = "lightblue")
Un boxplot muestra:
- La mediana (línea horizontal dentro de la caja)
- El primer cuartil (Q1, límite inferior de la caja)
- El tercer cuartil (Q3, límite superior de la caja)
- Los bigotes que se extienden hasta los valores mínimo y máximo (excluyendo outliers)
- Los valores atípicos (puntos individuales más allá de los bigotes)
Comparando grupos con boxplots
Los boxplots son especialmente útiles para comparar la distribución de una variable entre diferentes grupos:
# Boxplot por grupos
boxplot(mpg ~ cyl,
data = mtcars,
main = "Consumo por número de cilindros",
xlab = "Número de cilindros",
ylab = "Millas por galón (mpg)",
col = c("lightblue", "lightgreen", "salmon"))
La fórmula mpg ~ cyl
indica que queremos visualizar mpg
(variable numérica) agrupada por cyl
(factor). Este gráfico nos permite comparar rápidamente:
- La tendencia central (mediana) entre grupos
- La dispersión (altura de la caja) dentro de cada grupo
- La presencia de valores atípicos en cada grupo
Para añadir más información visual:
# Boxplot con muescas y puntos
boxplot(mpg ~ cyl,
data = mtcars,
main = "Consumo por cilindros con muescas",
xlab = "Número de cilindros",
ylab = "Millas por galón (mpg)",
col = c("lightblue", "lightgreen", "salmon"),
notch = TRUE, # Añade muescas (intervalo de confianza para la mediana)
varwidth = TRUE) # Ancho proporcional al tamaño de la muestra
Las muescas (notch = TRUE
) representan aproximadamente un intervalo de confianza del 95% para la mediana. Si las muescas de dos boxplots no se solapan, hay evidencia de que las medianas son significativamente diferentes.
Combinando boxplots con puntos individuales
A veces es útil ver los datos individuales junto con el boxplot, especialmente para muestras pequeñas:
# Boxplot con puntos individuales
boxplot(mpg ~ cyl,
data = mtcars,
main = "Consumo por cilindros con puntos",
xlab = "Número de cilindros",
ylab = "Millas por galón (mpg)",
col = c("lightblue", "lightgreen", "salmon"))
# Añadimos los puntos individuales
stripchart(mpg ~ cyl,
data = mtcars,
vertical = TRUE,
method = "jitter", # Dispersa puntos horizontalmente
pch = 19, # Tipo de punto
col = "darkblue",
add = TRUE) # Añade al gráfico existente
La función stripchart()
con add = TRUE
superpone los puntos individuales sobre el boxplot, permitiéndonos ver tanto la distribución general como los valores específicos.
Boxplots para múltiples variables
Podemos crear boxplots para varias variables numéricas simultáneamente:
# Seleccionamos variables numéricas
vars_numericas <- mtcars[, c("mpg", "disp", "hp", "wt")]
# Creamos boxplots para cada variable
boxplot(vars_numericas,
main = "Variables del dataset mtcars",
col = "lightblue",
las = 2) # Rota las etiquetas del eje
Sin embargo, este enfoque puede ser problemático si las variables tienen escalas muy diferentes. Una solución es estandarizar los datos:
# Estandarizamos las variables (media 0, desviación estándar 1)
vars_estandarizadas <- scale(vars_numericas)
# Creamos boxplots para las variables estandarizadas
boxplot(vars_estandarizadas,
main = "Variables estandarizadas",
col = "lightgreen",
las = 2)
Boxplots por múltiples factores
También podemos crear boxplots agrupados por dos factores:
# Convertimos am (transmisión) a factor si no lo hemos hecho
mtcars$am <- as.factor(mtcars$am)
levels(mtcars$am) <- c("Automático", "Manual")
# Boxplot por cilindros y tipo de transmisión
boxplot(mpg ~ cyl + am,
data = mtcars,
main = "Consumo por cilindros y transmisión",
xlab = "Cilindros y tipo de transmisión",
ylab = "Millas por galón (mpg)",
col = c("lightblue", "salmon"),
las = 2) # Rota las etiquetas del eje
La fórmula mpg ~ cyl + am
crea grupos para cada combinación de cyl
y am
, permitiéndonos ver cómo interactúan estos factores en relación con el consumo de combustible.
Combinando histogramas y boxplots
Para obtener una visión más completa, podemos combinar histogramas y boxplots en un mismo análisis:
# Configuramos un panel de 2 filas y 1 columna
par(mfrow = c(2, 1))
# Histograma en la parte superior
hist(mtcars$mpg,
breaks = 12,
col = "skyblue",
main = "Distribución del consumo",
xlab = "") # Omitimos etiqueta para evitar solapamiento
# Boxplot en la parte inferior
boxplot(mtcars$mpg,
horizontal = TRUE, # Boxplot horizontal para alinear con histograma
col = "skyblue",
main = "",
xlab = "Millas por galón (mpg)")
# Restauramos la configuración original
par(mfrow = c(1, 1))
Al alinear el histograma y el boxplot horizontal, podemos ver simultáneamente la forma de la distribución y sus características principales (mediana, cuartiles, valores atípicos).
Uso de ggplot2 para gráficos más elegantes
El paquete ggplot2 ofrece una alternativa más flexible y estéticamente agradable para crear visualizaciones:
# Instalamos y cargamos ggplot2 si no lo tenemos
# install.packages("ggplot2")
library(ggplot2)
# Histograma con ggplot2
ggplot(mtcars, aes(x = mpg)) +
geom_histogram(bins = 10, fill = "skyblue", color = "white") +
labs(title = "Distribución del consumo de combustible",
x = "Millas por galón (mpg)",
y = "Frecuencia") +
theme_minimal()
Para crear boxplots por grupos:
# Boxplot por grupos con ggplot2
ggplot(mtcars, aes(x = cyl, y = mpg, fill = cyl)) +
geom_boxplot() +
labs(title = "Consumo por número de cilindros",
x = "Número de cilindros",
y = "Millas por galón (mpg)") +
theme_minimal() +
scale_fill_brewer(palette = "Pastel1") # Paleta de colores predefinida
Una ventaja de ggplot2 es la facilidad para crear gráficos facetados (divididos por grupos):
# Histogramas facetados por número de cilindros
ggplot(mtcars, aes(x = mpg)) +
geom_histogram(bins = 8, fill = "skyblue", color = "white") +
facet_wrap(~ cyl, nrow = 1) + # Divide en paneles por cilindros
labs(title = "Distribución del consumo por cilindros",
x = "Millas por galón (mpg)",
y = "Frecuencia") +
theme_minimal()
Tablas de contingencia y frecuencias
Las tablas de contingencia y las tablas de frecuencias son herramientas fundamentales para resumir y analizar relaciones entre variables categóricas en nuestros datos. Estas técnicas nos permiten identificar patrones y asociaciones que podrían no ser evidentes en los datos sin procesar.
Tablas de frecuencias simples
Una tabla de frecuencias muestra la distribución de una variable categórica, contando cuántas veces aparece cada valor o categoría en el conjunto de datos. En R, podemos crear estas tablas fácilmente con la función table()
:
# Cargamos el dataset mtcars
data(mtcars)
# Convertimos variables numéricas a factores para el análisis
mtcars$cyl <- as.factor(mtcars$cyl)
mtcars$gear <- as.factor(mtcars$gear)
mtcars$am <- as.factor(mtcars$am)
levels(mtcars$am) <- c("Automático", "Manual")
# Tabla de frecuencias para número de cilindros
tabla_cyl <- table(mtcars$cyl)
tabla_cyl
Esta tabla nos muestra cuántos coches hay con 4, 6 y 8 cilindros en nuestro dataset. Para obtener las frecuencias relativas (proporciones):
# Frecuencias relativas (proporciones)
prop_cyl <- prop.table(tabla_cyl)
prop_cyl
# Frecuencias relativas en porcentaje
porcentaje_cyl <- prop.table(tabla_cyl) * 100
porcentaje_cyl
Para una presentación más completa, podemos combinar estas medidas en una sola tabla:
# Creamos una tabla resumen
resumen_cyl <- data.frame(
Frecuencia = as.vector(tabla_cyl),
Porcentaje = as.vector(porcentaje_cyl)
)
rownames(resumen_cyl) <- names(tabla_cyl)
resumen_cyl
Tablas de contingencia (tablas cruzadas)
Las tablas de contingencia muestran la relación entre dos variables categóricas, permitiéndonos ver cómo se distribuyen las observaciones según las combinaciones de categorías:
# Tabla de contingencia: cilindros vs. tipo de transmisión
tabla_cyl_am <- table(mtcars$cyl, mtcars$am)
tabla_cyl_am
Para mejorar la legibilidad, podemos añadir nombres a las filas y columnas:
# Tabla con nombres más descriptivos
tabla_cyl_am <- table(Cilindros = mtcars$cyl, Transmisión = mtcars$am)
tabla_cyl_am
Esta tabla nos muestra, por ejemplo, cuántos coches con 4 cilindros tienen transmisión automática y cuántos manual.
Frecuencias marginales y condicionales
A partir de una tabla de contingencia, podemos calcular diferentes tipos de frecuencias:
# Frecuencias marginales (totales por fila y columna)
margin.table(tabla_cyl_am, 1) # Totales por fila (cilindros)
margin.table(tabla_cyl_am, 2) # Totales por columna (transmisión)
# Frecuencias relativas (proporciones del total)
prop.table(tabla_cyl_am)
# Frecuencias relativas por fila
prop.table(tabla_cyl_am, 1)
# Frecuencias relativas por columna
prop.table(tabla_cyl_am, 2)
Las frecuencias relativas por fila nos muestran, para cada número de cilindros, qué proporción tiene transmisión automática o manual. Las frecuencias relativas por columna nos indican, para cada tipo de transmisión, qué proporción tiene 4, 6 u 8 cilindros.
Añadiendo totales marginales
Para una visión más completa, podemos añadir los totales marginales a nuestra tabla:
# Tabla con totales marginales
tabla_con_totales <- addmargins(tabla_cyl_am)
tabla_con_totales
La función addmargins()
añade una fila y una columna con los totales, facilitando la interpretación de los datos.
Tablas de contingencia para tres o más variables
También podemos crear tablas para analizar la relación entre tres o más variables categóricas:
# Tabla de contingencia tridimensional: cilindros, transmisión y número de marchas
tabla_3d <- table(Cilindros = mtcars$cyl,
Transmisión = mtcars$am,
Marchas = mtcars$gear)
tabla_3d
Para visualizar mejor esta tabla tridimensional, podemos examinarla por capas:
# Examinamos la tabla por cada valor de la tercera variable (marchas)
for (i in 1:length(dimnames(tabla_3d)[[3]])) {
cat("\nMarchas:", dimnames(tabla_3d)[[3]][i], "\n")
print(tabla_3d[,,i])
}
Pruebas de independencia
Una pregunta común es si existe una asociación entre las variables categóricas. La prueba de chi-cuadrado nos ayuda a determinar si las variables son independientes:
# Prueba de chi-cuadrado para independencia
resultado_chi <- chisq.test(tabla_cyl_am)
resultado_chi
Si el valor p (p-value) es menor que 0.05, rechazamos la hipótesis nula de independencia, sugiriendo que existe una asociación entre las variables.
Sin embargo, para tablas pequeñas o con frecuencias bajas, la aproximación de chi-cuadrado puede no ser adecuada. En estos casos, podemos usar la prueba exacta de Fisher:
# Prueba exacta de Fisher
fisher_test <- fisher.test(tabla_cyl_am)
fisher_test
Visualización de tablas de contingencia
Las representaciones visuales pueden facilitar la interpretación de las tablas de contingencia:
# Instalamos y cargamos el paquete corrplot si no lo tenemos
# install.packages("corrplot")
library(corrplot)
# Visualizamos la tabla como un mapa de calor
corrplot(as.matrix(tabla_cyl_am), is.cor = FALSE,
method = "color", addCoef.col = "black",
tl.col = "black", cl.pos = "n")
Para una visualización más elaborada, podemos usar el paquete ggplot2
:
# Instalamos y cargamos ggplot2 si no lo tenemos
# install.packages("ggplot2")
library(ggplot2)
# Convertimos la tabla a formato data.frame para ggplot
tabla_df <- as.data.frame(as.table(tabla_cyl_am))
names(tabla_df) <- c("Cilindros", "Transmisión", "Frecuencia")
# Creamos un gráfico de mosaico
ggplot(tabla_df, aes(x = Cilindros, y = Frecuencia, fill = Transmisión)) +
geom_bar(stat = "identity", position = "fill") +
labs(title = "Proporción de tipos de transmisión por cilindros",
y = "Proporción") +
scale_fill_brewer(palette = "Pastel1") +
theme_minimal()
Tablas de frecuencias para variables numéricas
Para variables numéricas, podemos crear tablas de frecuencias agrupando los valores en intervalos:
# Creamos intervalos para la variable mpg
intervalos_mpg <- cut(mtcars$mpg,
breaks = seq(10, 35, by = 5),
include.lowest = TRUE)
# Tabla de frecuencias para los intervalos
tabla_intervalos <- table(intervalos_mpg)
tabla_intervalos
# Frecuencias relativas
prop.table(tabla_intervalos) * 100
La función cut()
divide los valores en intervalos, que luego podemos contar con table()
.
Tablas de frecuencias acumuladas
Las frecuencias acumuladas nos muestran cuántas observaciones están por debajo de cierto valor:
# Frecuencias acumuladas
freq_acum <- cumsum(tabla_intervalos)
freq_acum
# Porcentajes acumulados
porc_acum <- cumsum(prop.table(tabla_intervalos)) * 100
porc_acum
# Tabla resumen con frecuencias acumuladas
resumen_intervalos <- data.frame(
Frecuencia = as.vector(tabla_intervalos),
Porcentaje = as.vector(prop.table(tabla_intervalos) * 100),
Frec_Acumulada = as.vector(freq_acum),
Porc_Acumulado = as.vector(porc_acum)
)
rownames(resumen_intervalos) <- names(tabla_intervalos)
resumen_intervalos
Uso de dplyr para tablas de frecuencias
El paquete dplyr ofrece una sintaxis más intuitiva para crear tablas de frecuencias:
# Instalamos y cargamos dplyr si no lo tenemos
# install.packages("dplyr")
library(dplyr)
# Tabla de frecuencias con dplyr
mtcars %>%
count(cyl) %>%
mutate(porcentaje = n / sum(n) * 100)
# Tabla de contingencia con dplyr
mtcars %>%
count(cyl, am) %>%
group_by(cyl) %>%
mutate(porcentaje_fila = n / sum(n) * 100) %>%
ungroup()
Exportación de tablas
Finalmente, podemos exportar nuestras tablas a diferentes formatos para incluirlas en informes:
# Exportar a CSV
write.csv(resumen_intervalos, "tabla_frecuencias.csv")
# Para exportar a Excel, podemos usar el paquete writexl
# install.packages("writexl")
# library(writexl)
# write_xlsx(resumen_intervalos, "tabla_frecuencias.xlsx")
Para presentaciones más elaboradas, podemos usar el paquete knitr
o kableExtra
:
# Instalamos y cargamos knitr si no lo tenemos
# install.packages("knitr")
library(knitr)
# Creamos una tabla formateada
kable(resumen_intervalos,
caption = "Tabla de frecuencias para consumo de combustible",
digits = 2,
format = "markdown")
Las tablas de contingencia y frecuencias son herramientas esenciales para el análisis exploratorio, permitiéndonos entender la estructura de nuestros datos categóricos y las relaciones entre variables antes de aplicar técnicas estadísticas más avanzadas.
Otros ejercicios de programación de R
Evalúa tus conocimientos de esta lección Estadística descriptiva en R con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.
Todas las lecciones de R
Accede a todas las lecciones de R y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.
Instalación De R Y Rstudio
Introducción Y Entorno
Introducción A R
Introducción Y Entorno
Operadores
Sintaxis
Estructuras De Datos
Sintaxis
Funciones
Sintaxis
Estructuras De Control Iterativo
Sintaxis
Scopes Y Closures
Sintaxis
Estructuras De Control Condicional
Sintaxis
Funciones Anónimas
Sintaxis
Tipos De Datos Y Variables
Sintaxis
Sistema R6: Clases Referenciales Y Encapsulamiento
Programación Orientada A Objetos
Sistema S4: Clases Formales Y Validación
Programación Orientada A Objetos
Herencia Y Polimorfismo En R
Programación Orientada A Objetos
Sistemas De Oop En R
Programación Orientada A Objetos
Sistema S3: Clases Implícitas Y Métodos Genéricos
Programación Orientada A Objetos
Tidyverse Para Transformación De Datos
Manipulación De Datos
Lubridate Para Fechas Y Tiempo
Manipulación De Datos
Group_by Y Summarize Para Agrupación Y Resumen
Manipulación De Datos
Stringr Para Expresiones Regulares
Manipulación De Datos
Tidyr Para Limpieza De Valores Faltantes
Manipulación De Datos
Joins En R Para Combinación Y Relaciones De Tablas
Manipulación De Datos
Pivot_longer Y Pivot_wider Para Reestructuración
Manipulación De Datos
Mutate Y Transmute Para Transformación
Manipulación De Datos
Dplyr Para Filtrado Y Selección
Manipulación De Datos
Readr Y Read.csv Para Importar Datos
Manipulación De Datos
Gráficos Bivariantes En R
Visualización De Datos
Gráficos Univariantes En R
Visualización De Datos
Facetas En Ggplot2
Visualización De Datos
Personalización Y Temas
Visualización De Datos
Ggplot2 Para Visualización De Datos
Visualización De Datos
Gráficos Multivariantes En R
Visualización De Datos
Correlación En R
Estadística
Regresión Lineal En R
Estadística
Pruebas De Hipótesis En R
Estadística
Anova En R
Estadística
Estadística Descriptiva En R
Estadística
En esta lección
Objetivos de aprendizaje de esta lección
- Comprender cómo calcular medidas de tendencia central y dispersión por grupos usando R.
- Aprender a utilizar funciones como aggregate() y dplyr para análisis estadísticos agrupados.
- Explorar técnicas de visualización de datos con histogramas y boxplots para comparar distribuciones.
- Crear y analizar tablas de frecuencias y tablas de contingencia para variables categóricas.
- Realizar pruebas estadísticas básicas para evaluar asociaciones entre variables categóricas.