Joffy Zhong:咨询顾问 | 写作爱好者 | 数据分析 | 互联网创业者 R语言中文社区专栏作者
知乎ID:https://www.zhihu.com/people/joffy/posts

背景:
此项目为Analiytics Vidhya的竞赛题目,大型商场销售额预测,该项目提供了从不同城市的10家商店中收集的1559种产品的2013年销售数据。目的是通过2013年的销售数据,建立一个销售额预测模型,预测每个产品在特定商店的销售情况。
写此篇文章的目的是记录我分析和思考的整个过程,并与各位分析师朋友一起交流,帮助自己未来持续改善和提升模型效果。
截止到写此文章为止,我的模型预测效果得分目前是前100名。
竞赛截止到2019年1月1号,如果您在零售行业工作,且在寻找一个优秀的模型或者对此类问题感兴趣,这个项目值得大家参与和探索,相信会有收获。
分析工具为R语言,并且最后通过xgboost提升整个模型效果。
你可以通过这个链接访问到竞赛主页 Big Mart Sales III(https://datahack.analyticsvidhya.com/contest/practice-problem-big-mart-sales-iii/)
提出假设:
目标是预测商店的每个产品的销量,对销售额可能的影响因素如下:
与商店有关的假设:

与商品有关的假设:

数据集
变量描述:

探索数据:
#加载包
library(ggplot2)
library(grid)
library(gridExtra)
library(caret)
library(randomForest)
library(xgboost)
library(Hmisc)
library(dplyr)
library(rpart)
library(rpart.plot)
#加载数据
train.data <- read.csv("train.csv",stringsAsFactors = F)
test.data <- read.csv("test.csv",stringsAsFactors = F) test.data$Item_Outlet_Sales <- NA
#合并数据集,特征工程需要,避免重复执行相同代码
all_bms <- rbind(train.data,test.data)
#描述统计量
describe(all_bms)
数据描述信息:
Item_Weight 产品重量存在缺失值,需要处理
Outlet_Size 商店大小存在缺失值,需要处理
Item_Outlet_Sales 商品销售额的缺失值符合测试集的数目,不用处理
Item_Fat_Content 商品低脂变量,有LF,low fat,Low Fat,reg,Regular五个类别,从类别描述看可以分为Low Fat和Regular两个变量,表示低脂和常规
Item_Visibility 商品的展示百分比数据中存在最低值为0,由于训练集的每个商品数据都有对应的销售额,因此这是异常的值,需要处理
Item_Type 产品类别归类较多,需要进一步看看能够生成新的归类变量
Item_MRP 给出了商品的标价,能够计算出对应商品的销量(相对于销售额,销量更易于理解和探索)
Outlet_Establishment_Year 商店的开店年份19xx年,这样的数据不直观,可以调整为年数
清洗数据
1、处理缺失值:商品重量
由于每个商品的重量应该是相同的,所以用商品的重量均值补插缺失的值
#计算商品重量均值,默认移除缺失值
tmp <- aggregate(Item_Weight~Item_Identifier,data = all_bms,FUN = mean)
#将均值赋值给对应缺失的重量值
for (i in which(is.na(all_bms$Item_Weight))) {
all_bms$Item_Weight[i] <- tmp$Item_Weight[tmp$Item_Identifier == all_bms$Item_Identifier[i]]
}
#检查缺失值,处理后没有缺失值
sum(is.na(all_bms$Item_Weight))
2、处理缺失值:商店大小
由于商店大小的值跟我们的前面的假设比较相关,商店的面积可能还与商店的类型等有关联,
#检查商店大小与商店类型的关系
<