Introducción

En este trabajo se presenta un análisis del conjunto de datos mpg, perteneciente al paquete ggplot2. Este dataset contiene información sobre vehículos fabricados en 2008, enfocado en variables técnicas y de rendimiento energético. El objetivo es identificar patrones de consumo y predecir el rendimiento urbano (cty) usando modelos estadísticos.

Carga y preparación de los datos

Primero cargamos las librerías necesarias:

# Cargar librerías
library(patchwork)
library(ggplot2)
library(tidyr) 
library(dendextend)
library(ggdendro)
library(treemap)
library(GGally)
library(calibrate)
library(dplyr)
library(ggcorrplot)
library(kableExtra)
library(protoclust)
library(dendextend)

Datasets

require(ggplot2)
# Cargar datos
data <- subset(mpg)

# Convertir datos a formato largo para análisis comparativo de consumo en ciudad (cty) y carretera (hwy)
data_largo <- data %>% 
  pivot_longer(cols = c(cty, hwy), names_to = "tipo_consumo", values_to = "mpg")

# Mostrar primeras filas
head(data, 5)
## # A tibble: 5 × 11
##   manufacturer model displ  year   cyl trans      drv     cty   hwy fl    class 
##   <chr>        <chr> <dbl> <int> <int> <chr>      <chr> <int> <int> <chr> <chr> 
## 1 audi         a4      1.8  1999     4 auto(l5)   f        18    29 p     compa…
## 2 audi         a4      1.8  1999     4 manual(m5) f        21    29 p     compa…
## 3 audi         a4      2    2008     4 manual(m6) f        20    31 p     compa…
## 4 audi         a4      2    2008     4 auto(av)   f        21    30 p     compa…
## 5 audi         a4      2.8  1999     6 auto(l5)   f        16    26 p     compa…

Contexto

En el contexto actual de creciente preocupación por el impacto ambiental y el costo del combustible, la eficiencia energética de los vehículos se ha convertido en un factor clave tanto para los consumidores como para los fabricantes. Las decisiones relacionadas con el diseño de autos, selección de motor, tipo de transmisión y tracción tienen un impacto directo sobre el consumo de combustible, lo cual afecta no solo el bolsillo del usuario final, sino también la huella ecológica del sector transporte.
Este estudio utiliza el conjunto de datos mpg, proveniente del paquete ggplot2, que contiene información técnica y de rendimiento de diversos vehículos comercializados en Estados Unidos. A partir de este dataset, se busca analizar y modelar el comportamiento del consumo de combustible en ciudad, identificar agrupaciones de vehículos según sus características de eficiencia, y visualizar patrones clave que permitan comprender cómo variables como el cilindraje, número de cilindros, tipo de transmisión o clase del vehículo influyen en el rendimiento.

Objetivos del Estudio

Analizar los factores que influyen en la eficiencia de combustible en ciudad y carretera en vehículos, utilizando el conjunto de datos mpg, a través de técnicas de análisis exploratorio, modelado de regresión y segmentación, con el propósito de identificar patrones relevantes que permitan comprender y explicar el comportamiento del consumo vehicular.

Cantidad vehículos por fabricante y año

# Asegúrate de que 'year' esté como factor
data$year <- as.factor(data$year)

# Contar vehículos por fabricante y año
conteo_fabricantes <- data %>%
  group_by(manufacturer, year) %>%
  summarise(cantidad = n(), .groups = 'drop')

# Calcular totales por año
totales <- conteo_fabricantes %>%
  group_by(year) %>%
  summarise(total = sum(cantidad))

# Gráfico
ggplot(conteo_fabricantes, aes(x = reorder(manufacturer, -cantidad), y = cantidad, fill = year)) +
  geom_bar(stat = "identity", position = position_dodge(width = 0.8)) +
  geom_text(aes(label = cantidad), 
            position = position_dodge(width = 0.8), vjust = -0.4, size = 3) +
  labs(
    title = "Cantidad de Vehículos por Fabricante y Año del Modelo",
    x = "Fabricante",
    y = "Cantidad de Vehículos",
    fill = "Año del Modelo"
  ) +
  annotate("label", x = 13, y = max(conteo_fabricantes$cantidad) + 3,
           label = paste0("Total 1999: ", totales$total[totales$year == "1999"],
                          "\nTotal 2008: ", totales$total[totales$year == "2008"]),
           fill = "gray90", label.size = 0.3, size = 4) +
  scale_fill_manual(values = c("1999" = "#E76F51", "2008" = "#2A9D8F")) +
  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5),
    axis.text.x = element_text(angle = 45, hjust = 1)
  )

