Paquetes utilizados

paquetes <- c("readr", "dplyr", "ggplot2", "knitr")

for (p in paquetes) {
  if (!requireNamespace(p, quietly = TRUE)) {
    install.packages(p)
  }
}

library(readr)
library(dplyr)
library(ggplot2)
library(knitr)

1. Introducción

Este documento corresponde al Trabajo individual de la Actividad 121 (Caso 1) de la unidad de Análisis Descriptivo. En el enunciado disponible para esta actividad no se incluyeron preguntas puntuales adicionales al Caso 1, más allá de indicar que se debe desarrollar el análisis a partir de la base de datos y publicarlo mediante RStudio Publish. Por esta razón, este trabajo se desarrolla como un análisis descriptivo general de la base beer2.csv, cubriendo los puntos centrales de la unidad: reconocimiento del tipo de cada variable, construcción de tablas de frecuencia para las variables cualitativas y cálculo de indicadores descriptivos para las variables cuantitativas.

A diferencia de la Actividad 122, que profundiza en dos variables cualitativas y dos cuantitativas, este trabajo hace un recorrido más general por la base de datos, mostrando cómo se clasifican todas sus variables y presentando un primer acercamiento descriptivo a varias de ellas.

2. Carga y descripción general de la base de datos

datos <- read_csv("beer2.csv")
dim(datos)
## [1] 1586614      15
str(datos)
## spc_tbl_ [1,586,614 × 15] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ id            : num [1:1586614] 47986 48213 48215 47969 64883 ...
##  $ marca         : chr [1:1586614] "Vecchio Birraio" "Vecchio Birraio" "Vecchio Birraio" "Vecchio Birraio" ...
##  $ precio        : num [1:1586614] 4.99 4.45 4.95 5.58 3.9 5.07 5.07 5.07 5.07 5.07 ...
##  $ alcohol       : num [1:1586614] 13.8 16.9 17.7 13.8 20.7 ...
##  $ carbohidratos : num [1:1586614] 11.5 14.2 15 10.5 15.2 12.1 12.1 12.1 12.1 12.1 ...
##  $ calorias      : num [1:1586614] 148 181 190 144 212 145 145 145 145 145 ...
##  $ nacionalidad  : chr [1:1586614] "Canadá" "Canadá" "Canadá" "Canadá" ...
##  $ calificacion  : num [1:1586614] 1.5 3 3 3 4 3 3.5 3 4 4.5 ...
##  $ aroma         : num [1:1586614] 2 2.5 2.5 3 4.5 3.5 3.5 2.5 3 3.5 ...
##  $ apariencia    : num [1:1586614] 2.5 3 3 3.5 4 3.5 3.5 3.5 3.5 5 ...
##  $ paladar       : num [1:1586614] 1.5 3 3 2.5 4 3 4 2 3.5 4 ...
##  $ sabor         : num [1:1586614] 1.5 3 3 3 4.5 3.5 4 3.5 4 4 ...
##  $ nombre_cerveza: chr [1:1586614] "Sausa Weizen" "Red Moon" "Black Horse Black Beer" "Sausa Pils" ...
##  $ tipo          : chr [1:1586614] "clara artesanal" "cerveza normal y helada" "cerveza normal y helada" "lager importada" ...
##  $ origen        : chr [1:1586614] "importada" "importada" "importada" "importada" ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   id = col_double(),
##   ..   marca = col_character(),
##   ..   precio = col_double(),
##   ..   alcohol = col_double(),
##   ..   carbohidratos = col_double(),
##   ..   calorias = col_double(),
##   ..   nacionalidad = col_character(),
##   ..   calificacion = col_double(),
##   ..   aroma = col_double(),
##   ..   apariencia = col_double(),
##   ..   paladar = col_double(),
##   ..   sabor = col_double(),
##   ..   nombre_cerveza = col_character(),
##   ..   tipo = col_character(),
##   ..   origen = col_character()
##   .. )
##  - attr(*, "problems")=<pointer: 0x000001aea3c22b80>
colSums(is.na(datos))
##             id          marca         precio        alcohol  carbohidratos 
##              0              0              0              0              0 
##       calorias   nacionalidad   calificacion          aroma     apariencia 
##              0              0              0              0              0 
##        paladar          sabor nombre_cerveza           tipo         origen 
##              0              0              0              0              0

La base de datos contiene 1586614 observaciones y 15 variables, y no presenta valores faltantes en ninguna de sus columnas. Cada fila representa una cerveza distinta, con información sobre su precio, composición, calificación y características generales como el tipo y el origen.

3. Clasificación de las variables

