四川旅游景点数据分析实战:从数据清洗到可视化全流程解析
2026/8/26 23:13:03 网站建设 项目流程

简介:数据分析是提取业务价值的核心手段,而数据清洗与探索性分析则是保证结论可靠的关键前提。在实际项目中,Pandas等Python工具帮助分析师高效处理缺失值、统一字段口径和转换价格区间,从而为后续的数据可视化与建模奠定坚实基础。这种技术思路广泛应用于旅游、零售、城市管理等行业。以四川省旅游景点数据为例,通过对景区等级、门票价格、游客评分和热度指数进行交叉分析,能够揭示旅游资源空间分布、价格与热度的真实关系,进而形成有数据支撑的运营建议。围绕一套完整的四川旅游景点分析项目,从数据清洗、探索到可视化输出的全过程,梳理了实操中的关键步骤与常见坑点,为学习者提供可复制的分析框架。 做数据分析这几年,一个很深的感受是:网上免费的案例教程不少,但大多停留在“跑通代码”的层面,要么数据集是外国的,要么业务场景离我们的生活太远。拿到一份真实、本土化、能直接练手的数据集反而成了稀缺资源。所以当我看到“四川省旅游景点数据分析(数据集+代码)”这个项目标题时,第一反应是:这东西很适合拿来当完整的数据分析实战样板。

这篇文章我会以这套四川省旅游景点数据分析项目为线索,把拿到数据集之后从清洗、探索、可视化到结论输出的完整流程拆开讲一遍。重点不是教你怎么背代码,而是告诉你拿到一份陌生的景点数据,每一步为什么要这么做、踩过哪些坑、怎么判断分析结果靠不靠谱。无论你是正在学Python数据分析的学生,还是想转行做数据分析师,或者单纯想用数据了解一下四川旅游的底牌,这篇都值得认真看完。

1. 拿到手的数据到底包含了什么:字段含义与数据质量摸底

1.1 数据集结构的第一眼判断

我打开这份数据集之后,先扫了一遍字段名。这类旅游景点数据通常不会太复杂,但字段命名往往不太规范,需要自己重新理一遍。以这份四川景点数据为例,典型的字段包括:景点名称、所在城市、景区等级(5A/4A/3A等)、门票参考价格、用户评分、热度指数、建议游玩时长、景点类型等,总共大概四五百条记录,覆盖了四川绝大多数A级景区和部分热门非A级景点。

第一件事不是急着分析,而是用Pandas快速确认数据长什么样。我习惯用info()和head()先看类型和内容,而不是直接describe(),因为describe()只能给你数值型字段的统计量,字符型字段乱不乱、有没有空值,得靠info和head来看。

import pandas as pd import numpy as np # 读取数据,先不指定引擎,默认按CSV解析 df = pd.read_csv('sichuan_travel_spot.csv', encoding='utf-8-sig') print(df.shape) # 看行列数 print(df.info()) # 看字段类型和缺失情况 print(df.head(10)) # 看前10行长什么样

这里有个细节:数据文件如果是从网上爬下来或者别人整理导出的,编码经常是问题。Python里直接读CSV遇到中文乱码,多半是编码没对上,我一般会先试utf-8,报错就换gbk,再不行用utf-8-sig。这份数据的编码还算干净,但我强烈建议你拿到任何一份数据,第一步都先确认编码,否则后面全白干。

1.2 字段口径不统一的坑

看完全部字段之后,最需要警惕的是“同一种东西,写法不统一”。比如景区等级字段里,有的写“5A”,有的写“5A级景区”,有的写“AAAAA”,如果不先统一口径,后面做分组统计就会莫名其妙多出几个类别。

再比如门票价格字段,有的单元格是“免费”,有的是“0”,有的是“60元”,有的是“60-100元”,还有的直接空着。“免费”和“0”好处理,但“60-100元”这种区间价格就很麻烦,你是取60还是100还是取中间值80?这里没有标准答案,取决于你分析的目的。如果是做价格区间分布,可以取区间下限做保守估计;如果是算游客花费,取平均值更接近实际。我在这份数据里是按区间均值处理的,因为后面要拿价格和热度做相关性分析,区间均值误差相对可控。

