Python二手房数据可视化分析:从数据清洗到PPT实战
简介这是一套面向Python数据分析初学者、毕业设计及期末大作业需求的南京二手房数据可视化完整项目资料围绕链家网房源数据展开从采集到建模的全流程实践。资源包共157个文件约40.04MB包含18个py源码脚本、18个csv原始与清洗数据、65张png可视化图表、15个html页面及11个js文件另附pptx答辩文档与说明文档覆盖爬虫、分析、展示各环节。项目综合运用Requests与BeautifulSoup抓取房源信息借助Numpy、Pandas完成数据清洗通过Matplotlib绘制分布图表并采用k-means聚类对房源进行分类归纳同时结合高德地图JS API实现地理可视化。已有999人学习下载读者可据此掌握二手房数据采集、清洗、可视化与聚类分析的完整思路理解房源基本特征与区域分布规律为购房决策或同类课题提供可复用的代码框架与分析方法。1. 南京二手房数据可视化分析从一份 zip 到能讲清楚的图表南京二手房市场有个很典型的特点挂牌量高、区域价差大、同一板块内不同小区的单价能差出一倍。想靠人工翻房源列表得出结论基本不现实。这个标题指向的是一套完整的落地链路——用 Python 把南京二手房数据抓下来或读进来清洗成规整的表再用可视化把「哪个区在涨、哪种户型最扛价、总价和面积到底什么关系」讲明白最后配一份能直接讲的 PPT。它适合三类人做课程设计的学生、想练手数据分析的 Python 入门者、以及需要快速出一份区域楼市简报的从业者。核心不是画几张图而是让图表能支撑一个结论。下面按「数据怎么来 → 怎么洗 → 怎么画 → 坑在哪 → 怎么讲」的顺序拆开讲。2. 数据从哪来南京二手房数据集的获取与字段设计2.1 采集还是用现成数据两条路怎么选做南京二手房分析第一步永远是数据。常见做法有两种一是用 Python 爬虫从公开房源平台抓取二是直接用整理好的 CSV/Excel 数据集。如果你手上是「带源码」的项目包大概率已经附了一份静态数据文件这时候别急着写爬虫先把数据读进来看字段。爬虫路线的现实问题是房源平台普遍有反爬列表页和详情页字段不一致翻页参数经常变。对新手来说把大量时间耗在对抗反爬上最后分析部分反而草草收尾这是最常见的翻车方式。我的建议是课程设计或练手场景优先用现成数据集跑通全流程确实要练爬虫就限定在少量页面把重点放在字段解析和存储上。一份能支撑可视化的南京二手房数据至少要有这些字段字段名含义类型用途district所在区鼓楼、江宁等字符串区域对比community小区名字符串明细查询area建筑面积㎡浮点面积分布total_price总价万元浮点总价分布unit_price单价元/㎡浮点核心指标layout户型如 3室2厅字符串户型分析floor楼层描述字符串辅助维度build_year建成年份整数房龄分析字段设计的关键是单价一定要单独存一列不要每次现算。因为总价和面积里只要有一个是脏数据现算的单价就会污染整张图。2.2 用 pandas 把数据读进来并做第一轮体检拿到数据文件后先别画图先体检。下面这段代码是每次开工我都会跑一遍的模板import pandas as pd import numpy as np # 读取数据注意编码中文数据常见 gbk / utf-8-sig df pd.read_csv(nanjing_ershoufang.csv, encodingutf-8-sig) # 第一轮体检形状、字段、缺失、重复 print(数据形状:, df.shape) print(字段列表:, df.columns.tolist()) print(缺失值统计:\n, df.isnull().sum()) print(重复行数:, df.duplicated().sum()) # 看数值字段的分布快速发现异常值 print(df[[area, total_price, unit_price]].describe()) # 看区域取值是否规范 print(区域取值:, df[district].unique())这段代码的逻辑是shape告诉你数据量够不够支撑分析isnull().sum()定位哪些列需要清洗duplicated()查重复房源describe()用最小值和最大值快速抓异常比如面积出现 0 或 9999单价出现个位数基本都是脏数据。encoding参数是中文数据的第一个坑用utf-8读出来乱码时换成utf-8-sig或gbk通常能解决。参数上describe()默认只统计数值列如果你把单价存成了带「元/㎡」单位的字符串这里会直接不显示说明类型没转对得先用str.replace去掉单位再astype(float)。3. 清洗与特征工程让单价和区域字段能直接进图3.1 处理缺失值、异常值和单位不统一真实数据里面积缺失、总价写成「暂无报价」、单价带单位都是家常便饭。清洗的目标只有一个让每一列都是干净的可计算类型。下面是我常用的清洗流程# 1. 统一去除字符串字段首尾空格 df[district] df[district].str.strip() df[layout] df[layout].str.strip() # 2. 把带单位的字段转成数值 def to_float(x): if pd.isna(x): return np.nan return float(str(x).replace(元/㎡, ).replace(㎡, ).replace(万, ).strip()) df[unit_price] df[unit_price].apply(to_float) df[area] df[area].apply(to_float) df[total_price] df[total_price].apply(to_float) # 3. 删除关键字段缺失的行 df df.dropna(subset[district, area, total_price, unit_price]) # 4. 用分位数剔除极端异常值 q_low df[unit_price].quantile(0.01) q_high df[unit_price].quantile(0.99) df df[(df[unit_price] q_low) (df[unit_price] q_high)] # 5. 面积和总价也要设合理区间 df df[(df[area] 10) (df[area] 500)] df df[(df[total_price] 20) (df[total_price] 3000)] print(清洗后数据量:, df.shape)逻辑说明第 2 步的to_float是核心把「450万」「32000元/㎡」这类字符串统一成数字否则后面所有计算都会报错或算错。第 4 步用 1% 和 99% 分位数卡边界比直接拍脑袋定阈值更稳因为不同区域单价差异大固定阈值容易误删。第 5 步的面积和总价区间是业务常识兜底10㎡ 以下的住宅和 3000 万以上的普通二手房在分析里都属于噪声。参数上分位数可以根据数据量调整数据少于 1000 条时用 0.05/0.95 更稳数据上万条时 0.01/0.99 足够。清洗完一定要重新describe()一遍确认数值范围合理。3.2 从户型、房龄里挖出能进图的特征原始字段直接画图往往不够看需要派生几个特征。最实用的三个户型拆成室数、从建成年份算房龄、按单价分档。# 1. 从户型字符串里提取室数如 3室2厅 - 3 df[rooms] df[layout].str.extract(r(\d)室).astype(float) # 2. 计算房龄 current_year 2024 df[house_age] current_year - df[build_year] # 3. 按单价分档方便做分层对比 bins [0, 20000, 30000, 40000, 60000, 100000] labels [2万以下, 2-3万, 3-4万, 4-6万, 6万以上] df[price_level] pd.cut(df[unit_price], binsbins, labelslabels) # 4. 按区域统计均价作为后续图表的排序依据 district_avg df.groupby(district)[unit_price].mean().sort_values(ascendingFalse) print(district_avg)str.extract用正则从户型里抠出室数比字符串切片稳因为户型写法不统一。pd.cut做分档是可视化前的常用预处理分档后画堆叠柱状图或饼图都方便。最后按区域算均价并排序这一步的产出直接决定了后面柱状图的顺序先排好序图才好看。这里有个容易忽略的点build_year如果是字符串或者有空值house_age会算出一堆 NaN画图时这些点会消失。所以算完房龄要再dropna一次或者用中位数填充。4. 可视化落地用 matplotlib 和 pyecharts 出四张核心图4.1 区域均价对比和总价分布怎么画可视化的第一原则是一张图只回答一个问题。南京二手房分析里最该先出的两张图是「各区域均价对比」和「总价分布」。import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] # 中文显示 plt.rcParams[axes.unicode_minus] False # 图1各区域均价柱状图 fig, ax plt.subplots(figsize(10, 6)) district_avg.plot(kindbar, axax, color#4C72B0) ax.set_title(南京各区域二手房均价对比) ax.set_xlabel(区域) ax.set_ylabel(均价元/㎡) for i, v in enumerate(district_avg.values): ax.text(i, v, f{int(v)}, hacenter, vabottom, fontsize9) plt.tight_layout() plt.savefig(district_avg.png, dpi150) # 图2总价分布直方图 fig, ax plt.subplots(figsize(10, 6)) ax.hist(df[total_price], bins40, color#55A868, edgecolorwhite) ax.set_title(南京二手房总价分布) ax.set_xlabel(总价万元) ax.set_ylabel(房源数量) plt.tight_layout() plt.savefig(total_price_dist.png, dpi150)逻辑说明district_avg是上一节算好的按均价排序的 Series直接plot(kindbar)就能出图排序后的柱子从高到低一眼能看出价格梯队。柱顶标数值用ax.text循环加比默认图例直观。直方图的bins参数控制柱子数量40 个在几千条数据下比较合适太少看不出分布形状太多会碎。中文显示是 matplotlib 的经典坑SimHei在 Windows 上一般可用Mac 上要换成Arial Unicode MSLinux 服务器上如果没有中文字体图里会全是方框这时候要么装字体要么改用 pyecharts 出 HTML。4.2 用 pyecharts 做可交互的区域-户型热力图静态图适合放 PPT但如果想让别人自己点着看pyecharts 更合适。下面用热力图展示「区域 × 户型」的均价分布from pyecharts.charts import HeatMap from pyecharts import options as opts # 构造 区域 x 户型 的均价矩阵 pivot df.pivot_table(valuesunit_price, indexdistrict, columnsrooms, aggfuncmean).round(0) districts pivot.index.tolist() rooms [str(int(c)) 室 for c in pivot.columns.tolist()] data [] for i, d in enumerate(districts): for j, r in enumerate(rooms): val pivot.iloc[i, j] if pd.notna(val): data.append([j, i, int(val)]) heatmap ( HeatMap() .add_xaxis(rooms) .add_yaxis(区域, districts, data, label_optsopts.LabelOpts(is_showTrue, positioninside)) .set_global_opts( title_optsopts.TitleOpts(title南京各区域不同户型均价热力图), visualmap_optsopts.VisualMapOpts(min_pivot.min().min(), max_pivot.max().max(), is_piecewiseFalse), ) ) heatmap.render(district_room_heatmap.html)逻辑说明pivot_table把数据透视成区域为行、室数为列的矩阵aggfuncmean算均价。热力图的data格式是[x索引, y索引, 值]所以循环时 x 对应户型、y 对应区域别写反写反了图会转置。visualmap_opts控制颜色映射范围用矩阵的最小最大值颜色对比最充分。参数上is_piecewiseFalse是连续渐变改成True会变成分段色块看个人偏好。如果某些区域某个户型没有房源pivot里是 NaN代码里用pd.notna跳过避免热力图出现空洞报错。5. 避坑与排查南京二手房分析里最容易翻车的五件事5.1 中文乱码和字体缺失现象读 CSV 报UnicodeDecodeError或者图里中文全是方框。 原因编码不匹配或系统没有中文字体。 解决读取时依次尝试utf-8-sig、gbkmatplotlib 里显式设置font.sans-serifLinux 环境先fc-list :langzh确认有没有中文字体没有就装一个或用 pyecharts。5.2 单价算错导致整张图失真现象区域均价柱状图里某个区高得离谱。 原因总价单位是「万」面积单位是「㎡」直接相除得到的是「万元/㎡」和「元/㎡」差了 10000 倍。 解决统一单位unit_price total_price * 10000 / area算完抽查几条和原始数据对一下。5.3 区域名称不统一现象groupby 之后出现「鼓楼」「鼓楼区」「南京市鼓楼区」三个分组。 原因数据来源不同区域写法不一致。 解决清洗时用映射表统一df[district] df[district].str.replace(区, )或者建一个{鼓楼区: 鼓楼}的字典做map。5.4 异常值没处理均值被拉偏现象均价明显高于市场认知。 原因个别天价房源或面积填错的数据没剔除。 解决用分位数卡边界别用固定阈值剔除后重新算均值并记录剔除了多少条PPT 里要能解释。5.5 图表太多但没有结论现象PPT 里十几张图讲的时候说不清重点。 原因为画图而画图没有围绕问题组织。 解决每张图配一句话结论比如「鼓楼均价最高是江宁的 1.6 倍」图是证据结论才是内容。6. 从数据到 PPT让图表能讲出结论的三个技巧做完整套分析最后卡在 PPT 上的人不少。图表能画出来不代表能讲清楚。我自己的习惯是先定三个结论再倒推需要哪几张图。第一个技巧是给每张图配一句「人话结论」。比如区域均价图标题不要写「各区域均价对比」直接写「鼓楼均价领跑江宁性价比最高」。观众看标题就懂图只是佐证。第二个技巧是控制图表数量一份二手房分析 PPT四到六张图足够区域均价、总价分布、面积-总价散点、区域户型热力图再加一张结论页。图多了反而稀释重点。第三个技巧是散点图加趋势线面积和总价的关系用散点图最直观import numpy as np fig, ax plt.subplots(figsize(10, 6)) ax.scatter(df[area], df[total_price], alpha0.3, s10, color#C44E52) # 拟合一条趋势线 z np.polyfit(df[area], df[total_price], 1) p np.poly1d(z) x_line np.linspace(df[area].min(), df[area].max(), 100) ax.plot(x_line, p(x_line), colorblack, linewidth2, label趋势线) ax.set_title(面积与总价关系面积每增 10㎡总价约增多少) ax.set_xlabel(面积㎡) ax.set_ylabel(总价万元) ax.legend() plt.tight_layout() plt.savefig(area_price_scatter.png, dpi150)alpha0.3让点半透明重叠区域能看出密度np.polyfit一次拟合出斜率斜率乘以 10 就是「面积每增 10㎡ 总价增加多少万」这句话直接可以放进 PPT。注意散点图在数据量大时渲染慢超过两万条可以先抽样再画。最后说个我自己的教训早期做这类分析我总想把所有字段都塞进图里结果 PPT 做了三十页讲的时候自己都绕晕。后来改成「三个结论、六张图、每图一句话」反而被问得最多的是结论怎么来的而不是图怎么画的。数据可视化分析的价值不在图多漂亮在于能不能让人看完就记住一个判断。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Docker Compose安装全指南:版本差异、常见报错与实战部署

