计算机毕业设计源码:Python安居客房产数据挖掘平台 Flask框架 可视化 requests爬虫 scikit-learn机器学习 大数据 房子 租房(建议收藏)✅
1、项目介绍
技术栈
Python语言、Flask框架、Echarts可视化工具、requests爬虫、scikit-learn机器学习库、决策树预测算法、HTML
功能模块
• 词云图分析模块
• 房屋类型分析模块
• 产权分析模块
• 房源数量分布分析模块
• 建筑年代与房价分析模块
• 房价与面积分析模块
• 房价与户型分析模块
• 房价与厅数量分析模块
• 房价与楼层分析模块
• 房价预测模块
• 后台数据管理模块
项目介绍
本项目是基于Python语言构建的安居客二手房数据分析与预测平台,整合数据采集、多维度分析与智能预测全流程技术。系统采用requests爬虫实现安居客房源信息的自动化抓取,经数据处理后依托Flask框架搭建Web应用层,结合HTML构建流畅交互界面。数据可视化层面借助Echarts生成词云图、房源数量分布图、建筑年代与房价关联图、面积与房价散点图、户型与厅数分析图表等多维度可视化成果,直观呈现二手房市场特征。核心技术亮点在于集成scikit-learn机器学习库中的决策树预测算法,基于建筑年代、朝向、户型、面积等特征构建房价预测模型,为用户提供精准的房价参考。系统配备完善的后台数据管理模块,支持房源信息的高效维护与查询,兼具数据可视化的直观性与算法模型的科学性,为购房者与房产从业者提供决策依据。
2、项目界面
(1)词云图分析、房屋类型和产权分析
该页面是房价可视化分析及预测系统界面,包含房价整体情况查看、后台数据管理等功能模块,可通过词云图展示小区名称关键词分布,同时以柱状图和饼图分别呈现房屋类型与产权年限的分布情况,辅助用户直观分析房源特征。


(2)房源数量分布分析
该页面是房价可视化分析及预测系统界面,包含房价整体情况、不同地区房源分析、房价影响因素分析、房价预测、后台数据管理等功能模块,可通过直方图、饼图和箱型图分别展示不同地区房源数量分布与平均房价分布,辅助用户直观分析区域房源与房价特征。

(3)房价影响因素分析1-------建筑年代与房价分析
该页面是房价可视化分析及预测系统的房价影响因素分析界面,包含房价整体情况、不同地区房源分析、房价影响因素分析、房价预测、后台数据管理等功能模块,可通过饼图与条形图分别展示不同建造年代的房源数量分布与对应平均房价排名,辅助用户分析建造年代对房价的影响。

(4)房价与面积分析
该页面是房价可视化分析及预测系统的房价影响因素分析界面,包含房价整体情况、不同地区房源分析、房价影响因素分析、房价预测、后台数据管理等功能模块,可通过散点图分别展示房屋总价与总面积、每间房间面积的关联关系,辅助用户分析面积因素对房价的影响。

(5)房价与户型分析
该页面是房价可视化分析及预测系统的房价影响因素分析界面,包含房价整体情况、不同地区房源分析、房价影响因素分析、房价预测、后台数据管理等功能模块,可通过饼图与条形图分别展示不同房屋户型的房源数量分布及对应平均房价排名,辅助用户分析户型因素对房价的影响。
(6)房价与厅数量分析
该页面是房价可视化分析及预测系统的房价影响因素分析界面,包含房价整体情况、不同地区房源分析、房价影响因素分析、房价预测、后台数据管理等功能模块,可通过饼图与条形图分别展示不同房屋户型厅数的房源数量分布及对应平均房价排名,辅助用户分析厅数因素对房价的影响。
(7)房价与楼层分析
该页面是房价可视化分析及预测系统的房价影响因素分析界面,包含房价整体情况、不同地区房源分析、房价影响因素分析、房价预测、后台数据管理等功能模块,可通过饼图与条形图分别展示不同房屋户型卫数的房源数量分布及对应平均房价排名,辅助用户分析卫数因素对房价的影响。
(8)房价预测
该页面是房价可视化分析及预测系统的房价预测界面,包含房价整体情况、不同地区房源分析、房价影响因素分析、房价预测、后台数据管理等功能模块,支持用户配置建造年代、朝向、户型、面积等多维度参数,通过决策树算法模型预测房价,并以散点图展示房源价格与面积分布及预测结果,辅助用户预判房价。

(9)后台数据管理
该页面是一个房产信息后台管理界面,整合了房源列表展示、筛选检索、分页控制、操作按钮(如编辑、删除)及数据统计汇总功能模块,并以表格形式呈现房产相关字段信息,支持后台数据的便捷管理与快速检索。

