R

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ícate

Medidas 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.

Aprende R online

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

R

Introducción Y Entorno

Introducción A R

R

Introducción Y Entorno

Operadores

R

Sintaxis

Estructuras De Datos

R

Sintaxis

Funciones

R

Sintaxis

Estructuras De Control Iterativo

R

Sintaxis

Scopes Y Closures

R

Sintaxis

Estructuras De Control Condicional

R

Sintaxis

Funciones Anónimas

R

Sintaxis

Tipos De Datos Y Variables

R

Sintaxis

Sistema R6: Clases Referenciales Y Encapsulamiento

R

Programación Orientada A Objetos

Sistema S4: Clases Formales Y Validación

R

Programación Orientada A Objetos

Herencia Y Polimorfismo En R

R

Programación Orientada A Objetos

Sistemas De Oop En R

R

Programación Orientada A Objetos

Sistema S3: Clases Implícitas Y Métodos Genéricos

R

Programación Orientada A Objetos

Tidyverse Para Transformación De Datos

R

Manipulación De Datos

Lubridate Para Fechas Y Tiempo

R

Manipulación De Datos

Group_by Y Summarize Para Agrupación Y Resumen

R

Manipulación De Datos

Stringr Para Expresiones Regulares

R

Manipulación De Datos

Tidyr Para Limpieza De Valores Faltantes

R

Manipulación De Datos

Joins En R Para Combinación Y Relaciones De Tablas

R

Manipulación De Datos

Pivot_longer Y Pivot_wider Para Reestructuración

R

Manipulación De Datos

Mutate Y Transmute Para Transformación

R

Manipulación De Datos

Dplyr Para Filtrado Y Selección

R

Manipulación De Datos

Readr Y Read.csv Para Importar Datos

R

Manipulación De Datos

Gráficos Bivariantes En R

R

Visualización De Datos

Gráficos Univariantes En R

R

Visualización De Datos

Facetas En Ggplot2

R

Visualización De Datos

Personalización Y Temas

R

Visualización De Datos

Ggplot2 Para Visualización De Datos

R

Visualización De Datos

Gráficos Multivariantes En R

R

Visualización De Datos

Correlación En R

R

Estadística

Regresión Lineal En R

R

Estadística

Pruebas De Hipótesis En R

R

Estadística

Anova En R

R

Estadística

Estadística Descriptiva En R

R

Estadística

Accede GRATIS a R y certifícate

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.