Pandas+Pyecharts | 电子产品销售数据分析可视化+用户RFM画像

news2024/12/23 4:03:55

文章目录

  • 🏳️‍🌈 1. 导入模块
  • 🏳️‍🌈 2. Pandas数据处理
    • 2.1 读取数据
    • 2.2 数据信息
    • 2.3 去掉部分用不到的列
    • 2.4 去除重复数据
    • 2.5 增加部分时间列
    • 2.6 过滤数据,也可以选择均值填充
    • 2.7 对年龄分组
    • 2.8 增加商品一、二级分类
  • 🏳️‍🌈 3. Pyecharts数据可视化
    • 3.1 每月订单数量订单额
    • 3.2 一月各天订单数量分布
    • 3.3 一天各时段订单数量分布
    • 3.4 男女用户订单比例
    • 3.5 女性/男性购买商品TOP20
    • 3.6 各年龄段订单数量订单额
    • 3.7 各年龄段购买商品TOP10
    • 3.8 用户RFM等级画像
  • 🏳️‍🌈 4. 可视化项目源码+数据

大家好,我是 👉【Python当打之年(点击跳转)】

本期利用 python 分析一份 电子产品销售数据,看看:

  • 每月订单数量订单额
  • 每天订单数量分布
  • 男女用户订单比例
  • 女性/男性购买商品TOP20
  • 各年龄段订单数量订单额
  • 用户RFM等级画像
  • 等等…

希望对大家有所帮助,如有疑问或者需要改进的地方可以联系小编。


🏳️‍🌈 1. 导入模块

import pandas as pd
from pyecharts.charts import Line
from pyecharts.charts import Bar
from pyecharts.charts import Pie
from pyecharts.charts import Grid
from pyecharts.charts import PictorialBar
from pyecharts import options as opts
from pyecharts.commons.utils import JsCode
import warnings
warnings.filterwarnings('ignore')

🏳️‍🌈 2. Pandas数据处理

2.1 读取数据

df = pd.read_csv("电子产品销售分析.csv")

在这里插入图片描述

2.2 数据信息

df.info()

在这里插入图片描述

一共有564169条数据,其中category_code、brand两列有部分数据缺失。

2.3 去掉部分用不到的列

df1 = df[['event_time', 'order_id', 'category_code', 'brand', 'price', 'user_id', 'age', 'sex', 'local']]
df1.shape

(564169, 9)

2.4 去除重复数据

df1 = df1.drop_duplicates()
df1.shape

(556456, 9)

2.5 增加部分时间列

df1['event_time'] = pd.to_datetime(df1['event_time'].str[:19],format="%Y-%m-%d %H:%M:%S")
df1['Year'] = df1['event_time'].dt.year
df1['Month'] = df1['event_time'].dt.month
df1['Day'] = df1['event_time'].dt.day
df1['hour'] = df1['event_time'].dt.hour
df1.head(10)

在这里插入图片描述

2.6 过滤数据,也可以选择均值填充

df1 = df1.dropna(subset=['category_code'])
df1 = df1[(df1["Year"] == 2020)&(df1["price"] > 0)]
df1.shape

(429261, 13)

2.7 对年龄分组

df1['age_group'] = pd.cut(df1['age'],[10,20,30,40,50],labels=['10-20','20-30','30-40','40-50'])

2.8 增加商品一、二级分类

df1["category_code_1"] = df1["category_code"].apply(lambda x: x.split(".")[0] if "." in x else x)
df1["category_code_2"] = df1["category_code"].apply(lambda x: x.split(".")[-1] if "." in x else x)
df1.head(10)

在这里插入图片描述

数据处理后还有87678个用户429261条数据。

🏳️‍🌈 3. Pyecharts数据可视化

3.1 每月订单数量订单额

def get_bar1():
    bar1 = (
        Bar()
            .add_xaxis(x_data)
            .add_yaxis("订单数量", y_data1)
            .extend_axis(yaxis=opts.AxisOpts(axislabel_opts=opts.LabelOpts(formatter="{value}万")))
            .set_global_opts(
            legend_opts=opts.LegendOpts(pos_top='25%', pos_left='center'),
            title_opts=opts.TitleOpts(
                title='1-每月订单数量订单额',
                subtitle='-- 制图@公众号:Python当打之年 --',
                pos_top='7%',
                pos_left="center"
            )
        )
    )
    line = (
        Line()
            .add_xaxis(x_data)
            .add_yaxis("订单额", y_data2, yaxis_index=1)
    )
    bar1.overlap(line)

