天猫订单综合分析

数据描述

概述

本数据为一个月内的天猫订单数据,时间为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

上图可见,订单量较多的区域主要是江浙沪、广东、北京、四川、重庆等地。我们可以推测,订单数与区域经济情况挂钩,经济越发达的地区,订单越多。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。