同程旅游境外旅游线路分析

来源:www.xysxzl.com时间:2021-03-16 10:17

海外旅游线路

因此,笔者选择境外旅游作为一个数据分析的探索线路进行实践。

分析线路:定义问题

同程旅游境外旅游线路分析

4.2 特征分析

4.3 可视化

4.4 模型构造

4.5 预测结果

4.6 验证

5. 总结

1.问题的定义:

本文中因变量为某条旅游线路的购买人数 , 自变量为线路的各个特征值,先要定义问题的自变量与因变量是什么,针对境外旅游数据的分析。

其次,要明确分析要解决的问题:① 购买人数与线路的各个特征之间的关系,探究下一步发展的方向 ② 构建一个线性回归模型来对已有数据新型训练,以便能够在未来综合各个特征的变化值来进行预测,以供决策参考.。

3.获取数据

3.1 数据来源: 同程旅游官网-境外旅游页面 同程旅游境外线路。

3.3 数据验证:①共获得2660行数据,其中由于网页结构差异导致爬取信息丢失的数据为550行,因此可用数据为2110 行数据 ② 将数据集分为训练集1476 行,测试集为 634行。

3.5 爬取代码:(不得用于商业用途,仅供个人学习参考.需要的私信我)。

4.分析数据

由于篇幅限制,概要分析报告的网页版超链接点击此处:概括报告。

5.总结

分析总结:

推论1:评分与购买人数整体呈现正相关的关系,因此,精心打造几条高知名度,高好评度的线路能够带动整体购买人数的提升.。

推论2:积分优惠金额占价格比值为(0.0357,0.0536] 之间时 平均人数相对应最高,可以根据 此来进行优惠金额的调整.。

推论3:整体上看,购物点数不会对购买人数造成较大波动的影响,因此可根据实际线路情况来安排。

推论4:针对北美洲,加拿大作为北境之国的线路可以更好地挖掘. 南美洲 巴西和阿根廷的人数都需更多的开发. 大洋洲的国家线路需要开拓,非洲可以加强毛里求斯,埃及和南非的开发程度。

推论5:从已有数据查看,是否安排用餐对购买人数的影响整体波动程度不大,因此可根据行程实际情况来安排。

5-7 天的区间次之, 8-13 天的区间为第三个级别.,推论6:天数在3-4天区间 平均人数最多。

因此线路规划在3-4天左右是最合适的。

规划线路时合理的控制每日花费区间小于704会减少因价格上涨而导致的购买人数下降的比例,购买人数下降的比例会增大,因此,推论7:当线路规划的每日花费达到预计达到(704,1147] 区间时。

预测总结:

本次构建的线性回归模型 XBGRegressor(),预测结果均方根误差较大,通过与验证集的比对,发现该模型对购买人数少的线路预测误差较小,对于购买人数多的小路预测误差较大。

经过思索,造成这些较大误差的原因可能为:无法获取到包含时间信息的特征,而网站的购买人数是长时间累计的,与时间相关性很高。

不同线路也是具有季节性的,以及配合假日信息也很重要。

由于数据准确性,全面性受限于客观因素,分析和预测尚有很多的改进空间,望指教。

分析代码如下:

本文架构:通过爬取同程网站上的境外旅游相关旅游数据作为原始数据集。

定义目标为训练一个预测旅游线路购买人数的线性回归模型。

进行数据清洗

异常数据识别及处理

缺失值的识别及处理

进行爬取特征的特征分析。

描述性分析

相关性分析

分析结果可视化

特征工程构造

特征选取

模型选择-调节

模型选择

参数调节

模型可视化

训练模型

对比结果

小结

假设预测

import pandas as pd。

import numpy as np。

import scipy.stats as stats。

import matplotlib.pyplot as plt。

import seaborn as sns。

import warnings。

warnings.filterwarnings('ignore')。

# 读取数据

df_train = pd.read_excel('D:\AI\Jupyter\同程数据分析\\train.xlsx')。