Relación en Modelos y Fabricantes

# Crear tabla de frecuencia fabricante-modelo
tabla_modelos <- data %>%
  count(manufacturer, model)

# Gráfico heatmap con etiquetas y eje X vertical
ggplot(tabla_modelos, aes(x = manufacturer, y = model, fill = n)) +
  geom_tile(color = "white") +
  geom_text(aes(label = n), size = 3, color = "white") +
  scale_fill_gradient(low = "#E76F51", high = "#2A9D8F") +
  labs(
    title = "Relación entre Modelos y Fabricantes",
    x = "Fabricante",
    y = "Modelo",
    fill = "Cantidad"
  ) +
  theme_minimal(base_size = 11) +
  theme(
    axis.text.x = element_text(angle = 90, hjust = 1),   # ← Etiquetas verticales
    axis.text.y = element_text(size = 8),
    plot.title = element_text(face = "bold", hjust = 0.5)
  )

Análisis Exploratorio de Datos (EDA)

Relación entre clase de vehiculo y consumo

# Panel A: Tracción
panel_drv <- data_largo %>%
  mutate(grupo = drv,
         panel = "A - Tipo de Tracción")

# Panel B: Transmisión
panel_trans <- data_largo %>%
  mutate(grupo = trans,
         panel = "B - Tipo de Transmisión")

# Combinar ambos paneles en un solo dataset
data_panel <- bind_rows(panel_drv, panel_trans)

a <- ggplot(data_panel, aes(x = grupo, y = mpg, fill = tipo_consumo)) +
  geom_boxplot(position = position_dodge(0.8)) +
  facet_wrap(~ panel, scales = "free_x") +
  labs(
    title = "Consumo por Transmisión y Tracción",
    x = "Categoría", y = "Consumo (mpg)", fill = "Tipo de Consumo"
  ) +
  scale_fill_manual(values = c("cty" = "#E76F51", "hwy" = "#2A9D8F"),
                    labels = c("Ciudad", "Carretera")) +
  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5, size = 16),
    strip.text = element_text(face = "bold", size = 14),             
    axis.text.x = element_text(angle = 45, hjust = 1, size = 10),    
    axis.title = element_text(size = 12),                            
    legend.title = element_text(size = 12),                          
    legend.text = element_text(size = 10),                           
    hjust = 1, 
    vjust = 0.5, 
    size = 10
  )
a

ggplot(data_largo, aes(x = class, y = mpg, fill = tipo_consumo)) +
  geom_boxplot(position = position_dodge(0.8)) +
  labs(
    title = "Consumo por Clase de Vehículo",
    x = "Clase de Vehículo", y = "Consumo (mpg)", fill = "Tipo de Consumo"
  ) +
  scale_fill_manual(values = c("cty" = "#E76F51", "hwy" = "#2A9D8F"),
                    labels = c("Ciudad", "Carretera")) +
  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5, size = 16), 
    strip.text = element_text(face = "bold", size = 14),             
    axis.text.x = element_text(angle = 45, hjust = 1, size = 10),    
    axis.title = element_text(size = 12),                            
    legend.title = element_text(size = 12),                          
    legend.text = element_text(size = 10)                            
  )

Relación entre Consumo de Combustible vs Cilindraje del Motor

ggplot(data_largo, aes(x = displ, y = mpg, color = tipo_consumo, shape = tipo_consumo)) +
  geom_point(alpha = 0.8, size = 2.8) +
  scale_color_manual(values = c("cty" = "#E76F51", "hwy" = "#2ca02c"),
                     labels = c("Ciudad (cty)", "Carretera (hwy)")) +
  scale_shape_manual(values = c(16, 17),
                     labels = c("Ciudad (cty)", "Carretera (hwy)")) +
  labs(
    title = "Consumo de Combustible vs Cilindraje del Motor",
    subtitle = "Comparación entre ciudad y carretera",
    x = "Cilindraje del motor (L)",
    y = "Consumo (mpg)",
    color = "Tipo de consumo",
    shape = "Tipo de consumo"
  ) +
  theme_minimal(base_size = 13) +
  theme(
    legend.position = "bottom",
    plot.title = element_text(face = "bold", hjust = 0.5),       # Negrilla y centrado
    plot.subtitle = element_text(hjust = 0.5)                    # Centrado
  )

