项目背景
AirBnb是一个旅行服务短期租赁社区,它拥有广泛的用户出行场景数据,通过这些数据,锁定潜在的目标客户群并指定相应的营销策略是Airbnb业务发展的基石。
分析需求:
通过现有数据,对AirBnb用户进行客户分群,分析用户群体的核心特征。方便未来的营销
分析流程:
1.数据概况分析:数据行/列数量、 缺失值分布
2.单变量分析:数字型变量的描述指标、类别型变量统计、日期型变量处理
3.模型建立、选择群数、模型评估与优化
分析过程:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn
df = pd.read(r'airbnb.csv')
df.info()
df.head()
image.png
字段说明
age:年龄
date_account_created: 用户注册日期
date_first_booking: 用户首次订房日期
gender:性别
Language_EN:使用英文语言
Language_ZH:使用中文语言
Country_US:目的地是美国
Country_EUR:目的地是欧洲
android:安卓渠道
moweb: H5渠道
web:网页渠道
ios: IOS渠道
Married: 是否已婚
Children:小孩的数量
df.describe()
年龄最大值为2014,存在异常值,进行异常值数据处理
#保留大于18岁且小于80岁的用户
df = df[df['age'] >= 18]
df = df[df['age'] <= 80]
df.describe()
年龄数据处理完成,18-80这个年龄段是大多数用户的年龄段。因此数据选取也比较合理。
类别型变量(日期)的调整,日期变量:用户注册日期,有两种方式
1.将用户注册的年份提取出来
2.计算用户注册到现在的时间(更有价值)
#step 1 :将注册日期转化为日期格式
df['date_account_created'] = pd.to_datetime(df['date_account_created'])
df.info()
date_account_created格式已经转化为时间格式
df['year_since_account_created'] = df['date_account_created'].apply(lambda x: 2019-x)
df.year_since_account.describe()
最短的注册时间是5年最长的是9年
df['date_first_booking'] = pd.to_datetime(df['date_first_booking'])
df['year_since_first_booking'] = df [ 'date_first_booking'].apply(lambda x : 2019 - x.year)
df.year_since_first_booking.describe()
发现距离第一次预定时间最短的是4年,最长的是9年
这样的衍生变量在预测消费者购买能够更好得到潜在效果
df = pd.get_dummies(df)
df.info
gender变量已经由原来的object类型变成了类别型变量
已经将日期转变成了距今的年份,可以将两个日期变量删除
#把类型为datetime64的数据drop
df.drop(df.select_dtypes(['datetime64']),inplace = True,axis = 1)
df.info()
我们已经将数据类型为datetime64的数据drop掉,也保留了我们需要建模的核心数据。
建模前准备:选取5个变量,作为分群的维度。
airbnb_5 = df[['age','web','moweb','ios','android']]
数据标准化,使用sklearn中预处理模块scale
from sklearn.preprocessing import scale
x = pd.DataFrame(scale(airbnb_5))
建立模型
使用cluster建模
from sklearn import cluster
先尝试3种分类
model = cluster.KMeans(n_clusters=3, random_state = 10)
model.fit(x)
提取标签查看分类结果
airbnb_5['cluster'] = model.labels_
airbnb_5.head(20)
绘制散点图 查看分群的效果
#横坐标为age(年龄),纵坐标为ios(是否为ios客户端),类别会为分群类别
sns.scatterplot(x = 'age' , y = 'ios' , hue = 'cluster',date = airbnb_5)
从散点图我们可以看出 是否使用ios系统这一变量分群效果不错
模型评估与优化
使用groupby函数,评估各个变量维度的分群效果
airbnb_5.groupby(['cluster'])['age'].describe()
age年龄区分度比较弱,3类yongh年龄都在18-78岁
airbnb_5.groupby(['cluster'])['ios'].describe()
ios的区分度比较好,1群和2群的ios值为0 0群的ios值为1
使用silhouette score,评估模型效果
from sklearn import metrics #调用sklearn的metrics库
x_cluster = model.fit_predict(x) #个体与群的距离
score = metrics.silhouette_score(x,x_cluster) #评分越高,个体与群体越近;评分越低,个体与群体越远
print(score)
centers = pd.DataFrame(model.cluster_centers_)
centers.to_csv('center_3.csv')
center_3
将群组分成5组
model = cluster.KMeans(n_cluster = 5 , random_state = 10)
model.fit(x)
centers = pd.DateFrame(model.cluster_centers_)
centers.to_csv('center_5.csv')
center_5
业务数据解读
先看center_3
center_3
行:每一行都是系统认为的一个群组,即0群,1群,2群
列:重点关注每一列的数据,找绝对值较大的数字,结合业务理解给予判断
0 和 2 两个群组独特,下单渠道集中
2群用户:果粉,ios重度用户,不怎么用web
0群用户:通过H5页面下单,但是不适用app(可能是活动推送页面,然后跳转到H5页面去操作)
再看center_5
center_5
年龄变量有变大的趋势
3群的用户还是重度果粉。新拆分出的4群用户,好像不是很喜欢web下单也不是很喜欢ios下单,但是在Android这一项的分值也不是很高。我们勉强可以将这类的用户也添加一个喜欢用Android下单的标签。