数据分析入门--电商数据分析

目录

项目背景

项目功能

项目结构

代码解析

cosmetic.py

main.py

html文件

Tmall.py

实现结果

化妆品cosmetic

每日订单量趋势

各品牌销量占比

各品牌销售额占比

天猫Tmall

表格

订单地区分布

订单日期分布

订单24小时分布

项目总结


项目背景

        该项目来自于GitHub平台,初衷是本文作者想入手电商数据分析领域而搜寻到的简单上手项目,以下是该项目链接GitHub - makisekurisuDDL/Data_analysis: 电商数据分析。本文书写初衷是为了尝试一下正式的文章书写格式,(主要是流水账式记录多了),本文所选项目旨在帮助数据分析初学者掌握电商数据分析的基本方法和技术。该项目汇集了一系列电商数据集,并提供了一套完整的数据分析流程和实践案例,以帮助用户深入理解电商领域的数据分析方法。

项目功能

        本文往下将称该项目为E-commerce Data Analysis Project。E-commerce Data Analysis Project 提供了以下核心功能:

  1. 数据收集与清洗:项目收集了多个真实电商平台的数据集,包括用户订单、产品信息、交易记录等,用户可以利用项目提供的数据清洗工具对数据进行预处理和清洗,确保数据质量。
  2. 数据分析与可视化:项目提供了丰富的数据分析工具和可视化技术,用户可以利用这些工具对电商数据进行统计分析、趋势分析、用户行为分析等,并通过图表、图形等方式直观展示分析结果。
  3. 业务洞察与决策支持:基于数据分析结果,项目提供了业务洞察和决策支持功能,帮助用户发现潜在的业务机会、优化营销策略、改进产品设计等,从而提升电商业务的效益和竞争力。

        在接下来的部分,我们将深入分析 E-commerce Data Analysis Project 的项目结构、代码结构、技术细节以及如何利用这个项目进行电商数据分析。通过对该项目的详细分析,读者将能够更好地理解电商数据分析的方法和技术,为他们在电商领域的数据分析实践提供有益的参考和指导。

项目结构

        以下为 E-commerce Data Analysis Project的项目结构,其中包括两个数据分析目标,一个是化妆品数据分析,一个是天猫双十一销售数据分析。每个分析目标又包括运行后结果保存文件夹、数据来源.csv文件、分析代码文件、主代码文件以及网页文件。

        接下来,我们将开始分析项目的代码结构。 

代码解析

cosmetic.py

        首先对化妆品数据代码进行分析。首先我们先看分析文件cosmetic.py,这段代码是用于生成电商数据分析的图表并在浏览器中展示。其次是csv文件,接下来解析其中的具体内容:

import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Map, Bar, Line, Pie
import webbrowser


# 每日订单趋势
def day_orders(data):
    result_day = data.groupby('update_time', as_index=False).agg({'sale_count': 'count'})
    days = (
        Line()
        .add_xaxis(result_day['update_time'].tolist())
        .add_yaxis('订单量', result_day['sale_count'].tolist())
        .set_global_opts(xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-45)),
                         title_opts=opts.TitleOpts(title='每日订单量趋势'))
        .set_series_opts(
            label_opts=opts.LabelOpts(is_show=True),
            markpoint_opts=opts.MarkPointOpts(
                data=[
                    opts.MarkPointItem(type_='max', name='最大值'),
                    opts.MarkPointItem(type_='min', name='最小值')
                ]
            )
        )
    )

    days.render('days.html')
    webbrowser.open('days.html', new=0, autoraise=True)

    return 0


# 各品牌销量占比
def brand_sale_count(data):
    result_brand = data.groupby('店名', as_index=False).agg({'sale_count': 'sum'})
    result_brand = result_brand.sort_values(by=['sale_count'], ascending=False)
    others = result_brand[8:]
    others = others['sale_count'].sum()
    result_brand = result_brand[0:8]
    result_brand['sale_count'] = result_brand['sale_count'] / 10000
    result_brand.loc[len(result_brand)] = ['其他', others / 10000]

    brand = (
        Pie()
        .add('销量', [list(z) for z in zip(result_brand['店名'], result_brand['sale_count'])])
        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}万"))
        .set_global_opts(title_opts=opts.TitleOpts(title='各品牌销量占比'))
    )

    brand.render('brand_count.html')
    webbrowser.open('brand_count.html', new=0, autoraise=True)

    return 0


