2016-08-23 3 views
2

У меня есть набор данных по магазинам по неделям с двумя функциями - продажами и pp. Я хочу сгруппировать их на основе этих функций, идеально подходящих для группировки тех, у которых наиболее похожие торговые модели в течение года ,Кластеризация с несколькими функциями по неделям

Возможно ли это сделать с данными, которые у меня есть. Мое понимание заключается в том, что столбцы и строки - это то, что будет назначено ярлыкам на основе кластеров, но у меня есть недели, чтобы принять во внимание, поэтому я не знаю, должны ли они быть в строках или столбцах?

library(data.table) 
dt <- data.table(weeks = rep(seq(1:5),5), 
      store = c(rep("a", 5), rep("b", 5), rep("c", 5), 
         rep("e", 5), rep("d", 5)), 
      sales = rep(rnorm(5), 5), 
      pp = rep(rnorm(5), 5)) 
dt <- dcast.data.table(dt, store ~ weeks, value.var = c("sales", "pp")) 

благодаря

+0

Do вы думаете, что кластеризация магазинов по отношению к (продажи, стр.) варьируется от недели к неделе. – OdeToMyFiddle

+0

Да, в данных содержится более 1000 магазинов, и некоторые из них будут в высоких туристических местах, поэтому в данных для магазинов будут всплески данных, когда они действительно горячие и т. Д. Поэтому я ожидал, что в магазинах, где это очевидно , может быть еще одно подмножество, основанное на метрике pp. Обычно я только что взял средний еженедельный объем продаж/п.п. и использовал это, чтобы удалить отдельные недели, но я надеюсь, что смогу зафиксировать изменения в течение недель в течение года. – MidnightDataGeek

ответ

1

Поскольку у вас есть более чем 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: enter image description here

Все Weeks

Из-за одного расположения столбцов, читаемость незначительно влияет enter image description here

+0

очень полный ответ, спасибо! – MidnightDataGeek