基于Python的携程网重庆市旅游景点数据可视化分析
一、项目背景
重庆,这座被誉为"山城"、"雾都"的城市,以其独特的地形地貌、丰富的旅游资源和深厚的文化底蕴,近年来成为国内炙手可热的旅游目的地。从洪崖洞的璀璨夜景到武隆天生三桥的壮丽奇观,重庆的旅游资源呈现出多元化、高品质的特点。
本项目通过爬取携程网重庆市旅游景点数据,运用Python数据分析技术,从空间分布、价格体系、标签特征、口碑评价四个维度,深入挖掘重庆旅游资源的分布规律与特征,为游客出行规划、景区运营管理提供数据支撑。
二、数据来源与预处理
2.1 数据来源
数据来源于携程网重庆市旅游景点页面,包含以下完整字段:
| 字段名称 | 说明 |
|---|---|
| 标题 | 景点名称 |
| 等级 | 景区等级(5A/4A等) |
| 碑榜 | 景点上榜情况(如"重庆夜游必打卡景点榜 No.7"等) |
| 标签 | 景点特色标签(如"遛娃宝藏地"、"自然山水"等) |
| 热度 | 景点热度评分 |
| 评分 | 游客评分 |
| 评论数 | 总评论数 |
| 好评数 | 好评数量 |
| 消费后评价数 | 消费后评价数量 |
| 差评数 | 差评数量 |
| 地址 | 大区域地址(如"解放碑/洪崖洞") |
| 详细地址 | 景点具体位置 |
| 距离 | 距市中心距离 |
| 门票 | 门票价格信息 |
| 开放时间 | 景区开放时间 |
| 官方电话 | 景区联系电话 |
| 封面图片链接 | 景点封面图片URL |
| 详情链接 | 景点详情页URL |
| 相关图片链接(轮播图的4个) | 轮播图图片链接列表 |
| 更多内容 | 景点详细介绍、优待政策、服务设施等 |
2.2 数据预处理关键技术
(1)行政区提取
由于原始数据中地址格式不统一,需要通过正则表达式从详细地址中提取行政区信息:
def extract_district(addr):
if pd.isna(addr):
return '未知'
addr_str = str(addr)
pattern = r'重庆市([^市]+?(?:区|县|新区))'
match = re.search(pattern, addr_str)
if match:
district = match.group(1).strip()
if '两江新区' in district:
return '两江新区'
return district
return '未知'
(2)门票价格提取
门票字段包含文本描述,需提取数值价格:
def extract_price(price_str):
if pd.isna(price_str):
return None
match = re.search(r'门票\s*([\d.]+)元', str(price_str))
if match:
return float(match.group(1))
return None
(3)等级分类判断
def is_5a(grade):
if pd.isna(grade):
return False
return '5A' in str(grade)
(4)好评率计算
df['好评率'] = df.apply(lambda x: x['好评数'] / x['评论数'] if x['评论数'] > 0 else np.nan, axis=1)
三、各行政区景点分布分析
3.1 可视化实现
本模块采用matplotlib绑定三个子图,从不同角度展示景点分布特征:
fig, axes = plt.subplots(1, 3, figsize=(18, 6))
# 图1:景点数量占比饼图
axes[0].pie(sizes, labels=labels, autopct='%1.1f%%', startangle=90)
axes[0].set_title('各行政区景点数量占比(前5名)')
# 图2:热度≥7景点数量条形图
axes[1].bar(x, y, color='skyblue')
axes[1].set_title('各行政区热度≥7的景点数量')
# 图3:5A与4A景点堆叠条形图
axes[2].bar(x, y_5a, width, label='5A', color='gold')
axes[2].bar(x, y_4a, width, bottom=y_5a, label='4A', color='lightcoral')
📸 请在此处插入截图:运行第一个代码块生成的三合一图表(饼图+条形图+堆叠条形图)
3.2 分析结果解读
(1)景点数量空间分布
从饼图可以看出:
- "未知"行政区占比最高(约63.0%),这主要是因为部分景点地址信息不完整或未能成功提取具体区县
- 在已知行政区中,渝中区(约5.0%)、两江新区(约3.7%)、**武隆区(约2.6%)**位列前三
解读:渝中区作为重庆母城,集中了洪崖洞、解放碑、长江索道等核心地标,景点密度高;武隆区则拥有天生三桥、仙女山等世界级自然景观。
(2)高热度景点分布
热度≥7分的景点数量与景点总量呈正相关:
- 渝中区、武隆区、两江新区领先
- 渝中区的高热度景点多集中在网红打卡地
- 武隆区以自然风光类景点获得高评价
(3)高等级景区分布
| 等级 | 主要分布区域 | 特点 |
|---|---|---|
| 5A | 武隆区、大足区、奉节县、南川区 | 世界级自然与文化遗产 |
| 4A | 渝中区、沙坪坝区、南岸区 | 人文、城市景观为主 |
关键发现:武隆区同时拥有多个5A和4A景区,是重庆高等级景区的核心集聚区;渝中区虽无5A景区,但凭借密集的4A景点和超高热度,依然是重庆旅游的绝对中心。
四、门票价格与热度、等级关系分析
4.1 可视化实现
本模块采用散点图+箱线图的组合,揭示价格与热度、等级的关系:
from scipy import stats
# 散点图 + 线性回归趋势线
slope, intercept, r_value, p_value, std_err = stats.linregress(x, y)
line_x = np.array([x.min(), x.max()])
line_y = intercept + slope * line_x
ax1.plot(line_x, line_y, color='red', linestyle='--',
label=f'趋势线 (r={r_value:.2f})')
# 箱线图
bp = ax2.boxplot(data_box, labels=['5A', '4A', '其他'], patch_artist=True)
colors = ['gold', 'lightcoral', 'lightgreen']
for patch, color in zip(bp['boxes'], colors):
patch.set_facecolor(color)
📸 请在此处插入截图:运行第二个代码块生成的双图(散点图+箱线图)
4.2 分析结果解读
(1)价格与热度的关系
| 指标 | 数值 | 含义 |
|---|---|---|
| 相关系数 r | 0.06 | 几乎无相关性 |
核心发现:
- 价格与热度之间几乎不存在线性相关性
- 无论价格高低(数十元至两百元),热度值均广泛分布在6.5~8.5之间
- 游客对景区的热度评价不受价格高低的显著影响
业务启示:价格并非决定热度的主要因素,景区的特色、服务质量、品牌效应等软实力可能更为关键。
(2)不同等级景区的价格分层
| 等级 | 中位数价格 | 价格区间 | 特点 |
|---|---|---|---|
| 5A | 130~150元 | 较宽,部分超200元 | 顶级景区定价能力强 |
| 4A | 80~100元 | 相对集中 | 中高端定位 |
| 其他 | 40~60元 | 离散程度小 | 低价为主 |
核心发现:景区等级对门票价格具有明显的分层效应——等级越高,价格普遍越高。
五、景点标签与行政区词云分析
5.1 可视化实现
本模块使用WordCloud库生成词云图,直观展示景点标签和行政区分布:
from wordcloud import WordCloud
# 生成标签词云
wordcloud_tags = WordCloud(
width=600, height=500,
background_color='white',
font_path='C:/Windows/Fonts/simhei.ttf',
collocations=False
).generate(tags_text)
# 生成行政区词云
wordcloud_district = WordCloud(
width=600, height=500,
background_color='white',
font_path='C:/Windows/Fonts/simhei.ttf',
collocations=False
).generate_from_frequencies(district_counts)
# 并排显示
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16, 8))
ax1.imshow(wordcloud_tags, interpolation='bilinear')
ax1.set_title('景点标签词云', fontsize=14)
ax2.imshow(wordcloud_district, interpolation='bilinear')
ax2.set_title('行政区词云', fontsize=14)
📸 请在此处插入截图:运行第三个代码块生成的词云双图(标签词云+行政区词云)
5.2 分析结果解读
(1)景点标签词云分析
核心标签(字体最大):
| 标签 | 含义 | 代表景点 |
|---|---|---|
| 夜游观景 | 重庆夜景经济核心吸引力 | 洪崖洞、两江游、南山一棵树 |
| 遛娃宝藏地 | 亲子游市场需求庞大 | 动物园、欢乐谷、海洋世界 |
| 自然山水 | 重庆旅游的"绿色底色" | 武隆天生三桥、仙女山、金佛山 |
| 历史建筑 | 人文景点重要地位 | 磁器口、湖广会馆、大足石刻 |
次要标签:
- 城市漫步、登高爬山:体现重庆"山城"特色
- 博物馆&展馆、公园&植物园、古镇古村:文化科普、休闲游憩需求
- 主题乐园、水上乐园、演唱会:现代娱乐业态
总结:重庆旅游呈现 "夜间经济 + 亲子游 + 山水观光 + 历史人文" 四轮驱动的特色。
(2)行政区词云分析
字体最大的区域:
- 渝中区:重庆母城和核心商圈,景区密度全市第一
- 武隆区:世界级自然遗产,远郊旅游标杆
次大字体区域:
- 两江新区、沙坪坝区:现代文旅项目+红色文化古镇
- 南岸区、九龙坡区、巴南区:休闲度假资源丰富
- 北碚区、万州区、奉节县:区域旅游集散中心
总结:重庆景点呈现 "主城核心集聚 + 远郊精品散布" 的格局。
六、评论数与好评率关系分析
6.1 可视化实现
本模块采用散点图+气泡图的组合,分析评论活跃度与口碑质量的关系:
# 图1:评论数 vs 好评率 散点图
ax1.scatter(x, y, alpha=0.5, s=20, c='steelblue')
ax1.set_xscale('log') # 对数刻度
# 添加趋势线
slope, intercept, r_value, p_value, std_err = stats.linregress(
valid['log_comments'], valid['好评率']*100)
ax1.plot(10**x_line, y_line, 'r--', label=f'趋势线 (r={r_value:.2f})')
# 图2:各行政区气泡图
sizes = stats['景点数'] * 30 # 气泡大小映射景点数量
scatter = ax2.scatter(stats['平均评论数'], stats['平均热度'],
s=sizes, c=colors, alpha=0.7, cmap='viridis')
ax2.set_xscale('log')
📸 请在此处插入截图:运行第四个代码块生成的双图(散点图+气泡图)
6.2 分析结果解读
(1)评论数与好评率的关系
主要行政区表现:
| 行政区 | 平均评论数 | 平均好评率 | 特点 |
|---|---|---|---|
| 江北区 | 约100万级别 | 约35% | 高热度、口碑分化 |
| 渝中区 | 约100万级别 | 约30% | 高热度、低好评矛盾 |
| 沙坪坝区 | 次高 | 约25% | 类似趋势 |
| 九龙坡区、南岸区 | 10万级别 | 20%~15% | 中位水平 |
| 云阳县、开州区 | 1万以下 | 10%以下 | 低评论、低好评 |
总体趋势:
- 呈现 "高评论数对应低好评率,低评论数对应更低好评率" 的近似趋势
- 高评论数区域因游客基数大,评价样本丰富,容易出现两极分化
- 低评论数区域因样本量小,好评率易受少数评价影响而波动
(2)各行政区评论活跃度与热度关系
气泡图解读:
- 气泡大小代表景点数量
- 横轴为平均评论数(对数刻度),反映讨论活跃度
- 纵轴为平均热度,反映景点受欢迎程度
核心发现:
- 渝中区、江北区等核心区域评论活跃度最高
- 武隆区等远郊区域热度高但评论数相对较低
- 部分新兴区域评论数和热度均较低,需加强推广
七、综合结论与建议
7.1 空间格局总结
重庆旅游景点呈现 "主城核心集聚 + 远郊精品散布" 的空间格局:
┌─────────────────────────────────────────────────┐
│ 主城九区(渝中、沙坪坝、南岸、江北等) │
│ → 人文、城市休闲类景点为主 │
│ → 数量多、热度高、评论活跃 │
├─────────────────────────────────────────────────┤
│ 远郊区县(武隆、大足、奉节、南川等) │
│ → 自然山水、世界遗产类景点为主 │
│ → 等级高、单价高、口碑好 │
└─────────────────────────────────────────────────┘
7.2 产品特征总结
重庆旅游呈现 "夜间经济 + 亲子游 + 山水观光 + 历史人文" 四轮驱动的特色:
| 维度 | 特征 | 代表资源 |
|---|---|---|
| 夜间经济 | 核心吸引力 | 洪崖洞、两江游、南山一棵树 |
| 亲子游 | 市场需求大 | 动物园、欢乐谷、海洋世界 |
| 山水观光 | 绿色底色 | 武隆天生三桥、仙女山、金佛山 |
| 历史人文 | 文化底蕴 | 磁器口、大足石刻、人民大礼堂 |
7.3 运营建议
对于景区运营方:
- 提升等级是提高定价上限的有效途径
- 需同步优化服务和特色,才能将高价格转化为高热度
- 不能单纯依靠价格策略提升热度
- 可利用"碑榜"、"标签"等信息进行精准营销
- 关注差评原因,针对性改进服务质量
对于游客:
- 高热度景区并非一定昂贵
- 部分4A或无等级景区也能提供高性价比的优质体验
- 可根据"标签"和"开放时间"灵活安排行程
- 关注评论数与好评率,理性选择景点
7.4 数据质量改进建议
"未知"行政区占比较高(63%),建议:
- 优化地址提取正则表达式
- 引入地理编码API进行地址解析
- 建立地址标准化清洗流程
八、技术栈总结
| 类别 | 技术/库 |
|---|---|
| 数据处理 | pandas, numpy |
| 可视化 | matplotlib |
| 词云生成 | wordcloud |
| 统计分析 | scipy.stats |
| 文本处理 | re(正则表达式) |
| 开发环境 | Jupyter Notebook |