Liberias Necesarias

# Cargar las bibliotecas necesarias
library(readxl)
library(dplyr)
library(ggplot2)
library(cluster)  # Para el análisis de silueta
library(factoextra)  # Para visualizar la silueta

df <- read_excel("C:/Users/juanj/Downloads/OneDrive_2024-09-19/Prueva tecnica profesional modelos v2/1_Informe cultivos de coca UNDOC 2022.xlsx")

1) Estructuramos datos:

# Eliminar la columna de nombres de departamentos
df_numeric <- df %>%
  select(-Departamento)

# Convertir a numérico
df_numeric <- df_numeric %>%
  mutate(across(everything(), ~as.numeric(.))) 

# Reemplazar los NA por ceros
df_numeric <- df_numeric %>%  
  replace(is.na(.), 0)  

# Escalar los datos (normalización)
df_scaled <- scale(df_numeric)

3) Validamos numero de clusters

# Definir un rango de clusters para evaluar
num_clusters <- 2:10

# 1. Calcular el método del codo (inertia/wss)
wss <- sapply(num_clusters, function(k){
  kmeans(df_scaled, centers = k, nstart = 25)$tot.withinss
})

# Graficar el método del codo
plot(num_clusters, wss, type = "b", pch = 19, frame = FALSE,
     xlab = "Número de clusters K",
     ylab = "Suma de cuadrados dentro de los clusters (WSS)",
     main = "Método del Codo para determinar el número óptimo de K")

# 2. Calcular el puntaje de silueta para diferentes valores de K
sil_scores <- sapply(num_clusters, function(k){
  model <- kmeans(df_scaled, centers = k, nstart = 25)
  silhouette_score <- silhouette(model$cluster, dist(df_scaled))
  mean(silhouette_score[, 3])  # Promedio del puntaje de silueta
})

# Graficar el puntaje de silueta para cada número de clusters
plot(num_clusters, sil_scores, type = "b", pch = 19, frame = FALSE,
     xlab = "Número de clusters K", ylab = "Puntaje de Silueta Promedio",
     main = "Análisis de Silueta para determinar el número óptimo de K")

4) Aplicamos algoritmo

# 3. Elegir el número de clusters óptimo ( 3 clusters)
set.seed(123)
kmeans_result <- kmeans(df_scaled, centers = 3, nstart = 25)

# Agregar la columna de cluster al dataframe original
df$Cluster <- as.factor(kmeans_result$cluster)

# Calcular el promedio de producción por departamento
df$Promedio <- rowMeans(df_numeric, na.rm = TRUE)  # Calcular el promedio por fila



# Visualización de los clusters por departamento con diferentes formas para cada cluster
ggplot(df, aes(x = Departamento, y = Promedio, shape = Cluster)) +  # Usar forma en lugar de color
  geom_point(size = 3) +
  scale_shape_manual(values = c(16, 17, 15)) +  # Usar círculos, triángulos y cuadrados
  labs(title = "Clasificación de Departamentos según nivel de producción (3 Clusters)",
       x = "Departamento",
       y = "Producción promedio (área cultivada)",
       shape = "Cluster") +  # Etiqueta para las formas
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

4) Consumo promedio por cluster

# 1. Calcular la producción promedio por cluster
produccion_por_cluster <- df %>%
  group_by(Cluster) %>%
  summarise(Promedio_Cluster = mean(Promedio, na.rm = TRUE))  # Promedio por cluster

# Visualizar la producción promedio por cluster
ggplot(produccion_por_cluster, aes(x = Cluster, y = Promedio_Cluster, fill = Cluster)) +
  geom_bar(stat = "identity") +
  labs(title = "Producción promedio por Cluster",
       x = "Cluster",
       y = "Producción promedio (área cultivada)") +
  theme_minimal()