# Cargar librerías necesarias
library(cluster)
library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(rio)
library(factoextra)
## Warning: package 'factoextra' was built under R version 4.4.2
## Cargando paquete requerido: ggplot2
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
# Cargar la base de datos
data=import("dataOK_all.xlsx")
## New names:
## • `` -> `...1`
# Calcular la razón de votación de Keiko entre Castillo
data <- data %>%
  mutate(razon_votacion = Keiko / Castillo)

# Verificar el cálculo
head(data$razon_votacion)
## [1] 0.4202271 0.6220444 0.6683045 0.1099285 0.6219261 0.6892180
# Seleccionar variables de interés
data_clean <- data %>%
  filter(provincia != "Lima") %>% # Excluir la provincia de Lima
  select(agua1_Red, razon_votacion, covidFallecidos) %>% 
  na.omit() # Eliminar filas con valores faltantes

# Normalizar las variables
data_scaled <- scale(data_clean)
# Calcular distancias euclidianas
dist_matrix <- dist(data_scaled)

# Clustering jerárquico aglomerativo
hclust_agg <- hclust(dist_matrix, method = "ward.D2")

# Dibujar el dendrograma
plot(hclust_agg, main = "Dendrograma - Jerárquico Aglomerativo", xlab = "", sub = "")

# Cortar el dendrograma para obtener k grupos (asumamos 4 grupos)
clusters_agg <- cutree(hclust_agg, k = 4)

# Añadir los grupos al dataset original
data_clean$cluster_agg <- clusters_agg
# Clustering jerárquico divisivo
diana_clust <- diana(data_scaled)

# Dibujar el dendrograma
plot(diana_clust, main = "Dendrograma - Jerárquico Divisivo", xlab = "", sub = "")

# Cortar el dendrograma para obtener k grupos
clusters_div <- cutree(as.hclust(diana_clust), k = 4)

# Añadir los grupos al dataset original
data_clean$cluster_div <- clusters_div
# Clustering k-means
set.seed(123) # Para reproducibilidad
kmeans_clust <- kmeans(data_scaled, centers = 4, nstart = 25)

# Añadir los grupos al dataset original
data_clean$cluster_kmeans <- kmeans_clust$cluster
# Índice de Silueta para cada técnica
sil_agg <- silhouette(clusters_agg, dist_matrix)
sil_div <- silhouette(clusters_div, dist_matrix)
sil_kmeans <- silhouette(kmeans_clust$cluster, dist_matrix)

# Visualización de índices de silueta
fviz_silhouette(sil_agg, main = "Silueta - Jerárquico Aglomerativo")
##   cluster size ave.sil.width
## 1       1  151          0.63
## 2       2   36          0.46
## 3       3    8          0.53
## 4       4    1          0.00

fviz_silhouette(sil_div, main = "Silueta - Jerárquico Divisivo")
##   cluster size ave.sil.width
## 1       1  153          0.62
## 2       2   35          0.50
## 3       3    7          0.61
## 4       4    1          0.00

fviz_silhouette(sil_kmeans, main = "Silueta - K-means")
##   cluster size ave.sil.width
## 1       1    1          0.00
## 2       2   62          0.45
## 3       3   13          0.32
## 4       4  120          0.68