3、项目说明
一、技术栈简要说明
本系统后端基于Python语言开发,采用Flask框架搭建Web应用层,负责处理HTTP请求与业务逻辑;数据采集环节使用requests爬虫实现安居客二手房信息的定向抓取;数据可视化层面引入Echarts工具生成多维度交互图表;机器学习部分集成scikit-learn库中的决策树预测算法,构建房价预测模型;前端页面采用HTML构建用户交互界面,保证页面布局清晰与操作流畅。
二、功能模块详细介绍
• 词云图分析模块
该模块对房源描述文本及小区名称进行分词处理,统计关键词出现频率,利用Echarts生成词云图进行可视化展示,字号大小代表词频高低,直观呈现二手房市场的热门小区与核心特征词汇。
• 房屋类型分析模块
模块对房源类型进行分类统计,包括住宅、公寓、别墅等不同类别,通过柱状图展示各类房屋类型的数量分布情况,帮助用户了解市场供给的结构特征。
• 产权分析模块
该模块对房屋产权年限进行统计分析,区分70年产权、40年产权等不同类型,通过饼图直观展示不同产权年限房源的占比分布,辅助用户把握产权结构特征。
• 房源数量分布分析模块
模块对不同区域或地段的房源数量进行统计,通过直方图、饼图和箱型图等多形式展示各区域房源分布情况及对应平均房价,帮助用户了解区域市场热度与价格水平。
• 建筑年代与房价分析模块
该模块对房屋建造年代进行分组统计,计算不同年代房源的平均房价,通过饼图与条形图展示各年代房源数量占比及对应均价排名,揭示建筑年代与房价的关联规律。
• 房价与面积分析模块
模块通过散点图直观展示房屋总价与总面积、每间房间面积之间的分布关系,帮助用户分析面积因素对房价的影响程度,识别面积与价格的关联趋势。
• 房价与户型分析模块
该模块对不同户型进行分类统计,包括一居室、两居室、三居室等类型,通过饼图展示户型数量占比,同时以条形图呈现各户型平均房价排名,分析户型对房价的影响。
• 房价与厅数量分析模块
模块对房屋厅的数量进行分类统计,区分一厅、两厅等不同情况,通过饼图与条形图展示各厅数类型的房源数量分布及对应平均房价,揭示厅数量与房价的关系。
• 房价与楼层分析模块
该模块对房屋所在楼层进行统计分析,按低楼层、中楼层、高楼层划分区间,通过饼图与条形图展示各楼层区间的房源数量分布及对应平均房价,分析楼层因素对房价的影响。
• 房价预测模块
模块基于scikit-learn库中的决策树预测算法,选取建筑年代、朝向、户型、面积、厅数、楼层等特征构建房价预测模型。用户在前端配置多维度参数后,系统调用模型返回预测房价,同时以散点图展示房源价格与面积分布及预测结果,辅助用户预判房价走势。
• 后台数据管理模块
该模块为管理员提供房源数据维护功能,以表格形式展示房源列表,集成筛选检索、分页控制、编辑删除等操作功能,支持对房源信息进行高效查询、更新与维护,保障数据准确性与完整性。
三、项目总结
本系统以安居客二手房数据为核心,构建了一套集数据采集、多维度分析与智能预测于一体的综合房产数据平台。后端采用Python与Flask框架搭建稳定Web应用,通过requests爬虫实现房源信息的自动化抓取;可视化层面借助Echarts生成词云图、房源数量分布图、建筑年代与房价关联图、面积与房价散点图、户型与厅数分析图表等多维度可视化成果,直观呈现二手房市场特征。核心技术亮点在于集成scikit-learn机器学习库中的决策树预测算法,基于建筑年代、朝向、户型、面积等特征构建房价预测模型,为用户提供精准的房价参考。系统功能覆盖词云分析、房屋类型与产权分析、房源数量分布、建筑年代分析、面积分析、户型分析、厅数分析、楼层分析、房价预测及后台管理等模块,配备完善的数据维护机制,兼具数据可视化的直观性与算法模型的科学性,为购房者与房产从业者提供决策依据,有效降低市场信息不对称。
4、核心代码
#!/usr/bin/python
# coding=utf-8
import sqlite3
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
np.random.seed(7)
sns.set(style="darkgrid")
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import train_test_split
import xgboost as xgb # GBM algorithm
from xgboost import XGBRegressor
import warnings
warnings.filterwarnings('ignore')
# 1、数据读取
conn = sqlite3.connect('all_house_infos.db')
sql = "select * from HouseInfo "
all_df = pd.read_sql(sql=sql, con=conn)
all_df.shape
# (1082, 22)
all_df.head(3)
print(" 1、数据读取----已完成!")
# 2、特征工程
del all_df['参考首付']
# 建造年代平均单价
tmp = all_df[['建造年代', '总价']].groupby('建造年代').mean()
tmp = tmp.reset_index()
tmp.columns = ['建造年代', '建造年代平均总价']
tmp.head(3)
tmp_map = {}
for i, row in tmp.iterrows():
tmp_map[row['建造年代']] = row['建造年代平均总价']
print(tmp_map)
# {'1980年': 168.0, '1990年': 166.16666666666666, '1993年': 114.0, '1995年': 255.0, '1996年': 92.0, '1997年': 106.16666666666667, '1998年': 142.66666666666666, '2000年': 115.5, '2001年': 187.75, '2002年': 245.75, '2003年': 158.98333333333332, '2004年': 136.4090909090909, '2005年': 170.1578947368421, '2006年': 188.9375, '2007年': 177.88888888888889, '2008年': 177.42225000000002, '2009年': 130.6076923076923, '2010年': 145.81428571428572, '2011年': 124.09545454545456, '2012年': 157.76470588235293, '2013年': 140.32391304347826, '2014年': 175.15, '2015年': 156.35373134328358, '2016年': 141.38051948051947, '2017年': 140.4399099099099, '2018年': 167.26336633663365, '2019年': 150.99186046511628, '2020年': 271.3565789473684, '2021年': 241.30555555555554, '2022年': 159.6, '暂无建造': 116.8468156424581}
all_df = pd.merge(all_df, tmp, on='建造年代', how='left')
all_df['建造年代'] = all_df['建造年代'].map(lambda x: int(x[:-1]) if '暂无' not in x else 2015)
set(all_df['房屋朝向'])
# {'东', '东北', '东南', '北', '南', '南北', '西', '西北', '西南'}
chaoxiang_map = {'东':0, '东北':1, '东南':2, '东西':3, '北':4, '南':5, '南北':6, '暂无朝向':7, '西':8, '西北':9, '西南':10}
all_df['房屋朝向'] = all_df['房屋朝向'].map(chaoxiang_map)
set(all_df['房屋类型'])
# {'未知'}
fangwuleix_map = {'公寓':0, '别墅':1, '平房':2, '普通住宅':3, '未知':4}
all_df['房屋类型'] = all_df['房屋类型'].map(fangwuleix_map)
set(all_df['所在楼层'])
# {'中层', '低层', '地下', '底层', '高层'}
suozailouceng_map = {'中层':0, '低层':1, '地下':2, '底层':3, '高层':4}
all_df['所在楼层'] = all_df['所在楼层'].map(suozailouceng_map)
set(all_df['装修程度'])
# {'毛坯', '简单装修', '精装修', '豪华装修'}
zhuangxiuchengdu_map = {'暂无装修情况':0, '毛坯':1, '简单装修':2, '精装修':3, '豪华装修':3}
all_df['装修程度'] = all_df['装修程度'].map(zhuangxiuchengdu_map)
set(all_df['产权年限'])
# {'40年产权', '70年产权', '暂无'}
changquannianxian_map = {'40年产权':0, '50年产权':1, '70年产权':2, '暂无':3}
all_df['产权年限'] = all_df['产权年限'].map(changquannianxian_map)
set(all_df['配套电梯'])
# {'无', '有'}
dianti_map = {'无':0, '暂无':0, '有':1}
all_df['配套电梯'] = all_df['配套电梯'].map(dianti_map)
set(all_df['房本年限'])
# {'未知', '满二年', '满五年'}
fangbennianxian_map = {'未知':0, '满二年':1, '满五年':2}
all_df['房本年限'] = all_df['房本年限'].map(fangbennianxian_map)
set(all_df['产权性质'])
# {'公房', '其它', '商住两用', '商品房住宅', '暂无', '经济适用房'}
changquanxingzhi_map = {'使用权':0, '公房':1, '其它':2, '动迁配套房':3,
'商住两用':4, '商品房住宅':5, '暂无':6, '经济适用房':7}
all_df['产权性质'] = all_df['产权性质'].map(changquanxingzhi_map)
set(all_df['唯一住房'])
# {'是', '未知'}
weiyizhufang_map = {'未知': 0, '否': 0, '是': 1}
all_df['唯一住房'] = all_df['唯一住房'].map(weiyizhufang_map)
del all_df['所属小区']
print(" 2、特征工程----已完成!")
# 3、 拆分成训练集和测试集
all_y = all_df['总价'].values
del all_df['总价']
del all_df['单价']
del all_df['链接']
del all_df['发布时间']
del all_df['所在位置']
all_x = all_df.values
plt.figure(figsize=(18, 10))
sns.kdeplot(np.log1p(all_y))
plt.show()
# 一个图
all_y = np.log1p(all_y)
df_columns = all_df.columns.values.tolist()
train_X, valid_X, train_Y, valid_Y = train_test_split(all_x, all_y, test_size=0.1, random_state=42)
# The error metric: RMSE on the log of the sale prices.
from sklearn.metrics import mean_squared_error
def rmse(y_true, y_pred):
return np.sqrt(mean_squared_error(y_true, y_pred))
all_df.info()
# --- ------ -------------- -----
# 0 产权性质 1082 non-null int64
# 1 房屋类型 1082 non-null int64
# 2 产权年限 1082 non-null int64
# 3 房本年限 1082 non-null int64
# 4 唯一住房 1082 non-null int64
# 5 所在楼层 1082 non-null int64
print('---> cv train to choose best_num_boost_round')
dtrain = xgb.DMatrix(train_X, label=train_Y, feature_names=df_columns)
xgb_params = {
'learning_rate': 0.01,
'n_estimators': 1000,
'max_depth': 4,
'min_child_weight': 2,
'eval_metric': 'rmse',
'objective': 'reg:linear',
'nthread': -1,
'silent': 1,
'booster': 'gbtree'
}
cv_result = xgb.cv(dict(xgb_params),
dtrain,
num_boost_round=4000,
early_stopping_rounds=100,
verbose_eval=100,
show_stdv=False,
)
best_num_boost_rounds = len(cv_result)
mean_train_logloss = cv_result.loc[best_num_boost_rounds-11 : best_num_boost_rounds-1, 'train-rmse-mean'].mean()
mean_test_logloss = cv_result.loc[best_num_boost_rounds-11 : best_num_boost_rounds-1, 'test-rmse-mean'].mean()
print('best_num_boost_rounds = {}'.format(best_num_boost_rounds))
print('mean_train_rmse = {:.7f} , mean_valid_rmse = {:.7f}\n'.format(mean_train_logloss, mean_test_logloss))
# ---> cv train to choose best_num_boost_round
# [0] train-rmse:4.36614 test-rmse:4.36616
# [100] train-rmse:1.64681 test-rmse:1.65042
# [200] train-rmse:0.685931 test-rmse:0.704961
# [300] train-rmse:0.385814 test-rmse:0.428268
# [400] train-rmse:0.31097 test-rmse:0.369818
# [500] train-rmse:0.289416 test-rmse:0.359264
# [600] train-rmse:0.277811 test-rmse:0.356436
# [700] train-rmse:0.268588 test-rmse:0.355353
# [800] train-rmse:0.260079 test-rmse:0.355791
# best_num_boost_rounds = 737
# mean_train_rmse = 0.2656433 , mean_valid_rmse = 0.3553390
print('---> training on total dataset to predict test and submit')
model = xgb.train(dict(xgb_params),
dtrain,
num_boost_round=best_num_boost_rounds)
feature_importance = model.get_fscore()
feature_importance = sorted(feature_importance.items(), key=lambda d: d[1], reverse=True)
feature_importance
# [('建筑面积', 2376),
# ('总楼层', 1246),
# ('建造年代', 925),
# ('建造年代平均总价', 640),
# ('装修程度', 479),
# ('房屋户型_室数', 446),
# ('房屋朝向', 314),
# ('所在楼层', 235),
# ('房本年限', 196),
# ('唯一住房', 176),
# ('配套电梯', 158),
# ('房屋户型_厅数', 133),
# ('房屋户型_卫数', 94),
# ('产权年限', 57),
# ('产权性质', 45)]
print(df_columns)
dvalid = xgb.DMatrix(valid_X, feature_names=df_columns)
predict_valid = model.predict(dvalid)
predict_price = np.expm1(predict_valid)
valid_true_price = np.expm1(valid_Y)
print('决策树模型在验证集上的均方误差 RMSE 为:', rmse(valid_Y, predict_valid))
# 决策树模型在验证集上的均方误差 RMSE 为: 0.3253231980310151
plt.figure(figsize=(18, 10))
sns.kdeplot(predict_valid, color='red', label='Predict Price')
sns.kdeplot(valid_Y, color='blue', label='True Price')
plt.title('True Price VS Predict Price (Distribution)', size=18)
plt.legend()
plt.show()
# 图
print(" 3、 拆分成训练集和测试集----已完成!")
## 4、模型保存
model.save_model('house_price.model')
print(" 4、模型保存----已完成!")
## 5、 模型加载
model = xgb.Booster(model_file='house_price.model')
model
# <xgboost.core.Booster at 0x7fba6f70d410>
print(" 5、 模型加载----已完成!")
5、项目列表




AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)