# 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