Consumo vs Cilindraje por Tipo de Consumo, Número de Cilindros y Año del Modelo

Este gráfico de dispersión con facetas explora la relación entre el cilindraje del motor y el consumo de combustible, diferenciando por el tipo de consumo (ciudad/carretera), el número de cilindros y el año del modelo.
ggplot(data_largo, aes(x = displ, y = mpg, color = factor(year))) +
  geom_point(size = 2.5, alpha = 0.7) +
  facet_grid(tipo_consumo ~ cyl, labeller = label_both) +
  labs(
    title = "Consumo de Combustible vs. Cilindraje del Motor",
    subtitle = "Por Tipo de Consumo, Número de Cilindros y Año del Modelo",
    x = "Cilindraje del Motor",
    y = "Consumo (MPG)",
    color = "Año del Modelo"
  ) +
  scale_color_manual(values = c("1999" = "#E76F51", "2008" = "#2ca02c")) +
  theme_minimal(base_size = 12) +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 18),
    plot.subtitle = element_text(hjust = 0.5, size = 14, margin = margin(b = 10)),
    strip.background = element_rect(fill = "#d3d3d3", color = NA),
    strip.text = element_text(face = "bold", size = 10),
    legend.position = "bottom",
    legend.title = element_text(size = 12, face = "bold"),
    legend.text = element_text(size = 10),
    axis.title = element_text(size = 12),
    axis.text = element_text(size = 10),
    panel.spacing = unit(0.5, "lines")
  )

Distribución del Consumo de Combustible por Tipo y Condición

Este gráfico de cajas ilustra la distribución del consumo de combustible (MPG), diferenciando entre ciudad y carretera, y analizando cómo varía según el tipo de combustible (fl) que utiliza el vehículo. La visualización permite identificar la eficiencia típica para cada combinación de combustible y condición de manejo.

# Definir las etiquetas descriptivas para los tipos de combustible (fl)
combustible_labels <- c(
  "c" = "Gasolina con plomo",  # c: compressed natural gas (gas natural comprimido)
  "d" = "Diésel",             # d: diesel
  "e" = "Etanol E85",         # e: ethanol E85
  "p" = "Premium sin plomo",  # p: premium unleaded
  "r" = "Regular sin plomo",   # r: regular unleaded
  "x" = "Regular sin plomo",   # x: regular unleaded (legacy) - en mpg, 'x' y 'r' son ambos regular
  "z" = "Premium sin plomo"    # z: premium unleaded (legacy) - en mpg, 'z' y 'p' son ambos premium
)

# Asegúrate de que fl sea un factor si no lo es, para que se ordene bien
data_largo$fl <- factor(data_largo$fl, levels = names(combustible_labels), labels = unname(combustible_labels))


# Gráfico con etiquetas de leyenda más descriptivas
ggplot(data_largo, aes(x = fl, y = mpg, fill = tipo_consumo)) +
  geom_boxplot(alpha = 0.8) +
  facet_wrap(~ tipo_consumo, labeller = as_labeller(c(cty = "Ciudad", hwy = "Carretera"))) +
  scale_fill_manual(
    values = c("cty" = "#E76F51", "hwy" = "#2A9D8F"), # Mantengo tus colores previos de ciudad/carretera
    labels = c("Ciudad", "Carretera"),
    name = "Tipo de Consumo" # Título para la leyenda
  ) +
  # Usamos scale_x_discrete con los labels definidos
  scale_x_discrete(labels = unique(unname(combustible_labels))) + # Solo las etiquetas únicas
  labs(
    title = "Distribución del Consumo de Combustible por Tipo y Condición",
    subtitle = "Análisis comparativo de MPG en Ciudad y Carretera",
    x = "Tipo de Combustible",
    y = "Consumo (MPG)", # Cambiado a MPG
    fill = "Condición de Manejo" # Leyenda más clara
  ) +
  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5, size = 18),
    plot.subtitle = element_text(hjust = 0.5, size = 14, margin = margin(b = 10)),
    axis.text.x = element_text(angle = 45, hjust = 1, size = 10),
    axis.title = element_text(size = 12),
    strip.background = element_rect(fill = "#d3d3d3", color = NA),
    strip.text = element_text(face = "bold", size = 12),
    legend.position = "bottom",
    legend.title = element_text(face = "bold", size = 12),
    legend.text = element_text(size = 10)
  )