# 各品牌销售额占比
def brand_sale_amount(data):
    result_brand = data.groupby('店名', as_index=False).agg({'sale_amount': 'sum'})
    result_brand = result_brand.sort_values(by=['sale_amount'], ascending=False)
    others = result_brand[8:]
    others = others['sale_amount'].sum()
    result_brand = result_brand[0:8]
    result_brand['sale_amount'] = result_brand['sale_amount'] / 100000000
    result_brand.loc[len(result_brand)] = ['其他', others / 100000000]
    result_brand['sale_amount'] = result_brand['sale_amount'].apply(lambda x: ("%.2f") % x)

    brand = (
        Pie()
        .add('销售额', [list(z) for z in zip(result_brand['店名'], result_brand['sale_amount'])])
        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}亿"))
        .set_global_opts(title_opts=opts.TitleOpts(title='各品牌销售额占比'))
    )

    brand.render('brand_amount.html')
    webbrowser.open('brand_amount.html', new=0, autoraise=True)
    return 0

import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Map, Bar, Line, Pie
import webbrowser
  • 导入库:

    • pandas:用于数据处理和分析。
    • pyecharts:用于生成数据可视化图表。
    • webbrowser:用于在浏览器中打开生成的 HTML 文件。
# 每日订单趋势
def day_orders(data):
    result_day = data.groupby('update_time', as_index=False).agg({'sale_count': 'count'})
    days = (
        Line()
        .add_xaxis(result_day['update_time'].tolist())
        .add_yaxis('订单量', result_day['sale_count'].tolist())
        .set_global_opts(xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-45)),
                         title_opts=opts.TitleOpts(title='每日订单量趋势'))
        .set_series_opts(
            label_opts=opts.LabelOpts(is_show=True),
            markpoint_opts=opts.MarkPointOpts(
                data=[
                    opts.MarkPointItem(type_='max', name='最大值'),
                    opts.MarkPointItem(type_='min', name='最小值')
                ]
            )
        )
    )

    days.render('days.html')
    webbrowser.open('days.html', new=0, autoraise=True)

    return 0
  • 每日订单趋势函数(day_orders(data)):

    • 使用 groupby 函数对数据按照日期进行分组汇总,得到每日的订单量。
    • 利用 pyecharts 中的 Line 类创建折线图,并设置 x 轴为日期,y 轴为订单量。
    • 添加全局选项和系列选项,包括 x 轴标签旋转、图表标题、标记点等。
    • 将生成的图表保存为 HTML 文件,并在浏览器中打开。
# 各品牌销量占比
def brand_sale_count(data):
    result_brand = data.groupby('店名', as_index=False).agg({'sale_count': 'sum'})
    result_brand = result_brand.sort_values(by=['sale_count'], ascending=False)
    others = result_brand[8:]
    others = others['sale_count'].sum()
    result_brand = result_brand[0:8]
    result_brand['sale_count'] = result_brand['sale_count'] / 10000
    result_brand.loc[len(result_brand)] = ['其他', others / 10000]

    brand = (
        Pie()
        .add('销量', [list(z) for z in zip(result_brand['店名'], result_brand['sale_count'])])
        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}万"))
        .set_global_opts(title_opts=opts.TitleOpts(title='各品牌销量占比'))
    )

    brand.render('brand_count.html')
    webbrowser.open('brand_count.html', new=0, autoraise=True)

    return 0
  • 各品牌销量占比函数(brand_sale_count(data)):

    • 使用 groupby 函数对数据按照品牌名称进行分组汇总,得到各品牌的销量。
    • 对销量进行排序,选择销量前8的品牌,其余品牌合并为“其他”。
    • 将销量转换为以万为单位,并创建各品牌销量占比的饼图。
    • 将生成的图表保存为 HTML 文件,并在浏览器中打开。

 