df_test = pd.read_excel('D:\AI\Jupyter\同程数据分析\\test.xlsx')。

#查看训练数据情况

df_train.info()。

RangeIndex: 1476 entries, 0 to 1475。

Data columns (total 37 columns):。

id 1476 non-null int64。

描述 1476 non-null object。

价格 1476 non-null int64。

出发城市 1476 non-null object。

目标城市 1476 non-null object。

目标国家 1476 non-null object。

目标大洲 1476 non-null object。

天 1472 non-null float64。

晚 1466 non-null float64。

启程航空公司 1291 non-null object。

返程航空公司 1290 non-null object。

线路定位 1208 non-null object。

旅游类型 1476 non-null object。

是否确认直飞 1476 non-null object。

是否确认旅游赠卡适用 1476 non-null object。

是否确认无购物 1476 non-null object。

是否机场接送 1476 non-null object。

是否确认无自费 1476 non-null object。

早餐自理数 1476 non-null int64。

早餐安排数 1476 non-null int64。

午餐自理数 1476 non-null int64。

午餐安排数 1476 non-null int64。

晚餐自理数 1476 non-null int64。

晚餐安排数 1476 non-null int64。

住宿酒店数 1476 non-null int64。

住宿民宿数 1476 non-null int64。

住宿别墅数 1476 non-null int64。

游玩景点数 1476 non-null int64。

购物点数 1476 non-null int64。

满意度 1476 non-null float64。

评论人数 1476 non-null int64。

积分优惠比例 1476 non-null int64。

线路评分 1476 non-null float64。

价格2 1476 non-null int64。

cmsnRate 1476 non-null float64。

realFavRate 1476 non-null float64。

购买人数 1476 non-null int64。

dtypes: float64(6), int64(17), object(14)。

memory usage: 426.7+ KB结论:共有37列特征 1476行. 存在缺失值的列:晚,线路定位,启程航空公司,返程航空公司。

1.1 异常值识别与处理

1.1.1 训练集中各数值类型特征的统计性结论查看。

df_train.describe()。

# 实际价格很高的有90800位,因此特别查看一下最高价格前五位的情况。

df_train.loc[df_train['价格'].sort_values(ascending=False)[:5].index][['id','描述','价格','目标城市','目标国家','天','晚','线路定位','住宿酒店数','住宿民宿数','住宿别墅数']]。

训练数据中价格很高的产品旅游的时间也很长,比较合理,没有异常。

1.1.2 测试集中各特征的描述性统计值。

df_test.describe()。

#由于有训练集中的检验结果在前,价格偏高的旅游天数也多,因此不进行特殊查看。

1.1 异常值处理小结 经过统计性的数值概括查看,以及价格异常高的实际数据查看发现两个数据集中没有要处理的异常数据。

1.2 进行两个数据集的缺失值识别和处理。

1.2 小结:完成缺失值填充

a) 天数的缺失值通过描述填充。

b)线路定位的缺失值通过每日花费的水平来填充。

c) 启程航班的缺失值通过【出发城市,目标城市】分组众数来填充,另外还无法填充的根据目标大洲的众数来填充。

d) 返程航班的缺失值根据启程航班的缺失值来填充。

2.进行特征分析

2.1 进行各个变量的相关性分析

from xgboost import plot_importance。

XGB_best = XGBRegressor()。

XGB_best.fit(source_X1,y)。

f,ax = plt.subplots(figsize=(20,10))。

plot_importance(XGB_best,ax=ax,height=0.5)。

ax.set_title('特征重要度',fontsize=30)。

ax.set_xlabel('分数',fontsize=30)。

ax.set_ylabel('特征',fontsize=30)。

ax.tick_params(axis='x',labelsize=30)。

ax.tick_params(axis='y',labelsize=15)。

根据以上的相关系数矩阵来进行有用的特征分析及可视化。

#先查看线路评分的购买人数的散点图。

train_copy = df_copy[:df_train.shape[0]-1]。