En resumen, este análisis nos ayudó a entender qué factores afectan el consumo de combustible en los vehículos usando el dataset mpg. Exploramos cómo variables como el cilindraje, el número de cilindros, el tipo de transmisión y la tracción influyen tanto en el consumo en ciudad como en carretera.

Con modelos de regresión pudimos medir cuánto impacta cada factor, mientras que técnicas como K-means y el agrupamiento jerárquico nos mostraron grupos claros de vehículos con comportamientos similares en términos de eficiencia. Además, herramientas como el PCA y los gráficos de coordenadas paralelas nos dieron una visión completa de los patrones ocultos en los datos.

Todo esto es útil no solo para quien compra un auto, sino también para fabricantes y tomadores de decisiones interesados en mejorar la eficiencia energética.

Modelación Estadística

Regresión lineal múltiple

Este modelo de regresión múltiple busca predecir el consumo en ciudad (cty) basándose en el cilindraje del motor (displ), el número de cilindros (cyl) y el consumo en carretera (hwy). Este enfoque nos permite entender cómo las características mecánicas y el desempeño en carretera se relacionan con la eficiencia de un vehículo en entornos urbanos.

# Modelo de regresión múltiple
modelo_reg <- lm(cty ~ displ + cyl + hwy, data = data)

# Obtener el resumen del modelo
summary_modelo <- summary(modelo_reg)

# Extraer los coeficientes y sus estadísticas
coeficientes_df_raw <- as.data.frame(summary_modelo$coefficients)

# Renombrar columnas para mayor claridad y trabajar con el mismo dataframe
colnames(coeficientes_df_raw) <- c("Estimado", "Error Estándar", "Valor t", "Valor p")

# Función para añadir asteriscos de significancia
format_pvalue_stars <- function(pvalue) {
  stars <- case_when(
    pvalue < 0.001 ~ "***",
    pvalue < 0.01 ~ "**",
    pvalue < 0.05 ~ "*",
    TRUE ~ ""
  )
  paste0(sprintf("%.4f", pvalue), stars)
}

# Aplicar el formato de p-value y añadir la columna de significancia
coeficientes_df_final <- coeficientes_df_raw %>%
  mutate(
    Sig. = format_pvalue_stars(`Valor p`),
    # Redondear las columnas numéricas para la presentación
    across(c(Estimado, `Error Estándar`, `Valor t`, `Valor p`), ~ round(., 4))
  )

# Crear la tabla con knitr::kable y aplicar estilos con kableExtra
knitr::kable(
  coeficientes_df_final,
  caption = "Resultados del Modelo de Regresión: Predicción de Consumo en Ciudad (cty)",
  format = "html",
  digits = 4,
  align = "lrrrrr" # Alineación de las columnas
) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed", "responsive"),
    full_width = TRUE, 
    position = "center" 
  ) %>%
  add_header_above(c(" " = 1, "Estadísticas del Coeficiente" = 4, "Significancia" = 1)) %>%
  column_spec(1, bold = TRUE, border_right = TRUE) %>%
  column_spec(5, border_right = TRUE) %>% 
  footnote(
    general = "Significancia: *** p < 0.001; ** p < 0.01; * p < 0.05",
    general_title = ""
  )
Resultados del Modelo de Regresión: Predicción de Consumo en Ciudad (cty)
Estadísticas del Coeficiente
Significancia
Estimado Error Estándar Valor t Valor p Sig.
(Intercept) 6.0879 0.8323 7.3148 0.0000 0.0000***
displ -0.0593 0.1635 -0.3630 0.7170 0.7170
cyl -0.4483 0.1301 -3.4455 0.0007 0.0007***
hwy 0.5809 0.0201 28.9000 0.0000 0.0000***
Significancia: *** p < 0.001; ** p < 0.01; * p < 0.05