# 各品牌销售额占比
def brand_sale_amount(data):
    result_brand = data.groupby('店名', as_index=False).agg({'sale_amount': 'sum'})
    result_brand = result_brand.sort_values(by=['sale_amount'], ascending=False)
    others = result_brand[8:]
    others = others['sale_amount'].sum()
    result_brand = result_brand[0:8]
    result_brand['sale_amount'] = result_brand['sale_amount'] / 100000000
    result_brand.loc[len(result_brand)] = ['其他', others / 100000000]
    result_brand['sale_amount'] = result_brand['sale_amount'].apply(lambda x: ("%.2f") % x)

    brand = (
        Pie()
        .add('销售额', [list(z) for z in zip(result_brand['店名'], result_brand['sale_amount'])])
        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}亿"))
        .set_global_opts(title_opts=opts.TitleOpts(title='各品牌销售额占比'))
    )

    brand.render('brand_amount.html')
    webbrowser.open('brand_amount.html', new=0, autoraise=True)
    return 0
  • 各品牌销售额占比函数(brand_sale_amount(data)):

    • 使用 groupby 函数对数据按照品牌名称进行分组汇总,得到各品牌的销售额。
    • 对销售额进行排序,选择销售额前8的品牌,其余品牌合并为“其他”。
    • 将销售额转换为以亿为单位,并创建各品牌销售额占比的饼图。
    • 将生成的图表保存为 HTML 文件,并在浏览器中打开。

        通过这些函数,可以根据用户的需求生成相应的数据可视化图表,并在浏览器中展示,以帮助用户更好地理解电商数据的特征和趋势。

main.py

其次是main.py文件

from cosmetic import *

data = pd.read_csv("cosmetic.csv")

data.drop_duplicates(inplace=True)   #数据去重
data.reset_index(drop=True, inplace=True)   #索引重置
data.fillna(0, inplace=True)    #空数据填充
data['update_time'] = pd.to_datetime(data['update_time']).apply(lambda x: x.strftime("%Y-%m-%d"))
data['sale_amount'] = data['sale_count'] * data['price']    #新增“销售额”列


opt = input("********************\n"
            "请选择功能:\n"
            "1.每日订单量趋势\n"
            "2.各品牌销量占比\n"
            "3.各品牌销售额占比\n")

if opt == '1':
    day_orders(data)
elif opt == '2':
    brand_sale_count(data)
elif opt == '3':
    brand_sale_amount(data)
else:
    webbrowser.open('error.html', new=0, autoraise=True)

        该文件导入了一个名为 cosmetic 的模块,然后读取了一个名为 cosmetic.csv 的数据文件。接着进行了一些数据预处理的步骤,包括去重、索引重置、空数据填充以及计算新增的销售额列。

        然后,代码提示用户选择功能,提供了三个选项:

  1. 每日订单量趋势
  2. 各品牌销量占比
  3. 各品牌销售额占比

        根据用户的选择,分别调用了 day_orders()brand_sale_count()brand_sale_amount() 函数来展示相应的数据分析结果。如果用户选择的功能不在列表中,则会打开一个名为 error.html 的文件来显示错误信息。

html文件

        接下来是网页代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Awesome-pyecharts</title>
                <script type="text/javascript" src="https://assets.pyecharts.org/assets/v5/echarts.min.js"></script>