Antes de analizar los datos es necesario reconocer qué tipo de variable es cada columna, ya que de eso depende la forma correcta de resumirla (tabla de frecuencia o indicadores descriptivos).

clasificacion <- data.frame(
  Variable = c("id", "marca", "precio", "alcohol", "carbohidratos", "calorias",
               "nacionalidad", "calificacion", "aroma", "apariencia", "paladar",
               "sabor", "nombre_cerveza", "tipo", "origen"),
  Tipo = c("Identificador (no se analiza)", "Cualitativa nominal (muchas categorías)",
           "Cuantitativa continua", "Cuantitativa continua", "Cuantitativa continua",
           "Cuantitativa continua", "Cualitativa nominal", "Cuantitativa discreta (escala)",
           "Cuantitativa discreta (escala)", "Cuantitativa discreta (escala)",
           "Cuantitativa discreta (escala)", "Cuantitativa discreta (escala)",
           "Identificador (no se analiza)", "Cualitativa nominal", "Cualitativa nominal")
)

kable(clasificacion, col.names = c("Variable", "Clasificación"))
Variable Clasificación
id Identificador (no se analiza)
marca Cualitativa nominal (muchas categorías)
precio Cuantitativa continua
alcohol Cuantitativa continua
carbohidratos Cuantitativa continua
calorias Cuantitativa continua
nacionalidad Cualitativa nominal
calificacion Cuantitativa discreta (escala)
aroma Cuantitativa discreta (escala)
apariencia Cuantitativa discreta (escala)
paladar Cuantitativa discreta (escala)
sabor Cuantitativa discreta (escala)
nombre_cerveza Identificador (no se analiza)
tipo Cualitativa nominal
origen Cualitativa nominal

Las variables id y nombre_cerveza funcionan como identificadores de cada observación (la segunda con una gran cantidad de valores distintos), por lo que no se analizan como variables descriptivas. De igual forma, marca tiene miles de categorías diferentes, lo cual la hace poco práctica para una tabla de frecuencia. Las variables calificacion, aroma, apariencia, paladar y sabor corresponden a puntuaciones numéricas en una escala definida, por lo que se tratan como cuantitativas discretas.

4. Análisis de variables cualitativas

Se seleccionan tres variables cualitativas con un número razonable de categorías: origen, tipo y nacionalidad.

4.1 Origen

tabla_origen <- datos %>%
  count(origen) %>%
  mutate(
    frecuencia_relativa = round(n / sum(n), 4),
    porcentaje = round(frecuencia_relativa * 100, 2)
  ) %>%
  rename(frecuencia_absoluta = n)

kable(tabla_origen, col.names = c("Origen", "Frecuencia absoluta", "Frecuencia relativa", "Porcentaje (%)"))
Origen Frecuencia absoluta Frecuencia relativa Porcentaje (%)
importada 1412449 0.8902 89.02
nacional 174165 0.1098 10.98
ggplot(datos, aes(x = origen)) +
  geom_bar(fill = "gray40") +
  labs(title = "Distribución de cervezas según origen", x = "Origen", y = "Número de cervezas") +
  theme_minimal()

La mayoría de las cervezas de la base son importadas, mientras que las nacionales representan una proporción bastante menor. No se incluye frecuencia acumulada porque origen es una variable nominal y sus dos categorías no tienen un orden entre sí.

4.2 Tipo

tabla_tipo <- datos %>%
  count(tipo) %>%
  arrange(desc(n)) %>%
  mutate(
    frecuencia_relativa = round(n / sum(n), 4),
    porcentaje = round(frecuencia_relativa * 100, 2)
  ) %>%
  rename(frecuencia_absoluta = n)

kable(tabla_tipo, col.names = c("Tipo de cerveza", "Frecuencia absoluta", "Frecuencia relativa", "Porcentaje (%)"))
Tipo de cerveza Frecuencia absoluta Frecuencia relativa Porcentaje (%)
cerveza normal y helada 839088 0.5289 52.89
clara artesanal 483464 0.3047 30.47
lager importada 219194 0.1382 13.82
lager artesanal 22725 0.0143 1.43
baja en calorías / sin alcohol 22143 0.0140 1.40
ggplot(datos, aes(x = reorder(tipo, tipo, function(x) -length(x)))) +
  geom_bar(fill = "gray40") +
  labs(title = "Distribución de cervezas según tipo", x = "Tipo de cerveza", y = "Número de cervezas") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 25, hjust = 1))

La categoría “cerveza normal y helada” concentra la mayor parte de las observaciones. Las categorías “lager artesanal” y “baja en calorías / sin alcohol” son mucho menos frecuentes, lo que muestra que el catálogo está dominado por unos pocos tipos de cerveza.

4.3 Nacionalidad