train_copy = pd.concat([train_copy,y],axis=1)。

# plt.scatter(train_copy['线路评分'],train_copy['购买人数'])。

train_copy['线路评分等级'] = pd.cut(train_copy['线路评分'],[-1,10,20,30,40,50,60,70,80])。

train_copy['线路评分等级'].isnull().sum()。

# f,ax = plt.subplots(figsize=(20,10))。

# sns.barplot('线路评分等级','购买人数',data=train_copy,ax=ax)#平均人数。

# ax.set_xlabel('线路评分等级',fontsize=30)。

# ax.set_ylabel('购买人数',fontsize=30)。

# ax.tick_params(axis='x',labelsize=30)。

# ax.tick_params(axis='y',labelsize=30)。

# autolabel(ax,'right')。

0

f,ax = plt.subplots(figsize=(20,10))。

sns.barplot('线路评分等级','购买人数',data=train_copy,ax=ax)#平均人数。

ax.set_xlabel('线路评分等级',fontsize=30)。

ax.set_ylabel('购买人数',fontsize=30)。

ax.tick_params(axis='x',labelsize=30)。

ax.tick_params(axis='y',labelsize=30)。

推论1:评分与购买人数整体呈现正相关的关系.。

因此,精心打造几条高知名度,高好评度的线路能够带动整体购买人数的提升.。

推论2:积分优惠金额占价格比值为(0.0357,0.0536] 之间时 平均人数相对应最高,可以根据此来进行优惠金额的调整.。

(0.0536,0.0714] 较低的原因可能是因为其对应的是高端路线,本身花费较多即使优惠较多,人数也相对较少。

f,ax = plt.subplots(figsize=(20,10))。

sns.pointplot('购物点数','购买人数',data=train_copy,ax=ax)#平均人数。

ax.set_xlabel('购物点数',fontsize=20)。

ax.set_ylabel('购买人数',fontsize=20)。

ax.tick_params(axis='x',labelsize=20)。

ax.tick_params(axis='y',labelsize=20)。

autolabel(ax,'right')。

train_copy[train_copy['购物点数']==13]。

推论:整体上看,购物点数不会对购买人数造成较大波动的影响,因此可根据实际线路情况来安排。

13这个是由于样本数少造成的异常,可根据实际情况了安排。

train_copy['单日购物点数'] = round(train_copy['购物点数']/train_copy['天'],2)。

f,ax = plt.subplots(figsize=(80,10))。

sns.pointplot('单日购物点数','购买人数',data=train_copy,ax=ax)#平均人数。

ax.set_xlabel('单日购物点数',fontsize=20)。

ax.set_ylabel('购买人数',fontsize=20)。

ax.tick_params(axis='x',labelsize=8)。

ax.tick_params(axis='y',labelsize=8)。

autolabel(ax,'right')。

df_full['单日购物点数'] = round(df_full['购物点数']/df_full['天'],2)。

#各个大洲的对比

f,ax = plt.subplots(figsize=(40,10))。

sns.barplot('目标大洲','购买人数',data=train_copy,ax=ax,estimator=sum)#总人数。

ax.set_xlabel('目标大洲',fontsize=40)。

ax.set_ylabel('购买人数',fontsize=40)。

ax.tick_params(axis='x',labelsize=40)。

ax.tick_params(axis='y',labelsize=40)。

autolabel(ax,'right',fontsize=40)。

结论1:亚欧大洲的开发比较完善,但其他4个洲的线路开发人数还很少,潜藏着巨大潜力。

continent_country = train_copy[['目标国家','购买人数']].groupby(train_copy['目标大洲'])。

row = 0

col = 0

i =0

f,axes = plt.subplots(2,2,figsize=(40,15))。

for key,group in continent_country:。

if key in ('大洋洲','北美洲','非洲','南美洲'):。

sns.barplot('目标国家','购买人数',data=group,estimator=sum,ax=axes[row,col])。

