大家好,如今的企业有能力收集大量的数据,这些数据可以帮助企业制定更好的策略并了解其客户的行为。Cohort分析可以在其中发挥作用,Cohort分析是一种了解客户行为或用户互动的强大工具,并为企业提供有价值的见解,本文中将介绍如何使用Python进行Cohort分析。
Cohort分析
Cohort分析是一种经常在市场营销、客户忠诚度、用户体验和产品开发等领域使用的数据分析技术。通过这种分析方法,我们可以详细了解特定时期内人群或群体的行为,Cohort用于识别具有相似特征或经历的人群或群体。
例如,对于电子商务业务,可以使用Cohort分析来监测不同的群体,比如客户群体、来自特定地区的群体或偏好特定产品类别的群体。通过这种分析,我们可以研究特定群体在一段时间内的行为和倾向。
应用Cohort分析
本文有一个由12个表组成的关系数据库,将在Python通过MS SQL从这个表中提取所需的特征。进行必要的预处理操作后将使用数据适合进行分析。
分析中需要两个特征,分别是客户ID和订单日期,目标是查看能够保留多少客户,并在其首次到达日期后的每个月基础上保留多长时间。
我们所想要的特征包含在一个单独的表中,因此在查询过程中,不需要从其他表中提取属性。为了举例说明,假设将在两个表上工作,接下来使用MS SQL中的JOIN
获取本文想要的特征。
SELECT * FROM ORDERS
SELECT * FROM USERS
SELECT U.ID, O.DATE_ FROM USERS U JOIN ORDERS O ON U.ID= O.ID
通过JOIN
从USERS和ORDERS表中调用具有相同ID值的属性,为了在Python中进行分析,将访问该数据库,在其中运行我们的查询,并将数据作为数据帧在我们的操作中使用。
首先导入本文所需要的库:
import pandas as pd
import sqlalchemy as sa
import urllib
from datetime import datetime
在第二步中,使用urllib.parse.quote_plus
函数来保护连接字符串免受环境因素的影响,并将连接信息写入这个将用于连接SQL Server数据库的字符串中。
params = urllib.parse.quote_plus("DRIVER={SQL Server};""SERVER=DESKTOP-F3H252;""DATABASE=E-COMMERCE;")
注:如果不知道服务器名称,可以通过查询
"SELECT @@SERVERNAME"
来找到它。
接下来,使用"SQLAlchemy (sa)"
库创建与SQL Server数据库的连接,使用"sa.create_engine"
函数,我们可以利用连接字符串和其他连接设置创建一个链接引擎。"odbc_connect"
参数用于ODBC连接,并包含之前转换的连接字符串。
engine = sa.create_engine("mssql+pyodbc:///?odbc_connect={}".format(params))
在下一步中将创建一个SQL查询,使用查询"SELECT U.ID, O.DATE_ FROM USERS U JOIN ORDERS O ON U.ID= O.ID"
来获取我们想要的特征。
qry ="SELECT U.ID, O.DATE_ FROM USERS U JOIN ORDERS O ON U.ID= O.ID"
通过"engine"
对象建立数据库连接,并在"with"
代码块中使用该连接,使用"con.execute(qry)"
运行SQL查询并获取结果集(rs),
最后将结果集转换为Pandas DataFrame。
with engine.connect() as con:rs = con.execute(qry)df = pd.DataFrame(rs)
df.isnull().sum()ID 0
DATE_ 0
dtype: int64
由于我们将按月进行工作,所以小时数对我们来说并不重要,所以我们首先要删除小时数,然后再删除天数。首先,我们将日期列(DATE_)
转换为日期时间格式,然后只获取日期。
df['DATE_'] = pd.to_datetime(df['DATE_'])
df['DATE_'] = df['DATE_'].dt.date
下一步行动是删除天数,接下来为此定义一个lambda
函数,希望保留年份和月份的值。datetime(x.year, x.month, 1)
将使用年份和月份信息创建一个新的日期对象,其中包含该月的第一天。
get_year_month = lambda x: datetime(x.year, x.month, 1)
接下来使用这个函数创建一个新的变量,并将新数据存储在'DATE_MONTH'
列中。
df['DATE_MONTH'] = df['DATE_'].apply(get_year_month)
将根据客户ID对要执行的流程进行分组,并通过创建'COHORT_MONTH'
变量在这一列中保留每个客户的首次到达日期。
user_first_date = df.groupby('ID')['DATE_MONTH']
df['COHORT_MONTH'] = user_first_date.transform('min')
当我们查看所获得的值时,如果对第一个订单日期和其他订单日期进行评估,就可以很容易地找到差异,可以通过创建一个新的'COHORT_INDEX'
变量,将差异保留在这一列中。
years_diff = df['DATE_MONTH'].dt.year - df['COHORT_MONTH'].dt.year
months_diff = df['DATE_MONTH'].dt.month -df['COHORT_MONTH'].dt.month
df['COHORT_INDEX'] = years_diff * 12 + months_diff + 1
接下来计算每个首次到达日期的活跃客户的月度数量,通过分组创建名为cohort_data
的数据帧,其中包含了每个月首次到达的唯一客户数量。
grouping_count = df.groupby(['COHORT_MONTH', 'COHORT_INDEX'])
cohort_data = grouping_count['ID'].apply(pd.Series.nunique)
cohort_data = cohort_data.reset_index()
cohort_data.head()
进而将cohort_data
数据帧整理到数据透视表中,并创建一个名为cohort_user_counts
的新数据帧,该数据帧将包含每个群体的月活跃客户数量,计算每个客户的活跃百分比,通过将每个月群体中的客户数除以初始客户数来实现此目的。
cohort_sizes = cohort_user_counts.iloc[:,0]
retention = cohort_user_counts.divide(cohort_sizes, axis=0)
retention.index = retention.index.strftime('%m-%Y')
最后在热图上可视化retention
数据帧:
sns.set(style = 'white')
plt.figure(figsize = (15, 6))
plt.title('Cohort: Retention rate by month')
sns.heatmap(retention,cmap = plt.cm.Reds,annot = True,fmt = '.0%')
plt.xlabel("Ongoing months"
plt.ylabel("First arrival date")
plt.show()
如上所述,图表中的百分比表达的是活跃率,从中可以推断出的内容回答了可以保留客户多长时间的问题。