</head>
<body >
    <div id="b770aaf86b114bc1b4e495da3e247208" class="chart-container" style="width:900px; height:500px; "></div>
    <script>
        var chart_b770aaf86b114bc1b4e495da3e247208 = echarts.init(
            document.getElementById('b770aaf86b114bc1b4e495da3e247208'), 'white', {renderer: 'canvas'});
        var option_b770aaf86b114bc1b4e495da3e247208 = {
    "animation": true,
    "animationThreshold": 2000,
    "animationDuration": 1000,
    "animationEasing": "cubicOut",
    "animationDelay": 0,
    "animationDurationUpdate": 300,
    "animationEasingUpdate": "cubicOut",
    "animationDelayUpdate": 0,
    "aria": {
        "enabled": false
    },
    "color": [
        "#5470c6",
        "#91cc75",
        "#fac858",
        "#ee6666",
        "#73c0de",
        "#3ba272",
        "#fc8452",
        "#9a60b4",
        "#ea7ccc"
    ],
    "series": [
        {
            "type": "line",
            "name": "\u8ba2\u5355\u91cf",
            "connectNulls": false,
            "xAxisIndex": 0,
            "symbolSize": 4,
            "showSymbol": true,
            "smooth": false,
            "clip": true,
            "step": false,
            "data": [
                [
                    "2016-11-05",
                    3161
                ],
                [
                    "2016-11-06",
                    3190
                ],
                [
                    "2016-11-07",
                    3112
                ],
                [
                    "2016-11-08",
                    3148
                ],
                [
                    "2016-11-09",
                    3166
                ],
                [
                    "2016-11-10",
                    3182
                ],
                [
                    "2016-11-11",
                    2331
                ],
                [
                    "2016-11-12",
                    2042
                ],
                [
                    "2016-11-13",
                    2103
                ],
                [
                    "2016-11-14",
                    2077
                ]
            ],
            "hoverAnimation": true,
            "label": {
                "show": true,
                "margin": 8
            },
            "logBase": 10,
            "seriesLayoutBy": "column",
            "lineStyle": {
                "show": true,
                "width": 1,
                "opacity": 1,
                "curveness": 0,
                "type": "solid"
            },
            "areaStyle": {
                "opacity": 0
            },
            "markPoint": {
                "label": {
                    "show": true,
                    "position": "inside",
                    "color": "#fff",
                    "margin": 8
                },
                "data": [
                    {
                        "name": "\u6700\u5927\u503c",
                        "type": "max"
                    },
                    {
                        "name": "\u6700\u5c0f\u503c",
                        "type": "min"
                    }
                ]
            },
            "zlevel": 0,
            "z": 0,
            "rippleEffect": {
                "show": true,
                "brushType": "stroke",
                "scale": 2.5,
                "period": 4
            }
        }
    ],
    "legend": [
        {
            "data": [
                "\u8ba2\u5355\u91cf"
            ],
            "selected": {},
            "show": true,
            "padding": 5,
            "itemGap": 10,
            "itemWidth": 25,
            "itemHeight": 14,
            "backgroundColor": "transparent",
            "borderColor": "#ccc",
            "borderRadius": 0,
            "pageButtonItemGap": 5,
            "pageButtonPosition": "end",
            "pageFormatter": "{current}/{total}",
            "pageIconColor": "#2f4554",
            "pageIconInactiveColor": "#aaa",
            "pageIconSize": 15,
            "animationDurationUpdate": 800,
            "selector": false,
            "selectorPosition": "auto",
            "selectorItemGap": 7,
            "selectorButtonGap": 10
        }
    ],
    "tooltip": {
        "show": true,
        "trigger": "item",
        "triggerOn": "mousemove|click",
        "axisPointer": {
            "type": "line"
        },
        "showContent": true,
        "alwaysShowContent": false,
        "showDelay": 0,
        "hideDelay": 100,
        "enterable": false,
        "confine": false,
        "appendToBody": false,
        "transitionDuration": 0.4,
        "textStyle": {
            "fontSize": 14
        },
        "borderWidth": 0,
        "padding": 5,
        "order": "seriesAsc"
    },
    "xAxis": [
        {
            "show": true,
            "scale": false,
            "nameLocation": "end",
            "nameGap": 15,
            "gridIndex": 0,
            "axisLabel": {
                "show": true,
                "rotate": -45,
                "margin": 8
            },
            "inverse": false,
            "offset": 0,
            "splitNumber": 5,
            "minInterval": 0,
            "splitLine": {
                "show": true,
                "lineStyle": {
                    "show": true,
                    "width": 1,
                    "opacity": 1,
                    "curveness": 0,
                    "type": "solid"
                }
            },
            "data": [
                "2016-11-05",
                "2016-11-06",
                "2016-11-07",
                "2016-11-08",
                "2016-11-09",
                "2016-11-10",
                "2016-11-11",
                "2016-11-12",
                "2016-11-13",
                "2016-11-14"
            ]
        }
    ],
    "yAxis": [
        {
            "show": true,
            "scale": false,
            "nameLocation": "end",
            "nameGap": 15,
            "gridIndex": 0,
            "inverse": false,
            "offset": 0,
            "splitNumber": 5,
            "minInterval": 0,
            "splitLine": {
                "show": true,
                "lineStyle": {
                    "show": true,
                    "width": 1,
                    "opacity": 1,
                    "curveness": 0,
                    "type": "solid"
                }
            }
        }
    ],
    "title": [
        {
            "show": true,
            "text": "\u6bcf\u65e5\u8ba2\u5355\u91cf\u8d8b\u52bf",
            "target": "blank",
            "subtarget": "blank",
            "padding": 5,
            "itemGap": 10,
            "textAlign": "auto",
            "textVerticalAlign": "auto",
            "triggerEvent": false
        }
    ]
};
        chart_b770aaf86b114bc1b4e495da3e247208.setOption(option_b770aaf86b114bc1b4e495da3e247208);
    </script>
</body>
</html>