在这里插入图片描述

  • 下半年的订单量和订单额相对于上半年明显增多。
  • 8月份的订单量和订单额达到峰值。

3.2 一月各天订单数量分布

def get_bar2():
    pie1 = (
        Pie()
            .add(
            "",
            datas,
            radius=["13%", "25%"],
            label_opts=opts.LabelOpts(formatter="{b}: {d}%"),
        )
    )
    bar1 = (
        Bar(init_opts=opts.InitOpts(theme='dark', width='1000px', height='600px', bg_color='#0d0735'))
            .add_xaxis(x_data)
            .add_yaxis("", y_data, itemstyle_opts=opts.ItemStyleOpts(color=JsCode(color_function)))
            .set_global_opts(
            legend_opts=opts.LegendOpts(is_show=False),
            title_opts=opts.TitleOpts(
                title='2-一月各天订单数量分布',
                subtitle='-- 制图@公众号:Python当打之年 --',
                pos_top='7%',
                pos_left="center"
            )
        )
    )
    bar1.overlap(pie1)

在这里插入图片描述

  • 从每天的订单量上看,上中下旬订单量基本持平,占比都在30%以上,上旬和中旬要稍微高一点。

3.3 一天各时段订单数量分布

在这里插入图片描述

  • 从订单时段上看,上午的订单要明显高于下午,占比达到了70.26%,尤其是在早上7:00-11:00之间。

3.4 男女用户订单比例

在这里插入图片描述

  • 男性订单数量占比49.55%,女性订单数量占比50.45%,基本持平。

3.5 女性/男性购买商品TOP20

def get_bar3():
    bar1 = (
        Bar()
        .add_xaxis(x_data1)
        .add_yaxis('女性', y_data1,
                   label_opts=opts.LabelOpts(position='right')
                   )
        .set_global_opts(
            title_opts=opts.TitleOpts(
                title='5-女性/男性购买商品TOP20',
                subtitle='-- 制图@公众号:Python当打之年 --',
                pos_top='3%',
                pos_left="center"),
            legend_opts=opts.LegendOpts(pos_left='20%', pos_top='10%')
        )
        .reversal_axis()
    )
    bar2 = (
        Bar()
        .add_xaxis(x_data2)
        .add_yaxis('男性', y_data2,
                   label_opts=opts.LabelOpts(position='right')
                   )
        .set_global_opts(
            legend_opts=opts.LegendOpts(pos_right='25%', pos_top='10%')
        )
        .reversal_axis()
    )
    grid1 = (
        Grid()
        .add(bar1, grid_opts=opts.GridOpts(pos_left='12%', pos_right='50%', pos_top='15%'))
        .add(bar2, grid_opts=opts.GridOpts(pos_left='60%', pos_right='5%', pos_top='15%'))
    )

在这里插入图片描述

  • 男性女性购买商品TOP20基本一致:smartphone、notebook、refrigerators、headphone等四类商品购买量比较大。

3.6 各年龄段订单数量订单额

在这里插入图片描述

  • 在10-50年龄段内,随着年龄段的增加,订单量和订单金额也在逐步增大。
  • 细分的话,20-30和40-50这两个年龄段稍高一些。

3.7 各年龄段购买商品TOP10

在这里插入图片描述

3.8 用户RFM等级画像

RFM模型是衡量客户价值和客户创利能力的重要工具和手段。该模型通过一个客户的近期购买行为®、购买的总体频率(F)以及花了多少钱(M)三项指标来描述该客户的价值状况,从而能够更加准确地将成本和精力更精确的花在用户层次身上,实现针对性的营销。

用户分类:

def rfm_func(x):
    level = x.apply(lambda x:"1" if x > 0 else '0')
    RMF = level.R + level.F + level.M
    dic_rfm ={
        '111':'重要价值客户',
        '011':'重要保持客户',
        '101':'重要发展客户',
        '001':'重要挽留客户',
        '110':'一般价值客户',
        '100':'一般发展客户',
        '010':'一般保持客户',
        '000':'一般挽留客户'
    }
    result = dic_rfm[RMF]
    return result

