一、数据导入
csv_path = './Data/North_American_Superstore.csv' df = pd.read_csv(csv_path, encoding="gbk") pd.set_option('display.max_columns', None) # 原始dataframe中列名中包含空格,需要进行替换 df.rename(columns = lambda x : x.replace(' ',''),inplace = True) df.head()
二、数据预处理
1.数据概况
print(df.shape) print("-"*30) print(df.describe()) print("-"*30) print(df.info())
2.数据清理
异常数据处理
df.loc[df['Sales']<0].Sales.count() # 统计销售额Sales<0的个数 df.loc[df['Sales']<0, ['OrderID', 'CustomerID', 'Sales']] # 查看异常Sales的OrderID和CustomerID df = df.loc[(df['Sales']>0)&(df['Quantity']>0)] # 取Sales 和 Quantity 均大于零的行
数据格式
# 日期数据格式转换 df['OrderDate'] = pd.to_datetime(df['OrderDate']) # 查看用户下单的日期范围 print('最晚下单日期是:',df['OrderDate'].max()) print('最早下单日期是:',df['OrderDate'].min())
三、客户价值和客户创利能力分析
RFM分析:最近一次消费(Recency近度)、消费频率(Frequency频度)、消费金额(Monetary额度)
重要价值客户(高,高,高):最近消费时间近、消费频次和消费金额都很高,绝对的优质客户。
重要保持客户(低,高,高):最近消费时间较远,但消费频次和金额都很高,说明这是个一段时间没来的忠诚客户,需要主动和他保持联系。
重要发展客户(高,低,高):最近消费时间较近、消费金额高,但频次不高,忠诚度不高,很有潜力的用户,必须重点发展。
重要挽留客户(低,低,高):最近消费时间较远、消费频次不高,但消费金额高,可能是将要流失或者已经要流失的用户,应当基于挽留措施
1.客户RFM表
获取不同客户(CustomerID)在所有时间内的下单次数Frequency
df_f = df.copy() df_f.drop_duplicates(subset=['OrderID'],keep='first',inplace=True) # 合并相同的订单 df_freq = df_f.groupby('CustomerID',as_index=False).OrderID.count().rename(columns={'OrderID':'Frequency'}) df_freq.set_index('CustomerID',drop=True,inplace=True) df_freq.head()
获取不同客户(CustomerID)在所有时间内的订单金额Monetary、利润Profit和最后一次下单距离当前时间的天数Recency
df_group = df.groupby('CustomerID') df_rm = df_group.agg({'Sales':'sum','OrderDate':'max','Profit':'sum'}).rename(columns={'Sales':'Monetary'}) df_rm['Recency'] = (pd.to_datetime('2019-01-01') - df_rm['OrderDate']).dt.days df_rm = df_rm.drop('OrderDate',axis=1) df_rm.head()
获取获取不同客户(CustomerID)在其发生购买的年限内年均下单频次Frequency
DiffYears = df_group.agg({'OrderDate':(lambda df : df.dt.year.max() - df.dt.year.min()+1)}).rename( columns={'OrderDate':'DiffYears'}).DiffYears DiffYears.head() df_freq.Frequency=df_freq.Frequency/DiffYears df_freq.head()
df_rfm = df_rm.merge(df_freq,on='CustomerID') df_rfm.head()
2.不同类型客户分析
以中位数为界划分对各客户进行类型划分
# 求取RFM各值的中位数 r_med = df_rfm['Recency'].median() f_med = df_rfm['Frequency'].median() m_med = df_rfm['Monetary'].median() r_med,f_med,m_med # 划分客户类型的函数 def customer_type_func(frame): customer_type_list = [] for i in range(len(frame)): if frame.iloc[i,2]<=r_med and frame.iloc[i,3]>=f_med and frame.iloc[i,0]>=m_med: customer_type_list.append('重要价值客户') elif frame.iloc[i,2]<=r_med and frame.iloc[i,3]<f_med and frame.iloc[i,0]>=m_med: customer_type_list.append('重要发展客户') elif frame.iloc[i,2]>r_med and frame.iloc[i,3]>=f_med and frame.iloc[i,0]>=m_med: customer_type_list.append('重要保持客户') elif frame.iloc[i,2]>r_med and frame.iloc[i,3]<f_med and frame.iloc[i,0]>=m_med: customer_type_list.append('重要挽留客户') else: customer_type_list.append('一般客户') frame['CustomerType'] = customer_type_list customer_type_func(df_rfm)
分析不同类型客户的总体获利情况
df_rfm['ProfitType'] = (df_rfm.Profit>0) df_ProfitCustNum= df_rfm.groupby(['CustomerType','ProfitType']).size().reset_index(name='ProfitCustNum') df_ProfitCustNum
不同类型客户总订单金额、利润率、利润、客户平均订单金额、客户平均订单利润
不同类型客户创利情况分析
四、同期群分析
同期群分析(Cohort Analysis,亦称群组分析),其主要目的是分析相似群体的行为随时间的变化(比如用户商品的回购、对产品/服务的使用等)
通过将用户按初始行为的发生时间分组(得到同期群),然后再统计初始行为时间后不同时段内留存行为的发生频次。
由于数据集的原因,不能确定历史所有老客户的ID,因此做出假设:以2015上半年下单的客户为老客户,从2015年下半年开始计算新增客户,2016年上半年开始计算客户回购率/留存率
for i, customer_list_half_year in enumerate(u_customer_list): if i>0 and i<7: last_list = [] # 保存过去所有时间内客户ID(去重) retain_list = [] # 保存以后每个半年回购的客户人数 for j in range(0,i): last_list.extend(u_customer_list[j]) last_list = list(set(last_list)) new_list = [cust for cust in customer_list_half_year if cust not in last_list] # 保存当前周期新增客户ID for k in range(i+1,8): retain_list.append(len([cust for cust in u_customer_list[k] if cust in new_list])) print(label[i]+'新增客户数量为', len(new_list), '留存率依次为',[round(i/len(new_list), 3) for i in retain_list])
五、Tableau仪表盘搭建
标签:customer,med,df,frame,能力,客户,创利,OrderDate From: https://www.cnblogs.com/0chenxian0/p/17398133.html