Docker Compose安装全指南:版本差异、常见报错与实战部署

最近有个朋友让我帮他在一台新装好的服务器上部署环境,本来以为半小时就能搞定的事,结果光是在“安装Docker Compose”这一步就折腾了近一下午。不是Docker没装好,而是Compose这个工具本身就有好几个版本、好几种装法,不同系统上还…

2026/10/2 22:02:09 阅读更多 →
基于YOLOv8的徽章分析系统:从训练到部署的完整毕设实战

基于YOLOv8的徽章分析系统:从训练到部署的完整毕设实战

简介:这是一套面向计算机、人工智能、通信工程等专业学生与教师的YOLOv8徽章分析系统完整项目包,可直接用于毕业设计、课程设计或大作业,也适合深度学习入门者进阶练习。资源包含源码、完整数据集、可视化界面与部署说明,部署简单…

2026/10/2 22:01:08 阅读更多 →
Java学籍管理系统源码解析:从数据库设计到答辩避坑

Java学籍管理系统源码解析:从数据库设计到答辩避坑

简介:面向软件工程本科期末大作业的Java学籍管理系统完整源码包,按学院学籍管理要求梳理学生基本信息、班级信息、专业信息、动态信息等模块,兼顾考勤、纪律、寝室、卫生等日常管理场景,适合高校学生用于课程设计、期末项目或毕业…