清洗这一步我单独强调一下,因为太多人忽略它。很多新手拿到数据就直接画图,画出来的图表自己都解释不了,原因就是底层数据有问题。数据质量决定了分析天花板,下面这段代码处理了三个最常见的脏数据问题:

# 统一景区等级字段 df['景区等级'] = df['景区等级'].str.replace('级景区', '').str.strip() # 把“免费”改为0,去掉“元”单位,处理区间价格取均值 def parse_price(s): if pd.isna(s): return np.nan s = str(s).replace('元', '').strip() if s in ['免费', '暂无', '-']: return 0 if '-' in s: parts = s.split('-') try: return (float(parts[0]) + float(parts[1])) / 2 except: return np.nan try: return float(s) except: return np.nan df['门票价格'] = df['门票参考价'].apply(parse_price)

做完这一步,再info一次,确认没有因为转换产生新的大面积缺失,就可以进入真正的探索分析了。

2. 景区空间分布与等级梯队:四川旅游资源的底牌

2.1 按市州聚合,看旅游资源的“家底”分布

拿到一份省级景点数据集,先做空间分布是性价比最高的第一步。四川有21个市州,旅游资源分布极不均衡。用groupby按市州统计景区数量,再叠加景区等级维度,就能非常直观地看出哪些地方是“数量优势”,哪些地方是“质量优势”。

city_count = df.groupby('所在市州')['景点名称'].count().sort_values(ascending=False) print(city_count) # 等级和市州的交叉表 cross = pd.crosstab(df['所在市州'], df['景区等级']) print(cross)

从结果看,成都的景区总量毫无悬念排第一,这和成都作为交通枢纽、人口中心、历史文化遗产聚集地等综合因素有关。但真正有意思的是阿坝州和甘孜州:景区总数不算最多,5A和4A级景区的占比却非常高。这说明这两个地区的旅游资源走的是“精品路线”,单个景区的能级很高,九寨沟、黄龙、稻城亚丁都集中在这里。

这种“数量vs质量”的差异,在后面对比分析时特别有用。如果只看景区数量,成都碾压一切;但如果看高等级景区占比,阿坝、甘孜才是四川旅游的天花板。这就是交叉表的威力,单一维度看不出这个结论。

2.2 等级结构里的“腰部塌陷”问题

把所有景区按等级做个柱状图,你会看到一个典型的金字塔结构:5A级景区的数量很少,4A级景区则是绝对主力,3A和2A级景区数量也不少。我自己统计下来,4A级景区占到了总量的四成以上,是四川景区体系的绝对腰部力量。

为什么会有这个结构?简单说,5A级景区的评定标准非常高,对服务质量、交通可达性、游客接待能力都有硬性要求,不是光有自然资源就能上的。4A级景区门槛相对亲民,覆盖面更大,所以成了大多数地市州“主推”的景区级别。

这个结构给到做旅游数据分析的人一个启发:如果你在做游客量预测或者区域旅游经济分析,不能只看5A景区,4A景区的分布和热度才是基本盘。只盯着头部景区做分析,会严重低估很多非传统旅游城市的表现。

2.3 用图表呈现空间分布时,地图不是首选

关于可视化,我想多聊两句。很多人一看到“省级景点数据”就下意识想画地图,觉得地图直观。但地图类图表有三个问题:第一,地图底图的坐标数据需要额外找资源,网上很多免费的四川省GeoJSON质量参差不齐,合并不好反而误导;第二,景点的分布往往在局部区域高度集中,放到省级地图上根本看不清密度差异;第三,地图图表的颜色分级很容易因为区间设置不当,让人产生错误的视觉判断。

