Clustering Analysis

Data Analysis
Clustering
Kmeans
Published

December 6, 2024

Overview

Load Libraries

Prepare Data

cluster_df <- data %>%
  select(
    age,
    lab_hba1c,
    BMI_cat,
    sex,
    SDI) %>%
  drop_na()
# Convert factors to dummies
cluster_df_dummy <- model.matrix(~ ., data = cluster_df)[, -1]  # remove intercept
# Scale numeric variables
cluster_scaled <- scale(cluster_df_dummy)

Optimal Number of Clusters

factoextra::fviz_nbclust(cluster_scaled, 
                         kmeans, 
                         method = "wss") +
  theme_minimal() +
  labs(title = "Elbow Method for Optimal k")
factoextra::fviz_nbclust(cluster_scaled, 
                         kmeans, 
                         method = "silhouette") +
  theme_minimal() +
  labs(title = "Silhouette Method for Optimal k")

K-MEANS (k = 3 as example)

set.seed(2025)
km <- kmeans(cluster_scaled, 
             centers = 3, nstart = 30)
# Add cluster labels to dataset
cluster_results <- cluster_df %>%
  mutate(cluster = factor(km$cluster))
factoextra::fviz_cluster(
  km,
  data = cluster_scaled,
  geom = "point",
  ellipse.type = "convex",
  ggtheme = theme_minimal()
)
# Cluster profile
cluster_profile <- cluster_results %>%
  group_by(cluster) %>%
  summarise(
    age_mean = mean(age),
    hba1c_mean = mean(lab_hba1c),
    BMI_most_frequent = names(sort(table(BMI_cat), decreasing = TRUE))[1],
    sex_ratio = mean(sex == "woman"),
    sdi_high = mean(SDI == "High")
  )

cluster_profile
Back to top