搜索

查看: 3129|回复: 11

[Python] 详解如何利用Python进行客户分群分析

[复制链接]
发表于 2023-5-4 17:18:24 | 显示全部楼层 |阅读模式
Editor 2023-5-4 17:18:24 3129 11 看全部
目录
  • 导入数据和python库
  • 分离新老客户
  • 按客户ID排序,然后是日期
  • 定义一些函数
  • 创建群组
  • 转换为群组百分比
  • 可视化每个电子商务数据分析师必须掌握的一项数据聚类技能
    如果你是一名在电子商务公司工作的数据分析师,从客户数据中挖掘潜在价值,来提高客户留存率很可能就是你的工作任务之一。
    然而,客户数据是巨大的,每个客户的行为都不一样。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  

    202302240912185.jpg

    202302240912185.jpg


    分离新老客户
    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)  

    202302240912196.png

    202302240912196.png


    定义一些函数
    def purchase_rate(customer_id):  
        purchase_rate = [1]  
        counter = 1  
        for i in range(1,len(customer_id)):  
              if customer_id != 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 == 1:  
                     join_date = date  
              else:  
                     join_date = 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 == 1:  
                  age_by_month = 0  
              else:  
                  if year == join_year:  
                     age_by_month = month - join_month  
                  else:  
                     age_by_month = month - join_month + 12*(year-join_year)  
         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  

    202302240912197.jpg

    202302240912197.jpg


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

    202302240912208.jpg

    202302240912208.jpg


    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)  

    202302240912209.jpg

    202302240912209.jpg


    **如何解释这个表格:**以群组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]  

    2023022409122110.jpg

    2023022409122110.jpg


    可视化
    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()  

    2023022409122111.jpg

    2023022409122111.jpg


    2023022409122212.jpg

    2023022409122212.jpg


    到此这篇关于详解如何利用Python进行客户分群分析的文章就介绍到这了,更多相关Python客户分群分析内容请搜索知鸟论坛以前的文章或继续浏览下面的相关文章希望大家以后多多支持知鸟论坛
  • 回复

    使用道具 举报

    发表于 2023-6-28 18:36:25 | 显示全部楼层
    术数古籍专卖疤 2023-6-28 18:36:25 看全部
    楼主,大恩不言谢了!知鸟论坛是最棒的!
    回复

    使用道具 举报

    发表于 2023-6-28 21:09:14 | 显示全部楼层
    Gordon520 2023-6-28 21:09:14 看全部
    楼主,我太崇拜你了!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    发表于 2023-6-30 08:34:08 | 显示全部楼层
    462710480 2023-6-30 08:34:08 看全部
    楼主发贴辛苦了,谢谢楼主分享!我觉得知鸟论坛是注册对了!
    回复

    使用道具 举报

    发表于 2023-6-30 14:46:22 | 显示全部楼层
    心随674 2023-6-30 14:46:22 看全部
    这个帖子不回对不起自己!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    发表于 2023-6-30 22:44:47 | 显示全部楼层
    ffycxyw2274436 2023-6-30 22:44:47 看全部
    楼主,大恩不言谢了!知鸟论坛是最棒的!
    回复

    使用道具 举报

    发表于 2023-7-3 12:17:21 | 显示全部楼层
    123456848 2023-7-3 12:17:21 看全部
    这东西我收了!谢谢楼主!知鸟论坛真好!
    回复

    使用道具 举报

    发表于 2023-7-3 22:20:35 | 显示全部楼层
    xinting_6ym 2023-7-3 22:20:35 看全部
    这个帖子不回对不起自己!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    发表于 2023-7-4 19:35:19 | 显示全部楼层
    掌舵的鱼1987 2023-7-4 19:35:19 看全部
    楼主太厉害了!楼主,I*老*虎*U!我觉得知鸟论坛真是个好地方!
    回复

    使用道具 举报

    发表于 2023-7-6 14:19:16 | 显示全部楼层
    墙和鸡蛋 2023-7-6 14:19:16 看全部
    楼主太厉害了!楼主,I*老*虎*U!我觉得知鸟论坛真是个好地方!
    回复

    使用道具 举报

    • 您可能感兴趣
    点击右侧快捷回复 【请勿灌水】
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则 返回列表

    RSS订阅| SiteMap| 小黑屋| 知鸟论坛
    联系邮箱E-mail:zniao@foxmail.com
    快速回复 返回顶部 返回列表