我在这个项目里更推荐用横向条形图或排序柱状图呈现市州景区数量,一眼就能看出梯度差异。如果一定要做地理维度,可以用气泡图散点叠加,而不是去做完整的省级区域着色。这个判断标准很简单:你的分析目的是看“分布结构”,还是看“地理拓扑关系”?前者用条形图足够,后者才需要地图。

import matplotlib.pyplot as plt import matplotlib matplotlib.rcParams['font.sans-serif'] = ['SimHei'] # 解决中文乱码 plt.figure(figsize=(10, 8)) city_count.sort_values().plot(kind='barh', color='#4C72B0') plt.title('四川省各市州A级景区数量分布') plt.xlabel('景区数量') plt.tight_layout() plt.savefig('city_spot_count.png', dpi=150)

这里有一个很隐蔽的坑:matplotlib默认字体不包含中文字形,直接画图标题和图例里的中文全会变成方框。很多人在这一步就卡住了,以为是代码写错了,其实是字体问题。用rcParams指定中文字体可以解决,SimHei、Microsoft YaHei、Noto Sans CJK都行,看你的系统装了哪个。

3. 门票价格与热度之间的关系:定价值不值得参考

3.1 价格数据的描述性统计,先看分布形态

景区门票价格单独拎出来做描述性统计,你会发现中位数和平均数差得很远。这是因为少数高价景区把平均值拉高了,大部分景区的门票其实集中在中低价区间。这种数据形态,用平均数分析意义不大,我更建议做分箱处理。

bins = [0, 0.1, 50, 100, 200, 500] labels = ['免费', '0-50元', '50-100元', '100-200元', '200元以上'] df['价格区间'] = pd.cut(df['门票价格'], bins=bins, labels=labels, right=False) price_group = df['价格区间'].value_counts().sort_index() print(price_group)

处理时有个细节:市面上很多数据集“免费”和“0”分不清楚,有的直接空着。我上面的清洗逻辑里把“免费”改成了0,但真实情况中,空值可能代表免费,也可能代表数据缺失,具体怎么处理需要有业务判断。在这个项目里,我单独筛了一遍缺失价格的记录,发现大部分都是新开发的景区,官网没有明确挂牌价,所以我保守地选择在相关分析中剔除这些记录,而不是强行填0。

3.2 价格和热度的相关性,结论可能和你想的不一样

价格和热度算相关系数,我一开始预期是负相关——价格越高,去的游客越少,热度越低。但实际算出来相关系数只有-0.2左右,接近无相关。这说明四川景区的“热度”并不主要由门票价格决定,更可能由知名度、交通便利度、社交平台传播效应驱动。

为了把这个结论讲清楚,我画了一张散点图:横轴是门票价格,纵轴是热度指数,然后按景区等级用颜色区分。结果非常有意思:5A景区无论价格高低,热度都维持在高位;4A景区则分化明显,靠近成都的4A景区热度明显高于同等级其他地区的景区;3A及以下的景区,热度普遍随价格上升而下降。

这个现象背后其实是两类景区的逻辑差异:头部景区属于“目的地型”,游客是先决定去这里,再接受价格;腰部景区属于“顺路型”,游客往往在旅途中临时决定增加行程,价格就成了敏感因素。

3.3 免费景区真的更受欢迎吗?

单独把免费景区拎出来看,结论更反直觉:免费景区的热度两极分化极其严重。一类是城市里的公园、博物馆、历史街区,比如成都主城区的一批免费景点,热度常年靠前,人流量很大;另一类是欠发达地区的免费观景台、自然风光点,虽然免费,但交通不便、配套不完善,热度很低。

这说明“免费”本身不是流量的保证,“可达性”才是。用数据把这个点确认之后,对做景区规划的朋友有参考价值:一个景区想提升热度,定价策略能起的作用有限,改善交通接驳、提升周边住宿餐饮配套,效果可能更直接。

4. 游客体验维度:评分和游玩时长背后的问题

4.1 评分的分布结构,为什么大部分景区都挤在4分以上

