Поскольку у вас есть более чем 1000 магазинов, ниже демо не может быть применимо непосредственно, но мы надеемся, направить вас в правильном направлении.
Вы можете анализировать кластеризация магазинов на еженедельной основе или какой-либо другой вариант недель (N = 4,8, ...)
Здесь мы рассмотрим магазин кластеров на еженедельной частоте:
Тестовые данные
library(dplyr) #data manipulation
library(ggdendro) #extracting clusters
library(ggplot2) #plotting
library(gridExtra) #for arranging ggplot graphs in grids
set.seed(42)
DF <- data.frame(weeks = rep(seq(1:5),5),
store = c(rep("A", 5), rep("B", 5), rep("C", 5),
rep("E", 5), rep("D", 5)),
sales = rnorm(25),
pp = rnorm(25))
weekInput = unique(DF$weeks)
Выбор частоты недель:
В простом случае я включил дискретные недели, т.е. 1,2,3,4 и 5.
Предположим, вы хотите выбрать N = 4 как частоту недель, т.е. недель от 1 до 4,5, 8 и т. Д., Вы можете использовать следующее для создания разделов weekInput в течение года и изменять в соответствии с вашими требованиями.
#weekFreq = 4
#StartWeek = 1
#EndWeek = 52
#startPoints=seq(StartWeek,EndWeek,weekFreq)
#endPoints= c(tail(startPoints,-1)-1,EndWeek)
#
#freqDF = data.frame(cbind(startPoints,endPoints))
#weekInput = lapply(1:nrow(freqDF),function(x) { z= freqDF[x,]; z=as.vector(as.matrix(z)) })
#head(weekInput)
#[[1]]
#[1] 1 4
#
#[[2]]
#[1] 5 8
#
#[[3]]
#[1] 9 12
#
#[[4]]
#[1] 13 16
#
#[[5]]
#[1] 17 20
#
#[[6]]
#[1] 21 24
черчение кластеров
Хороших ресурсов для построения различных дендрограмм являются here и here
За каждую неделю, мы вычислим матрицу расстояний над числовыми данными и создавать иерархические кластеры и использовать ggdendro пакет для построения и вывода списка объектов участка
plotList = lapply(weekInput,function(x) {
subsetWeek=DF %>%
group_by(weeks) %>%
filter(weeks==x) %>% #you could change this to `weeks %in% c(x[1],x[2])`
as.data.frame() %>% # x[1] and x[2] are start and end points of weekInput
select(-weeks) %>%
as.data.frame()
#For numeric features of data, compute the distance matrix and form hierarchical cluster
numericDF= subsetWeek[,sapply(subsetWeek,is.numeric)]
clustDF = hclust(dist(numericDF))
#You can choose to limit the clusters to N = n, as per your discretion
#clustDF = cutree(clustDF, 4)
clustDF$labels = subsetWeek$store
#Use functions from ggdendro package for extracting clusters for ease in plotting
clustDendro = as.dendrogram(clustDF)
dendroData = dendro_data(clustDendro,type="rectangle")
Labels = label(dendroData)
Labels$group <- c(rep("Area1", 2), rep("Area2", 2), rep("Area3", 1))
gPlot = ggplot(segment(dendroData)) +
geom_segment(aes(x=x,y=y,xend=xend,yend=yend)) +
geom_label(data=Labels,aes(label=label,x=x,y=0,label.size=5,colour=Labels$group,fontface="bold")) +
ggtitle(paste0("Store Clusters for Week:",x)) +
labs(color="Area Names\n")
gPlot = gPlot + theme(legend.title = element_text(face = "bold"))
return(gPlot)
})
Упорядочивание Участок
Перечень участка объекты сверху могут быть организованы в соответствии с требованием. Полезные ссылки на более подробную информацию в here
grid::grid.newpage()
grid::grid.draw(do.call(rbind,lapply(plotList,function(x) ggplotGrob(x))))
Single Week:
Все Weeks
Из-за одного расположения столбцов, читаемость незначительно влияет
Do вы думаете, что кластеризация магазинов по отношению к (продажи, стр.) варьируется от недели к неделе. – OdeToMyFiddle
Да, в данных содержится более 1000 магазинов, и некоторые из них будут в высоких туристических местах, поэтому в данных для магазинов будут всплески данных, когда они действительно горячие и т. Д. Поэтому я ожидал, что в магазинах, где это очевидно , может быть еще одно подмножество, основанное на метрике pp. Обычно я только что взял средний еженедельный объем продаж/п.п. и использовал это, чтобы удалить отдельные недели, но я надеюсь, что смогу зафиксировать изменения в течение недель в течение года. – MidnightDataGeek