###########################################
######### ANALIAIS DE CLUSTERS ############
###########################################

library(factoextra)
library(dplyr)
library(tidyr)
library(readxl)
library(tidyverse)
library(cluster)
library(NbClust)
library(ggplot2)
library(writexl)
library(gridExtra)
library(plyr)
library(reshape2)

## establecer directorio de trabajo
setwd("~/Documents/EconWork/Quantil_CRC_Clusters/Data/")

## Cargar datos
load('BaseClusterFinal.RData')

#_________________________________________________________________________________ ####
# ELECCION DE VARIABLES ####

## Municipios excluidos
exc <- as.data.frame(read_excel("320 municipios exceptuados - Clúster CRC.xlsx"))
exc <- exc[, c('DIVIPOLA', 'Exceptuados')]

## Eliminar excluidos
dt <- dt[!(dt$id_municipio %in% exc$DIVIPOLA), ]

## Seleccion de variables a trabajar
vn <- c("id_municipio", "DENS_POB", "CEN_POB_RURAL_DIS", "DIST_CAPITAL", "IPM", "NUM_PROV", 
        "Cap_4g_pc", "INDICADOR_LTE", "total_cob", "Jitter", "Latencia", 
        "Perdida_de_Paquetes", "Descarga", "Carga")
X  <- dt[, vn] 
Y  <- X[, 1]
X  <- X[, -1] 

## Se escalan las variables.
X_scale <- scale(X)

#_________________________________________________________________________________ ####
# ANALISIS CODO ####

## Analisis del número óptimo de categorías: suma del error al interior de los clúster. 
grafica2 <- fviz_nbclust(X_scale, pam, method = "wss", k.max = 10)
grafica2 <- grafica2 +
  ggtitle("Método del Codo") + xlab("Numero de Clusters K") +  # Cambia "Título Eje X" por el título que desees para el eje X
  ylab("Suma Cuadrada Total al Interior") + 
  theme(plot.title = element_text(size = 20),
        axis.title.x = element_text(size = 20), # Ajusta el tamaño y la negrita del eje X
        axis.title.y = element_text(size = 20),  # Ajusta el tamaño y la negrita del eje Y
        axis.text.x = element_text(size = 16),  # Ajusta el tamaño de los valores del eje X
        axis.text.y = element_text(size = 16))  # Ajusta
print(grafica2)

#_________________________________________________________________________________ ####
# ANALISIS GAP STAT ####

## Analisis del número óptimo de categorías:  Gap Statistic Hastie (2001)
gap_stat <- clusGap (X_scale, FUNcluster = pam, K.max = 10, B = 10)
# trazar el número de conglomerados frente a la estadística computada
grafica <- fviz_gap_stat(gap_stat)
# Cambiar el título y el tamaño de letra
grafica <- grafica +
  ggtitle("Gap Statistic") + xlab("Numero de Clusters K") +  # Cambia "Título Eje X" por el título que desees para el eje X
  ylab("Gap statistic (k)") + 
  theme(plot.title = element_text(size = 20),
        axis.title.x = element_text(size = 20), # Ajusta el tamaño y la negrita del eje X
        axis.title.y = element_text(size = 20),  # Ajusta el tamaño y la negrita del eje Y
        axis.text.x = element_text(size = 16),  # Ajusta el tamaño de los valores del eje X
        axis.text.y = element_text(size = 16))  # Ajusta
print(grafica)

## combinar ambas gráficas en una misma. 
graficas_combinadas <- grid.arrange(grafica2, grafica, ncol = 2)

#_________________________________________________________________________________ ####
# SEGMENTACION & DESCRIPTIVAS ####

## Algoritmo de segmentación
set.seed(42) # semilla para la replicabilidad. 
kmed <- pam(X_scale, k = 8)

## Añadir el resultado de la segmentación a una nueva tabla llamada estadisticas
dtc <- data.frame(dt, kmeans_nuevo = kmed$clustering)

## Agrupar por la variable de segmentación y calcular estadísticas ponderadas
estadisticas <- ddply(dtc, .(kmeans_nuevo), summarize,
                      distancia_capital = mean(DIST_CAPITAL)/1000,
                      CAPACIDAD_4G_HAB = mean(Cap_4g_pc),
                      Ind_penetracion_4G = mean(INDICADOR_LTE),
                      Carga = mean(Carga), Descarga = mean(Descarga), 
                      Latencia = mean(Latencia), Jitter = mean(Jitter), 
                      Perdida_paquetes = mean(Perdida_de_Paquetes),
                      Num_provedores = mean(NUM_PROV),
                      IPM = mean(IPM), Pob_rural = mean(CEN_POB_RURAL_DIS)*100,
                      num_obs = length(id_municipio)) 

## Transponer tabla
estadisticas <- data.frame(round(t(estadisticas[, -1]), 2))

## Guardar
write_xlsx(estadisticas, "estadisticas_exceptuados_8_cluster_5_var.xlsx")

## Municipios
mun_clust <- data.frame(dt, Cluster = kmed$clustering)
munn <- as.data.frame(read_excel('DIVIPOLA.xlsx', skip = 5))
munn <- munn[, c('id_municipio', 'Mun')]
munn <- merge(munn, mun_clust, all.x = T)

#_________________________________________________________________________________ ####
# FIN ####