Python-RFM28模型

1.业务背景

多数二线城市房产中介企业在经营过程中,衡量其业务重点是否与市场热点相匹配是较为复杂的事情,主要是因为房屋签约和过户环节距离时间较长,导致过户数据时效性差,属于外部不可控因素。所以退而求其次,根据历史较长时间的签约数据制定企业目标,判断重点作业范围经营现状(根据签约数据建立模型得到)是否偏离企业规划目标(根据过户数据建立九宫格制定)就相对较为容易了,下文将阐述根据签约数据构建RFM28模型。

2.模型建立

这里只能提供思路,数据敏感无法提供

2.1获取数据

利用pymysql和pandas包从MySQL数据库提取数据

# -*- coding: utf-8 -*-
# 获取MySQL数据库数据
import pymysql
import pandas as pd
import numpy as np
sql_cmd = """ SELECT * FROM DB.sign_details_d WHERE year=2017 AND quarter="Q3" """
conn = pymysql.connect(host='localhost',user='***',passwd='***',db='DB',port=3306,charset='utf8')
primary_data = pd.read_sql(sql_cmd, conn)

2.2数据准备——选择数据和特征

选择符合需求的数据和特征,提高模型准确度

# 数据准备——选择数据和特征
data = primary_data[(primary_data['房屋用途']=='普通住宅') | (primary_data['房屋用途']=='商住两用')]
data.rename(columns={'日期':'签约日期'},inplace=True)
housing_area = data[['房源所在区域','楼盘名称']].drop_duplicates('楼盘名称')
dt_RFM = data[['合同ID','楼盘名称','签约日期','成交价']]

2.3数据准备——时间处理

确定“近度”(recency)数据

# 数据准备——时间处理
dt_RFM['签约日期'] = dt_RFM['签约日期'].astype(str)
dt_RFM['签约日期'] = pd.to_datetime(dt_RFM['签约日期'],format='%Y%m%d')
dt_RFM['DateDiff'] = pd.to_datetime('2017-09-15')-dt_RFM['签约日期']
dt_RFM['DateDiff'] = dt_RFM['DateDiff'].dt.days

2.4属性构造——近度、频度、额度

利用最近一次成交间隔时间、成交量和成交价分别构造近度、频度、额度三个维度的数据

# 近度、频度、额度三维数据构造
R_agg = dt_RFM.groupby(by=['楼盘名称'])['DateDiff'].agg({'Recency':np.min})
F_agg = dt_RFM.groupby(by=['楼盘名称'])['合同ID'].agg({'Frequency':np.size})
M_agg = dt_RFM.groupby(by=['楼盘名称'])['成交价'].agg({'Monetary':np.sum})

RFMdata = R_agg.join(F_agg).join(M_agg)

2.5数据分组——28原则

对“近度”数据采用等分方法设置分位点,但是“频度”和“额度”数据差异极大,等分法不能进行有效分类,故结合二八原则进行分位点的设置,以确保分类等级和企业目标划分(九宫格)尽可能匹配。

# 数据分组——等分法
bins1 = RFMdata.Recency.quantile(q=[0,0.2,0.4,0.6,0.8,1],interpolation='nearest')
bins1[0] = 0
labels1 = [5,4,3,2,1]
R_cut = pd.cut(RFMdata.Recency,bins=bins1,labels=labels1)

# 数据分组——28原则应用
bins2 = RFMdata.Frequency.quantile(q=[0,0.8,0.85,0.9,0.95,1],interpolation='nearest')
bins2[0] = 0
labels2 = [1,2,3,4,5]
F_cut = pd.cut(RFMdata.Frequency,bins=bins2,labels=labels2)

# 数据分组——28原则应用
bins3 = RFMdata.Monetary.quantile(q=[0,0.8,0.85,0.9,0.95,1],interpolation='nearest')
bins3[0] = 0
M_cut = pd.cut(RFMdata.Monetary,bins=bins3,labels=labels2)

RFMdata['R_cut'] = R_cut
RFMdata['F_cut'] = F_cut
RFMdata['M_cut'] = M_cut

2.6等级划分标准构造

各维度权重相同分值均为5,根据求和后的分值将等级划分为9类,即为楼盘最终等级。

# 构建等级评价标准,并划分等级
RFMdata['RFM'] = 5*RFMdata['F_cut'].astype(int)+5*RFMdata['M_cut'].astype(int)+5*RFMdata['R_cut'].astype(int)

bins = RFMdata.RFM.quantile(q=[0, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1],interpolation='nearest')
bins[0] = 0
labels = [1,2,3,4,5,6,7,8,9]
RFMdata['classes'] = pd.cut(RFMdata['RFM'],bins=bins,labels=labels)
RFMdata = RFMdata.reset_index()

2.7数据统计

因为模型参数为非固定参数,故对划分完等级的数据进行数理统计,方便数据观察和模型调整,使模型更贴近业务场景

# 等级分布情况的统计
Classes = RFMdata.groupby(by=['classes'])['楼盘名称'].agg({'等级房源数量':np.size})
Classes = Classes.reset_index()
Classes.rename(columns={'classes':'等级'},inplace=True)
Classes = Classes.sort_values(by=['等级'],ascending=False)
Classes['类别占比累计'] = round(1*Classes['等级房源数量'].cumsum()/Classes['等级房源数量'].sum(),4)

2.8数据整合

计算完成的结果需要交付运营方,故需对数据列进行重新命名。匹配企业制定的楼盘宫格,方便运营方进行更深入的对比分析

# 数据整理,匹配企业定位数据
df = ['楼盘名称','最近成交距离季度末N天','季度成交量','季度GMV','距离天数等级','季度成交量等级','季度GMV等级','RFM等级值','楼盘最终等级']
RFMdata.columns = df
House_Classes = pd.read_excel('E:\\楼盘宫格.xlsx')
RFMdata_re = pd.merge(House_Classes,RFMdata,on=['楼盘名称'],how='right')
RFMdata_re = pd.merge(Housing_Area,RFMdata_re,on=['楼盘名称'],how='left')
RFMdata_re = RFMdata_re.sort_values(by,=['楼盘最终等级','RFM等级值'],ascending=False)

2.9数据输出

输出为Excel表格并交付运营方

# 数据输出与保存
writer = pd.ExcelWriter('E:\\楼盘层级分析Q3.xlsx')
RFMdata_re.to_excel(writer,sheet_name='RFM模型',encoding='utf_8_sig',index=False)
Classes.to_excel(writer,sheet_name='等级分布',encoding='utf_8_sig',index=False)
writer.save()
print('Perfect:','生活不止眼前的苟且')

3.总结

二手房交易市场主要讲求供需关系的判断,楼市好的时候属于业主方市场——客找房市场,要定位好的楼盘好的房子是企业占据市场的战略核心;楼市差的时候属于客户方市场——房等客市场,除了极好的房子依然抢手,企业需要转移注意力到客户方,例如利用机器学习或深度学习方法定位好的客户。房产交易过程客户资料成交前后出入极大,而楼盘信息准确性极高,所以经历有限的情况下还是要靠房子吸引客户。所以好的楼盘好的房子的任务在一线运营,客户信息挖掘在集团。


声明:本文所载信息不保证准确性和完整性。文中所述内容和意见仅供参考,不构成实际商业建议,如有雷同纯属巧合。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值