计算等级:

df_rfm = df1.copy()
df_rfm = df_rfm[['user_id','event_time','price']]
# 时间以当年年底为准
df_rfm['days'] = (pd.to_datetime("2020-12-31")-df_rfm["event_time"]).dt.days
# 计算等级
df_rfm = pd.pivot_table(df_rfm,index="user_id",
                     values=["user_id","days","price"],
                     aggfunc={"user_id":"count","days":"min","price":"sum"})
df_rfm = df_rfm[["days","user_id","price"]]
df_rfm.columns = ["R","F","M"]
df_rfm['RMF'] = df_rfm[['R','F','M']].apply(lambda x:x-x.mean()).apply(rfm_func,axis=1)
df_rfm.head()

在这里插入图片描述

用户画像:
在这里插入图片描述

根据RFM模型可将用户分为以下8类:

  • 重要价值客户:最近消费时间近、消费频次和消费金额都很高。 重要保持客户:最近消费时间较远,消费金额和频次都很高。

  • 重要发展客户:最近消费时间较近、消费金额高,但频次不高、忠诚度不高,很有潜力的用户,必须重点发展。

  • 重要挽留客户:最近消费时间较远、消费频次不高,但消费金额高的用户,可能是将要流失或者己经要流失的用户,应当给予挽留措施。

  • 一般价值客户:最近消费时间近,频率高但消费金额低.需要提高其客单价。

  • 一般发展客户:最近消费时间较近,消费金额、频次都不高。

  • 一般保持客户:最近消费时间较远,消费频次高,消费金额不高。

  • 一般挽留客户:各项指数都不高,可以适当放弃。

🏳️‍🌈 4. 可视化项目源码+数据

点击跳转:【全部可视化项目源码+数据】


以上就是本期为大家整理的全部内容了,赶快练习起来吧,原创不易,喜欢的朋友可以点赞、收藏也可以分享注明出处)让更多人知道。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/891729.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

系统公告 | 用Navicat就可以访问应用数据库啦~

“超能力”数据库~拿来即用,应用开发人员再也不用为撰写API而发愁。MemFire Cloud 为开发者提供了简单易用的云数据库(表编辑器、自动生成API、SQL编辑器、备份恢复、托管运维),很大地降低开发者的使用门槛。 MemFire …

喜报!YCloud荣升WhatsApp Select等级商业解决方案提供商

即日起,云片国际站YCloud正式成为WhatsApp Select等级BSP(商业解决方案提供商)。2022年10月,YCloud获得Meta大中华地区首批BSP资格。通过YCloud团队不断追求卓越,专注为客户构建创新的通信解决方案的专业服务&#xff…

暴力破解

1、暴力破解 基于表单的暴力破解 使用bp抓包 我们要破解username和password,就应当选取Cluster bomb的攻击方式,在payloads中上传我们的字典,首先在payload set 1中上传username的字典,再选取payload set 2上传password的字典。 …

多线程-死锁

