python数据分析小案例:天猫订单数据综合分析

2023-12-14 01:29:02

嗨喽~大家好呀,这里是魔王呐 ? ~!

python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取

本数据集共收集了发生在一个月内的28010条数据,包含以下:

7个字段说明

  1. 订单编号:订单编号

  2. 总金额:订单总金额

  3. 买家实际支付金额:总金额 - 退款金额(在已付款的情况下)。金额为0(在未付款的情况下)

  4. 收货地址:各个省份

  5. 订单创建时间:下单时间

  6. 订单付款时间:付款时间

  7. 退款金额:付款后申请退款的金额。如无付过款,退款金额为0

分析目的

  1. 订单每个环节的转化转化率

  2. 订单成交的时间(按天)趋势(按实际成交)

  3. 订单数在地图上的分布

订单读取及处理

读取数据
import pandas as pd
df = pd.read_csv('tmall_order_report.csv',encoding='gbk')
df.head()

处理数据
df.columns
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:926207505
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# 将字段名称中空格去掉,规范字段名称
df = df.rename( columns = {'收货地址 ':'收货地址','订单付款时间 ':'订单付款时间'} )
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)
付过款的订单数
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:926207505
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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)
全额到款订单数
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:926207505
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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

总体转化率
round(df_convs['订单数']/df_convs.loc['总订单数','订单数']*100,0)

# 添加总体转化率,每个环节除以总订单数
name = '总体转化率'
total_convs = round(df_convs['订单数']/df_convs.loc['总订单数','订单数']*100,0)
df_convs[name] = total_convs
df_convs

# 漏斗图 Funnel
from pyecharts.charts import Funnel
from pyecharts import options as opts
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:926207505
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
funnel = (
    Funnel()
    .add(
        "总体转化率",
        [list(z) for z in zip(df_convs.index,df_convs["总体转化率"])],

        # 让外面的字体出现在图上面
        label_opts = opts.LabelOpts(position = 'inside')
        )
    # 设置系列选项,格式化输出
    .set_series_opts(tooltip_opts = opts.TooltipOpts(formatter = '{a}<br/>{b}:{c}%'))

    # 设置全局选项,添加标题
    .set_global_opts(title_opts = opts.TitleOpts(title = "总体转化率"))
)
funnel.render_notebook()

  • 那么这个的话就是我们的一个漏斗图,我们可以看到天猫的一个总体转化率还是非常高的对吧

  • 所以说像这个天猫他的一个对于商品的推荐还是做的非常不错的

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

name = '单一环节转化率'

# shift(): 让整个列往下移动一个位置
# 那么移完位置之后就不可避免会出现第一个位置是空的
# 所以这里我们把第一个位置填数据
df_convs["单一环节转化率"] = df_convs['订单数'].shift().fillna(28010.0)

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

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:926207505
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
name = '单一环节转化率'

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

整体订单数趋势

# 按到款订单统计

# 将订单创建时间这一字段改成时间类型的数据
df_trans['订单创建时间'] = df_trans['订单创建时间'].astype('datetime64')
# 然后让订单创建时间变成行标
df_trans=df_trans.set_index('订单创建时间')
# 最后看一下前5行
df_trans.head()

df_trans.resample('D')['订单编号'].count().index.day.astype('str').tolist()
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:926207505
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# 重采样,时间序列的内容

# 统计每天的订单数量
se_trans_month = df_trans.resample('D')['订单编号'].count()
se_trans_month

from pyecharts.charts import Line
x = se_trans_month.index.day.astype('str').tolist()
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:926207505
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
line = (
    Line()
    # 准备x轴数据,先拿到x轴数据
    # se_trans_month.index
    # 然后只取天
    # se_trans_month.index.day
    # 转成字符串类型,因为直接用整数类型画图会有一点问题
    .add_xaxis(x)
    .add_yaxis(
        "订单数",
        se_trans_month,
    )
    
    # 设置背景有格子
    # 选择性讲,可不讲
    .set_global_opts(
        yaxis_opts = opts.AxisOpts(
            splitline_opts = opts.SplitLineOpts(is_show = True)
        )
    )
    
)
line.render_notebook()

结论:

2月上半个月,企业多数未复工,快递停运,无法发货

下半个月,随着企业复工逐渐增多,订单数开始上涨

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

销量区域分布-地理图

se_trans_map = df_trans.groupby('收货地址')['订单编号'].count()
se_trans_map

import pyecharts.options as opts
from pyecharts.charts import Map
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:926207505
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# 展示地理分布图
map1 = (
    Map()
    .add(
         "订单数",
        [list(i) for i in se_trans_map.items()],
        'china'
    )
    .set_global_opts(
        visualmap_opts=opts.VisualMapOpts(
            max_=max(se_trans_map)*0.6
        )
    )
    
)
map1.render_notebook()

尾语

最后感谢你观看我的文章呐~本次航班到这里就结束啦 🛬

希望本篇文章有对你带来帮助 🎉,有学习到一点知识~

躲起来的星星🍥也在努力发光,你也要努力加油(让我们一起努力叭)。

最后,宣传一下呀~👇👇👇更多源码、资料、素材、解答、交流皆点击下方名片获取呀👇👇

文章来源:https://blog.csdn.net/python56123/article/details/134895643
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。