axes[row,col].set_xlabel(key,fontsize=40)。

axes[row,col].set_ylabel('购买人数',fontsize=40)。

axes[row,col].tick_params(axis='y',labelsize=40)。

axes[row,col].tick_params(axis='x',labelsize=35)。

autolabel(axes[row,col],'right',fontsize=40)。

i+=1

col+=1

if i % 2 ==0:。

row = row+1。

col=0

推论2:针对北美洲,加拿大作为北境之国的线路可以更好地挖掘. 南美洲 巴西和阿根廷的人数都需要。

更多的开发. 大洋洲的国家线路需要开拓,非洲可以加强毛里求斯,埃及和南非的开发程度。

#用餐自理数和安排数。

train_copy['用餐自理数'] = train_copy['早餐自理数'] + train_copy['午餐自理数'] +train_copy['晚餐自理数']。

train_copy['用餐自理比例'] = train_copy['用餐自理数']/train_copy['天']。

train_copy['用餐安排数'] = train_copy['早餐安排数'] + train_copy['午餐安排数'] + train_copy['晚餐安排数']。

train_copy['用餐安排比例'] = train_copy['用餐安排数']/train_copy['天']。

f,ax = plt.subplots(figsize=(40,10))。

sns.pointplot('用餐自理比例','购买人数',data=train_copy,ax=ax,color='red')。

sns.pointplot('用餐安排比例','购买人数',data=train_copy,ax=ax)。

ax.set_xlabel('比例',fontsize=40)。

ax.set_ylabel('购买人数',fontsize=40)。

ax.tick_params(axis='y',labelsize=40)。

df_full['用餐自理数'] = df_full['早餐自理数'] + df_full['午餐自理数'] +df_full['晚餐自理数']。

df_full['用餐自理比例'] = df_full['用餐自理数']/df_full['天']。

df_full['用餐安排数'] = df_full['早餐安排数'] + df_full['午餐安排数'] + df_full['晚餐安排数']。

df_full['用餐安排比例'] = df_full['用餐安排数']/df_full['天']。

推论:从已有数据查看,是否安排用餐对购买人数的影响整体波动程度不大,因此可根据行程实际情况来安排。

f,ax = plt.subplots(figsize=(40,10))。

sns.pointplot('天','购买人数',data=train_copy,ax=ax,color='red')。

ax.set_xlabel('行程天数',fontsize=40)。

ax.set_ylabel('购买人数',fontsize=40)。

ax.tick_params(axis='x',labelsize=40)。

ax.tick_params(axis='y',labelsize=40)。

推论:天数在3-4天区间 平均人数最多,5-7 天的区间次之, 8-13 天的区间为第三个级别.。

因此线路规划在3-4天左右是最合适的。

train_copy['每日花费区间'] = pd.cut(train_copy['每日花费'],10)。

f,ax = plt.subplots(figsize=(40,10))。

sns.pointplot('每日花费区间','购买人数',data=train_copy,ax=ax,color='red')。

ax.set_xlabel('每日花费区间',fontsize=40)。

ax.set_ylabel('购买人数',fontsize=40)。

ax.tick_params(axis='x',labelsize=23)。

ax.tick_params(axis='y',labelsize=40)。

推论:当线路规划的每日花费达到预计达到(704,1147] 区间时,购买人数下降的比例会增大,因此在。

规划线路时合理的控制每日花费区间小于704会减少因价格上涨而导致的购买人数下降的比例。

  • 旅游什么
  • 陕西自驾游景点攻略
  • 周末丽水乡村旅游精品线路告诉
  • 旅游之后兰州了解多少
  • 边境朝鲜境内园区开园中企投资
  • 西安旅行实用攻略三天感受西安古城历史厚重
  • 德阳市黄许职业中专学校2019招生简介
  • 广东惠州值得一去十大旅游景点去过几个
  • 贺州文化广电旅游局
  • 美国旅游洛杉矶真正十大购物中心
  • 精品行程推荐