以上是一个 HTML 页面的代码,用于展示一个 ECharts 折线图。解析一下其中的内容:

  •  `<!DOCTYPE html>`:HTML5 文档类型声明,表示该文档是 HTML5 格式的。
  •  `<html>`:HTML 根元素,表示整个 HTML 页面的开始。
  •  `<head>`:HTML 头部元素,包含了页面的元信息和引用的外部资源。
  •  `<meta charset="UTF-8">`:设置页面的字符编码为 UTF-8,确保页面中的中文和特殊字符能够正确显示。
  •  `<title>Awesome-pyecharts</title>`:页面标题,显示在浏览器标签页上。
  •  `<script type="text/javascript" src="https://assets.pyecharts.org/assets/v5/echarts.min.js"></script>`:引入了 ECharts 的 JavaScript 文件,用于绘制图表。
  •  `<body>`:HTML 页面的主体部分。
  • `<div id="b770aaf86b114bc1b4e495da3e247208" class="chart-container" style="width:900px; height:500px; "></div>`:一个 `<div>` 元素,用于容纳 ECharts 图表,设置了固定的宽度和高度。
  • `<script>`:JavaScript 脚本部分,用于初始化和配置 ECharts 图表。
  •  `var chart_b770aaf86b114bc1b4e495da3e247208 = echarts.init(...)`:初始化 ECharts 实例,指定了一个 `<div>` 元素作为图表容器,并设置了图表的主题为白色。
  •  `var option_b770aaf86b114bc1b4e495da3e247208 = {...}`:指定了图表的配置选项,包括动画效果、颜色、系列数据、图表标题等。
  • `chart_b770aaf86b114bc1b4e495da3e247208.setOption(option_b770aaf86b114bc1b4e495da3e247208);`:将配置选项应用到 ECharts 实例,生成最终的图表。

        这段 HTML 代码通过引入 ECharts 的 JavaScript 文件和指定图表的配置选项,实现了在浏览器中展示一个具有动画效果的折线图。

Tmall.py

         而天猫双十一的数据也以上面类似结构构成,此处就不重复解析了,仅对其中数据分析文件进行解析:

import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Map, Bar, Line
from pyecharts.components import Table


data = pd.read_csv("tmall_order_report.csv")
data.columns = data.columns.str.strip(' ')  # 列名去空格
data['收货地址'] = data['收货地址'].str.replace('自治区|省|壮族|维吾尔|回族', '')  # 去除后缀
data['订单创建时间'] = pd.to_datetime(data['订单创建时间'])
data['订单付款时间'] = pd.to_datetime(data['订单付款时间'])

#返回统计表格
def get_table(data):
    result = {}
    result['总订单数'] = data['订单编号'].count()
    result['已完成订单数'] = data['订单编号'][data['订单付款时间'].notnull()].count()
    result['未付款订单数'] = data['订单编号'][data['订单付款时间'].isnull()].count()
    result['退款订单数'] = data['订单编号'][data['退款金额'] > 0].count()
    result['总付款金额'] = data['买家实际支付金额'].sum()
    result['总退款金额'] = data['退款金额'].sum()

    table = Table()
    headers = ['总订单数', '已完成订单数', '总付款金额', '退款订单数', '总退款金额', '成交率', '退款率']
    row = [
        [
            result['总订单数'], result['已完成订单数'], f"{result['总付款金额'] / 10000:.2f}万",
            result['退款订单数'], f"{result['总退款金额'] / 10000:.2f}万",
            f"{result['已完成订单数'] / result['总订单数']:.2%}",
            f"{result['退款订单数'] / result['总订单数']:.2%}"
        ]
    ]
    table.add(headers, row)

    return table.render('table.html')




#各城市订单统计排序
def get_citys(data):
    city_orders = data[data['订单付款时间'].notnull()].groupby('收货地址', as_index=False).agg({'订单编号': 'count'})
    city_orders = city_orders.sort_values(by=['订单编号'], ascending=False)

    bar = (
        Bar()
        .add_xaxis(city_orders['收货地址'].tolist())
        .add_yaxis('订单数量', city_orders['订单编号'].tolist(), category_gap=10)
        .set_global_opts(xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-45)),
                         title_opts=opts.TitleOpts(title='各城市订单数量降序'))
    )

    return bar.render('citys.html')

#每日订单趋势
def get_days(data):
    day_orders = data[['订单创建时间', '订单编号']]
    day_orders['订单创建时间'] = day_orders['订单创建时间'].apply(lambda x: x.date())
    day_orders = day_orders.groupby('订单创建时间', as_index=False).agg({'订单编号': 'count'})

    l = (
        Line()
        .add_xaxis(day_orders['订单创建时间'].tolist())
        .add_yaxis('订单量', day_orders['订单编号'].tolist())
        .set_global_opts(xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-45)),
                         title_opts=opts.TitleOpts(title='每日订单量趋势'))
        .set_series_opts(
            label_opts=opts.LabelOpts(is_show=True),
            markpoint_opts=opts.MarkPointOpts(
                data=[
                    opts.MarkPointItem(type_="max", name="最大值"),
                    opts.MarkPointItem(type_="min", name="最小值")
                ]
            ),
        )
    )

    return l.render('days.html')

