# Cargar librerías necesarias
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3
library(factoextra)
## Warning: package 'factoextra' was built under R version 4.3.3
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
library(cluster)
## Warning: package 'cluster' was built under R version 4.3.3
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.3.3
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
# Cargar datos desde el archivo CSV
file_path <- "D:/@Josefh.QM/UNAP_24_1/Tecnicas_Estadisticas_Multivariadas/Ventas_vehiculos.csv"
datos <- read.csv(file_path, header = TRUE, sep = ";", fill = TRUE, comment.char = "")
# Eliminar columnas no necesarias para el clustering
datos_cluster <- subset(datos, select = -c(marca, modelo, tipo))
# Convertir las variables numéricas a formato adecuado
numeric_cols <- c("ventas", "reventa", "precio", "motor", "CV", "pisada", "ancho", "largo", "peso_neto", "deposito", "mpg")
datos_cluster[numeric_cols] <- lapply(datos_cluster[numeric_cols], function(x) as.numeric(gsub(",", ".", x)))
# Eliminar filas con NA/NaN/Inf
datos_cluster <- datos_cluster[complete.cases(datos_cluster), ]
# Escalar las variables numéricas
datos_escalados <- scale(datos_cluster)
# Distancias y Clustering Jerárquico
mat_dist <- dist(x = datos_escalados, method = "euclidean")
hc_complete <- hclust(d = mat_dist, method = "complete")
hc_average <- hclust(d = mat_dist, method = "average")
# Visualizar dendrogramas
par(mfrow = c(2, 1))
plot(hc_complete, main = "Dendrograma (Complete Linkage)", xlab = "", sub = "", cex = 0.6)
plot(hc_average, main = "Dendrograma (Average Linkage)", xlab = "", sub = "", cex = 0.6)

# K-Means Clustering
set.seed(123)
km_clusters <- kmeans(x = datos_escalados, centers = 4, nstart = 25)
# PAM Clustering
set.seed(123)
pam_clusters <- pam(x = datos_escalados, k = 4, metric = "manhattan")
# CLARA Clustering
set.seed(1234)
clara_clusters <- clara(x = datos_escalados, k = 4, metric = "manhattan", stand = TRUE, samples = 50, pamLike = TRUE)
# Visualización de Clusters con PCA
# Visualizar clusters generados por K-Means
fviz_cluster(km_clusters, data = datos_escalados, geom = "point", ellipse.type = "convex", palette = "jco", ggtheme = theme_classic())

# Visualizar clusters generados por PAM
fviz_cluster(pam_clusters, data = datos_escalados, geom = "point", ellipse.type = "convex", palette = "jco", ggtheme = theme_classic())

# Visualizar clusters generados por CLARA
fviz_cluster(clara_clusters, data = datos_escalados, geom = "point", ellipse.type = "convex", palette = "jco", ggtheme = theme_classic())

# Comparación de Clusters
# Esta tabla muestra la comparación entre los clusters generados por K-Means y PAM.
# Por ejemplo, hay 26 observaciones que están en el Cluster 1 según K-Means y también están en el Cluster 1 según PAM.
table(km_clusters$cluster, pam_clusters$clustering, dnn = list("K-Means", "PAM"))
## PAM
## K-Means 1 2 3 4
## 1 26 15 0 0
## 2 0 0 4 4
## 3 0 34 18 1
## 4 0 1 14 0
# Aquí se compara la asignación de clusters entre K-Means y CLARA.
# Por ejemplo, hay 27 observaciones que pertenecen al Cluster 1 según K-Means y también están en el Cluster 1 según CLARA.
table(km_clusters$cluster, clara_clusters$clustering, dnn = list("K-Means", "CLARA"))
## CLARA
## K-Means 1 2 3 4
## 1 27 0 0 14
## 2 0 5 3 0
## 3 0 23 11 19
## 4 0 1 13 1
# Esta tabla muestra cómo se asignan los mismos datos a los clusters generados por PAM y CLARA.
# Por ejemplo, hay 26 observaciones en el Cluster 1 según PAM y también están en el Cluster 1 según CLARA.
table(pam_clusters$clustering, clara_clusters$clustering, dnn = list("PAM", "CLARA"))
## CLARA
## PAM 1 2 3 4
## 1 26 0 0 0
## 2 1 15 0 34
## 3 0 9 27 0
## 4 0 5 0 0
# Evaluación de Clustering
# Aquí se calcula el coeficiente de silueta para evaluar la calidad de los clusters generados por K-Means.
silhouette_kmeans <- silhouette(km_clusters$cluster, dist(datos_escalados))
# Este paso calcula el coeficiente de silueta para evaluar la calidad de los clusters generados por PAM.
silhouette_pam <- silhouette(pam_clusters$clustering, dist(datos_escalados))
# Este cálculo se centra en el coeficiente de silueta para evaluar los clusters generados por CLARA.
silhouette_clara <- silhouette(clara_clusters$clustering, dist(datos_escalados))
# Plot Silhouette
# Este gráfico visualiza el coeficiente de silueta para cada observación en los clusters generados por K-Means.
# Valores más cercanos a 1 indican una buena separación entre los clusters.
fviz_silhouette(silhouette_kmeans) + theme_classic()
## cluster size ave.sil.width
## 1 1 41 0.37
## 2 2 8 0.28
## 3 3 53 0.27
## 4 4 15 0.06

# Aquí se muestra el coeficiente de silueta para cada observación en los clusters generados por PAM.
# Nuevamente, valores más cercanos a 1 indican una mejor calidad de clustering.
fviz_silhouette(silhouette_pam) + theme_classic()
## cluster size ave.sil.width
## 1 1 26 0.36
## 2 2 50 0.25
## 3 3 36 0.07
## 4 4 5 0.30

# Este gráfico representa el coeficiente de silueta para cada observación en los clusters generados por CLARA.
# Valores más cercanos a 1 sugieren una buena separación entre clusters.
fviz_silhouette(silhouette_clara) + theme_classic()
## cluster size ave.sil.width
## 1 1 27 0.31
## 2 2 29 0.01
## 3 3 27 0.11
## 4 4 34 0.24
