超市业绩分析
加载包
数据预处理与统计
预处理
data <- read_csv("data.csv", locale = locale(encoding = "gb2312"))
names(data) <- c("customerID", "General_Category_ID", "General_Category_Name", "Middle_Category_ID",
"Middle_Category_Name", "Mini_Category_ID", "Mini_Category_Name", "date", "month",
"product_id", "Specifications", "type", "unit", "sales_volume", "sales_value",
"unit_price", "promotion")
data <- na.omit(data)
# 日期数据
data$date <- ymd(data$date)
data$year <- year(data$date)
data$month <- month(data$date)
data$week <- week(data$date)
data$mday <- mday(data$date)
data$wday <- wday(data$date)
# 销售数量有负值
data <- data %>% filter(!sales_volume < 0)
# 销售单位有0、2或者重合不明确的
clean_unit <- function(unit) {
if (unit == "0" | unit == "2") {
"未知单位"
} else if (unit == "kg" | unit == "Kg" | unit == "KG" | unit == "千克" | unit ==
"公斤") {
"kg"
} else if (unit == "d袋" | unit == "袋") {
"袋"
} else {
unit
}
}
data <- data %>% mutate(unit = mapply(clean_unit, unit))
write.csv(data, "task1_1.csv")统计每个大类商品的销售金额
统计每个中类商品的促销销售金额和非促销销售金额
统计生鲜类产品和一般产品的每周销售金额
数据分析与可视化
绘制生鲜类商品和一般商品每天销售金额的折线图
- 分析比较两类产品的销售状况
data %>% filter(type != "联营商品", sales_value < 1000) %>% group_by(type, date) %>%
summarise(Sales = sum(sales_value)) %>% ggplot(aes(x = date, y = Sales)) + geom_point(aes(color = type),
size = 2.8, alpha = 0.5) + geom_line(aes(color = type), size = 0.8) + ggtitle("生鲜与一般商品的销售折线图") +
theme(panel.grid.major.x = element_blank(), legend.position = c(0.9, 0.8), legend.title = element_blank(),
axis.title.x = element_blank(), legend.text = element_text(size = 12, face = "bold"))由折线图可得知生鲜与一般商品销售额的波动方向大致相同,但一般商品销售额的变动程度更大;除个别日期外,一般商品销售额高于生鲜销售额,这是因为一般商品多为粮油、日配、酒饮、洗化与休闲,与包含蔬果和肉禽的生鲜相比较,一般商品的品种数目多,覆盖范围广,相应地,人们对一般商品的需求量大,故其销售额高于生鲜。
折线图总体呈较小的周期波动,生鲜与一般商品的波动规律大致相同。结合数据与实际情况可知,销售额一般按周波动,一周中大部分在周三、周四的销售额高于其他时间段。一般商品二月的销售额波动较为特殊,波动幅度剧烈,可能因为春节的到来大幅提高人们对一般商品的需求,如准备年货、突发的集团购买(作为福利)、拜访亲友所需的礼物等,查阅资料得知2015年的春节为2月19日,符合一般商品的销售额在二月中旬突然上涨一段时间后急速回落的情况。
按月绘制各大类商品销售金额的占比饼图,并分析其销售状况
- 这段代码注意查看重叠
check_overlap = TRUE
plot_data <- data %>%
group_by(General_Category_Name, month) %>%
summarise(Sales = sum(sales_value)) %>%
filter(!is.na(month)) %>%
arrange(desc(Sales))
pie_plot <- function(plot_data, m) {
plot_data[plot_data$month == m,][1:6,]%>%
ggplot(aes(x = "", y = Sales, fill = General_Category_Name)) +
geom_bar(stat = "identity", width = 2) +
coord_polar("y") +
geom_text(aes(label = round(Sales)),
position = position_stack(vjust = 0.5),
check_overlap = TRUE, # 查看是否重叠
fontface = "bold",
size = 4.5) +
labs(x = NULL, y = NULL, fill = NULL, title = paste0(m, "月份商品销售饼图")) +
theme(axis.line = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
plot.title = element_text(size = 14)
)
}
plotlist <- vector("list", 4)
names(plotlist) <- c('pie_1', 'pie_2', 'pie_3', 'pie_4')
for (i in c(1:4)) {
m <- i
plotlist[[i]] <- pie_plot(plot_data, m)
}
Rmisc::multiplot(plotlist = plotlist, cols = 2)一月份
一月份前六大类商品按销售额从大到小的排序分别为蔬果、日配、粮油、休闲、洗化、肉禽,其中,蔬果销售额为21588元,肉禽销售额为9085元。
二月份
二月份前六大类商品按销售额从大到小的排序分别为酒饮、休闲、日配、粮油、蔬果、洗化,其中,酒饮销售额为31794元,肉禽销售额为7814元。二月销售情况与一月相比,酒饮销售额飞速增加,一月份酒饮属于销售额最高的前六大类商品,二月份酒饮进入销售额最高的前六大类商品并位于第一位,结合实际情况可知,二月份人们庆祝春节,多数人有假期走亲访友,对酒饮的需求量急剧增加。同时休闲类商品增幅也较为明显,同样可归于特殊节假日对销售额的影响。
三月份
三月份前六大类商品按销售额从大到小的排序分别为蔬果、日配、休闲、粮油、洗化、酒饮,其中,蔬果销售额为21888元,与一月份销售额21588元基本持平,酒饮销售额为7780元,与上月31794元相比大幅缩水,考虑到二月份春节带来的影响,三月份酒饮销售额大幅下降为正常现象。
四月份
四月份前六大类商品按销售额从大到小的排序分别为蔬果、日配、休闲、粮油、洗化、酒饮,其中,蔬果销售额为21266元,与一月销售额21588元,三月销售额21888元基本持平,酒饮销售额为9126元。
整体观察一月至四月各大类商品销售额的变化,发现二月份春节对商品销售额变动的影响显著,变动幅度最明显的为酒饮类商品。除去特殊节日的影响,即观察一、三、四月的销售情况,销售额最高的为蔬果大类商品,日配的销售额与蔬果相近,位居第二。
周环比增长率
growth_rate <- function(x) {
rating <- x %>% group_by(week) %>% summarise(value = sum(sales_value)) %>% filter(!is.na(week),
week != 18)
rating <- rating %>% mutate(rate = c(0, diff(value)/rating$value[-1]))
rating <- rating[-1, ]
ggplot(rating) + geom_bar(aes(week, rate), stat = "identity", color = "steelblue",
fill = "steelblue") + scale_x_continuous(breaks = c(1:17)) + theme(panel.grid.major.x = element_blank())
}
growth_rate_no8 <- function(x) {
rating <- x %>% group_by(week) %>% summarise(value = sum(sales_value)) %>% filter(!is.na(week),
week != 18)
rating <- rating %>% mutate(rate = c(0, diff(value)/rating$value[-1]))
rating <- rating[-1, ]
rating <- rating %>% filter(week != 8)
ggplot(rating) + geom_bar(aes(week, rate), stat = "identity", color = "steelblue",
fill = "steelblue") + scale_x_continuous(breaks = c(1:17)) + theme(panel.grid.major.x = element_blank())
}
rate_yes <- data %>% filter(promotion == "是") %>% growth_rate() + ggtitle("促销商品周环比增长率")
rate_no <- data %>% filter(promotion == "否") %>% growth_rate() + ggtitle("非促销商品周环比增长率")
Rmisc::multiplot(rate_yes, rate_no)rate_yes_no8 <- data %>% filter(promotion == "是") %>% growth_rate_no8() + ggtitle("促销商品周环比增长率",
subtitle = "去掉第八周")
rate_no_no8 <- data %>% filter(promotion == "否") %>% growth_rate_no8() + ggtitle("非促销商品周环比增长率",
subtitle = "去掉第八周")
Rmisc::multiplot(rate_yes_no8, rate_no_no8)得到直方图后发现促销商品与非促销商品的环比增长率在第八周均大幅下降,分析其原因发现2015年的春节在第七周,人们对各类商品的需求大幅上升,购买力增强,销售额增加,但第八周人们对各类商品的消费逐渐回归正常水平,故环比增长率会出现相对较大的负值。第八周增长率变化的特殊情况使得其他各周增长率变动在同一张图中表现不明晰,为显示除第八周之外的各周环比增长率变化,去掉第八周的环比增长率并绘制柱状图。
用户画像与促销策略
- 销售金额排名前十的优质客户
customer <- data %>% group_by(customerID) %>% summarise(Consumption = sum(sales_value)) %>%
arrange(desc(Consumption)) %>% head(10)
customer %>% DT::datatable()分析各大类商品的销售情况,总结其销售规律
大类商品销量与销售额分析
- 销售额柱状图
General_data <- data %>% group_by(General_Category_Name) %>% summarise(Total_Sales = sum(sales_value),
Total_Amount = sum(sales_volume))
# 销售额柱状图
NA[1] NA
首先对各大类商品销售额进行分析,由图10可知,日配与蔬果销售额分别位于第一、二位,文体、家电与烘焙的销售额非常低,占据最后三位。在各月销售额的分析中,一、三、四月蔬果销售额最高,日配销售额接近蔬果,位居第二。但二月受到节日影响,日配销售额远高于蔬果,最终,一至四月的总销售额日配超过蔬果位居第一。
- 销售量柱状图
[1] NA
然后对各大类商品销售量进行分析,发现销量呈现坡度较大的三个梯队,第一梯队为日配与蔬果,其销售额也最大,但日配与蔬果销售量的差距大于销售间的差距,观察所给数据发现这由蔬果平均价格高于日配平均价格导致;第二梯队为粮油与休闲,粮油与休闲的销售量相近,但销售额之间的差距较大,是因为休闲的平均价格高于粮油;第三梯队为酒饮与洗化,酒饮的销售额与销售量均大于洗化的销售额与销售量。其他各大类商品中较为特殊的是肉禽,其销售额位居第七,约为洗化的2/3,但其销售量约为洗化的1/4,侧面反映出肉禽价格偏高。
时间层面分析
- 周内分析图
[1] NA
首先对平均销售额在一周内的变动进行分析,发现周四的平均销售额最高,周五最低。周一至周四的平均消费额总体高于周五至周日的平均消费额,这可能与当地居民的生活规律有关。
- 月度分析图
data %>% group_by(mday) %>% summarise(Avg_Sales = sum(sales_value)/4) %>% na.omit() %>%
ggplot(aes(x = factor(mday), y = Avg_Sales, fill = mday)) + geom_bar(stat = "identity") +
geom_smooth(aes(x = mday, y = Avg_Sales), color = "orange", linetype = 1) + theme(legend.position = "none") +
scale_x_discrete(breaks = c(1:31)) + labs(x = NULL, y = "平均销售额") + ggtitle("月内分析图",
subtitle = "销售额月末有下滑趋势")然后对平均销售额在一个月内的变动进行分析,发现平均销售额在月末有下滑趋势,可能是每月月底人们拥有的资金较少的缘故;平均销售额在月中有较小的起伏,这可能是二月份销售额急剧变化的影响。
促销分析
promo <- data %>% filter(promotion == "是")
unpromo <- data %>% filter(promotion == "否")
table(promo$wday)
1 2 3 4 5 6 7
770 876 895 1642 718 780 731
plot_promo <- promo %>% group_by(wday) %>% summarise(Sales = sum(sales_value)/18) %>%
na.omit()
plot_unpromo <- unpromo %>% group_by(wday) %>% summarise(Sales = sum(sales_value)/18) %>%
na.omit()
plot_data <- rbind(plot_promo, plot_unpromo)
plot_data$promotion <- rep(c("是", "否"), each = 7)
ggplot(plot_data, aes(x = factor(wday), y = Sales, fill = promotion)) + geom_bar(stat = "identity") +
coord_flip() + ggtitle("促销分析——堆叠柱状图", subtitle = "促销能有效带动整体销售额增长") +
scale_x_discrete(breaks = c(1:7), labels = c("MON", "TUE", "WES", "THU", "FRI",
"SAT", "SUN")) + labs(fill = "是否促销", x = NULL, y = "平均销售额") + theme(panel.grid.major.y = element_blank(),
panel.grid.major.x = element_blank(), axis.text.y = element_text("bold", angle = 45,
size = 12))促销商品对于销售的影响
由于整体数据的时间跨度较短,我们选择对周内的每一天进行平均销售额的分析,然后绘制堆积柱状图。从上图可以看到,非促销产品仍贡献了绝大部分的销售额,然而这并不能说明促销是没有效果的。相反,我们可以看出,促销力度与当天的整体销售额是有密切关系的。以周四为例,周四的整体平均销售额是一周内最高的,与此同时在周四的促销力度也是最大的;同样的,周五的整体平均销售额在一周之内属于最低,它的促销力度也是最低的。
总结与建议:
促销的力度直接决定了整体销售业绩的好坏,大力度的促销不仅能够加快促销商品的销售,同时也能显著地拉动非促销商品销售额的上涨。所以,我们建议,在成本得到良好控制的前提下,商场应该加大促销力度,从而使得整体业绩得到提升。