一、数据描述
1.1数据集描述
数据集为某电商平台2016年一整年的交易数据, 数据包含104557条数据,10个字段。
1.2数据展示
二、问题提出
1、各个月的订单数是否均衡?
2、在不同价格段之间的商品销售情况?
3、在不同时间段下单情况如何?
三、数据清洗和预处理
3.1缺失值处理
df.isnull().sum(axis=0) # 查看缺失值 ---------------------------------------- orderId 0 userId 0 productId 0 cityId 0 price 0 payMoney 0 channelId 8 deviceType 0 createTime 0 payTime 0 deviceName 87 dtype: int64
发现 deviceName 有87个缺失值,而 deviceType 没有缺失值,看一下 deviceType 的取值分布:
df["deviceType"].value_counts() ---------------------------------- 2 52448 3 42948 1 7054 4 2017 6 87 5 3 Name: deviceType, dtype: int64
发现这一列有类别为6的值,数量刚好为87,而设备信息文件并没有6这个类别,怀疑是信息填错了,将其重新归类为5,同时将 deviceName 的缺失值用"other"进行填充:
df[‘deviceType‘].replace({6: 5}, inplace = True) df.fillna({"deviceName": "other"}, inplace=True)
还有一列有8个缺失值,数据占比较少,我们直接将其删除:
df.dropna(inplace=True) df.isnull().sum(axis=0) ------------------------ orderId 0 userId 0 productId 0 cityId 0 price 0 payMoney 0 channelId 0 deviceType 0 createTime 0 payTime 0 deviceName 0 dtype: int64
删除缺失值之后,再来看一下数据集的大小:
df.shape -------------------------- (104549, 11)
3.2异常值处理
可以通过数据概况初步探索异常值:
df.describe()
根据上面的结果可以看出 productId 最小值是0,payMoney 有负值,这明显是不合理的,我们需要对其进行处理。
首先看看 productId 值为0的数量,数量较少的话直接删除:
df.productId[(df.productId == 0)].size ------------------------------------------------- 177 # 177条记录,数量不多,直接删掉 df.drop(index=df[df.productId==0].index, inplace=True)
对于 payMoney 存在负值的记录,直接将其删除:
df.productId[(df.payMoney < 0)].size ---------------------------------------- 6 # 只有6条记录,直接删除 df.drop(index=df[df.payMoney < 0].index, inplace=True)
再看一下这两列值的情况:
df[["productId", "payMoney"]].describe() ------------------------------------------ productId payMoney count 104366.000000 1.043660e+05 mean 505.417626 8.690449e+04 std 287.629531 9.075357e+04 min 1.000000 0.000000e+00 25% 255.000000 3.360000e+04 50% 508.000000 5.500000e+04 75% 759.000000 1.040000e+05 max 1000.000000 2.294200e+06
四、各变量相关性数据分析与可视化
4.1总体情况分析
先来看一下2016年一年的总体情况:
# 总订单数,总下单用户,总销售额,有销售的商品数 print(df.orderId.count()) print(df.userId.unique().size) print(df.payMoney.sum()/100) # 原单位是“分”,需要转换成“元” print(df.productId.unique().size) -------------------------------------- 104356 102474 906931.2370000001 1000
再看看一下各个月的情况:
# 增加一个月份列,方便按照月份来进行统计 df[‘month‘] = df["payTime"].dt.month month = df["month"].unique() order_count = df.groupby(by=‘month‘).count()["orderId"] plt.bar(month, order_count) plt.show()
4.1各维度分析
分析数据可以从两方面开始考虑,一个是维度,一个是指标,维度可以看做x轴,指标可以看成是y轴,同一个维度可以分析多个指标,同一个维度也可以做降维升维。
价格分析
对于价格,可以看下所有商品价格的分布,这样可以知道什么价格的商品卖的最好:
# 原单位是“分”,需要转换成“元” df[‘price‘] = df[‘price‘] / 100 # 先按照100的区间取分桶 bins = np.arange(0, 7500, 100) print(pd.cut(df.price, bins).value_counts()) ----------------------------------------------- (400, 500] 14791 (300, 400] 10737 (200, 300] 9966 (500, 600] 9189 (600, 700] 8777 (100, 200] 7123 (700, 800] 7111 .... (6400, 6500] 2 (5500, 5600] 1 (7300, 7400] 0 Name: price, Length: 74, dtype: int64 plt.figure(figsize=(16, 16)) plt.hist(df[‘price‘], bins)
下单时间分析
按小时分析:
# 按小时的下单量分布,可以按时间做推广 df[‘orderHour‘] = df.createTime.dt.hour df.groupby(‘orderHour‘).count()[‘orderId‘].plot()
从上图可以看出, 中午12-14点下单比较多,应该是午休的时候,然后是晚上20点左右,晚上20点左右几乎是所有互联网产品的一个高峰,下单高峰要注意网站的稳定性、可用性。下单高峰时间段也可以考虑进行推广,效果会更佳。
按星期分析:
df[‘orderWeek‘] = df.createTime.dt.dayofweek + 1 df.groupby(‘orderWeek‘).count()[‘orderId‘].plot()
从上面可以看出,上班时间订单量不断上升,在周六达到顶峰,休息时间人们有更强的购买欲望,这也是比较符合现实的。
支付时间分析
可以看一下客户在下单之后多久时间会进行支付:
def get_seconds(x): return x.total_seconds() df[‘payDelta‘] = (df[‘payTime‘] - df[‘createTime‘]).apply(get_seconds) bins = [0, 50, 100, 1000, 10000, 100000] pd.cut(df.payDelta, bins).value_counts() --------------------------------------- (0, 50] 79229 (100, 1000] 12899 (50, 100] 10674 (1000, 10000] 968 (10000, 100000] 231 Name: payDelta, dtype: int64
从上面可以看出,大部分人下单50秒以内就会进行支付,说明用户基本很少犹豫,购买的目的性很强。
用饼图看一下比例:
pd.cut(df.payDelta, bins).value_counts().plot(kind=‘pie‘, autopct=‘%d%%‘, shadow=True, figsize=(10, 4))
五、主要结论
通过对电商历史交易数据的清洗和分析,给出一些可以提升销量的建议,当然这只是简单的分析,需要更好的提升销量还需要更加深入和专业的分析才行。