McCombs School of Business · Marketing Analytics
K-Means Clustering — R Code
Energy_Poll_Cluster_Code_K_Means_1.R
#######################################################################################
#R Code to Run K_Means (first run ..._Choose_Cluster.R to determine number of clusters)
#######################################################################################
#install.packages("readxl" and "factoextra" and "writexl")
library(readxl)
library(factoextra)
library(writexl)
#set random seed
set.seed(123456789)
#Read data
energy_poll_data <- read_excel("energy_poll_data.xlsx")
cluster_dat <- energy_poll_data[, c("NGO", "GOVT", "INDUSTRY", "SCIENCE", "ECON", "ENV")]
#Set number of clusters
K<-5
#Run K-Means with chosen level of segments (centers)
k5_res <- kmeans(cluster_dat, centers = K, nstart = 100, iter.max = 200)
# Per-cluster summaries
cluster_sizes <- data.frame(cluster = 1:K, size = k5_res$size)
centers <- data.frame(cluster = 1:K, k5_res$centers, row.names = NULL)
print(cluster_sizes)
print(centers)
# Row-level outputs
assignments <- data.frame(
row = seq_len(nrow(cluster_dat)),
cluster = k5_res$cluster
)
# Original data + cluster label
data_with_cluster <- cbind(energy_poll_data, cluster = k5_res$cluster)
# Cluster “profiles” on original scale (means per cluster)
feature_cols<-c("NGO", "GOVT", "INDUSTRY", "SCIENCE", "ECON", "ENV")
cluster_profiles <- aggregate(
energy_poll_data[, feature_cols],
by = list(cluster = k5_res$cluster),
FUN = mean
)
# Write everything to one Excel workbook (one sheet per item)
write_xlsx(
list(
Cluster_Profiles = cluster_profiles,
Cluster_Sizes = cluster_sizes,
Data_with_Cluster = data_with_cluster
),
path = "kmeans_summary.xlsx"
)
cat("Wrote kmeans_summary.xlsx\n")