Я использую кластеризацию K-средних, чтобы увидеть похожее поведение клиентов.
Запуск алгоритма k-средних
library(cluster) # Needed for silhouette function
kmeansDat <- data_tbl
kmeansDat.t <- t(kmeansDat) # Get customers in rows and products in columns
# Setup for k-means loop
km.out <- list()
sil.out <- list()
x <- vector()
y <- vector()
minClust <- 2 # Hypothesized minimum number of segments
maxClust <- 10 # Hypothesized maximum number of segments
# Compute k-means clustering over various clusters, k, from minClust to maxClust
for (centr in minClust:maxClust) {
i <- centr-(minClust-1) # relevels start as 1, and increases with centr
set.seed(11) # For reproducibility
km.out[i] <- list(kmeans(kmeansDat.t, centers = centr, nstart = 50))
sil.out[i] <- list(silhouette(km.out[[i]][[1]], dist(kmeansDat.t)))
# Used for plotting silhouette average widths
x[i] = centr # value of k
y[i] = summary(sil.out[[i]])[[4]] # Silhouette average width
}
# Get customer names that are in each segment ----------------------------------
# Get attributes of optimal k-means output
maxSilRow <- which.max(y) # Row number of max silhouette value
optimalClusters <- x[maxSilRow] # Number of clusters
km.out.best <- km.out[[maxSilRow]] # k-means output of best cluster
# Create list of customer names for each cluster
clusterNames <- list()
clusterList <- list()
for (clustr in 1:optimalClusters) {
clusterNames[clustr] <- paste0("X", clustr)
clusterList[clustr] <- list(
names(
km.out.best$cluster[km.out.best$cluster == clustr]
)
)
}
names(clusterList) <- clusterNames
print(clusterList)
Объединенный кадр данных
Затем я объединял кластер Центроиды с моим набором данных для проверки функций
cust_segment_cntrs <- t(km.out.best$centers) # Get centroids for groups
colnames(cust_segment_cntrs) <- make.names(colnames(cust_segment_cntrs))
customer_clustered <- bind_cols(data_tbl[, 1:7], as.data.frame(cust_segment_cntrs))
Я получил следующий результат:
$ nr_caes <int> 1, 3, 1, 1, 2, 1, 1, 2, 1, 1, 1, …
$ sum_day <int> 67, 155, 210, 42, 7, 51, 392, 310…
$ avg_lifetime <dbl> 45.00000, 91.50000, 137.00000, 37…
$ avg_perc <dbl> 0.800118, 0.427191, 0.570201, 0.7…
$ age <int> 35, 29, 27, 51, 31, 63, 35, 27, 4…
$ lifetime <int> 90, 366, 274, 756, 546, 702, 28, …
$ perc_seen <dbl> 31.78205, 81.42577, 93.25000, 58.…
$ X1 <dbl> -0.160736676, 0.101188572, -0.021…
$ X2 <dbl> -0.44987836, -0.37890378, -0.3508…
$ X3 <dbl> -0.25349377, -0.41840180, 0.32034…
$ X4 <dbl> 0.07813974, 0.09580886, 0.1019051…
$ X5 <dbl> -0.58865724, -0.58865724, -0.5886…
$ X6 <dbl> -0.36094591, -0.36094591, -0.3609…
$ X7 <dbl> -0.22366143, -0.26367804, -0.2645…
$ X8 <dbl> -0.1806002, -0.1727053, -0.146464…
Однако все кластеры имеют значения центроидов для всех клиентов для каждого кластера с X1 по X8. Мне трудно понять, какие клиенты принадлежат к какому кластеру.
- Мне интересно, что я могу сделать, чтобы назначить какой-то порог?
- Итак, я могу сказать, что этот клиент принадлежит к определенный кластер, например, начальное и конечное значение на основе центроида.
Извините, если не смог хорошо объяснить.
- В конце концов, я хочу увидеть, какой клиент к какой группе принадлежит, а также характеристики функций.
Заранее спасибо