2026/10/2 22:01:08 阅读更多 →

最新新闻

210张单类别筷子计数数据集:VOC到YOLO格式转换与YOLOv8训练实战

210张单类别筷子计数数据集:VOC到YOLO格式转换与YOLOv8训练实战

简介:筷子计数标注数据集是一套面向目标检测与计数任务的专业标注数据,包含210张筷子图片及完整标签文件,主要适用人群为计算机视觉开发者、算法学习者以及餐饮或工业场景中的智能化管理项目团队,可服务于餐具数量盘点等实际需求。…

2026/10/2 22:44:01 阅读更多 →
Android Killer实战:从安装配置到APK反编译修改全攻略

Android Killer实战:从安装配置到APK反编译修改全攻略

提到安卓逆向,很多人第一反应是命令行里敲一长串apktool、dex2jar、jadx,光是环境搭建就能劝退一半人。Android Killer就是把这条链路打包好的图形化工具,从反编译、查看smali源码,到回编译、签名、安装,都在一个界面里…

2026/10/2 22:44:01 阅读更多 →
Windows 部署 OpenClaw 避坑手册:路径、权限、拦截问题全部梳理|TaoToken 统一 Key 接入

Windows 部署 OpenClaw 避坑手册:路径、权限、拦截问题全部梳理|TaoToken 统一 Key 接入

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 22:44:01 阅读更多 →
Raven新版本:多Agent协作的总调度与Harness持续进化机制

