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)
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.
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.
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.
Se seleccionan tres variables cualitativas con un número razonable de
categorías: origen, tipo y
nacionalidad.
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í.
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.
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.
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.
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.