#每小时订单趋势
def get_hours(data):
    hour_orders = data[['订单创建时间', '订单编号']]
    hour_orders['订单创建时间'] = hour_orders['订单创建时间'].apply(lambda x: x.strftime('%H'))
    hour_orders = hour_orders.groupby('订单创建时间', as_index=False).agg({'订单编号': 'count'})

    h = (
        Line()
        .add_xaxis(hour_orders['订单创建时间'].tolist())
        .add_yaxis('订单量', hour_orders['订单编号'].tolist())
        .set_global_opts(title_opts=opts.TitleOpts(title="每小时订单量趋势"))
        .set_series_opts(
            label_opts=opts.LabelOpts(is_show=True),
            markpoint_opts=opts.MarkPointOpts(
                data=[
                    opts.MarkPointItem(type_="max", name='最大值'),
                    opts.MarkPointItem(type_="min", name='最小值')
                ]
            )
        )
    )

    return h.render('hours.html')

        

import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Map, Bar, Line
from pyecharts.components import Table


data = pd.read_csv("tmall_order_report.csv")
data.columns = data.columns.str.strip(' ')  # 列名去空格
data['收货地址'] = data['收货地址'].str.replace('自治区|省|壮族|维吾尔|回族', '')  # 去除后缀
data['订单创建时间'] = pd.to_datetime(data['订单创建时间'])
data['订单付款时间'] = pd.to_datetime(data['订单付款时间'])

这段代码使用了 pandas 进行数据处理和分析,以及 pyecharts 生成图表。

  • `import pandas as pd`:导入 pandas 库,用于数据处理和分析。
  •  `from pyecharts import options as opts`:从 pyecharts 库中导入 options 模块,用于设置图表的配置选项。
  •  `from pyecharts.charts import Map, Bar, Line`:从 pyecharts 库中导入 Map、Bar 和 Line 类,用于创建地图、柱状图和折线图。
  •  `from pyecharts.components import Table`:从 pyecharts 库中导入 Table 类,用于创建表格。
  • `data = pd.read_csv("tmall_order_report.csv")`:使用 pandas 的 read_csv() 函数从 CSV 文件中读取数据,并存储在 DataFrame 对象中。
  • `data.columns = data.columns.str.strip(' ')`:去除数据中列名的前后空格。
  •  `data['收货地址'] = data['收货地址'].str.replace('自治区|省|壮族|维吾尔|回族', '')`:对收货地址列进行处理,去除省级单位的后缀。
  •  `data['订单创建时间'] = pd.to_datetime(data['订单创建时间'])`:将订单创建时间列转换为 pandas 的日期时间类型。
  • `data['订单付款时间'] = pd.to_datetime(data['订单付款时间'])`:将订单付款时间列转换为 pandas 的日期时间类型。

        这段代码主要完成了数据的读取和预处理工作,包括读取 CSV 文件、去除列名空格、处理收货地址列和订单时间列的格式转换。

def get_table(data):
    result = {}
    result['总订单数'] = data['订单编号'].count()
    result['已完成订单数'] = data['订单编号'][data['订单付款时间'].notnull()].count()
    result['未付款订单数'] = data['订单编号'][data['订单付款时间'].isnull()].count()
    result['退款订单数'] = data['订单编号'][data['退款金额'] > 0].count()
    result['总付款金额'] = data['买家实际支付金额'].sum()
    result['总退款金额'] = data['退款金额'].sum()

    table = Table()
    headers = ['总订单数', '已完成订单数', '总付款金额', '退款订单数', '总退款金额', '成交率', '退款率']
    row = [
        [
            result['总订单数'], result['已完成订单数'], f"{result['总付款金额'] / 10000:.2f}万",
            result['退款订单数'], f"{result['总退款金额'] / 10000:.2f}万",
            f"{result['已完成订单数'] / result['总订单数']:.2%}",
            f"{result['退款订单数'] / result['总订单数']:.2%}"
        ]
    ]
    table.add(headers, row)

    return table.render('table.html')

