当前位置:   article > 正文

python酒店数据分析_python数据分析实战——AirBnb用户分群

import numpy as np def create_user_hotel_matrix(users, items, data, hotel_id

项目背景

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下单的标签。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/379823
推荐阅读
相关标签
  

闽ICP备14008679号