Python数据分析预测商品销售额
⼀、选题的背景 
选择此题: 题⽬来源于Kaglge竞赛平台,具有⼀定的学习意义。可以更好的理解机器学习和数据分析的券过程。
⽬标:根据商店的销售数据预测商品的销售额
社会: 通过机器学习帮助商店⽼板做出决策,可以提供货物的资源利⽤率,促进社会经济发展。
经济: 通过对销售额的预测,可以更好的帮助⽼板进货和销售,提⾼商店的收益。
技术: 通过这⼀次的项⽬的学习,可以学到机器学习,数据挖掘的全部流程。从数据获取,到数据处理,特征选择,模型建⽴各个⽅⾯全⾯掌握机器学习的流程。可以更深⼊对机器学习总回归任务的理解。
⼆、⼤数据分析设计⽅案
1.数据集描述:训练集样本个数:8523,测试集样本个数:5681。
数据集字段说明:训练集共 11 个特征,1 个标签;测试集只有 11 个特征,没有标签。其中 Item_Identif
ier, Item_Fat_Content 等 8 个特征的原始数据都是字符串类型,其余特征是浮点数类型。(具体特征如下图所⽰)
2.项⽬实现的主要思路
(1)观察数据集各个特征, 出猜想,结果可能和哪些因素有关
(2)检查各个特征的数据类型,将其转化为树枝类型⽅便计算
(3)观察数据的缺失值,确定缺失值处理⽅法
(4)观察训练集和测试集的特征分布规律,看看有没有需要删除的
(5)样本数据的标准化(归到 0-1 之间)
(6)建模处理训练集的异常值
(7)构建多个模型,分别使⽤交叉验证和⽹格搜索选出最有的参数
(8)使⽤融合的⽅法,对多个模型的结果加权求和
三、数据分析步骤
1.数据源
数据来源datahack.analyticsvidhya/contest/practice-problem-big-mart-sales-iii/
2.数据清洗
⾮数值类型映射为数值类型
(1)统计 Item_Weight 特征所有的变量,结果如下图所⽰(图⽚左边⼀列表⽰该列出现的类别,右边是计数。如第⼀⾏ Low Fat 5089 表⽰Item_Weigh 特征所在列共有 5089 个样本的特征值为 Low Fat),虽然统计发现有四个字段,但是发现 LF,low fat, Low Fat 都表⽰低脂,可以合为⼀项,⽤数字 0 代替。Regular 和 reg 都表⽰正常可合为⼀项,⽤数字 1 代替;
(2)统计 Outlet_Size 特征所有的变量,结果如下图所⽰,商店⼤⼩有三种类型,按如下规则:Small : ⽤数值 1 代替;Medium: ⽤数值 2 代替;High: ⽤数值 3 代替
(3)统计 Outlet_Location_Type 特征所有的变量,结果如下图,商店地域有三种类型,按如下规则:Tier1: ⽤数值 1 代替;Tier2: ⽤数值 2代替;Tier3: ⽤数值3 代替
(4)统计 Item _Type 特征所有的变量,结果如下图,发现有 16 种类型的变量,我们第⼀次尝试将这 16 种类型映射到 1-16 共 16 个整数上,后来参考⽹上的其他⼈的做法,将这 16 种划分为 3 ⼤类,⾷物(Fruits and Vegetables, Snack Foods,Meat, Baking Goods, Bread, Breakfast, Frozen Foods, Dairy, Starchy Foods),⽇⽤品(Household, Others, Health and Hygiene)酒⽔(Soft Drinks, HardDrinks)。处理完的特征较原来的特征模型分数有所提⾼
1import pandas as pd
2import numpy as np
3import matplotlib.pyplot as plt
4import seaborn as sns
5
6from math import sqrt
ics import mean_squared_error # 计算均⽅误差
ics import make_scorer
del_selection import train_test_split
10
del_selection import GridSearchCV, RepeatedKFold, cross_val_score,cross_val_predict,KFold
semble import RandomForestRegressor, GradientBoostingRegressor,AdaBoostRegressor
13from sklearn.linear_model import LinearRegression, Lasso, Ridge, ElasticNet
14
15import warnings
16 warnings.filterwarnings("ignore")
17 %matplotlib inline
18 %config InlineBackend.figure_format = 'svg'
导⼊数据集
1 train_data = pd.read_csv("train_data.csv")
2 test_data = pd.read_csv("test_data.csv")
3 train_data.head()
4# len(test_data)
数据数值化操作
1def small_class_num(data):
2try:
3#Item_Fat_Content
4        Item_Fat_Content = {'Low Fat':0, 'Regular':1,"LF":0,"reg":1,"low fat":0,}
5        data["Item_Fat_Content"] = data["Item_Fat_Content"].apply(lambda x: Item_Fat_Content[x])
6#Outlet_Size
7#        Outlet_Size = {'Small':1, 'Medium':2, 'High':3,'NONE':4}
8#        data["Outlet_Size"].fillna("NONE",inplace=True) #填充缺失值
9#        data["Outlet_Size"] = data["Outlet_Size"].apply(lambda x: Outlet_Size[x])
10        data["Outlet_Size"].replace({"Small":1,"Medium":2,"High":3},inplace = True)
11#Outlet_Location_Type
12        Outlet_Location_Type = {'Tier 3':3, 'Tier 2':2, 'Tier 1':1}
13        data["Outlet_Location_Type"] = data["Outlet_Location_Type"].apply(lambda x: Outlet_Location_Type[x])
14#Outlet_Type
15        Outlet_Type = {'Supermarket Type1':1, 'Supermarket Type2':2, 'Supermarket Type3':3, 'Grocery Store':4,}
16        data["Outlet_Type"] = data["Outlet_Type"].apply(lambda x: Outlet_Type[x])
17except:
18print("数值化已经完成过,切勿重复操作")
19
20 small_class_num(train_data)
21 small_class_num(test_data)
1def item_type_num(data):
2try:
3        data["Item_Type"].replace({"Fruits and Vegetables":"FD","Meat":"FD","Dairy":"FD","Breakfast":"FD"},inplace = True)
4        data["Item_Type"].replace({"Snack Foods":"FD","Frozen Foods":"FD","Canned":"FD"},inplace = True)
5        data["Item_Type"].replace({"Baking Goods":"FD","Breads":"FD","Canned":"FD","Seafood":"FD","Starchy Foods":"FD"},inplace = True)
6        data["Item_Type"].replace({"Household":"NC","Health and Hygiene":"NC","Others":"NC"},inplace = True)
7        data["Item_Type"].replace({"Soft Drinks":"DR","Hard Drinks":"DR",},inplace = True)
8        data["Item_Type"].value_counts()
put through9        data["Item_Type"].replace({"FD":1,"NC":2,"DR":3},inplace = True)
10except:
工程地质结构体定义
11print("数值化已经完成过,切勿重复操作")
12 item_type_num(train_data)
13 item_type_num(test_data)
1 train_data.isnull().sum()
缺失值处理
1def Item_Weight_filna(data):
2"""
3根据商品ID填充,没有则填充平均值
4"""
5    data[data.isnull().values==True] ##查看空⾏
6    Item_Weight_Missing = data[data["Item_Weight"].isnull()].list()
7    Item_Weight_Missing_ID = data["Item_Identifier"][Item_Weight_Missing].tolist()
8    data["Item_Weight"] = data["Item_Weight"].fillna(-1)
9    data_dict = upby('Item_Identifier').Item_Weight.apply(list).to_dict()
10for item in data_dict:
11        a = data_dict[item]
12while -1.0 in a:
13            a.remove(-1.0)
14    b = []
15for item in Item_Weight_Missing_ID:
16try:
17            b.append(data_dict[item][0])
18except:
19            b.append(data["Item_Weight"].mean())
20    data["Item_Weight"][Item_Weight_Missing] = b
21
22 Item_Weight_filna(train_data)
23 Item_Weight_filna(test_data)
数值类型特征归⼀化处理
(1)对于连续性变量(Item_Weight,Item_Visibility,Item_MRP,),发现有的特征值特别⼤,有的特征值很⼩,所以我们将连续型数值标准化。使⽤ min-max 标准化⽅法。
(2)其中,对于商店成⽴的年份(Outlet_Establishment_Year),我们改⽤商店成⽴的时间,⽤当前年份减去成⽴时间可得。这样可以减⼩模型的计算量。
(3)商店 ID (IOutlet_Identifier)和商品 ID (tem_Identifier,)看上去⽆⽤,暂时不做处理。
数据缺失值处理
(1)对数据集进⾏统计可知,数据集(包括测试集和训练集)都存在缺失值,两个数据集的确实值主要集中在 Item_Weight 和
Outlet_Size 上。其中训练集Item_Weight 缺失 1463 个,Outlet_Size 缺失 2410 个;测试集 Item_Weight 缺失 976个,Outlet_Size 缺失1606 个
(2)对 Outlet_Size 的缺失值进⾏处理。我们通过计算所有特征两两间的⽪尔逊系数,得出了特征间的关系矩阵。将其画成热⼒图可以很明显的看出,Outlet_Size 和Outlet_Location_Type 之间的关系最为密切。所以,我们采⽤了随机森林的算法,对已有 Outlet_Size 的书籍构建了模型,然后去预测缺失值。(特征关系矩阵如下图所⽰)
1 matrix = () #相关系数矩阵
xml教程吾爱破解2 f, ax = plt.subplots(figsize=(8, 8))
3 sns.heatmap(matrix,vmax=.8, square=True,cmap="BuPu",annot=True)
(3)对 Item_Weight 的缺失值进⾏处理。发现商品的 Item_Weight 和商品的 ID 有关系,我们可以根据已有重量的商品 ID 去填充其他的缺失值。(如下图所⽰)
销售额分布曲线
预测结果之因变量分析:我们观察了销售⾦额的频率分布图,发现销售额主要集中在 0 – 4000 之间
1 g = sns.kdeplot(train_data["Item_Outlet_Sales"], color="Red", shade = True)
2 g.set_xlabel("Item_Outlet_Sales")
3 g.set_ylabel("Frequency")
3.⼤数据分析过程及采⽤的算法
使⽤随机森林进⾏缺失值填充
semble import RandomForestClassifier
2def Outlet_Size_filna(train_data):
3"""
4上述⽅法失效,使⽤随机森林进⾏填充
5"""
6try:python数据分析基础教程答案
7        train_data["Outlet_Size"].fillna(-1,inplace=True) #填充缺失值
8        fc=RandomForestClassifier()
9        Outlet_Size_Miss = train_data.loc[train_data["Outlet_Size"] == -1]
10        Outlet_Size_Train = train_data.loc[train_data["Outlet_Size"] != -1]
python traceback11        Train_P = Outlet_Size_Train[["Outlet_Location_Type"]]
12        Train_L = Outlet_Size_Train["Outlet_Size"]
13        fc=RandomForestClassifier()
14        fc.fit(Train_P,Train_L)
15        c = Outlet_Size_Miss["Outlet_Location_Type"].shape(-1,1)
16        d = fc.predict(c)
rounddown函数公式17        train_data.loc[train_data["Outlet_Size"]==-1,"Outlet_Size"] = d
18except:
19print("缺失值填充完毕,请勿重复操作!!!")
20
21 Outlet_Size_filna(train_data)
22 Outlet_Size_filna(test_data)
各个特征与结果的关系
1def draw_feature_result(feature,x=10,y=4):
2    fig, (ax1, ax2) = plt.subplots(1,2, figsize=(x,y))
3    sns.barplot(x = feature, y="Item_Outlet_Sales", data=train_data, ax=ax1)
4
5    feature_1 = train_data['Item_Outlet_Sales'].groupby(train_data[feature]).sum()
6    dict_feature_1 = {feature:feature_1.index,'Item_Outlet_Sales':feature_1.values}
7    dict_feature_1 = pd.DataFrame(dict_feature_1)
8    sns.barplot(x=feature, y="Item_Outlet_Sales", data=dict_feature_1, ax=ax2)
9
10 draw_feature_result("Item_Fat_Content")

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。