tabla_nac <- datos %>%
  count(nacionalidad) %>%
  arrange(desc(n)) %>%
  mutate(
    frecuencia_relativa = round(n / sum(n), 4),
    porcentaje = round(frecuencia_relativa * 100, 2)
  ) %>%
  rename(frecuencia_absoluta = n)

kable(tabla_nac, col.names = c("Nacionalidad", "Frecuencia absoluta", "Frecuencia relativa", "Porcentaje (%)"))
Nacionalidad Frecuencia absoluta Frecuencia relativa Porcentaje (%)
Austria 201941 0.1273 12.73
Bélgica 188677 0.1189 11.89
Francia 181574 0.1144 11.44
Estados Unidos 174165 0.1098 10.98
Inglaterra 162644 0.1025 10.25
Canadá 159508 0.1005 10.05
Japón 155273 0.0979 9.79
Alemania 121684 0.0767 7.67
Irlanda 120742 0.0761 7.61
República Checa 120406 0.0759 7.59
ggplot(datos, aes(x = reorder(nacionalidad, nacionalidad, function(x) -length(x)))) +
  geom_bar(fill = "gray40") +
  labs(title = "Distribución de cervezas según nacionalidad", x = "Nacionalidad", y = "Número de cervezas") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 40, hjust = 1))

La base incluye diez nacionalidades distintas. Ninguna concentra una mayoría absoluta de los datos, lo que indica una distribución más repartida que en el caso de tipo u origen, aunque sí se observan algunas nacionalidades con más presencia que otras.

5. Análisis de variables cuantitativas

Para las variables cuantitativas continuas (precio, alcohol, carbohidratos, calorias) se calculan los principales indicadores de posición, tendencia central y dispersión.

skewness <- function(x) {
  n <- length(x)
  m3 <- sum((x - mean(x))^3) / n
  m3 / (sd(x)^3)
}

vars_cuant <- c("precio", "alcohol", "carbohidratos", "calorias")

resumen_cuant <- data.frame(
  Variable = vars_cuant,
  Media = sapply(datos[vars_cuant], mean),
  Mediana = sapply(datos[vars_cuant], median),
  Desv_estandar = sapply(datos[vars_cuant], sd),
  Minimo = sapply(datos[vars_cuant], min),
  Maximo = sapply(datos[vars_cuant], max),
  Asimetria = sapply(datos[vars_cuant], skewness)
)

resumen_cuant[,-1] <- round(resumen_cuant[,-1], 2)

kable(resumen_cuant)
Variable Media Mediana Desv_estandar Minimo Maximo Asimetria
precio precio 5.00 5.00 0.89 2.37 7.72 0.00
alcohol alcohol 18.71 17.67 5.46 0.03 59.45 0.96
carbohidratos carbohidratos 14.05 13.80 2.38 3.50 30.20 0.46
calorias calorias 193.17 182.00 46.57 21.00 541.00 0.92
ggplot(datos, aes(x = precio)) +
  geom_histogram(bins = 30, fill = "gray40", color = "white") +
  labs(title = "Distribución del precio", x = "Precio", y = "Frecuencia") +
  theme_minimal()

ggplot(datos, aes(x = calorias)) +
  geom_histogram(bins = 30, fill = "gray40", color = "white") +
  labs(title = "Distribución de las calorías", x = "Calorías", y = "Frecuencia") +
  theme_minimal()

El precio es la variable con la distribución más simétrica del grupo, ya que su media y su mediana son muy cercanas y su coeficiente de asimetría es prácticamente cero. En cambio, alcohol y calorias muestran una asimetría positiva más marcada, es decir, su media es mayor que su mediana debido a la presencia de valores altos que estiran la distribución hacia la derecha. Esto se puede ver en el histograma de calorías, donde la mayoría de los datos se concentra en la parte baja del rango, pero existe una cola de valores más altos y menos frecuentes.

6. Conclusiones

Este primer análisis descriptivo de beer2.csv permitió reconocer el tipo de cada variable, construir tablas de frecuencia para las variables cualitativas con un número manejable de categorías y calcular los principales indicadores descriptivos para las variables cuantitativas continuas.

En general, la base está dominada por cervezas importadas y por el tipo “cerveza normal y helada”, mientras que las nacionalidades están más repartidas entre las diez categorías registradas. En cuanto a las variables numéricas, el precio se comporta de manera simétrica y con poca dispersión, mientras que el alcohol y las calorías presentan mayor variabilidad y una distribución sesgada hacia la derecha. Este panorama general sirve como base para el análisis más profundo que se desarrolla en la Actividad 122, donde se estudian con mayor detalle dos variables cualitativas y dos cuantitativas.