数据描述
概述
本数据为一个月内的天猫订单数据,时间为2020年2月1日至2020年2月29日,数据量为28010条。
字段说明:
- 订单编号:订单编号
- 总金额:订单总金额
- 买家实际支付金额:已付款情况下,为总金额 - 退款金额;未付款的情况下,金额为0
- 收货地址:各省份
- 订单创建时间:下单时间
- 订单付款时间:付款时间
- 退款金额:付款后申请退款的金额。无退款或未付过款,退款金额为0
分析目标
- 计算订单各环节的转化率,了解用户行为
- 计算并画图查看每天的订单量,了解订单高峰时间
- 画图查看订单在各省份的分布情况,了解各省份的成交情况
数据处理与分析
数据预处理
1、首先导入包,读取数据并查看数据前10行
In:
# 导入pandas、numpy、matplotlib包
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 读取数据
df = pd.read_csv('C:/data/tmall_order_report.csv')
df.head(10)
Out:
订单编号 总金额 买家实际支付金额 收货地址 订单创建时间 订单付款时间 退款金额
0 1 178.8 0.0 上海 2020-02-21 00:00:00 NaN 0.0
1 2 21.0 21.0 内蒙古自治区2020-02-20 23:59:54 2020-02-21 00:00:02 0.0
2 3 37.0 0.0 安徽省 2020-02-20 23:59:35 NaN 0.0
3 4 157.0 157.0 湖南省 2020-02-20 23:58:34 2020-02-20 23:58:44 0.0
4 5 64.8 0.0 江苏省 2020-02-20 23:57:04 2020-02-20 23:57:11 64.8
5 6 327.7 148.9 浙江省 2020-02-20 23:56:39 2020-02-20 23:56:53 178.8
6 7 357.0 357.0 天津 2020-02-20 23:56:36 2020-02-20 23:56:40 0.0
7 8 53.0 53.0 浙江省 2020-02-20 23:56:12 2020-02-20 23:56:16 0.0
8 9 43.0 0.0 湖南省 2020-02-20 23:54:53 2020-02-20 23:55:04 43.0
9 10 421.0 421.0 北京 2020-02-20 23:54:28 2020-02-20 23:54:33 0.0
2、查看数据基本信息
In:
df.info()
Out:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 28010 entries, 0 to 28009
Data columns (total 7 columns):
订单编号 28010 non-null int64
总金额 28010 non-null float64
买家实际支付金额 28010 non-null float64
收货地址 28010 non-null object
订单创建时间 28010 non-null object
订单付款时间 24087 non-null object
退款金额 28010 non-null float64
dtypes: float64(3), int64(1), object(3)
memory usage: 1.5+ MB
可以看到,只有订单付款时间的数据数量与其他字段不一致,存在缺失值,在之后可能需要处理。
3、查看字段信息并进行规范
In:
df.columns
Out:
Index(['订单编号', '总金额', '买家实际支付金额', '收货地址 ', '订单创建时间', '订单付款时间 ', '退款金额'], dtype='object')
In:
# 发现字段名称中存在空格,进行规范
df.columns = ['订单编号', '总金额', '买家实际支付金额', '收货地址', '订单创建时间', '订单付款时间', '退款金额']
df.columns
Out:
Index(['订单编号', '总金额', '买家实际支付金额', '收货地址', '订单创建时间', '订单付款时间', '退款金额'], dtype='object')
4、查看是否存在重复数据
In:
df.duplicated().sum()
Out:
0
可以看出不存在重复数据,不需要进行处理。
5、查看缺失值
In:
df['订单付款时间'].isnull().sum()
Out:
3923
可以看到,订单付款时间存在3923个缺失值,说明这些订单中有3923笔下单但未进行付款,属于正常现象,无需进行处理。
计算订单转化率
1、 计算各环节订单数
In:
import collections
dic_cvr = collections.OrderedDict({'订单总数':len(df['订单编号']),
'支付订单数':df['订单付款时间'].notnull().sum(),
'到款订单数':len(df[df['买家实际支付金额'] != 0]),
'全额到款订单数':len(df[(df['买家实际支付金额'] != 0) & (df['退款金额'] == 0)])})
df_cvr = pd.Series(dic_cvr,name = '订单数').to_frame()
df_cvr
out:
订单数
订单总数 28010
支付订单数 24087
到款订单数 18955
全额到款订单数 18441
2、计算各环节与订单总数的转化率
In:
cvr_total = df_cvr['订单数']/df_cvr.loc['订单总数','订单数']
df_cvr['总转化率'] = cvr_total
df_cvr[['总转化率']] = df_cvr[['总转化率']].applymap(lambda x :'%.2f%%' % (x*100))
df_cvr
Out:
订单数 总转化率
订单总数 28010 100.00%
支付订单数 24087 85.99%
到款订单数 18955 67.67%
全额到款订单数 18441 65.84%
3、绘制总转化率漏斗图
In:
from pyecharts.charts import Funnel
from pyecharts import options as opts
funnel = Funnel().add( '总转化率',
[list(z) for z in zip(df_cvr.index,cvr_total)],
label_opts = opts.LabelOpts(position = 'inside'))
funnel.render_notebook()
Out:
image.png
4、计算各环节与上一环节的转化率
In:
cvr_single = df_cvr['订单数'].shift() # 将数据向下移一位,第一行变成NAN
cvr_single = cvr_single.fillna(df_cvr.loc['订单总数','订单数']) # 将第一行的NAN填上订单总数的数据,用于计算
cvr_single = df_cvr['订单数']/cvr_single
df_cvr['单一环节转化率'] = cvr_single
df_cvr[['单一环节转化率']] = df_cvr[['单一环节转化率']].applymap(lambda x :'%.2f%%' % (x*100))
df_cvr
Out:
订单数 总转化率 单一环节转化率
订单总数 28010 100.00% 100.00%
支付订单数 24087 85.99% 85.99%
到款订单数 18955 67.67% 78.69%
全额到款订单数 18441 65.84% 97.29%
5、绘制单一环节转化率漏斗图
In:
funnel = Funnel().add( '单一环节转化率',
[list(z) for z in zip(df_cvr.index,cvr_single)],
label_opts = opts.LabelOpts(position = 'inside'))
funnel.render_notebook()
Out:
image.png
订单趋势查看
查看每日订单数趋势并绘图
In:
plt.figure(figsize=(12,7))
df_sales = df
df_sales['订单创建时间'] = pd.to_datetime(df_sales['订单创建时间'])
df_sales = df_sales.set_index('订单创建时间')
df_sales_day = df_sales.resample('D')['订单编号'].count() # 按天计数
x = df_sales_day.index
y = df_sales_day
plt.plot(x,y,color = '#E9967A', marker = 'd')
plt.title('每日订单数')
plt.xlabel('日期')
plt.ylabel('订单数')
for a, b in zip(x, y):
plt.text(a, b, b, ha='center', va='bottom', fontsize=12)
plt.show()
Out:
image.png
上图可以看出,从2月中旬,即15日开始,每日订单量开始逐步上升,可能是由于疫情逐步缓解,企业开始慢慢复工,订单量也就逐步上涨。
订单区域分布查看
按区域分组后画图查看
In:
df_sales_map = df_sales.groupby('收货地址')['收货地址'].count().sort_values(ascending = False)
plt.figure(figsize=(10,5))
df_sales_map.plot(kind = 'bar',color = '#87CEFA')
Out:
image.png
从上图可以看出,订单量最高的区域是上海,其次广东,且上海的订单明显高于其他省市。
绘制地理分布图查看
1、 处理收货地址,使其与Map中一致
In:
result = []
for i in df_sales_map.index:
if i.endswith('自治区'):
if i == '内蒙古自治区':
i = i[:3]
result.append(i)
else:
i = i[:2]
result.append(i)
else:
result.append(i)
df_sales_map.index = result
2、将其他非自治区省份的省去掉
In:
df_sales_map.index = df_sales_map.index.str.strip('省')
df_sales_map.index
Out:
Index(['上海', '广东', '江苏', '浙江', '北京', '四川', '山东', '辽宁', '天津', '湖南', '河北', '重庆',
'河南', '云南', '安徽', '陕西', '福建', '山西', '广西', '江西', '吉林', '黑龙江', '贵州',
'内蒙古', '海南', '甘肃', '湖北', '新疆', '宁夏', '青海', '西藏'],
dtype='object')
3、绘制地理分布图
In:
from pyecharts.charts import Map
sales_map = Map().add( '订单数',[list(i) for i in df_sales_map.items()]).set_global_opts(visualmap_opts=opts.VisualMapOpts(max_=max(df_sales_map)*0.6)) # 设置最大数据范围
sales_map.render_notebook()
Out:
image.png
上图可见,订单量较多的区域主要是江浙沪、广东、北京、四川、重庆等地。我们可以推测,订单数与区域经济情况挂钩,经济越发达的地区,订单越多。