Explicación de los Resultados

Los resultados en la tabla cuantifican la influencia de cada factor en el consumo de combustible en ciudad (MPG urbano). La columna “Estimado” indica cuánto cambia, en promedio, el MPG en ciudad por cada unidad de aumento en la variable correspondiente, asumiendo que el resto de los factores se mantienen constantes. Por ejemplo, un coeficiente negativo para el cilindraje del motor (displ) o el número de cilindros (cyl) implicaría que un motor más grande o con más cilindros está asociado a un menor MPG en ciudad. El coeficiente para el consumo en carretera (hwy) muestra la relación directa entre el consumo en carretera y el consumo en ciudad. Los “Valores p”, por su parte, nos permiten determinar la significancia estadística de cada predictor; un valor p bajo (generalmente menor a 0.05) sugiere que la relación observada no es simplemente una casualidad.

p1 <- ggplot(data, aes(x = displ, y = cty)) +
  geom_point(alpha = 0.6, color = "#1f77b4", size = 2.5) +
  stat_smooth(method = "lm", formula = y ~ x + log(x), se = FALSE, color = "#d62728", linewidth = 1.2) +
  labs(
    title = "Consumo en Ciudad vs Cilindraje del Motor",
    subtitle = "Con línea ajustada del modelo de regresión",
    x = "Cilindraje (L)",
    y = "Consumo en Ciudad (mpg)"
  ) +
  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5),
    plot.subtitle = element_text(hjust = 0.5)
  )
p2 <- ggplot(data, aes(x = displ, y = hwy)) +
  geom_point(alpha = 0.6, color = "#2ca02c", size = 2.5) +
  stat_smooth(method = "lm", formula = y ~ x + log(x), se = FALSE, color = "#d62728", linewidth = 1.2) +
  labs(
    title = "Consumo en Carretera vs Cilindraje del Motor",
    subtitle = "Con línea ajustada del modelo de regresión",
    x = "Cilindraje (L)",
    y = "Consumo en Carretera (mpg)"
  ) +
  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5),
    plot.subtitle = element_text(hjust = 0.5)
  )
p1 + p2

El modelo muestra una relación significativa entre las variables predictoras y el rendimiento urbano. La variable más influyente es .hwy

Agrupamiento K-means + PCA

El modelo muestra una relación significativa entre las variables predictoras y el rendimiento urbano. La variable más influyente es hwy.

Agrupamiento K-means + PCA Objetivo: Identificar grupos de vehículos con características similares en cuanto a eficiencia y desempeño técnico.

Los tres clusters representan distintos niveles de eficiencia:

  • Grupo 1: Alta eficiencia (motores pequeños, alto rendimiento)
  • Grupo 2: Eficiencia media
  • Grupo 3: Baja eficiencia (motores grandes, bajo rendimiento)
# 1. Usamos 'data' y aseguramos que 'cyl' sea numérica
data$cyl <- as.numeric(as.character(data$cyl))

# 2. Selección de variables numéricas relevantes
datos_num <- data %>% 
  select(displ, cyl, cty, hwy)

# 3. Estandarización de los datos (importante para k-means)
datos_scaled <- scale(datos_num)

# 4. Aplicar k-means con 3 clusters (como tienes en tu código)
set.seed(123)  # Para reproducibilidad
kmeans_model <- kmeans(datos_scaled, centers = 3)

# 5. Asignar nombres a los clusters
data$cluster <- factor(kmeans_model$cluster,
                        levels = c(2, 1, 3),
                        labels = c("Alta eficiencia", "Media eficiencia", "Baja eficiencia"))

# 6. Aplicar PCA
pca <- prcomp(datos_scaled, center = TRUE, scale. = TRUE)

# 7. Definir la paleta de colores personalizada
colores_eficiencia <- c(
  "Alta eficiencia" = "#2ca02c",  # verde
  "Media eficiencia" = "#1f77b4",  # azul
  "Baja eficiencia" = "#d62728"   # rojo
)

