前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >创建一个 Python 应用程序来衡量客户终身价值 (CLV)

创建一个 Python 应用程序来衡量客户终身价值 (CLV)

作者头像
磐创AI
发布2021-11-19 15:24:24
1K0
发布2021-11-19 15:24:24
举报
文章被收录于专栏:磐创AI技术团队的专栏


磐创AI分享

作者 | amitvkulkarni

编译 | Flin

来源 | analyticsvidhya

【导读】“如果你不关心你的客户,你的竞争对手自然会关心”——Bob Hooey

概述

客户终身价值是企业在特定客户与企业关联期间从特定客户那里获得的利润。每个行业都有自己的一套指标,可以跟踪和衡量这些指标,以帮助企业瞄准正确的客户并预测未来的客户群。

CLV 使营销、销售等各个部门能够规划其战略并向最有价值的客户提供特定产品或定制服务。它还为客户服务团队提供了一个框架,用于了解在培养和留住客户方面需要付出的努力。

当 CLV 与其他工具(例如客户细分、定价和营销策略)一起应用时,它是最有效的,并增加了巨大的价值,这意味着它告诉我们谁是我们最有利可图的客户,但它没有告诉我们哪些产品需要以什么价格和数量来销售。

因此,应该明智地应用 CLV,而不应该将其作为做出业务决策的唯一标准。CLV 可能会根据业务模型及其目标而变化,这意味着需要定期重新审视其定义和计算。

以下是各个行业如何使用 CLV

保险:营销团队想知道哪些客户最有可能支付高额保费而不是索赔,这反过来有助于他们获得新客户并发展业务。

电信:预测的 CLV 用于了解当前客户忠诚度的可能性以及他们继续使用计划或订阅的可能性。

零售:CLV 用于了解购买行为,并针对具有定制优惠/折扣的特定客户进行消费。

CLV的好处

  • 购置成本:帮助确定可接受的购置成本以及将营销工作放在何处
  • 潜在客户:帮助确定现有客户和潜在新客户的未来价值
  • 客户关系:能够与客户建立更牢固有效的关系
  • 品牌忠诚度:良好的关系有助于建立品牌忠诚度

目标

我们将探索以下步骤,并在本博客结束时,使用plotly dash构建客户终身价值模拟器应用程序。

  • 客户终身价值 (CLV) 概述
  • CLV 的好处
  • 数据探索
  • CLV计算
  • 使用 Plotly dash 开发应用程序
  • 结束语

入门

我们将使用来自UCI 机器学习存储库(https://archive.ics.uci.edu/ml/datasets/online+retail)的零售数据集 (CSV) 来构建 Python 应用程序。

属性描述可以在上面的 URL 中找到。

让我们加载数据集并查看数据。

代码语言:javascript
复制
data = pd.read_excel("./data/Online_Retail.xlsx")
data.head(10)
代码语言:javascript
复制
data.info()
代码语言:javascript
复制
Data columns (total 8 columns):
 #   Column       Non-Null Count  Dtype         
---  ------       --------------  -----         
 0   InvoiceNo    40 non-null     int64         
 1   StockCode    40 non-null     object        
 2   Description  40 non-null     object        
 3   Quantity     40 non-null     int64         
 4   InvoiceDate  40 non-null     datetime64[ns]
 5   UnitPrice    40 non-null     float64       
 6   CustomerID   40 non-null     int64         
 7   Country      40 non-null     object        
dtypes: datetime64[ns](1), float64(1), int64(3), object(3)

数据预处理

让我们清理数据,并创建我们在稍后阶段计算 CLV 所需的新函数。

  1. 数据清洗:删除重复记录
  2. 数量:我们将只考虑正数量。任何负值表示产品因某种原因被退回。
  3. 总购买量:这将是产品的单价x数量
  4. 聚合:由于数据处于交易级别,我们按CustomerIDCountry聚合数据我们将通过使用group by函数来做到这一点。
  5. 平均订单价值: 这将是花费的金额与交易数量的比率
  6. 购买频率:这是交易总和与交易总数的比率。它是每个客户的平均订单数。
  7. 流失率:这是没有再次订购的客户的百分比。
  8. CLTV:(平均订单价值 x 购买频率)/流失率)
  9. 此外,让我们重命名一些列名称以使其易于跟踪。

完成上述步骤后,数据将如下所示。

随着我们的进展,我们将进一步处理这个问题。

完整代码可从pre-processing.py 获取: https://github.com/amitvkulkarni/Data-Apps/blob/main/Customer%20Lifetime%20Value/pre_processing.py

使用 Plotly Dash 开发应用程序

我们将使用 Plotly Dash 开发我们的应用程序,这是一个用于构建数据应用程序的 Python 框架。让我们创建一个名为app.py的文件,并从加载库开始。

第 1 步:加载库
代码语言:javascript
复制
import pandas as pd
import matplotlib.pyplot as plt 
import seaborn as sns
import datetime as dt
import numpy as np
import dash
import dash_table
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output, State
第 2 步:设计布局 (UI)

卡片:我们正在跟踪的所有 4 个 KPI 都将位于页面顶部。定义了字体大小和颜色等。此外,每张卡的唯一 ID 稍后将用于填充值。

代码语言:javascript
复制
html.H2('Total Customers', style={
    'font-weight': 'normal'}),
