La base de datos ‘Internet.xlsx’ contiene diferentes indicadores sobre el uso y la tenencia de radio, tv, teléfono fijo, etc, en diferentes países como se describe en la siguiente tabla:
df = read_excel("Internet.xlsx"); head(df)
Z <- df %>%
select(-Country) %>%
mutate(across(everything(), ~ scale(.) %>% as.vector()))
D <- dist(Z, method = "euclidean")
Métodos jerárquicos:
agjers <- hclust(D, method = "single")
agjercom <- hclust(D, method = "complete")
agjercen <- hclust(D, method = "centroid")
agjerward <- hclust(D, method = "ward.D2")
# Visualización de los dendrogramas
par(mfrow = c(2, 2))
plot(agjers, main = "Single Linkage", xlab = "", sub = "")
plot(agjercom, main = "Complete Linkage", xlab = "", sub = "")
plot(agjercen, main = "Centroid Linkage", xlab = "", sub = "")
plot(agjerward, main = "Ward's Method", xlab = "", sub = "")
El
método Ward minimiza la varianza dentro de los clusters, lo que
generalmente produce resultados más equilibrados. Ahora se determina el
número óptimo de clusters (método del codo y silhouette):
fviz_nbclust(Z, FUN = hcut, method = "wss") +
ggtitle("Número óptimo de clusters - Método del Codo")
fviz_nbclust(Z, FUN = hcut, method = "silhouette") +
ggtitle("Número óptimo de clusters - Silhouette")
Los Gràficos muestran que el valor optimo de k = 2. Revisando un
dendograma, cortamos el dendrograma en k=2:
k <- 2
clusters <- cutree(agjerward, k = k)
dfTotal <- df %>%
mutate(Cluster = clusters)
fviz_cluster(list(data = Z, cluster = clusters))
Comenzamos con el método del Codo para encontrar el mejor k
fviz_nbclust(Z, kmeans, method = "wss") +
ggtitle("Número óptimo de clusters - Método del Codo")
Luego revisamosel método del Silhouette para encontrar el mejor k
fviz_nbclust(Z, kmeans, method = "silhouette") +
ggtitle("Número óptimo de clusters - Silhouette")
Ejecutamos k-means con el k óptimo
set.seed(123)
k_optimo <- 2
modelo_kmeans <- kmeans(Z, centers = k_optimo, nstart = 25)
# Visualización de los clusters
fviz_cluster(modelo_kmeans, data = Z)
3.
Qué método entre jerárquico y k-medias resultó mejor?
Segùn los gràficos anteriores, el metodo jeràrquico y el metodo kmeans arrojan los mismo valores, es decir sugieren un k=2 Ward. Igualmente se revisa el el valor pormedio que arroja cada mètodo:
# Índice Silhouette para método jerárquico
clusters_jerarquico <- cutree(agjerward, k = 3)
silhouette_jerarquico <- silhouette(clusters_jerarquico, dist(Z))
summary(silhouette_jerarquico)
## Silhouette of 153 units in 3 clusters from silhouette.default(x = clusters_jerarquico, dist = dist(Z)) :
## Cluster sizes and average silhouette widths:
## 50 60 43
## 0.1715465 0.3703138 0.3180427
## Individual silhouette widths:
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -0.2267 0.1838 0.3193 0.2907 0.4287 0.5336
# Índice Silhouette para k-medias (con k=3 por ejemplo)
silhouette_kmeans <- silhouette(modelo_kmeans$cluster, dist(Z))
summary(silhouette_kmeans)
## Silhouette of 153 units in 2 clusters from silhouette.default(x = modelo_kmeans$cluster, dist = dist(Z)) :
## Cluster sizes and average silhouette widths:
## 100 53
## 0.4354434 0.3698745
## Individual silhouette widths:
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -0.006238 0.340684 0.465204 0.412730 0.532679 0.607825
Se comparan los promedio:
mean(silhouette_jerarquico[, 3])
## [1] 0.2906666
mean(silhouette_kmeans[, 3])
## [1] 0.41273
Basándonos en los valores promedio del índice Silhouette, el método de k-medias (0.41273) supera al método jerárquico (0.2906666).
Caracterizamos los clusters Método jerárquico:
clusters_jerarquico <- cutree(agjerward, k = 3) # Cambia k según corresponda
datos_jerarquico <- Z %>%
mutate(Cluster = clusters_jerarquico) %>%
group_by(Cluster) %>%
summarise(across(everything(), list(
Media = mean,
CV = ~ sd(.) / mean(.),
Q1 = ~ quantile(., 0.25),
Q3 = ~ quantile(., 0.75)
))); datos_jerarquico
Caracterizamos los clusters - Método kMeans:
datos_kmeans <- Z %>%
mutate(Cluster = modelo_kmeans$cluster) %>%
group_by(Cluster) %>%
summarise(across(everything(), list(
Media = mean,
CV = ~ sd(.) / mean(.),
Q1 = ~ quantile(., 0.25),
Q3 = ~ quantile(., 0.75)
))); datos_kmeans
Realizamos un diagrama de cajas para jerárquico:
datos_jerarquico_boxplot <- Z %>%
mutate(Cluster = clusters_jerarquico) %>%
pivot_longer(cols = -Cluster, names_to = "Variable", values_to = "Valor")
ggplot(datos_jerarquico_boxplot, aes(x = as.factor(Cluster), y = Valor, fill = as.factor(Cluster))) +
geom_boxplot() +
facet_wrap(~ Variable, scales = "free") +
labs(title = "Diagramas de cajas - Método jerárquico", x = "Cluster", y = "Valor") +
theme_minimal()
Ahora realizamos el diagrama de cajas para k-means:
datos_kmeans_boxplot <- Z %>%
mutate(Cluster = modelo_kmeans$cluster) %>%
pivot_longer(cols = -Cluster, names_to = "Variable", values_to = "Valor")
ggplot(datos_kmeans_boxplot, aes(x = as.factor(Cluster), y = Valor, fill = as.factor(Cluster))) +
geom_boxplot() +
facet_wrap(~ Variable, scales = "free") +
labs(title = "Diagramas de cajas - Método k-means", x = "Cluster", y = "Valor") +
theme_minimal()
Sí, se observan diferencias entre los agrupamientos realizados con los
métodos jerárquico y k-means. El método k-means generalmente produce
clusters más compactos y homogéneos, como lo reflejan valores más bajos
en el coeficiente de variación (CV) y distribuciones más centradas en
los diagramas de cajas. Por otro lado, el método jerárquico, al ser más
sensible a valores atípicos y la estructura jerárquica de los datos,
tiende a formar clusters con mayor variabilidad interna y puede incluir
valores extremos en sus grupos.