# Visualización de clusters con nombres
grafico_4 <- ggplot(data, aes(x = displ, y = cty, color = cluster)) +
  geom_point(size = 3) +
  labs(title = "Agrupamiento K-means con Nombres de Grupo",
       x = "Tamaño del Motor (L)",
       y = "Rendimiento en Ciudad (mpg)",
       color = "Eficiencia") + 
  scale_color_manual(values = colores_eficiencia) + 
  theme_minimal() +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5, size = 16),
    axis.title = element_text(size = 12),
    axis.text = element_text(size = 10),
    legend.title = element_text(size = 12),
    legend.text = element_text(size = 10)
  )

grafico_4

Agrupamiento jerárquico

# Calcular distancias euclidianas entre observaciones
distancias <- dist(datos_scaled)

# Agrupamiento jerárquico usando método ward.D2
hc <- hclust(distancias, method = "ward.D2")

# Convertir el hclust a un objeto dendrogram.
dend <- as.dendrogram(hc)

# Mapear los labels del dendrograma a los clusters de k-means.
order_labels <- order.dendrogram(dend)
cluster_colors_ordered <- data$cluster[order_labels]

Extraer Prototipos para Simplificar el Diagrama

Los prototipos (centroides de los clusters) representan un “resumen” de cada grupo, simplificando la interpretación de las características principales de cada cluster.

# Obtener los centroides de los clusters de K-means (prototipos)
prototypes_scaled <- kmeans_model$centers

# Desescalar los centroides para interpretarlos en las unidades originales de las variables
original_means <- attr(datos_scaled, "scaled:center")
original_sds <- attr(datos_scaled, "scaled:scale")

prototypes_original <- sweep(prototypes_scaled, 2, original_sds, FUN = "*")
prototypes_original <- sweep(prototypes_original, 2, original_means, FUN = "+")

# Convertir a dataframe para mejor visualización
prototypes_df <- as.data.frame(prototypes_original)

# Renombrar las filas con los nombres de los clusters para mayor claridad
row.names(prototypes_df) <- levels(data$cluster)

# Opcional: Redondear los valores para una mejor lectura
prototypes_df_rounded <- round(prototypes_df, 2)

# Mostrar la tabla de prototipos usando kable
knitr::kable(prototypes_df_rounded,
             caption = "Prototipos de los Clusters de Eficiencia Vehicular",
             col.names = c("Cilindraje", "Cilindros", "MPG Ciudad", "MPG Carretera"))
Prototipos de los Clusters de Eficiencia Vehicular
Cilindraje Cilindros MPG Ciudad MPG Carretera
Alta eficiencia 3.37 5.88 16.19 22.68
Media eficiencia 2.13 4.05 21.31 29.32
Baja eficiencia 5.13 8.00 12.57 17.63

Este gráfico de prototipos te permite ver de forma clara las características promedio de cada uno de los tres grupos de eficiencia identificados.

Treemap: Eficiencia General con Diferencia Ciudad/Carretera

Los treemaps ofrecen una perspectiva visual y cuantitativa de cómo las distintas clases de vehículos contribuyen al consumo promedio general, tanto en ciudad como en carretera. El tamaño de cada rectángulo es proporcional al rendimiento promedio de esa clase de vehículo, mientras que el color (tonos de azul para ciudad y verdes para carretera) refuerza esta medida, con colores más intensos indicando mayor eficiencia. Adicionalmente, las etiquetas dentro de cada segmento ahora muestran el nombre de la clase, su consumo promedio en MPG, y el porcentaje que esa clase representa del consumo promedio total de todas las clases en esa condición. Esto permite identificar rápidamente las clases más y menos eficientes, así como su peso relativo en el panorama general del consumo.

# 1. Calcular rendimiento medio y sumar para porcentajes para Cty
data_media_cty <- data %>%
  group_by(class) %>%
  summarise(promedio_mpg = mean(cty, na.rm = TRUE), .groups = 'drop') %>%
  mutate(porcentaje = promedio_mpg / sum(promedio_mpg) * 100) %>%
  arrange(desc(promedio_mpg)) %>% # Ordenar para mejor visualización
  # Crear una etiqueta combinada para el treemap
  mutate(label_text = paste0(class, "\n", sprintf("%.1f", promedio_mpg), " MPG\n(", sprintf("%.1f", porcentaje), "%)"))