Raven新版本:多Agent协作的总调度与Harness持续进化机制

1. 从标题拆解:Raven 到底在解决什么问题1.1 一个调度器加一个进化引擎,这个组合意味着什么看到“CC、Codex 组队干活,Raven 新版本既做总调度也让 Harness 持续进化”这个标题,我第一反应是:终于有人把多 Agent 协作里…

2026/10/2 22:44:01 阅读更多 →
16G显存跑27B大模型实战:量化选型与性能调优全攻略

16G显存跑27B大模型实战:量化选型与性能调优全攻略

先泼一盆冷水:16G显存跑27B大模型,这事儿听起来像是“小马拉大车”,但如果你选对了量化格式、调对了上下文长度,它真能在日常办公、代码辅助、本地知识问答这些场景里跑得有模有样。我自己在RTX 4080 16G上折腾了大概两周&#xf…

2026/10/2 22:44:01 阅读更多 →
AI编程测试验证Skills套件:从代码生成到质量闭环的实践指南

AI编程测试验证Skills套件:从代码生成到质量闭环的实践指南

1. 一句话能写代码,但你真的敢直接上线吗AI写代码这件事,这两年已经从“玩具”变成了“主力”。命令行里敲一句“帮我写一个用户注册接口,用Python实现,带JWT签名验证”,十几秒后一段完整代码就躺在编辑器里了。速度确…

