如何利用 Python 进行客户分群分析(附源码)

news2024/9/27 12:13:36

每个电子商务数据分析师必须掌握的一项数据聚类技能

如果你是一名在电子商务公司工作的数据分析师,从客户数据中挖掘潜在价值,来提高客户留存率很可能就是你的工作任务之一。

然而,客户数据是巨大的,每个客户的行为都不一样。2020年3月收购的客户A与2020年5月收购的客户B表现出不同的行为。因此,有必要将客户分为不同的群组,然后调查每个群组在一段时间内的行为。这就是所谓的同期群分析

同期群分析是了解一个特殊客户群体在一段时间内的行为的数据分析技术。

在这篇文章中,不会详细介绍同期群分析的理论。这篇文章更多的是告诉你如何将客户分成不同的群组,并在一段时间内观察每个群组的留存率。

导入数据和python库

import pandas as pd  
import matplotlib.pyplot as plt  
import seaborn as sns  
df = pd.read_csv('sales_2018-01-01_2019-12-31.csv')  
df  

技术交流

技术要学会分享、交流,不建议闭门造车。一个人走的很快、一堆人可以走的更远。

本文来自技术群粉丝分享整理,文章源码、数据、技术交流,均可加交流群获取,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友。

方式①、添加微信号:pythoner666,备注:来自CSDN +备注来意
方式②、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

在这里插入图片描述

分离新老客户

first_time = df.loc[df['customer_type'] == 'First-time',]  
final = df.loc[df['customer_id'].isin(first_time['customer_id'].values)]  

在这里,不能简单地选择df.loc[df['customer_type']],因为在这个数据中,在customer_type列下,First_time指的是新客户,而Returning指的是老客户。因此,如果我在2019年12月31日第一次购买,数据会显示我在2019年12月31日是新客户,但在我第二次、第三次…时是返回客户。同期群分析着眼于新客户和他们的后续购买行为。因此,如果我们简单地使用df.loc[df['customer_type']=='First-time',],我们就会忽略新客户的后续购买,这不是分析同期群行为的正确方法。

因此,这里所需要做的是,首先创建一个所有第一次的客户列表,并将其存储为first_time。然后从原始客户数据框df中只选择那些ID在first_time客户组内的客户。通过这样做,我们可以确保我们获得的数据只有第一次的客户和他们后来的购买行为。

现在,我们删除customer_type列,因为它已经没有必要了。同时,将日期列转换成正确的日期时间格式

final = final.drop(columns = ['customer_type'])  
final['day']= pd.to_datetime(final['day'], dayfirst=True)  

按客户ID排序,然后是日期

final = final.drop(columns = ['customer_type'])  
final['day']= pd.to_datetime(final['day'], dayfirst=True)  

定义一些函数

def purchase_rate(customer_id):  
    purchase_rate = [1]  
    counter = 1  
    for i in range(1,len(customer_id)):  
          if customer_id[i] != customer_id[i-1]:  
                 purchase_rate.append(1)  
                 counter = 1  
          else:  
                 counter += 1  
                 purchase_rate.append(counter)  
    return purchase_rate  
def join_date(date, purchase_rate):  
    join_date = list(range(len(date)))  
    for i in range(len(purchase_rate)):   
          if purchase_rate[i] == 1:  
                 join_date[i] = date[i]  
          else:  
                 join_date[i] = join_date[i-1]  
    return join_date  
def age_by_month(purchase_rate, month, year, join_month, join_year):  
    age_by_month = list(range(len(year)))  
    for i in range(len(purchase_rate)):  
          if purchase_rate[i] == 1:  
              age_by_month[i] = 0  
          else:  
              if year[i] == join_year[i]:  
                 age_by_month[i] = month[i] - join_month[i]  
              else:  
                 age_by_month[i] = month[i] - join_month[i] + 12*(year[i]-join_year[i])  
     return age_by_month  
  • purchase_rate函数将决定这是否是每个客户的第二次、第三次、第四次购买。

  • join_date函数允许确定客户加入的日期。

  • age_by_month函数提供了从客户当前购买到第一次购买的多少个月。

现在输入已经准备好了,接下来创建群组。

创建群组

final['month'] =pd.to_datetime(final['day']).dt.month  
final['Purchase Rate'] = purchase_rate(final['customer_id'])  
final['Join Date'] = join_date(final['day'], final['Purchase Rate'])  
final['Join Date'] = pd.to_datetime(final['Join Date'], dayfirst=True)  
final['cohort'] = pd.to_datetime(final['Join Date']).dt.strftime('%Y-%m')  
final['year'] = pd.to_datetime(final['day']).dt.year  
final['Join Date Month'] = pd.to_datetime(final['Join Date']).dt.month  
final['Join Date Year'] = pd.to_datetime(final['Join Date']).dt.year  