# 2. Calcular rendimiento medio y sumar para porcentajes para Hwy
data_media_hwy <- data %>%
  group_by(class) %>%
  summarise(promedio_mpg = mean(hwy, na.rm = TRUE), .groups = 'drop') %>%
  mutate(porcentaje = promedio_mpg / sum(promedio_mpg) * 100) %>%
  arrange(desc(promedio_mpg)) %>%
  # Crear una etiqueta combinada para el treemap
  mutate(label_text = paste0(class, "\n", sprintf("%.1f", promedio_mpg), " MPG\n(", sprintf("%.1f", porcentaje), "%)"))


# --- Treemap para Consumo en Ciudad ---
# La función treemap genera el gráfico directamente, así que la llamamos dentro de un contexto para imprimir.
message("\n### Consumo Promedio en Ciudad (MPG) por Clase de Vehículo")
treemap(data_media_cty,
          index = "label_text", # Usamos la nueva columna con etiquetas combinadas
          vSize = "promedio_mpg",
          vColor = "promedio_mpg",
          type = "value",
          title = "Consumo Promedio en Ciudad (MPG) por Clase",
          palette = "Blues",
          border.col = "#FFFFFF",
          fontfamily.title = "sans",
          fontfamily.labels = "sans",
          fontsize.title = 16,
          fontsize.labels = 10,
          fontcolor.labels = "white",
          bg.labels = "#00000050",
          position.legend = "none"
          )

# --- Treemap para Consumo en Carretera ---
message("\n### Consumo Promedio en Carretera (MPG) por Clase de Vehículo")
treemap(data_media_hwy,
          index = "label_text", # Usamos la nueva columna con etiquetas combinadas
          vSize = "promedio_mpg",
          vColor = "promedio_mpg",
          type = "value",
          title = "Consumo Promedio en Carretera (MPG) por Clase",
          palette = "Greens",
          border.col = "#FFFFFF",
          fontfamily.title = "sans",
          fontfamily.labels = "sans",
          fontsize.title = 16,
          fontsize.labels = 10,
          fontcolor.labels = "white",
          bg.labels = "#00000050",
          position.legend = "none"
          )

Este gráfico resalta visualmente qué tipos de vehículos tienen mayor eficiencia energética.

Visualización Multidimensional

Coordenadas Paralelas

Permite visualizar perfiles multidimensionales de grupos de vehículos. En este caso, mostramos los tres clusters obtenidos anteriormente.

# Seleccionar variables para coordenadas paralelas
datos_vis <- data %>%
  dplyr::select(cluster, displ, cyl, cty, hwy)

# 2. Definir la paleta de colores personalizada (la misma que usaste para el K-means)
colores_eficiencia <- c(
  "Alta eficiencia" = "#2ca02c",  # verde
  "Media eficiencia" = "#1f77b4",  # azul
  "Baja eficiencia" = "#d62728"   # rojo
)

# 3. Gráfico de coordenadas paralelas
grafico_9 <- ggparcoord(data = datos_vis,
                        columns = 2:5, 
                        groupColumn = "cluster",
                        alphaLines = 0.5, 
                        title = "Perfiles de Clusters de Eficiencia Vehicular", 
                        showPoints = FALSE, 
                        boxplot = TRUE, 
                        scale = "robust" 
                        ) +
  # Personalizar etiquetas de los ejes
  scale_x_discrete(labels = c(
    "displ" = "Cilindraje",
    "cyl" = "Cilindros",
    "cty" = "MPG Ciudad",
    "hwy" = "MPG Carretera"
  )) +
  # Aplicar los colores personalizados
  scale_color_manual(values = colores_eficiencia) +
  # Ajustar el tema y elementos de texto
  theme_minimal() +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5, size = 18), # Título del gráfico
    axis.title.x = element_blank(), 
    axis.title.y = element_blank(), 
    axis.text.x = element_text(angle = 45, hjust = 1, size = 12), 
    axis.text.y = element_text(size = 10), 
    legend.position = "right", 
    legend.title = element_text(face = "bold", size = 14), 
    legend.text = element_text(size = 12) 
  )

grafico_9

Este gráfico ayuda a comparar patrones de consumo y desempeño entre los distintos grupos identificados.

Multidimensionamiento Escalar (MDS)

