基于Python和Flink的酒店数据分析

大数据学习路线图

【版权声明】版权所有,严禁转载,严禁用于商业用途,侵权必究。
作者:厦门大学计算机科学与技术系2023级研究生 欧立瀚
指导老师:厦门大学数据库实验室 林子雨 博士/副教授
时间:2024年6月
相关教材:林子雨编著《Flink编程基础(Java版)》(访问教材官网
相关案例:Flink大数据处理分析案例集锦
本案例数据集来源于Kaggle 公开项目 Hotel booking demand。使用pandas进行数据清洗,保存到分布式文件系统HDFS中,接下来使用Flink Python API 进行数据分析,主要使用其中的 Table API,最后,采用matplotlib进行可视化。
数据集和代码下载:从百度网盘下载本案例的代码和数据集。(提取码是ziyu)

1.数据集

1.1获取

数据集来源于 Kaggle 公开项目 Hotel booking demand(链接:Hotel booking demand (kaggle.com)

@@1.2数据集描述
该数据集为酒店预定记录。如图所示,数据集为 16.86 MB 大小 CSV 文件,共 119390 条记录。每条记录有包括 hotel、is_canceled、lead_time 等字段在内共32 个字段。

2.准备阶段

2.1数据预处理

1.对缺失值进行填充:
a)children字段中是数值型变量,且偏态分布,用中位数填充;
b)country字段是类别变量,用众数填充;
c)agent空值用0填充,表示没有代理;
d)company缺失值太多,删除变量。

2.对 arrival_date_month 字段数据格式进行处理,将其由英文字符转为数字格式。比如原来的六月为“July”转化为“6”

3.初始条件,餐饮字段中的Undefined / SC无餐套餐为一类

4.删除异常值
a)删除 adults 和 children 字段之和为 0 的记录
b)删除每日房价为负数的记录
c)删除 market_segment 为 Undefined 的记录

2.2上传到HDFS

启动HDFS:

使用 python hdfs 模块将上述预处理结果上传到HDFS:

从浏览器访问hdfs Web界面http://localhost:9870, 可以确认数据已经被上传到HDFS中:

3.使用 Flink 进行数据分析

3.1数据读取

本次实验使用Flink Python API 进行数据分析,主要使用其中的 Table API。
1.首先导入相关模块:

2.设置 env。这里使用批处理模式,同时把并行度设置为8:

3.利用 hdfs 模块,从 hdfs 中读取数据。
将数据首先读入为pandas DataFrame,再调用from_pandas() 方法将DataFrame数据转化为Flink Table。这样做的原因是用Flink自带的方式(FileDescritor、DDL语句等)读取csv文件比较繁琐,需要逐一指明字段名称与类型。

3.2酒店每月平均价格变化

1.利用Table Descriptor创建临时表(指明CSV格式),以保存酒店每月平均价格。临时表包含三个字段:月份、酒店类型、人均价格

2.按月和酒店类型分组,计算每个酒店每月的人均价格,并将结果保存于上述表中;

3.处理得到的 csv 文件如下图所示(截取部分):

3.3酒店每月入住量变化

1.利用Table Descriptor创建临时表(指明CSV格式),以保存酒店每月平均价格。临时表包含三个字段:月份、酒店类型、入住量

2.按月和酒店类型分组,计算每个酒店每月的人均价格,并将结果保存于上述表中;

3.处理得到的 csv 文件如下图所示(截取部分):

3.4游客分布

1.首先,利用Table Descriptor创建临时表(指明CSV格式),以保存处理结果。临时表包含三个字段:酒店类型、国家、预定人数

2.根据基于酒店类型和国家分组,统计游客的数量,并将结果存于临时表中:

3.处理得到的 csv 文件如下所示:

3.5不同价格区间酒店的预定情况

1.实现udf自定义函数,基于人均价格计算所属的价格区间:

2.按酒店类型和价格区间分组,统计取消总数和预定总数:

3.计算取消率(预定数除以总数,这里需要乘以0.1确保转化为浮点数)和实际入住数(预定数减去取消数):

4.首先,利用Table Descriptor创建临时表(指明CSV格式),以保存处理结果。临时表包含六个字段:价格区间、酒店类型、预定数、取消数、取消率、实际入住数。

5.处理得到的 csv 文件如下所示:

3.6游客入住天数

1.首先,利用Table Descriptor创建临时表(指明CSV格式),以保存处理结果。临时表包含三个字段:居住天数分类、酒店类别、人数

2.自定义函数用于将居住天数分为四类:

3.根据居住天数类别、酒店类别分组聚合

4.绘图分析

4.1酒店每月平均价格/入住量变化情况



上图是每月人均价格变化

上图是每月入住量变化
由图可以发现:
1、城市酒店4-5月(春季)和9-10月(秋季)为预定旺季,房价也相应提高
2、度假酒店3-5月份(春季)和10月份(秋季)为预定旺季,房价稍有上浮
3、对于两家酒店来说6-8月份均为淡季,但发现度假酒店在7-8月淡季反而房价很高,远高于其他月份
4、11月-来年1月份(冬季)为预定淡季

4.2游客分布



由图可见,游客主要分布于欧洲地区,其次是北美。

4.3不同价格区间酒店的经营情况


不同价格区间酒店的预订量:

不同价格区间酒店的入住量:

不同价格区间酒店的取消率:

大多数旅客还是选择人均价格在(0,100)区间的酒店入住;度假酒店的取消率有随着价格区间增长而增长的趋势。

4.4游客入住天数



大多数游客住2-5晚,且住宿时间越长,越倾向于选度假酒店。

补充说明:代码目录结构


1.dataset 目录:存放数据集
2.figure 目录:存储Flink分析得到的结果,用于绘图
3.flink.ipynb:Flink 数据分析代码
4.plot.ipynb:绘图代码
5.prepare.ipynb:数据预处理代码