磐创AI分享
作者 | amitvkulkarni
编译 | Flin
来源 | analyticsvidhya
客户终身价值是企业在特定客户与企业关联期间从特定客户那里获得的利润。每个行业都有自己的一套指标,可以跟踪和衡量这些指标,以帮助企业瞄准正确的客户并预测未来的客户群。
CLV 使营销、销售等各个部门能够规划其战略并向最有价值的客户提供特定产品或定制服务。它还为客户服务团队提供了一个框架,用于了解在培养和留住客户方面需要付出的努力。
当 CLV 与其他工具(例如客户细分、定价和营销策略)一起应用时,它是最有效的,并增加了巨大的价值,这意味着它告诉我们谁是我们最有利可图的客户,但它没有告诉我们哪些产品需要以什么价格和数量来销售。
因此,应该明智地应用 CLV,而不应该将其作为做出业务决策的唯一标准。CLV 可能会根据业务模型及其目标而变化,这意味着需要定期重新审视其定义和计算。
保险:营销团队想知道哪些客户最有可能支付高额保费而不是索赔,这反过来有助于他们获得新客户并发展业务。
电信:预测的 CLV 用于了解当前客户忠诚度的可能性以及他们继续使用计划或订阅的可能性。
零售:CLV 用于了解购买行为,并针对具有定制优惠/折扣的特定客户进行消费。
我们将探索以下步骤,并在本博客结束时,使用plotly dash构建客户终身价值模拟器应用程序。
我们将使用来自UCI 机器学习存储库(https://archive.ics.uci.edu/ml/datasets/online+retail)的零售数据集 (CSV) 来构建 Python 应用程序。
属性描述可以在上面的 URL 中找到。
让我们加载数据集并查看数据。
data = pd.read_excel("./data/Online_Retail.xlsx")
data.head(10)
data.info()
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 所需的新函数。
完成上述步骤后,数据将如下所示。
随着我们的进展,我们将进一步处理这个问题。
完整代码可从pre-processing.py 获取: https://github.com/amitvkulkarni/Data-Apps/blob/main/Customer%20Lifetime%20Value/pre_processing.py
我们将使用 Plotly Dash 开发我们的应用程序,这是一个用于构建数据应用程序的 Python 框架。让我们创建一个名为app.py的文件,并从加载库开始。
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
卡片:我们正在跟踪的所有 4 个 KPI 都将位于页面顶部。定义了字体大小和颜色等。此外,每张卡的唯一 ID 稍后将用于填充值。
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 个图表,一个条形图显示最畅销的产品,第二个显示国家/地区的购买趋势。
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)
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
我们定义了一个update_output_All()函数,该函数将控件的值作为输入,执行逻辑,这意味着生成可视化和数据表,这些数据表将被填充到UI上。在2个方面缺少交互性:
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 的行业案例。