Este gráfico de Escalamiento Multidimensional (MDS) reduce las complejas relaciones entre vehículos a un espacio bidimensional. La proximidad entre los puntos en el gráfico indica similitud entre vehículos, y están coloreados según su clase de vehículo, lo que permite identificar agrupaciones naturales.

# 1. Calcular MDS
# Usamos las distancias euclidianas de los datos estandarizados.
mds <- cmdscale(dist(datos_scaled), k = 2)

# 2. Convertir a dataframe para ggplot
mds_df <- as.data.frame(mds)
colnames(mds_df) <- c("Dim1", "Dim2") # Nombres más descriptivos para las dimensiones
mds_df$class <- data$class # Añadir la columna de clase

# 3. Gráfico de MDS
grafico_10 <- ggplot(mds_df, aes(x = Dim1, y = Dim2, color = class)) +
  geom_point(size = 3, alpha = 0.8) + # Ajustar tamaño y añadir transparencia
  labs(
    title = "MDS: Posición Relativa de Vehículos por Clase",
    subtitle = "Basado en Características Estandarizadas", # Añadir un subtítulo
    x = "Dimensión 1 (MDS)", # Etiqueta más clara para el eje X
    y = "Dimensión 2 (MDS)", # Etiqueta más clara para el eje Y
    color = "Clase de Vehículo" # Título de la leyenda más descriptivo
  ) +
  scale_color_brewer(palette = "Set2") + # Usar una paleta de colores cualitativa (o "Dark2", "Paired", etc.)
  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 18),
    plot.subtitle = element_text(hjust = 0.5, size = 14, margin = margin(b = 10)),
    axis.title = element_text(size = 12),
    axis.text = element_text(size = 10),
    legend.position = "right",
    legend.title = element_text(face = "bold", size = 12),
    legend.text = element_text(size = 10)
  )
grafico_10

Este gráfico muestra cómo se distribuyen los vehículos en un espacio de dos dimensiones basado en sus similitudes.

Análisis de Componentes Principales (PCA)

Este gráfico de Análisis de Componentes Principales (PCA) visualiza la distribución de los vehículos en un espacio bidimensional, utilizando los dos primeros componentes principales. Los puntos están coloreados según los clusters de eficiencia (Alta, Media, Baja) identificados previamente, permitiendo observar cómo se agrupan los vehículos con base en sus características técnicas.

# Proyectar datos en componentes principales
pca_data <- data.frame(pca$x, cluster = data$cluster)

# Gráfico de biplots (componentes 1 y 2)
grafico_11 <- ggplot(pca_data, aes(x = PC1, y = PC2, color = cluster)) +
  geom_point(size = 3, alpha = 0.8) + # Ajuste de transparencia para visibilidad
  labs(
    title = "PCA: Agrupamiento de Vehículos por Eficiencia", # Título más descriptivo
    x = "Componente Principal 1",
    y = "Componente Principal 2",
    color = "Eficiencia" # Nombre más claro para la leyenda
  ) +
  scale_color_manual(values = colores_eficiencia) + # ¡Aplicamos los colores aquí!
  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 18),
    axis.title = element_text(size = 12),
    axis.text = element_text(size = 10),
    legend.position = "right",
    legend.title = element_text(face = "bold", size = 12),
    legend.text = element_text(size = 10)
  )

grafico_11

Conclusiones

Los distintos métodos de visualización han sido clave para explorar y entender las complejidades del conjunto de datos. Desde gráficos de dispersión y paneles facetados que muestran cómo se relacionan variables como el consumo y el cilindraje, hasta técnicas avanzadas como el Análisis de Componentes Principales (PCA) y el Escalamiento Multidimensional (MDS), cada herramienta nos ha ayudado a ver los datos desde ángulos diferentes.

Con K-means y coordenadas paralelas identificamos patrones de agrupamiento entre los vehículos, mientras que los treemaps nos permitieron comprender mejor la distribución de ciertas características. Además, los modelos de regresión nos ofrecieron una forma de evaluar cómo factores como el peso o el número de cilindros afectan la eficiencia del vehículo.

En conjunto, las visualizaciones y análisis no solo contribuyen a una comprensión profunda y multifacética del conjunto de datos, sino que también han sido fundamentales para descubrir tendencias importantes sobre el rendimiento y la eficiencia del consumo de combustible de los vehiculos.