html.H2(id='id_total_customer', style = {'color': 'DarkSlateGray'}),
], className='box_emissions'),
html.Div([
    html.H2('Total Transactions', style={
        'font-weight': 'normal'}),
    html.H2(id='id_total_transactions', style = {'color': 'DarkSlateGray'}),
], className='box_emissions'),
html.Div([
    html.H2('Total Sales($)', style={
        'font-weight': 'normal'}),
    html.H2(id='id_total_sales', style = {'color': 'DarkSlateGray'}),
], className='box_emissions'),
html.Div([
    html.H2('Avg Order Value($)', style={
        'font-weight': 'normal'}),
    html.H2(id='id_order_value', style = {'color': 'DarkSlateGray'}),
], className='box_emissions'),

图表:我们有 2 个图表,一个条形图显示最畅销的产品,第二个显示国家/地区的购买趋势。

柱状图:
代码语言:javascript
复制
df_plot_bar = pp.filtered_data.groupby('Description').agg({'TotalPurchase':'sum'}).sort_values(by = 'TotalPurchase', ascending=False).reset_index().head(5)
df_plot_bar['percent'] = round((df_plot_bar['TotalPurchase'] / df_plot_bar['TotalPurchase'].sum()) * 100,2).apply(lambda x : "{:,}".format(x))
fir_plotbar = px.bar(df_plot_bar, y='percent', x='Description', title='TOP SELLING PRODUCTS', text='percent', color='percent',)
fir_plotbar.update_traces(texttemplate='%{text:.2s}', textposition='inside')
fir_plotbar.update_layout(uniformtext_minsize=8, uniformtext_mode='hide', showlegend=False)
散点图:
代码语言:javascript
复制
df_plot = df.groupby(['Country','Description','UnitPrice','Quantity']).agg({'TotalPurchase': 'sum'},{'Quantity':'sum'}).reset_index()
fig_UnitPriceVsQuantity = px.scatter(df_plot[:25000], x="UnitPrice", y="Quantity", color = 'Country', 
        size='TotalPurchase',  size_max=20, log_y= True, log_x= True, title= "PURCHASE TREND ACROSS COUNTRIES")

注意:与卡片和绘图类似,其他 UI 组件如侧边栏、用于显示结果的表格都是设计好的。请从 Github访问完整的layout.py代码:https://github.com/amitvkulkarni/Data-Apps/blob/main/Customer%20Lifetime%20Value/layout.py

第 3 步:定义交互性(回调)

我们定义了一个update_output_All()函数,该函数将控件的值作为输入,执行逻辑,这意味着生成可视化和数据表,这些数据表将被填充到UI上。在2个方面缺少交互性:

  1. 应用加载:所有卡片、图表、KPI 和表格都将包含来自所有国家/地区的数字。
  2. 用户选择:一旦用户选择了一个特定的国家,所有的卡片、图表和表格都将包含特定于所选国家的数据。
代码语言:javascript
复制
def update_output_All(country_selected):
    try:
        if (country_selected != 'All' and country_selected != None):
            df_selectedCountry = pp.filtered_data.loc[pp.filtered_data['Country'] == country_selected]
            df_selectedCountry_p = pp.filtered_data_group.loc[pp.filtered_data_group['Country'] == country_selected]
            cnt_transactions = df_selectedCountry.Country.shape[0]
            cnt_customers = len(df_selectedCountry.CustomerID.unique())
            cnt_sales = round(df_selectedCountry.groupby('Country').agg({'TotalPurchase':'sum'})['TotalPurchase'].sum(),2)
            .........
            return [cnt_customers, cnt_transactions, cnt_sales, cnt_avgsales,  df_selectedCountry_p.drop(['num_days','num_units'], axis = 1).to_dict('records'),
                    fig_UnitPriceVsQuantity_country, fir_plotbar]
        else:
            cnt_transactions = pp.filtered_data.shape[0]
            cnt_customers = len(pp.filtered_data.CustomerID.unique())
            cnt_sales = round(pp.filtered_data.groupby('Country').agg({'TotalPurchase':'sum'})['TotalPurchase'].sum(),2)
            cnt_avgsales = round(pp.filtered_data_group.groupby('Country').agg({'avg_order_value': 'mean'})['avg_order_value'].mean())
            ........
            return [cnt_customers, cnt_transactions, cnt_sales,cnt_avgsales,  pp.filtered_data_group.drop(['num_days','num_units'], axis = 1).to_dict('records'),
                    pp.fig_UnitPriceVsQuantity, fir_plotbar]
    except Exception as e:
        logging.exception('Something went wrong with interaction logic:', e)

完整代码可以从app.py访问:https://github.com/amitvkulkarni/Data-Apps/blob/main/Customer%20Lifetime%20Value/app.py

结语

该博客的目的是介绍一种使用 Python 计算客户生命周期价值 (CLV) 的公式方法,并构建一个可以帮助业务用户即时做出决策的仪表板/网络应用程序。

我们还涉及构建数据应用程序的各个方面,从数据探索到公式,还涉及一些可以利用 CLV 的行业案例。

  • 此项目设置可用作模板,以便为其他用例快速复制它。
  • 你可以构建更复杂的预测模型来计算 CLV。
  • 添加更多与你的案例相关的控件和绘图,并具有更多交互性。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 磐创AI 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 【导读】“如果你不关心你的客户,你的竞争对手自然会关心”——Bob Hooey
  • 概述
  • 以下是各个行业如何使用 CLV
  • CLV的好处
  • 目标
  • 入门
  • 数据预处理
  • 使用 Plotly Dash 开发应用程序
    • 第 1 步:加载库
      • 第 2 步:设计布局 (UI)
        • 柱状图:
          • 散点图:
            • 第 3 步:定义交互性(回调)
            • 结语
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档