摘要
本次实践案例利用数据kaggle数据进行分析。链接如下
该数据集为西班牙在线杂货店Ulabox订单数据,数据集包括匿名的子集30K订单从2017年开始的所有类型的客户。整个分析分为五个步骤:“提出问题”,“理解数据”,“数据清洗”,“建立模型”,“总结”。
提出问题
所谓提出问题就是建立目标,我们进行数据分析的过程最终就是为了完成目标。那么这次项目的目标是:什么样的客户喜欢在Ulabox平台上购物。
在以此为一级目标的前提下,将一级目标分为三个子目标,在根据子目标的需要确定所需要的字段。分析目标的脑图如下:
理解数据
明确了目标后,需要理解数据,理解数据其实就包括数据的获取、导入、查看数据集信息。获取数据上边已经提到链接,接下来就是导入数据
一、导入数据
我们需要将这些数据导入到python的数据结构中。
二、查看数据集的信息
包括描述统计信息,从整体上理解数据
首先导入数据:
#导入数据分析包
import pandas as pd
import numpy as np
#读取csv文件
fileNameStr= open('C:/Users/Administrator/Desktop/python第三关/作业/ulabox_2017.csv')
salesDf = pd.read_csv(fileNameStr)
接下来打印前五行数据,并且查询有多少行多少列。这样能够清楚了解数据的大概样子,都有哪些字段信息以方便了解这些字段特点。
customer :消费者ID,一个消费者可能有多个订单
order :订单ID,订单的唯一标识,不重复
total_items :订单中购买的商品数量
discount% :收到的总折扣百分比
weekday :下单时间:星期几下单,1-7 为 周一至周日
hour :下单时间:几点下单,0-23 为二十四小时制
Food% :食物在订单总价中占比,食物为非生鲜类食物
Fresh% :生鲜类食物在订单总中占比
Drinks% :饮品在订单总价占比,由于高糖税可能导致总折扣为负
Home% :家居用品在订单总价中占比
Beauty% : 美妆类产品在订单总价中占比
Health% :保健类产品在订单总价中占比
Baby% :母婴类产品在订单总价占比
Pets% :宠物用品在订单总价占比
数据清洗
在做数据分析之前对数据进行清洗,原因是很多读取进来的数据并不符合我们分析的标准。选择子集:选择研究问题需要的子集;
从 原始数据中选择子集,可以使用loc方法来进行选择,以上数据字段都是数据分析过程需要的,因此就不用再做出选择了。
2.列名重命名:如果数据列名不符合使用习惯或不方便数据分析时就需要对这些列名进行重命名;
在此举一个例子,比如‘Food%’字段修改成‘Food’,我们可以先定义一个旧列名和新列名对应关系的字典,然后使用数据框的rename方法进行重命名。首先传入了一个参数inplace,他的意思是如果inplace的值等于false表示数据框本身会变,会另外自动创建一个新的数据框,这样就不影响原来的数据框默认的inplace值是false,如何inplace等于true的话,表示重命名是在原来的数据框中进行操作的,那么原始数据框会变成重命名之后的样子。
#字典:旧列名和新列名对应关系
colNameDict = {'discount%':'discount','Food%':'Food','Fresh%':'Fresh','Drinks%':'Drinks',
'Home%':'Home','Beauty%':'Beauty','Health%':'Health','Baby%':'Baby','Pets%':'Pets'}
'''inplace=False,数据框本身不会变,而会创建一个改动后新的数据框,默认的inplace是Falseinplace=True,数据框本身会改动'''
salesDf.rename(columns = colNameDict,inplace=True)
salesDf.head()
3.缺失数据处理:由于原始数据有些没用记录或造成数据是空值,这时就需要运用到某些计数来处理缺失值;
首先查询是否存在缺失值
两种方法都确定数据中没有缺失值,如果不查看缺失值的个数,数据中我消费者ID和订单号是不允许为空的,因此使用dropna来删除缺失数据,需要给函数传入了两个参数,一个参数名称是subset用于存放删除指定列的列表,另一个参数名称是how用于指定如何删除数据,这里how等于any表示在给定的任何一列有缺失值就删除
4.数据类型转换:比如有些数字的导入时是字符串类型,当我们需要计算的时候就会不方便,这时就需要转换成数字类型;刚刚已经查看过数据的数据类型,没有需要转化的,所以这次研究的问题数据类型是不需要转化的。
5.数据排序:数据排序方便我们发现更多有价值的信息;
利用sort_values方法指定列名进行排序。Sacending=True是表示升序排列,相反的Sacending=False就是降序排列。
'''
by:按哪几列排序
ascending=True 表示升序排列,
ascending=False表示降序排列
'''
#按订单数量进行降序排列
salesDf=salesDf.sort_values(by='total_items',
ascending=False)
salesDf.head()
按照订单数量排序后需要重命名行名,因为排序后的索引值是之前的行号,需要修改成从0到n按顺序的索引值。利用reset_index方法将行号修改成从0到n按顺序的索引值。
6.异常值处理:有些数值太大或太小超过了我们定义的范围,这时就需要对异常值进行特殊的处理;
使用数据框的describe方法来获取数据框中每一列的描述统计信息。描述统计信息可以整体上描述统计集:salesDf.describe()
从上图中可以看到折扣率的最小值是负数,这里的折扣率代表,如果客户在100欧元的订单中节省20欧元(也就是说,他必须支付80欧元),则此字段将包含20个。此字段实际上包括折扣和充值(如糖税),因此有时可能是负数。
建立模型
问题1、该在线超市的用户日常下单的时间习惯是什么?
#画分布图
plt.hist(salesDf['hour'])
#设置横坐标轴范围
plt.xlim((0, 23))
#设置坐标轴名称
plt.xlabel('hour')
#设置坐标轴刻度
my_x_ticks = np.arange(0, 23, 1)
plt.xticks(my_x_ticks)
#显示出所有设置
plt.show()
问题2、周末及工作日商品销售情况有何不同;
weekday_count = dict(salesDf['weekday'].value_counts())#统计weekday列元素的值的个数
weekday_count
问题3、新老客户比例是多少?
根据customer统计出每位客户的下单数量
购买次数最多的是52次,大部分客户都是一次购物,购物一次的客户占比约为45%。说明该在线超市能够的获取新客户。
问题4、该在线超市客户主要购买那一类产品?
首先判断该在线超市客户主要购买那一类产品,我们可以认为愿意花更多价钱购买一种产品的客户为主要购买的用户,数据体现为购买某种产品折扣率为负的这部分客户。并且家具用品购买的占比要相对高,此项分析选取折扣率小于零切占比大于%50的用户;
利用以下代码判断:
从上述判断可以看出,该在线超市用户购买美妆、保健品和宠物用品较少。以非生鲜类食物、生鲜类食物和饮品为主。用户购买最多的还是饮品类的商品。
问题5、该在线超市客户在购买主要产品后还购买什么?
该超市客户中喜欢喝饮料的人还喜欢购买什么?首先筛选客户中折扣率小于0且购买的物品占比在50%以上的订单。
总结
1.该在线超市用户喜欢在22、21、10~13点三个时间点购物下单,从中可以推断该在线商店用户上班族居多,下单时间都是工作日以外的时间;
2.客户下单量集中在周天和周一,推荐集中在这些时间进行满减等活动;
3.超市对新客户具有吸引力,但高频购买的老客户不足,需要思考如何留存老客户。
4.该在线超市客户中喜欢购买饮品的人还喜欢购买非生鲜类食品和家居用品,建议当用户浏览饮料类商品时可进行相关饮料、家居用品和食品推荐