游客评分是另一个值得深挖的字段。直方图画出来,绝大多数景区的评分集中在4.0到4.5之间,低于3.5的非常少。这不是四川景区特别优秀,而是评分体系本身有偏差:愿意在OTA平台打分的人,整体偏向正面,极端不满意的游客通常直接不发评论。

所以我对评分做分析时,没有简单看平均值,而是看了评分和景区等级的交叉关系。结果发现,5A景区的平均评分并没有显著高于4A景区,甚至个别5A景区的评分低于某些口碑极好的4A景区。这说明评分更多反映的是“期望管理”而不是“绝对质量”:游客对5A景区的期望值更高,体验稍有不满意就容易给低分;对4A景区期望较低,稍有惊喜就容易给高分。

4.2 建议游玩时长这个字段,暗藏景区定位密码

很多数据集里都有“建议游玩时长”字段,但大家分析时常常忽略它。我觉得这个字段特别能说明问题,因为建议游玩时长直接反映了景区的游览模式。

做一次分组分析,把景区按建议游玩时长分成“2小时以下”“2-4小时”“4小时以上”三组,再对比评分和热度,能看出很清晰的规律:短时长的景区集中在城市型景点和主题街区,游玩节奏快,评分普遍不低,适合作为行程中的“填空型”景点;长时长的景区以自然风光和大型综合度假区为主,评分两极分化明显,要么因为风景壮丽拿到高分,要么因为管理和服务跟不上被吐槽。

这个维度对行程规划非常有帮助。如果你是做旅游产品设计的,完全可以基于“建议游玩时长”字段搭建一个简易的路线拼接模型:把一天的时间拆成上午和下午两个时段,分别匹配对应时长的景点,再结合地理分布优化动线。

4.3 简单文本分析:从评论关键词看景区类型风格

如果这份数据里还有一段简短的景点描述或游客评论摘要,那就可以顺带做一点最基础的文本分析。不需要上什么复杂的NLP模型,用jieba分词加词频统计就够了。

对高频词做词云或者条形图,你会发现不同类型景区的关键词差异非常大。比如自然风光类的高频词是“风景”“栈道”“观景”“徒步”“原始”,人文历史类的高频词则是“古迹”“历史”“文化”“寺庙”“博物馆”。这一步虽然简单,但能帮你在没有人工标注的情况下,快速给景区打一个“类型标签”,后续做细分类分析就有抓手了。

import jieba from collections import Counter text = ''.join(df['景点简介'].dropna().tolist()) words = jieba.lcut(text) # 去掉单字和标点等无意义词 stopwords = set(['的', '了', '是', '在', '和', '有', '与', '及', '等', '、', '。']) words = [w for w in words if len(w) > 1 and w not in stopwords] counter = Counter(words).most_common(30) print(counter)

这里有个分词的小坑:jieba对景区专有名词的切分不一定准确,比如“四姑娘山”可能被切成“四姑娘”和“山”。如果你要精确统计景区名,最好在分词前加载自定义词典,把已知的景区名称加进去,否则统计出来的词频会有偏差。

5. 复现这套代码时的几个关键坑,我替你踩过了

5.1 编码问题不是小事,统一用utf-8-sig更稳妥

我第一次跑这份数据的时候,直接用pandas默认参数读取,结果中文列名全部变成乱码。排查了半天发现是编码问题。如果你用记事本打开CSV文件,另存时可以选编码,优先存成utf-8-sig,这样Excel打开不乱码,Pandas读取也不乱码。如果用gbk编码存的,Pandas读的时候就要指定encoding='gbk'。

一个实用技巧:写读取代码的时候别把编码写死,先用一个变量定义编码方式,后面如果换了数据源,只需要改一行。

ENCODING = 'utf-8-sig' df = pd.read_csv('data/sichuan_travel_spot.csv', encoding=ENCODING)

5.2 图表中文乱码的完整解决方案

