社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

客户同期群分析Python实战

CDA数据分析师 • 1 年前 • 184 次点击  


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

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

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

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

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

导入数据和python库

# 数据获取:在公众号 数据STUDIO 后台回复 data
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

分离新老客户

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=(2015))
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()

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


推荐阅读

👉 情人节数据“爆”了!数据显示女性比男性更愿意为浪漫买单

👉 做一份好的生产计划之前,必须做好哪些准备 | CDA持证人专访

👉 解读 | 如今数据分析岗位的现状和需求是怎样的?

👉 解读 | 数据分析行业大概是什么时候在国内兴起的?

👉 从体制内走出,我靠数据分析再次上岸 | 求职分享


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/153034
 
184 次点击