2026/10/2 22:43:00 阅读更多 →

日新闻

从零搭建AI工程化:模型之外的完整闭环

从零搭建AI工程化:模型之外的完整闭环

先搞清楚一件事:从零开始做 AI 工程化,难的从来不是调模型、写提示词,而是把一套原型 Demo 变成长得像是“正经系统”的东西。你手里可能已经有了能跑通的代码,也可能刚读完一些概念,但真到了要把它变成可维护、可观测…

2026/10/2 0:00:20 阅读更多 →
大模型训练显存估计与混合精度训练实战指南

大模型训练显存估计与混合精度训练实战指南

1. 大模型训练显存估计与混合精度训练详解显存不够用,几乎是每个做大模型训练的人都会撞上的第一堵墙。你可能也经历过:模型代码写完了,数据管道跑通了,满心欢喜地按下训练启动脚本,结果几秒钟后终端弹出一行红字——C…

2026/10/2 0:00:20 阅读更多 →
小样本学习数据集选型指南:27个真正可用的高质量数据集

小样本学习数据集选型指南:27个真正可用的高质量数据集

1. 小样本学习的“弹药库”:为什么你总在找数据集,却总找不到真正能用的? 小样本、数据集——这两个词最近半年在我处理的200多个AI项目咨询里,出现频率排进前三。不是模型调不好,不是代码写不对,而是卡在…

2026/10/2 0:00:20 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/1 19:40:48 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/1 19:41:40 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/10/1 20:05:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 5:26:06 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 6:09:11 阅读更多 →