matplotlib画图中文变方块,是每个数据分析初学者都会遇到的事。上面我提到用rcParams指定字体,但还有个更隐蔽的情况:有时候在Jupyter Notebook里设置好了,导出成PDF或者在某些Linux服务器上,字体又失效了。这是因为你的环境中根本没有对应字体文件,rcParams设置了也没用。

这时候可以用matplotlib自带的font_manager查一下系统里有哪些中文字体,也可以直接下载一个开源中文字体放到系统字体目录。最省事的方案是用Noto Sans CJK,开源免费,跨平台支持好,Linux服务器上装一次,基本不会再出问题。

5.3 路径别带中文和空格,这是最便宜的避坑方式

Windows环境下,文件路径如果带中文,有些库处理起来会出莫名其妙的问题。比如pyecharts渲染地图需要读.js文件,路径带中文偶尔会读取失败。我的习惯是建一个纯英文的目录存放数据和代码,比如D:/projects/sichuan_analysis/,下面分data、code和output三个子目录。这个习惯看起来没什么技术含量,但能帮你省掉大量排查时间。

5.4 换一份数据怎么复用这套代码:把分析流程函数化

如果你的目的是学习,那跑通一遍就够了。但如果你想把这份代码应用到其他省份的景点数据上,我建议你做一件事情:把清洗和分析逻辑拆成函数,只保留最核心的业务逻辑,然后把数据源路径、字段名映射统一放到配置区。

这样做的好处是,换数据的时候你只需要改配置区的字段映射关系,不需要动分析函数。比如原来数据里价格字段叫“门票参考价”,新数据里可能叫“票价”,通过一个统一的映射字典转换,代码的复用性会大幅提升。

我在自己项目里的做法是定义了一个标准的DataFrame结构,通过rename把外部字段统一映射成内部标准字段,后续所有分析都是基于标准字段进行。这一步虽然前期麻烦,但换数据源的时候省下的时间绝对值得。

6. 从“跑通代码”到“讲好故事”:数据分析项目的加分项

6.1 能用数据回答的5个问题,提前想清楚

分析做完之后,很多人的报告只是一堆图表的堆砌,没有结论。我自己的经验是:动手分析之前,先列出你真正想回答的问题,然后每一个图表都为其中一个问题服务,无关的图表不画。

以四川旅游景点数据为例,我预先列出了5个问题:一是四川的景区资源在空间上如何分布;二是高等级景区集中在哪里;三是门票价格和热度是否相关;四是游客评分和景区等级是否一致;五是不同地市州的景区特色是什么。整份报告的通篇逻辑,就围绕这5个问题展开。

6.2 分析结论要有“数据+解释+建议”三层结构

数据分析报告最忌讳的事情是只给结果不给解释:比如“成都市景区数量最多”这个结论,如果只写到这一句,等于什么都没说。合格的写法是再加上“为什么”——成都作为全省交通枢纽和人口中心,加上历史文化遗产密度高,所以自然成为景区数量第一的城市。然后再给出建议——其他市州在旅游资源开发时,如果对标成都,核心不在增加景区数量,而在提升高等级景区占比和交通可达性。

这个三层结构几乎可以套用在任何分析结论上。数据是事实层,解释是逻辑层,建议是行动层,三层都有了,才叫一个完整的分析闭环。

6.3 用数据讲故事的节奏感:从全局到局部,从总量到结构

最后分享一个我的个人心得:一份好的数据分析报告,结构上应该遵循“总-分-总”的节奏。先给用户看全局(四川21个市州的总量排名),再拆解局部(头部市州和尾部市州的差异来源),最后回到全局形成综合判断(四川旅游整体是“成都极点+西部资源线”的非均衡结构)。

这套节奏不是我发明的,电影叙事都这么干:先介绍背景,再铺开冲突,最后收束。你写分析报告的时候把自己当成讲故事的人,数据是论据,结论是剧情,读者才会愿意读下去。这也是我在这份四川旅游景点数据分析项目里收获最大的经验:分析能力是基础,表达能力的差距往往决定你能走多远。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询