Python数据分析与可视化教案6.4 超市数据分析与可视化.docx
6.4超市数据分析与可视化随着互联网与大数据的开展,电商杨业得到飞速开展,每天产生成千上万的数据,挖 掘出其中的价值尤为重要。在电商超市数据分析中,分析的内容主要包括三个方面:为高 管提供盈利性分析,为运营部门提供产品分析,为销售部门提供客户分析。一、数据源本案例包括三个数据集:supermarket.csv、category.xlsxs region.txto1. supermarket.csvsupermarketcsv数据集包括字段:利润率、产品ID、产品名称、利润、发货日期、国 家、城市、子类别、客户ID、客户名称、折扣、数量、省、细分、订单ID、订单日期、 邮寄方式、销售额。数据源1如图6-*所示。利润率,产品ID,产品名称,利润,发货日期,国家,城市,子类客户ID,客户名称,折扣,数量,省,细分,订单ID,订单日期,邮寄方式,销售额-47%,办公用-用品-10002717Fiskars 剪刀,蓝色760.704,2018/4/29,中国杭州用品,曾惠-14485,曾惠,0.4.2,浙江,公司,US-2018-1357144,2018/4/27,二级,129.696 34%,办公用-信封-10004832,GlobeWeis 搭扣信封,红色二42.56,2018/6/19,中国,内江,信封,i镇-10165,许安,0,2.00,四川,消费者,CN-2018-1973789,2018/6/15,标酒 13%,办公用-装订-10001505,'Cardinal 抑口固邮,回收42,2018/6八9,中国,内江,窃了机,哙-10165,$,0.42四川,消费者,CN-2018-1973789,2018/6/15,屣纷 -8%,办公用-用品-10003746, Weencut 开信刀,1,-27.104,2018/12/13,中国,镇江用品,宋良-17170,宋良,0.4,400,江苏,公司,US-2018-3017568,2018/12/9,标准纺 40%,办公用-器具-10003452,KtchenAid 搅拌机,黑色”,550.2,2017/6/2,中国,汕头,器具万兰-15730,万兰0,3.00,广东消费者,CN-2017-2975416,2017/5/31,13 34%,技术-设备-10001640,柯尼卡打印机红色,3783.78,2016/10/31,中国,景德镇,设备渝明-18325渝明,0,9,江西,消费者,CN-2016-4497736,2016/10/27,标准级,1 36%,办公用-装订-10001029,由记。订书机 实惠,172.76,2016/10/31,中国,景德猛装订机渝明-18325渝明,0,2,江西消费者,CN-2016-4497736,2016/10/27,标准级 31 %,家具-椅子-10000578JSAFC。扶手椅,可谓,2684.08,2016/10/31,中国,景德镇,椅子,俞明-18325,俞明。4,江西消费者,CN-2016-4497736,2016/10/27标准级 8%,办公用-纸张-10001629JGreen Bar计划信息表,多色,4692016/10/31,中国,景德镇,纸张,俞明-18325,俞明,05江西,消费者,CN-2016-4497736,2016/10/27,标 22%,办公用-系固-10004801,3tockwell 橡皮筋,整包:33.88,2016/10/31,中国,景德镇,系固件,俞明-18325,俞明,0,2,江西,消费者,CN-2016-4497736,2016/10/27,标 1 %,技术-设备"0000001,爱普生计算器,耐用二422015/12/24,中国,榆林,设备,谢雯-21700,谢雯。2,陕西,小型企业XN-2015-4195213,2015/12/22,二级434.28图6-*数据源1 (局部)region.txt数据集包括字段:地区、省。数据源2如图6-*所示。二'"region -记事本文件(F)编辑(E)格式(0)查看(V)帮助(H)地区 省南南南南南南南南南南南南南南南南南南南北南南西东庆南藏川湖湖河海广广重云西四-*数据源2 (局部)category.xlsx数据集包括字段:子类别、类别。数据源3如图6.*所示。 Figure 1今G今 中Q三上 El不同邮政方式的利润和58. 7%标准级图6-*步骤10输出结果三、结论1 .从数据去重的分析结果中可以看出,“订单ID”、“产品ID”、“客户ID”三个字段 相同数据的行很少,说明绝大局部的数据均是可用的。2 .从数据描述性统计的分析结果中可以看出,销售金额排名的前5的产品中有两件产 品是扶手椅,分别排名第2名和第5名。3 .从2015到2018的利润环比情况看,利润是逐年递增的,并且2016年、2017年、 2018年与上一年的利润环比分别为26.3%、32.28%. 9.52%。4 .从交叉透视表分析结果可以看出,销量数量较多包括椅子(华东地区与中南地区)、 装订机(华东地区与中南地区),平均销售金额较多包括桌子(华北地区、东北地区和中南 地区)、复印机(华北地区)、器具(西北地区、东北地区与华北地区)。说明一些商品虽然 销量大,但利润却不大。5 .从条形图的结果中可以看出,在所有地区中,西北和华北平均销售额超过了总体平 均销售额,说明这个地区的销售情况较好。6 .从多子图柱形折线叠加图的结果中可以看出,1月、3月、8月、和12月销售和利润 情况较好,其他月份较差。7 .从环形图的结果中可以看出,标准级的邮寄方式贡献的利润最大,占比到达58.7%。8 .从不同邮寄方式的利润环形图可以看出,标准级的情况最好。文件开始插入页面布局公式数据审c0粘贴等送 12 A? A”X剪切 亳复制 W格式刷/ABC1子类别类别2桌子家具3用具家具4椅子家具5书架家具6设备技术7配件技术8复印机技术9 技术10装订机办公用品11纸张办公用品12用品办公用品13信封办公用品14系固件办公用品15收纳具办公用品16器具办公用品17美术办公用品18标签办公用品B / U 1少笠剪贴板 Q字体E30&图6-*数据源3 (局部)二、目标1 .统计销售金额排名的前5的产品,找出热销商品。2 .计算所有年份的利润,分析利润变化趋势。3 .计算2015-2018年的利润环比。4 .计算2016年中南地区办公用品的平均每月利润。5 .分析不同地区的不同类别对于销售金额的影响。6 .根据不同地区的平均销售额绘制条形图,分析哪些地区的平均销售额较高。7 .根据不同月份的平均销售额、平均利润、平均利润率,在同一个绘图窗口中绘制多 子图柱形图与折线图,并分析哪些月份销售和利润情况较好。8 .根据不同邮寄方式的利润绘制环形图,并分析哪些邮寄方式的利润和较高。三、步骤步骤1 :导入库,设置参数。(1)导入所需要的库 pandas、numpy、matplotlib.pyploto(2)利用pd.sejoption解除显示宽度的显示,设置数据对齐。(3)利用reParams设置相关参数,将显示字体设置为黑体,字体大小设置为15。步骤1代码如下:import pandas as pdimport matplotlib.pyplot as pitpd.set_option('display.unicode.east_asian_widthTrue)pd.set_option('display.widthNone)plt.rcParams,fbnt.sans-serif=,Simhei,plt.rcParamst'font.sizel 5步骤2:读入数据,合并数据,显示数据形状。(1)导入超市的销售数据supermarket.csv、地区分布数据region.txt、商品类别数据 category.xlsx (三个文件均存放在c:data路径中),将导入的数据命名为datal、data2s data3o其中,region.txt文件的分隔符是Tab, category.xlsx的数据在Sheet 1工作表内。(2)利用merge函数将datal、data2. data3三个数据按照合适的关键字进行合并,合 并方式为外连接,命名为data。(3)输出data的行数、列数、列名以及前5行。步骤2 (1)代码如下:datal = pd.read_csv(Hc:/data/supermarket.csvn)data2 = pd.read_csv(,'c:/data/region.txt,',sep='t,)data3 = pd.read_excel(nc:/data/category.xlsxn,sheet_name='Sheetr)步骤2 (2)代码如下:data = pd.merge(datal,data2,how='outer',on=)data 二 pd.merge(data,data3,how='outer',on='子类另lJ')步骤2 (3)代码如下:print("数据的行数=%dn 数据的列数=%dM%(data.shapeO,data.shapel)print("数据的前 5 行为:n”,data.head()输出结果如图6-*所示。Run:6-2C:UsersliliangAnaconda3python.exe C:/Users/liliang/PycharmProjects/sjfx/6-2.py 数据的行数=9959 数据的列数=20 数据的列名为:Index(利润率','产品ID','产品名称',利润'发货日期','国家','城市','子类别,客户ID','客户名称',折扣,数量'省',细分','订单ID','订单日期','邮寄方式','销售额','地区','类别 dtype='object')Process finished with exit code 0数据的前5行为:发货日期国家城市子类别利润率产品ID产品名称利润0-47%办公用-用品-10002717Fiskars剪刀,蓝色-60.7042018/4/29中国杭州 用品1-47%办公用-用品-10002717Fiskars剪刀,蓝色-182.1122017/6/14中国温岭 用品2-5%办公用-用品-10001427Elite大剪刀,蓝色-33.4602015/2/6中国椒江 用品3-42%办公用-用品-10000347Stiletto尺子,锯齿状-68.1802015/11/17中国杭州 用品4-18%办公用-用品-10000764Elite尺子,工业-15.8482017/11/30中国湖州 用品图6-*步骤2输出结果步骤3 :数据预处理(1)将利润率中格式改为小数形式,如5%改为0.05。(2)删除数据中“订单ID”、“产品ID”、“客户ID”三个字段相同数据的行,保存第 一次出现的值。步骤3 (1)代码如下:print(data利润率.head(3)data1利润率】=data利润率apply(lambda x:x.replaceC,%n;n,)#去掉利润率中的data利润率=data'利润率astype(''float'')/100#将去掉的数据再除以100print(data利润率1.head(3)输出结果如图6-*所不。Run:6-2AC:UsersliliangAnaconda3python.exe C:/Users/liliang/PycharmProjects/sjfx/6-2.py0-47%1-47%rp2-5%Name: 利润率,dtype: object».0-0.471-0.472-0.05Name:利润率,dtype: float64Process finished with exit code 0图6-*步骤3 (1)输出结果 步骤3 (2)代码如下:data = data.drop_duplicates(subset寸订单 ID?产品 ID?客户 ID,keep=,first,)print("去重后的行数=n,data.shape0) 输出结果如图6-*所不。Run:6-2AC:UsersliliangAnaconda3python.exe C:/Users/liliang/PycharmProjects/sjfx/6-2.py去重后的行数=9954Process finished with exit code 0 » »图6-*步骤3 (2)输出结果步骤4 :时间序列处理(1)将发货日期和订单日期转换为日期格式。(2)从开始时间(“订单日期”)中分别抽取出年和月,并生成新变量“年”、“月 步骤4 (1)代码如下:print(data发货日期?订单日期R.dtypes)data发货日期口 = pd.to_datetime(data发货日期口)data订单日期口 = pd.to_datetime(da皿,订单日期口)print(data发货日期?订单日期R.dtypes) 输出结果如图6-*所不。Run:6-2AC:UsersliliangAnaconda3python.exe C:/Users/liliang/PycharmProjects/sjfx/6-2.py发货日期object订单日期object rp dtype: object发货日期datetime64ns” .订单日期datetime64nsdtype: object Process finished with exit code 0图6-*步骤4输出结果步骤4 (2)代码如下:data年'=data订单日期data月'=data订单日期print(data'订单日期?年?月 :5) 输出结果如图6-*所不。Run:6-2AC:UsersliliangAnaconda3python.exe C:/Users/liliang/PycharmProjects/sjfx/6-2.py订单日期年 月02018-04-272018412017-06-072017622015-02-0220152» 二32015-11-1320151142017-11-25201711Process finished with exit code 0图6-*步骤4输出结果步骤5 :描述性统计分析(1)统计销售金额排名的前5的产品。(2)计算所有年份的利润,并降序排序。(3)计算2016年中南地区办公用品的平均每月利润。步骤5 (1)代码如下:group_resultl = data.groupby(by=y 品名称')销售额'.sum() group_resultl = group_result 1 ,sort_values(ascending=False) print("销售金额排名的前5的产品:n”,group_resultl.head。) 输出结果如图6-*所不。Run:6-2C:UsersliliangAnaconda3python.exe C:/Users/liliang/PycharmProjects/sjfx/6-2.py 销售金额排名的前5的产品:产品名称华为充电器,混合尺寸Harbour Creations扶手椅,每套两件KitchenAid炉灶,黑色Safco书库,传统Harbour Creations 扶手椅,可调Name:销售额,dtype: float64115078.264102817.48499410.69694952.84493537.780115078.264102817.48499410.69694952.84493537.780Process finished with exit code 0图6-*步骤5 (1)输出结果 步骤5 (2)代码如下:group_result2 二 data.groupby(by='年')'利润.sum。group_result2= group_result2.sort_values(ascending=False) print("每年的利润为:n”,group_resuk2) 输出结果如图6-*所不。Run:声.6-4C:UsersliliangAnaconda3python.exe C:/Users/liliang/PycharmProjects/sjfx/6-4.py 每年的利润为:年201820172016681114.427621896.4922015372236.655470145.767Name:利润,dtype: float64图6-*步骤5 (2)输出结果步骤5 (3)代码如下:loc_result = data.loc(data'年'=2016)& (data地区中南)& (data类别卜士办公用品Rmean = loc_result利润'.sum()/12mean = round(mean,2)print(H2016年中南地区办公用品的平均每月利润为:mean)输出结果如图6-*所不。Run:6-2AC:UsersliliangAnaconda3python.exe C:/Users/liliang/PycharmProjects/sjfx/6-2.py2016年中南地区办公用品的平均每月利润为:3602.1»» Press finished with exit code 0图6-*步骤5 (3)输出结果步骤6 :计算2015-2018年的利润环比。步骤6代码如下:years = group_result2.indexvalues = group_result2n = len(values)hb_list =for i in range(n):if i =0:hb = 0else:hb = (values.iloci-values.iloci-1 )/values.iloci-l print-%d 年的环比=%.2f%n%(yearsi,hb* 100)输出结果如图6-*所不。Run:6-2AC:UsersliliangAnaconda3python.exe C:/Users/liliang/PycharmProjects/sjfx/6-2.py2015年的环比=0.00% 2016年的环比=26.30%» $2017年的环比=32.28%过 2018年的环比=9.52%X 一» Process finished with exit code 0图6-*步骤6输出结果步骤7 :交叉透视表分析(1)绘制不同地区的不同类别的订单频数的频数交叉表。(2)绘制不同地区的不同类别的销售额平均值的数据透视表。步骤7 (1)和步骤7 (2)代码如下:import numpy as nptabi = pd.crosstab(index=data子类另,columns=data地区')print("不同地区的不同类别的订单频数n”,tabi)tab2 = pd.pivot_table(data,index='子类另,columns='地区',values二销售额:aggfunc=np.mean)tab2 = round(tab2,0)print("不同地区的不同类别的销售额平均值n】ab2) 输出结果如图6-*所不。步骤8 :绘制条形图。将窗口大小设为(8, 6),统计不同地区的平均销售额。根据不同 地区的平均销售额绘制条形图,条形的宽度为03图标标题设为“不同地区的平均销售额”, 添加销售额总平均值作为辅助线,辅助线为红色虚线。步骤8代码如下:plt.rcParams'figure.figsize'=(8,6)result 1 = data.groupby(by地区')销售额.mean()rusultl_mean = data销售额'.mean()y = result!.indexwidth = result 1hight = 0.3plt.barh(y,width,hight)pit. title(”不同类别的平均销售额”)plt.axvline(rusultl_mean,color=T,linestyle=':')plt.show()输出结果如图6-*所不。 Figure 1不同地区的平均销售额图6-*步骤8输出结果步骤9 :绘制多子图的柱形折线叠加图(1)将窗口大小设为(10. 8),创立3行1列子图。(2)在3个子图中,根据不同月份的平均销售额、平均利润、平均利润率,绘制多子 图柱形图与折线图,其中横坐标为月份,纵坐标分别为平均销售额、平均利润、平均利润率, 横坐标刻度为1至IJ 12,柱形图的颜色为天蓝,折线图的颜色为红色虚线。步骤9 (1)代码如下:plt.rcParams'figure.figsize'=(10,8) fig,axes = plt.subplots(3,l)ax = axes.ravel()步骤9 (2)代码如下:y =销售额利润利润率'names=平均销售额平均利润?平均利润率1for i,j,k in zip(range(3),y,names):result2 = data.groupby(by='月 |)j.mean()x = result2.indexy = result?axi.bar(x,y,color=,skyblue,)axi.plot(x,y,color=,brown,linestyle = ,1) axi.set_ylabel(k)axi.set_xticks(np.arange( 1,13)plt.show()输出结果如图6-*所示。 Figure 1谷6 去Q三m E)0000O 51 O 0.0.图6-*步骤9输出结果步骤10 :绘制环形图。统计不同邮寄方式的利润和,根据不同邮寄方式的利润和绘制 环形图,内部文本颜色大小设为深绿色、16,饼图的外部文本颜色大小设为红色、20.设置 标题为“不同邮政方式的利润和“。步骤10代码如下:results = data.groupby(by='邮寄方式')利润】.sum()c = ,darkorangeVyellowgreenVskyblueVlightyellow,patches,text l,text2 = plt.pie(x=result3,labels=result3.index,autopct = '%. If%',colors = c,radius=l)for i in textl:i.set_size(20)i.seCcolorCred*)for i in text2:i.set_size(16)i.set_color('darkgreen')plt.pie(x= 1 ,colors='wradius=0.6)pit. title("不同邮政方式的利润和”,color=b)plt.show()输出结果如图6-*所不。