这个函数是用来生成表格的,主要完成了对订单数据的统计分析,并将结果以表格形式呈现出来。

  • def get_table(data)::定义了一个函数,接受一个参数 data,即要生成表格的数据。
  • result = {}:创建一个空字典 result,用于存储表格的统计结果。
  • 接下来,通过对数据进行各种条件筛选和计算,得到表格需要展示的统计信息,包括总订单数、已完成订单数、未付款订单数、退款订单数、总付款金额和总退款金额。
  • table = Table():创建一个 Table 对象。
  • headers = [...]:定义表格的列名。
  • row = [...]:定义表格的行内容,包括总订单数、已完成订单数、总付款金额、退款订单数、总退款金额、成交率和退款率。其中,成交率和退款率通过计算得到,并以百分比形式表示。
  • table.add(headers, row):将列名和行内容添加到表格中。
  • return table.render('table.html'):生成表格 HTML 文件,并返回文件路径。
#各城市订单统计排序
def get_citys(data):
    city_orders = data[data['订单付款时间'].notnull()].groupby('收货地址', as_index=False).agg({'订单编号': 'count'})
    city_orders = city_orders.sort_values(by=['订单编号'], ascending=False)

    bar = (
        Bar()
        .add_xaxis(city_orders['收货地址'].tolist())
        .add_yaxis('订单数量', city_orders['订单编号'].tolist(), category_gap=10)
        .set_global_opts(xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-45)),
                         title_opts=opts.TitleOpts(title='各城市订单数量降序'))
    )

    return bar.render('citys.html')

这个函数主要完成了对各城市订单数量的统计分析,并通过柱状图进行可视化展示。

  •  `def get_citys(data):`:定义了一个函数,接受一个参数 `data`,即订单数据。
  • `city_orders = data[data['订单付款时间'].notnull()].groupby('收货地址', as_index=False).agg({'订单编号': 'count'})`:首先根据订单付款时间的非空值进行筛选,然后按照收货地址分组,统计每个城市的订单数量。
  • `city_orders = city_orders.sort_values(by=['订单编号'], ascending=False)`:对城市订单数量进行降序排序。
  •  `bar = `:创建一个柱状图对象。
  • `.add_xaxis(city_orders['收货地址'].tolist())`:设置 X 轴数据为各城市的名称。
  • `.add_yaxis('订单数量', city_orders['订单编号'].tolist(), category_gap=10)`:添加 Y 轴数据为订单数量,并指定柱状图之间的间隔为 10。
  • `.set_global_opts(...)`:设置全局配置项,包括 X 轴标签的旋转角度和图表标题。
  •  `return bar.render('citys.html')`:生成柱状图 HTML 文件,并返回文件路径。
#每日订单趋势
def get_days(data):
    day_orders = data[['订单创建时间', '订单编号']]
    day_orders['订单创建时间'] = day_orders['订单创建时间'].apply(lambda x: x.date())
    day_orders = day_orders.groupby('订单创建时间', as_index=False).agg({'订单编号': 'count'})

    l = (
        Line()
        .add_xaxis(day_orders['订单创建时间'].tolist())
        .add_yaxis('订单量', day_orders['订单编号'].tolist())
        .set_global_opts(xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-45)),
                         title_opts=opts.TitleOpts(title='每日订单量趋势'))
        .set_series_opts(
            label_opts=opts.LabelOpts(is_show=True),
            markpoint_opts=opts.MarkPointOpts(
                data=[
                    opts.MarkPointItem(type_="max", name="最大值"),
                    opts.MarkPointItem(type_="min", name="最小值")
                ]
            ),
        )
    )

    return l.render('days.html')

这个函数主要完成了对每日订单数量的统计分析,并通过折线图进行可视化展示。

  •  `def get_days(data):`:定义了一个函数,接受一个参数 `data`,即订单数据。
  •  `day_orders = data[['订单创建时间', '订单编号']]`:从订单数据中选取了订单创建时间和订单编号两列。
  •  `day_orders['订单创建时间'] = day_orders['订单创建时间'].apply(lambda x: x.date())`:将订单创建时间转换为日期格式。
  •  `day_orders = day_orders.groupby('订单创建时间', as_index=False).agg({'订单编号': 'count'})`:按照订单创建日期分组,统计每日订单数量。
  • `l = (`:创建一个折线图对象。
  •  `.add_xaxis(day_orders['订单创建时间'].tolist())`:设置 X 轴数据为每日订单创建时间。
  •  `.add_yaxis('订单量', day_orders['订单编号'].tolist())`:添加 Y 轴数据为每日订单数量。
  •  `.set_global_opts(...)`:设置全局配置项,包括 X 轴标签的旋转角度和图表标题。
  •  `.set_series_opts(...)`:设置系列配置项,包括标签显示和标记点的显示。
  •  `return l.render('days.html')`:生成折线图 HTML 文件,并返回文件路径。