final['Age by month'] = age_by_month(final['Purchase Rate'],   
                                     final['month'],  
                                     final['year'],  
                                     final['Join Date Month'],  
                                     final['Join Date Year'])  

cohorts = final.groupby(['cohort','Age by month']).nunique()  
cohorts = cohorts.customer_id.to_frame().reset_index()   # convert series to frame  
cohorts = pd.pivot_table(cohorts, values = 'customer_id',index = 'cohort', columns= 'Age by month')  
cohorts.replace(np.nan, '',regex=True)  

**如何解释这个表格:**以群组2018-01为例。在2018年1月,有462名新客户。在这462人中,121名客户在2018年2月回来购买,125名在2018年3月购买,以此类推。

转换为群组百分比

for i in range(len(cohorts)-1):  
    cohorts[i+1] = cohorts[i+1]/cohorts[0]  
cohorts[0] = cohorts[0]/cohorts[0]  

可视化

cohorts_t = cohorts.transpose()  
cohorts_t[cohorts_t.columns].plot(figsize=(10,5))  
sns.set(style='whitegrid')  
plt.figure(figsize=(20, 15))  
plt.title('Cohorts: User Retention')  
sns.set(font_scale = 0.5) # font size  
sns.heatmap(cohorts, mask=cohorts.isnull(),  
cmap="Blues",  
annot=True, fmt='.01%')  
plt.show()  

就这样吧。希望你们喜欢并从这篇文章中获得一些对你有用的东西。

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

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

相关文章

python中安装gurobi和pycharm没有语法提示问题解决

