1、本数据集的数据内容与数据特征分析
列名
数据类型
含义
hotel
object
包含H1和H2,H1指假日酒店;H2指城市酒店
is_canceled
int64
1代表取消,O代表不取消
lead_time
arrival_date_year
入住年
arrival_date_month
入住月份
arrival_date_week_number
在第几周入住
arrival_date_day_of_month
在月份中几号入住
stays_in_weekend_nights
在周末住几晚
stays_in_week_nights
在一周之内住几晚
adults
成年人预订人数
children
float64
儿童预订人数
babies
婴儿预订人数
meal
不同种类餐食预订情况
country
不同国家简写
market_segment
市场划分,分为旅行社代理人和包价旅游承包
distribution_channel
分布渠道,同market_segment
is_repeated_guest
以前是否预订过
previous_cancellations
这次预订以前取消的次数
previous_bookings_not_canceled
这次预订以前没有取消的次数
reserved_room_type
预订房型,类别较多,以字母A-P划分
assigned_room_type
入住的房型,同reserved_room_type
booking_changes
变更预订次数
deposit_type
押金类型
agent
代理商ID
company
公司ID
days_in_waiting_list
证实预订前等待的天数
customer_type
顾客类别
adr
平均每日价格
required_car_parking_spaces
需要的停车位
total_of_special_requests
特殊需求数
reservation_status
订单状态
reservation_status_date
显示订单状态日期
2、数据分析的课程设计方案概述
1)数据收集:如何收集大量数据。
解决方案:通过和鲸社区和Kaggle查找需要的数据。
2)大数据分析:如何结合大数据生成的图表进行分析
解决方案:结合实际情况,如地理位置,活动节日等进行实际推断。
三、数据分析步骤
1、数据源
该数据集来自kaggle
2、数据清洗
检查是否能完整显示各行各列的数据
1#设置显示所有列2pd.set_option('display.max_columns',None)34#读取文件,并显示所有的数据5data=pd.read_csv('hotel_bookings.csv')6df=data.copy()7df.head()显示结果如下:
检查数据中是否有空数据
1'''2#检查数据中缺少的值3#1、先用isnull函数会返回一个布尔型数据框,其中每个元素都表示对应的数据是否为空。4#2、接着使用sum函数对数据为空的所有元素进行求和。5#3、使用布尔索引判断大于0的值,就能得到数据中存在缺失的值。6'''7df.isnull().sum()[df.isnull().sum()>0]
显示结果如下:
对有空数据的列进行数据清洗,并检查是否还存在空数据
1#进行数据清洗2#将agent列中选择所有缺失值的值。并将这些值更新为'Noagent'3df.loc[df.agent.isnull()==False,'agent']='Agent'4df.agent.fillna('Noagent',inplace=True)5#使用Unknown(未知)来填充country(国家)列缺少的值6df.country.fillna('Unknown',inplace=True)7#使用0来填充children(儿童预定人数)列缺少的值8df.children.fillna(0,inplace=True)9'''10#对company(公司ID)列进行更新11#某些行中,细分市场或分销渠道被指定为公司,其中公司行为空,将用Corporate(公司)填充这些空值12#将在公司栏中填写公司的非缺失值13#用Individuals(个人)填充公司列中剩余的缺失值14'''15df.loc[((df.market_segment=='Corporate')|(df.distribution_channel=='Corporate'))&(df.company.isnull()),'company']='Corporate'16df.loc[df.company.isnull()==False,'company']='Corporate'17df.company.fillna('Individuals',inplace=True)1819#查看数据之中是否还存在缺失值20df.isnull().sum()
删除重复冗余的数据,并对每个国家进行归纳整理,将每个国家归入对应的大陆上
3、大数据分析过程
通过pandas.crosstab()函数来生成数据表,方便查看数据间的关系。
1tbl=pd.crosstab(df.hotel,df.is_canceled,margins=True)2tbl
1tbl['cancel_percent']=tbl[1]*100/tbl['All']2tbl
1pd.crosstab(df.hotel,df.is_canceled,values=df.is_canceled,aggfunc='count',normalize=True).plot.bar()2plt.title('酒店取消预订情况')3plt.ylabel('取消预订比例')4plt.xlabel('酒店类型')5plt.show()显示结果如下:
分析:这里可以看出来,CityHotel(城市酒店)取消的人数更多,相比较于ResortHotel(假日酒店)多出了6.5个百分点,除去正常超额预订的情况,CityHotel的取消率还是过高,可能是因为城市酒店位置优越,方便前往商务场所或者旅游景点。此外,城市酒店的价格可能比假日酒店的价格更容易接受。
1sns.distplot(df.lead_time)2plt.show()
1plt.rcParams['figure.figsize']=[8,5]2sns.countplot(x='arrival_date_year',data=df,hue='hotel')3plt.xlabel('年份')4plt.ylabel('预订数量')5plt.title('每年的预订')6plt.show()
分析:从图中可以看出2016年的预订量是最高的,而2015年是最少的,可能2015年后市场需求增加、2015年后酒店更新和建立数量增加等。
1tbl=pd.crosstab(df.arrival_date_year,df.is_canceled,margins=True)2tbl3#添加一列cancel-percent(取消预订的百分比)来显示取消的预订占总预订的百分比4tbl['cancel-percent']=tbl[1]*100/tbl['All']5tbl
1tbl.drop('All',axis=0)['cancel-percent'].plot.bar()2plt.xticks(rotation=0)3plt.xlabel('Year')4plt.ylabel('Cancellation%')5plt.title('2015-2017年取消率')6plt.show()
df[df.is_canceled==1]['arrival_date_year'].value_counts()/len(df[df.is_canceled==1])显示结果如下:
分析:根据图标显示发现,酒店的预订数量和取消率连年增加,说明随着年份增加,酒店市场需求也再增加,随着市场的增加客户的选择更多,当发现有更加好的酒店时,就更容易取消预订过的酒店。也有可能是随着预订数量的增加,酒店进行了房间超售,导致客户不满或无房可住,导致预订取消率增加。
1plt.rcParams['figure.figsize']=[8,5]2sns.countplot(x='arrival_date_month',data=df,order=df.arrival_date_month.value_counts().index)3plt.title('每月预订数量')4plt.xlabel('预订月份')5plt.ylabel('预订数量')6plt.xticks(rotation=60,ha='right')7plt.show()
1plt.rcParams['figure.figsize']=[8,5]2sns.countplot(x='arrival_date_month',data=df,order=df.arrival_date_month.value_counts().index,hue='hotel')3plt.title('每月预订数量')4plt.xlabel('BookingMonth')5plt.ylabel('NumberofBookings')6plt.xticks(rotation=60,ha='right')7plt.show()
1tbl=pd.crosstab(df.arrival_date_month,df.is_canceled,margins=True)2tbl['cancel_percent']=tbl[1]*100/tbl['All']3tbl
#将上表中的取消预订的百分比进行绘制
1tbl.drop('All',axis=0)['cancel_percent'].plot.bar()2plt.title('每个月取消预订百分比')3plt.xlabel('月份')4plt.ylabel('取消预订百分比(%)')5plt.show()
分析:与其他月份相比,8月和7月的预定量是最高的,这期间一般是学校假期,学生群体更容易去其他地方旅游度假或参加聚会活动,所以假期也是假期预订量的关键。但通过后续的取消预订百分比图发现,7、8月份也是取消率最高的月份,根据上一个酒店会超售的分析,再次表明了,在节假日期间,酒店的预订量会过多和匆忙。
#绘制第几周入住的柱状图
1plt.figure(figsize=(10,15))2sns.countplot(x='arrival_date_week_number',data=df)3plt.title('每周入住数量')4plt.xticks(rotation='vertical')5plt.xlabel('每年的周数')6plt.ylabel('数量')7plt.show()
分析:不难发现,第33周的预订量是最高的,推算一下是在8月份附近,进一步支持了8月份节假日举行活动和旅游度假的说法。还看到临近年底与过年前夕,预订数量明显减少,特别是在51周,是预订量最低的一周,根据推算,是在12月份中旬,在国外,这个日子最接近圣诞节,说明人们在这一周会进行圣诞节的准备活动,不会过多的在意酒店预订。
1plt.figure(figsize=(7,7))2sns.distplot(df.stays_in_weekend_nights)3plt.title('周末入住持续天数')4plt.xlabel('周末入住天数')5plt.ylabel('密度')6plt.show()
1plt.figure(figsize=(7,7))2sns.boxplot(x='hotel',y='stays_in_weekend_nights',data=df)3plt.show()
分析:通过盒图发现,两个酒店在周末入住天数其实差不多,所以,周末在CityHotel和ResortHotel住的人只是进行短住,一般持续一两天,长期居住的人较少。
1plt.figure(figsize=(5,5))2sns.distplot(df.loc[(df.stays_in_week_nights==0)&(df.stays_in_weekend_nights==0)]['adults'])3plt.title('成年人预订人数图')4plt.ylabel('密度')5plt.xlabel('成年人预订人数')6plt.show()
分析:由图片可以得知,预订大部分人是单人和双人,只有少数的未成年人和极少数有三个人的预订。人数最多的是双人预订,大部分可能是夫妻和情侣入住,大多可能是以休闲或旅游为主。
#绘制婴儿预订入住图
1plt.figure(figsize=(5,5))2sns.distplot(df.babies)3plt.title('婴儿预订入住图')4plt.ylabel('密度')5plt.xlabel('婴儿数量')6plt.show()
分析:由婴儿预订入住图可以明确的看出,基本上入住的都是没有婴儿的人(排除可能将婴儿放置在亲戚或其他的可能),只有极少数人会带领一个婴儿入住酒店。表明,来入住酒店的人群多是公司旅行、单人旅行、情侣旅行等,只有极少数由婴儿的家庭来旅行。
1plt.figure(figsize=(8,8))2sns.countplot(x='country',data=df)3plt.title('国家地区频率分布')4plt.xticks(rotation=60,ha='right')5plt.ylabel('数量')6plt.xlabel('国家地区')7plt.show()
1tbl=pd.crosstab(df.country,df.is_canceled,margins=True)2#添加一列cancel-percent(取消预订的百分比)来显示取消的预订占总预订的百分比3tbl['cancel_percent']=tbl[1]*100/tbl['All']4tbl
1plt.figure(figsize=(7,7))2tbl.drop('All',axis=0)['cancel_percent'].plot.bar()3plt.title('国家地区取消预订百分比图')4plt.xticks(rotation=60,ha='right')5plt.ylabel('取消预订百分比(%)')6plt.xlabel('国家地区')7plt.show()
分析:从图中可以看出,Africa(非洲)的取消率是最高的,应该是源于签证的问题,因为欧盟有一些严格的规定(欧洲的国家取消比例要低很多),在上图中可以看出,除了未知地区,NorthAmerica(北美)客户的取消率是最低的,这可能是北约的原因。
#绘制市场划分图
1plt.rcParams['figure.figsize']=[7,7]2sns.countplot(x='market_segment',data=df)3plt.xticks(rotation=60,ha='right')4plt.title('市场划分图')5plt.ylabel('数量')6plt.xlabel('市场划分')7plt.show()
1tbl=pd.crosstab(df.market_segment,df.is_canceled,margins=True)2#添加一列cancel-percent(取消预订的百分比)来显示取消的预订占总预订的百分比3tbl['cancel_percent']=tbl[1]*100/tbl['All']4tbl
#绘制市场取消率图
1tbl.drop('All',axis=0)['cancel_percent'].plot.bar()2plt.title('市场取消率')3plt.xticks(rotation=60,ha='right')4plt.ylabel('取消预订百分比(%)')5plt.xlabel('市场划分')6plt.show()
分析:由市场划分图可以发现,绝大多数的记录是通过OnlineTA(在线旅行代理商)获得的,这表明在线旅行代理商在欧盟拥有强大的网络,在网络上有完善的预约流程。还发现有一些Complementary(补充)的记录,这表示可能是酒店方面有报销或补偿的政策。从市场取消率可以发现Undefined(未定义)的取消率是最高的,达到了百分百。这很不正常,查看市场划分数量表后发现,未定义数量有2条记录,这可能是由于系统错误,导致多了两条错误,并全部让其取消了。排除Undefined的记录后发现,OnlineTA的取消率是最高的,这表明,人们在看到网络上的酒店可能跟实际不符,可能导致预订取消的情况。
1sns.countplot(x='distribution_channel',data=df)2plt.title('市场分布渠道图')3plt.ylabel('数量')4plt.xlabel('市场分布渠道')5plt.show()
1tbl=pd.crosstab(df.distribution_channel,df.is_canceled,margins=True)2##添加一列cancel-percent(取消预订的百分比)来显示取消的预订占总预订的百分比3tbl['cancel_percent']=tbl[1]*100/tbl['All']4tbl
#绘制市场分布渠道百分比图
1tbl.drop('All',axis=0)['cancel_percent'].plot.bar()2plt.title('市场分布渠道百分比图')3plt.ylabel('取消预订百分比(%)')4plt.xlabel('分布渠道')5plt.show()
分析:在市场分布渠道图中可以发现,TA/TO(旅行代理商/旅行社)的预订量是最高的,说明酒店与TA/TO的联合合作。在市场分布百分比图中发现Undefined(未定义)的取消率是最高的,查看市场分布渠道数量表后发现,Undefined的数量为5条。将Undefined排除后,发现TA/TO的取消率是最高的,Corporate(公司)的取消率是最低的。这可能是因为公司预订是为了业务目的安排的,因此取消的风险可能较小,公司旅行还可能会有更多的提前安排和计划,这可能会使取消的可能性更小。
4、完整代码
四、总结
通过大数据分析,发现城市酒店的预定量比假日酒店的预定量多。可能是因为城市酒店位置优越,方便前往商务场所或者旅游景点。此外,城市酒店的价格可能比假日酒店的价格更容易接受。然而,城市酒店的预订取消率可能比假日酒店的高,可能是因为城市酒店的客户群更为多样化,其中可能包括许多商务旅客。这些商务旅客可能会因为工作原因或其他突发事件而不得不取消预订。而且,城市酒店的客户群还可能包括许多自由行旅客,这些旅客可能会因为个人原因而取消预订。相比之下,假日酒店的客户群可能更加稳定,因为假日酒店通常是为度假或休闲而安排的,因此客户可能不太可能因为工作或其他突发事件而取消预订。
根据国家地区的分析,酒店具有较多的欧盟客户,说明此数据集是来自于欧盟的酒店数据。这也说明了欧盟国家之间的贸易和经济联系较为紧密,欧盟的人们也更愿意前往邻国旅游。除欧盟本地外,还有不少其他国家和地区的客户,这可能是因为欧盟国家在旅游业方面具有较高的吸引力,包括丰富的文化、历史和自然风光。此外,欧盟国家的交通和通信设施也可能较为发达,使得前往这些国家旅游更加方便。根据分析还发现,酒店的客户中,北美洲的客户取消率普遍偏低而非洲的取消率较高,这说明了北美国家的经济和稳定性较高,因此可能会有较少的突发事件导致客户取消预订,另一方面,非洲国家可能存在较多的政治、经济和社会不稳定因素,这可能会导致客户更容易取消预订。例如,非洲国家可能存在较多的冲突和动乱,这可能会使客户担心前往这些国家的安全。此外,非洲国家的经济可能不太稳定,这也可能会使客户担心旅行的费用是否会发生变化。
2、收获
在这次设计过程中让我更加了解了什么是数据,了解了数据之间的关系,并让我更加熟悉了,pandas库、seaborn库、pyplot等方法的使用。这些可以帮助我对未来的趋势和变化进行预测,让我可以更好的了解市场与客户,可以通过大数据分析来提高业绩,这可以为我带来更多的竞争优势。
在这次的设计过程中,需要修改进步的地方还有很多,比如,可以更改绘图功能,也就是优化数据可视化工具,以便更好的呈现数据。如果可能,可以考虑引入机器学习,以提高效率。