天猫订单综合分析

262 阅读3分钟

png

订单读取及处理

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import os
import warnings
warnings.filterwarnings('ignore')

读取数据

path = r'H:\下载\个人\笔记\和鲸数据分析项目\天猫订单综合分析/tmall_order_report.csv'
df = pd.read_csv(path,engine = 'python',encoding = 'utf')
df.head(1)
df.tail(1)

处理数据

规范字段名称

df.columns
df.info()

重复值

df.duplicated().sum()

缺失值

df.isnull().sum()
# 订单付款时间 有2923个缺失值,属于正常现象,说明这些单位付过款,无需处理

订单转化率-漏斗图

计算每个环节的数据

  • 将得到如下数据
    ['总订单数', '28010'],
    ['付款订单数', '24087'],
    ['到款订单数', '18955'],
    ['全额到款订单数', '18441']
  • 买家实际支付金额:总金额 - 退款金额(在已付款的情况下)。金额为0(在未付款的情况下)
  • 退款金额:付款后申请退款的金额。如无付过款,退款金额为0

订单总笔数

dict_convs = dict()
key = '总订单数'
dict_convs[key] = len(df)
len(df)

付过款的订单数

key = '付款订单数'

# 付款时间不为空的,表示付过款
df_payed = df[df['订单付款时间'].notnull()]

dict_convs[key] = len(df_payed)

len(df_payed)

到款订单数

key = '到款订单数'

# 买家实际支付金额:总金额 - 退款金额(在已付款的情况下)
# 买家实际支付金额不为0的,说明订单商家收到过款
df_trans = df_payed[df_payed['买家实际支付金额'] != 0]

dict_convs[key] = len(df_trans)

len(df_trans)

全额到款订单数

key = '全额到款订单数'

# 在付款的订单中,退款金额为0的,说明没有退款,表示全额收款
df_trans_full = df_payed[df_payed['退款金额'] == 0]

dict_convs[key] = len(df_trans_full)

len(df_trans_full)
# 查看转化数据
dict_convs

转化率-呈现

df_convs = pd.Series(dict_convs,name = '订单数').to_frame()
df_convs

总体转化率

# 添加总体转化率,每个环节除以总订单数
name = '总体转化率'
total_convs = df_convs['订单数']/df_convs.loc['总订单数','订单数']*100
df_convs[name] = total_convs.apply(lambda x : round(x,0))   #round() 方法返回浮点数的四舍五入值。
df_convs
from pyecharts.charts import Funnel
from pyecharts import options as opts
funnel = Funnel().add(
                    series_name = name,
                    data_pair = [ list(z) for z in zip(df_convs.index,df_convs[name]) ],
                    is_selected = True,
                    label_opts = opts.LabelOpts(position = 'inside')
                    )
funnel.set_series_opts(tooltip_opts = opts.TooltipOpts(formatter = '{a}<br/>{b}:{c}%'))

funnel.set_global_opts( title_opts = opts.TitleOpts(title = name),
#                         tooltip_opts = opts.TooltipOpts(formatter = '{a}<br\>{b}:{c}%'),
                      )
                        
funnel.render_notebook()

png

单一环节转换率

# 添加单一环节转化率,每个环节除以上一环节

name = '单一环节转化率'
single_convs = df_convs['订单数'].shift()

df_convs[name] = single_convs.fillna(df_convs.loc['总订单数','订单数'])

# df_convs[name] = (df_convs['订单数']/df_convs[name]*100).apply(lambda x : round(x,0))

df_convs[name] = round((df_convs['订单数']/df_convs[name]*100),0)
df_convs
name = '单一环节转化率'

funnel = Funnel().add(
                    series_name = name,
                    data_pair = [ list(z) for z in zip(df_convs.index,df_convs[name]) ],
                    is_selected = True,
                    label_opts = opts.LabelOpts(position = 'inside')
                    )
funnel.set_series_opts(tooltip_opts = opts.TooltipOpts(formatter = '{a}<br/>{b}:{c}%'))

funnel.set_global_opts( title_opts = opts.TitleOpts(title = name),
#                         tooltip_opts = opts.TooltipOpts(formatter = '{a}<br\>{b}:{c}%'),
                      )
                        
funnel.render_notebook()

png

整体订单趋势

# 按到款订单统计
df_trans['订单创建时间'] = df_trans['订单创建时间'].astype('datetime64')
df_trans=df_trans.set_index('订单创建时间')
df_trans.head(1)
#xLable没有出现时:plt 画图是找不到字体,需要添加两行程序,如下:
plt.rcParams['font.sans-serif']=['SimHei']  #显示中文标签 
plt.rcParams['axes.unicode_minus']=False

se_trans_month = df_trans.resample('D')['订单编号'].count()
se_trans_month.plot()
se_trans_month.name

png

from pyecharts.charts import Line
name = '订单数'

(
    Line()
    .add_xaxis(xaxis_data = list(se_trans_month.index.day.map(str)))
    .add_yaxis(
        series_name= name,
        y_axis= se_trans_month,

    )
    .set_global_opts(
        yaxis_opts = opts.AxisOpts(
            splitline_opts = opts.SplitLineOpts(is_show = True)
        )
    )
    .render_notebook()
)

png

结论:

2月上半个月,企业多数未复工,快递停运,无法发货
下半个月,随着企业复工逐渐增多,订单数开始上涨

#订单平均价格
df_trans['买家实际支付金额'].mean()

销量区域分布-地理图

#xLable没有出现时:plt 画图是找不到字体,需要添加两行程序,如下:
plt.rcParams['font.sans-serif']=['SimHei']  #显示中文标签 
plt.rcParams['axes.unicode_minus']=False

se_trans_map = df_trans.groupby('收货地址')['收货地址'].count().sort_values(ascending = False)
plt.figure(dpi = 100)
se_trans_map.plot(kind = 'bar')
# len(se_trans_map)

png

df.columns
# '订单编号', '总金额', '买家实际支付金额', '收货地址', '订单创建时间', '订单付款时间', '退款金额'
# 为了保持由于下面的地理分布图使用的省份名称一致,定义一个处理自治区的函数
def strip_region(iterable):
    result = []
    for i in iterable:
        if i.endswith('自治区'):
            if i == '内蒙古自治区':
                i = i[:3]
                result.append(i)
            else:
                result.append(i[:2])
        else:
            result.append(i)
    return result
# 处理自治区,
se_trans_map.index = strip_region(se_trans_map.index)

# 去掉末位‘省’字
se_trans_map.index = se_trans_map.index.str.strip('省')
import pyecharts.options as opts
from pyecharts.charts import Map
# 展示地理分布图
name = '订单数'

(
    Map()
    .add(
        series_name = name,
        data_pair= [list(i) for i in se_trans_map.items()])
    .set_global_opts(visualmap_opts=opts.VisualMapOpts(
        max_=max(se_trans_map)*0.6
    )
                    )
    .render_notebook()
)

png