安装gurobi第一步 :下载gurobi ( http://www.gurobi.com ) ,需要注册账号第二步、申请License注册如果可以通过校园网, 则直接生成。不能的话,通过网站,发邮件申请 http://www.gurobi.cn/NewsView1.Asp?id4第三、邮件…

【虹科】基于Lidar的体积监控实现高效的库存管理

迄今为止,很多物料厂家测量库存的结果数据仍然不准确,会存在很大的误差,导致供应链效率低下——这个问题可以通过Lidar技术轻松解决。近年来,全球供应链的脆弱性已经多次得到证明。无论是油轮被困在苏伊士运河,阻塞海峡…

JSP 在线学习管理系统myeclipse定制开发sqlserver数据库网页模式java编程jdbc

一、源码特点 JSP 在线学习管理系统是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为SQLServer2008&#x…

从事Python自动化测试,30岁熬到月薪20K+,分享我的多年面试经…

年少不懂面试经,读懂已是测试人。 大家好,我是小码哥,一名历经沧桑,看透互联网行业百态的测试从业者,经过数年的勤学苦练,精钻深研究,终于从初出茅庐的职场新手成长为现在的测试老鸟&#xff0…

nodejs/eggjs如何使用第三方pure esm lib

问题Instead change the require of index.js in xxx/app/ws/index.ts to a dynamic import() which is available in all CommonJS modules.上述错误发生在我使用import引入一个第三方包的时候提示的,至于原因,主要是node当前仅支持cjs,而目…

TCP的三握四挥

本文是向大家介绍tcp的三次握手四次挥手的全过程,能够让我们更熟悉面向连接的传输层控制协议的原理,保证了数据传输的稳定性和可靠性。如果我们把网络体系按照OSI模型划分,那么不论是从上往下还是从下往上数,处于最中间的都是传输…

复赛名单公布!2022隐私计算HACKATHON大赛火热进行中!

开放隐私计算开放隐私计算开放隐私计算OpenMPC是国内第一个且影响力最大的隐私计算开放社区。社区秉承开放共享的精神,专注于隐私计算行业的研究与布道。社区致力于隐私计算技术的传播,愿成为中国 “隐私计算最后一公里的服务区”。183篇原创内容公众号O…

Python+Qt生日提醒

PythonQt生日提醒如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01;前言这篇博客针对<<PythonQt生日提醒>>编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 学习与应用推荐首选。文章目…

在k8s集群部署ELK

使用kubeadm或者其他方式部署一套k8s集群。 在k8s集群创建一个namespace&#xff1a;halashow 2 ELK部署架构 3.1 准备资源配置清单 Deployment中存在一个es的业务容器&#xff0c;和一个init容器&#xff0c;init容器主要是配置vm.max_map_count262144。 service暴露了9200…

MSP430F2132IRHBR功能框图TPS259824LNRGER电路保护和电源管理解决方案芯片

概述&#xff1a;MSP430F21x2 16位超低功耗微控制器 (MCU) 是MSP430系列微控制器的一部分。这些MCU采用一种架构&#xff0c;加上5种低功耗模式&#xff0c;能在便携式测量应用中延长电池的使用寿命。这些器件具有一个强大的16位 RISC CPU、16位寄存器和用于获得最大编码效率的…

Springboot整合mybatis并接收前端数据

mybatis之前记录过了。本以为可以快乐的开发项目&#xff0c;但是没想到在springboot中使用mybatis还不一样&#xff0c;那么我就在这里记录一下。 请注意&#xff0c;sprngboot中使用的mybatis是专门为springboot设计的&#xff0c;单独引用依赖的话需要在springboot找到如下…

Java性能分析

0、问题代码&#xff1a; 代码问题其实很明显&#xff0c;但是这里主要是为了练习如何使用工具进行分析 所以最好先不要看代码&#xff0c;假装不知道程序逻辑&#xff0c;而是先通过工具去分析&#xff0c;再结合分析数据去看代码&#xff0c;从而推出问题点在哪 import jav…

代码随想录NO50 |动态规划_leetcode 392.判断子序列 115.不同的子序列

动态规划_leetcode 392.判断子序列 115.不同的子序列今天继续子序列&#xff01; 392.判断子序列 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 dp[i][j] 表示以下标i-1为结尾的字符串s&#xff0c;和以下标j-1为结尾的字符串t&#xff0c;相同子序列的长度为dp…

靠谱的动漫绘画培训班国内有哪些

动漫绘画培训班有哪些&#xff0c;今天给大家带来的是国内专业的动漫培训机构排名&#xff0c;这5个动漫培训机构&#xff0c;相信你一定都知道&#xff0c;快来看看吧&#xff01; 一&#xff1a;动漫绘画培训机构排名 1、轻微课 轻微课是国内人气很高的板绘学习平台&#…

2.23作业ccc

检测中断到来时&#xff0c;让LED灯状态取反&#xff0c;并且在串口工具上打印一句话例如&#xff1a;当按键1按下之后&#xff0c;让LED1状态取反&#xff0c;并打印“LED1 down”当按键2按下之后&#xff0c;让LED2状态取反&#xff0c;并打印“LED2 down”当按键3按下之后&a…

vue2安装ant-design UI报错 ERR! peer vue@“>=3.2.0“ from ant-design-vue@3.2.15

npm install ant-design-vue --save 安装报错&#xff0c;使用的是vue2&#xff0c;如图&#xff0c; npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! While resolving: default0.1.0 npm ERR! Found: vue2.7.14 npm ERR! v…

13.Jenkins集成sonarqube

Jenkins集成sonarqube1.jenkins集成sonarqube2.jenkins以maven的方式集成sonarqube scanner报错1报错21.jenkins集成sonarqube 1.在jenkins插件管理中安装sonarqube scanner 2.jenkins要知道sonarqube服务端是谁&#xff0c;需要配置&#xff08;系统管理–系统配置–sonarq…

Knife4j文档请求异常错误

一、问题描述 springboot项目配置Knife4j后&#xff0c;访问地址http://xxxx/doc.html出现错误&#xff1a;Knife4j文档请求异常错误。 二、解决问题 使用google浏览器F12查看控制台后&#xff0c;发现有错误提示&#xff1a; 大致意思是某部分字段不能被有效解析为json。在…

因果推断方法(一)合成控制

知道的跳过下面的简单介绍&#xff1a; 就是比如广告主投放了10w元&#xff0c;那么他的收益怎么算&#xff1f;哪些订单就是广告带来的&#xff0c;哪些是不放广告也会购买&#xff1f; 合成控制法是目前我实际应用发现最好用的。置信度高&#xff0c;且容易理解。 简单讲下思…

iOS_苹果内购详细步骤

iOS苹果内购详细步骤iOS开发支付的两种方式1 Apple Pay 调取外部支付&#xff0c;例如支付宝、微信、银联等2 苹果内购IAP&#xff08;In-App Purchase&#xff09;1 IAP规则详解1.1 适用范围1.2 IAP类型1.2.1 Consumable products &#xff08;消耗型商品&#xff09;1.2.2 N…