#每小时订单趋势
def get_hours(data):
    hour_orders = data[['订单创建时间', '订单编号']]
    hour_orders['订单创建时间'] = hour_orders['订单创建时间'].apply(lambda x: x.strftime('%H'))
    hour_orders = hour_orders.groupby('订单创建时间', as_index=False).agg({'订单编号': 'count'})

    h = (
        Line()
        .add_xaxis(hour_orders['订单创建时间'].tolist())
        .add_yaxis('订单量', hour_orders['订单编号'].tolist())
        .set_global_opts(title_opts=opts.TitleOpts(title="每小时订单量趋势"))
        .set_series_opts(
            label_opts=opts.LabelOpts(is_show=True),
            markpoint_opts=opts.MarkPointOpts(
                data=[
                    opts.MarkPointItem(type_="max", name='最大值'),
                    opts.MarkPointItem(type_="min", name='最小值')
                ]
            )
        )
    )

    return h.render('hours.html')

这个函数主要完成了对每小时订单数量的统计分析,并通过折线图进行可视化展示。

  • `def get_hours(data):`:定义了一个函数,接受一个参数 `data`,即订单数据。
  •  `hour_orders = data[['订单创建时间', '订单编号']]`:从订单数据中选取了订单创建时间和订单编号两列。
  •  `hour_orders['订单创建时间'] = hour_orders['订单创建时间'].apply(lambda x: x.strftime('%H'))`:将订单创建时间转换为小时格式。
  • `hour_orders = hour_orders.groupby('订单创建时间', as_index=False).agg({'订单编号': 'count'})`:按照小时分组,统计每小时订单数量。
  •  `h = (`:创建一个折线图对象。
  •  `.add_xaxis(hour_orders['订单创建时间'].tolist())`:设置 X 轴数据为每小时订单创建时间。
  •  `.add_yaxis('订单量', hour_orders['订单编号'].tolist())`:添加 Y 轴数据为每小时订单数量。
  • `.set_global_opts(...)`:设置全局配置项,包括图表标题。
  •  `.set_series_opts(...)`:设置系列配置项,包括标签显示和标记点的显示。
  •  `return h.render('hours.html')`:生成折线图 HTML 文件,并返回文件路径。

        这些代码结合了数据预处理和基本的交互功能,使用户能够根据自己的需求选择不同的数据分析功能,从而更好地理解和分析电商数据。

实现结果

化妆品cosmetic

这里本机环境是conda4.14.0+python3.8.0版本,直接运行main文件即可。

出现以上文字后输入数字选项即可弹出对应网页结果。

每日订单量趋势

各品牌销量占比

各品牌销售额占比

天猫Tmall

天猫数据也是对应的。

表格

 

订单地区分布

订单日期分布

订单24小时分布

 

项目总结

        该项目优势所在:

  • 使用 Pandas 库加载和处理订单数据,包括列名处理、日期格式转换等,确保数据的准确性和可用性。
  • 提供了多种统计分析功能,包括每日订单趋势、每小时订单趋势、各城市订单数量统计等,以不同的时间粒度展示订单数据的变化趋势。
  • 使用 Pyecharts 库生成各种图表,如折线图、柱状图等,直观展示订单数据的分布和趋势,提高数据可视化程度。
  • 将分析结果保存为 HTML 文件,方便用户在浏览器中打开查看,便于分享和交流分析结果。
  • 采用模块化设计,将不同功能的代码分别封装成函数,提高了代码的可维护性和扩展性。

        可以改进的地方:

  • 可以制作一个说明文档更有助于读者使用和理解该项目。
  • 可以对数据进行更多方面的深挖,比如退款单数占比总单数并不少,可以分析是何品牌的哪些商品。

        本文到此告一段落,希望能帮助到一些人对数据分析产生兴趣或是入门提供一个良好的项目解析,如对文章中某些地方有疑问,希望多提些意见,大家共同进步,在此再次感谢本文项目来源GitHub - makisekurisuDDL/Data_analysis: 电商数据分析,以及给拖延症的自己鼓鼓劲,加油加油💪

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值