/*** 死锁demo*/ public class DeadlockDemo {public static void main(String[] args) {// 创建两个对象final Object resource1 "resource1";final Object resource2 "resource2";// 创建第一个线程Thread t1 new Thread(() -> {// 尝试锁定resour…

pe文件之手工构建节表(段表)和节的具体内容

一、实验目的 通过使用winHex手动 在原来的文件中 追加节(.text代码节、.rdata引入函数节、.data数据节),然后利用stud_pe添加节表的name,大小等信息,对一个pe文件进行修复,从而了解一个pe文件的具体构成 二、实验步骤…

免费AI学习网站(二)

国内绘画midjourney网站 http://aijiaolian.chat优质提示词分解教学 https://q3iylvv7qj.feishu.cn/docx/UGMzdPVGjo1fHcxu1kjcuXFcnff?fromfrom_copylink设计图AI实战,如何用AI提高83%的出图效率?https://q3iylvv7qj.feishu.cn/docx/Fsxxd3MncowFUix5…

同步请求和异步请求

同步请求和异步请求是在网络编程中常用的两种通信模式,它们有以下区别: 同步请求: 在发送一个请求后,程序会一直等待服务器返回响应,期间无法进行其他操作。请求发出后,程序会阻塞在请求处,直…

深入剖析:如何通过API优化云计算架构?快来看!

在当今数字化时代,云计算已经成为企业实现创新、提高效率和降低成本的核心策略之一。而在构建和管理云计算架构时,API(应用程序编程接口)的作用变得愈发重要。本文将深入探讨如何通过API优化云计算架构,实现更高效、灵…

深入探索 Java 8 新特性:Lambda 表达式

深入探索 Java 8 新特性:Lambda 表达式 ​ 在软件开发领域,不断的进步和创新是推动技术发展的关键。Java 8 作为一个重要的版本,引入了许多令人兴奋的新特性,其中最受瞩目的之一就是 Lambda 表达式。Lambda 表达式的引入使得 Jav…

【Linux】Linux之间如何互传文件(详细讲解)

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

[golang gin框架] 46.Gin商城项目-微服务实战之后台Rbac客户端调用微服务权限验证以及Rbac微服务数据库抽离

一. 根据用户的权限动态显示左侧菜单微服务 1.引入 后台Rbac客户端调用微服务权限验证功能主要是: 登录后显示用户名称、根据用户的权限动态显示左侧菜单,判断当前登录用户的权限 、没有权限访问则拒绝,参考[golang gin框架] 14.Gin 商城项目-RBAC管理,该微服务功能和上一节[g…

Python有哪些优质的可视化工具

目录 1. Matplotlib 2. Seaborn 3. Plotly 4. Bokeh 5. Plotly Express 6. ggplot 7. Altair 8. Wordcloud 9. D3.js (Data-Driven Documents) 10. NetworkX 11. Pygal 12. Folium 总结 在数据分析和数据科学的领域中,可视化是一种强大而直观的方式来呈…

VTK 判断一个 点 是否在一个模型 stl 内部 vtk 点是否在内部 表面 寻找最近点

判断 一个点 ,判断是否在风格 stl 模型内部,或表面: 目录 1.方案一:使用vtkCellLocator FindClosestPoint 找到模型上距离给定点最近的一点,计算两点的距离 ,小于某一阈值 则认为此点在模型上; 2.方案二…

Esp8266学习7. 点亮JMD0.96C-1 OLED屏

Esp8266学习7. 点亮JMD0.96C-1 OLED屏 一、ESP32-C3 I2C资源简介1. 简介2. 准备工作 二、I2C协议简介1. 起始条件(Start Condition):2. 设备地址传输(Device Address Transmission):3. 从设备响应&#xff…

玩转单元测试之gtest

引言 程序开发的时候,往往需要编写一些测试样例来完成功能测试,以保证自己的代码在功能上符合预期,能考虑到一些异常边界问题等等。 gtest快速入门 1.引入gtest # 使用的是1.10版本,其他版本可根据需要选择 git clone -b v1.1…

踩坑经验:JavaScript 中的 for...of 和 for...in 循环

在 JavaScript 编程中,for...of 和 for...in 是常用的循环语法,但它们在使用时可能会引发一些意想不到的问题。本文将分享我在使用这两种循环时所遇到的坑和经验。 两者的区别: 适用对象类型: for…of:主要用于遍历可…

微信开发之一键删除好友的技术实现

简要描述: 删除联系人 请求URL: http://域名地址/delContact 请求方式: POST 请求头Headers: Content-Type:application/jsonAuthorization:login接口返回 参数: 参数名必选类型说明wI…

小红书运营 新号快速涨粉方法

大家好,我是网媒智星,今天跟大家分享一下小红书新号快速涨粉的方法。 新手博主在刚开始使用小红书时往往会陷入一个误区,他们热衷于发布自己认可的笔记,然后迫不及待地去查看数据,却发现没有获得赞赏和关注。 然而&…

微信小程序登录及登录态管理

一,小程序登录 小程序登录 | 微信开放文档 接口应在服务器端调用,详细说明参见服务端API。 接口说明 接口英文名 code2Session 功能描述 登录凭证校验。通过 wx.login 接口获得临时登录凭证 code 后传到开发者服务器调用此接口完成登录流程。更多使…

Android Framework 全局替换系统字体

基于Android 11 Android Framework 全局替换系统字体 第一种通过替换系统默认字体 将需要替换的字体资源放置frameworks/base/data/fonts/目录下。 将系统默认的Roboto字体替换为HarmonyOs字体。 frameworks/base/data/fonts/fonts.xml frameworks/base/data/fonts/Android.…