博主介绍:✌全网粉丝10W+,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌
> 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与我联系了。🍅点击查看作者主页,了解更多项目!
🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。🍅
1、毕业设计:2025年计算机专业毕业设计选题汇总(建议收藏)✅
2、最全计算机专业毕业设计选题大全(建议收藏)✅
1、项目介绍
技术栈:
Python语言、Flask框架、Echarts可视化、requests爬虫技术、
机器学习决策树算法的房价预测模型、HTML 安居客网站二手房数据
2、项目界面
(1)词云图分析、房屋类型和产权分析
(2)房源数量分布分析
(3)房价影响因素分析1——-建筑年代与房价分析
(4)房价与面积分析
(5)房价与户型分析
(6)房价与厅数量分析
(7)房价与楼层分析
(8)房价预测
(9)后台数据管理
3、项目说明
- 词云图分析、房屋类型和产权分析
功能描述:
通过词云图展示二手房数据中常见的关键词,帮助用户快速了解市场热点词汇。同时,对房屋类型(如住宅、公寓等)和产权信息(如70年产权、40年产权等)进行统计分析,以直观的图表形式呈现不同房屋类型和产权的分布情况。
技术实现:
使用Python的wordcloud
库生成词云图,结合matplotlib
进行可视化展示。房屋类型和产权的统计分析则通过pandas
库完成数据处理,并使用Echarts生成交互式图表。
- 房源数量分布分析
功能描述:
分析不同区域或地段的房源数量分布情况,帮助用户了解哪些区域房源较多,从而为购房决策提供参考。
技术实现:
通过requests
爬虫技术从安居客网站获取二手房数据,使用pandas
进行数据清洗和统计,最后利用Echarts生成地理分布图或柱状图展示房源数量分布。
- 房价影响因素分析(建筑年代与房价分析)
功能描述:
分析建筑年代对房价的影响,通过图表展示不同年代房屋的平均房价,帮助用户了解房屋年代与房价之间的关系。
技术实现:
使用pandas
对数据进行分组和统计分析,计算不同建筑年代的房价均值,并通过Echarts生成折线图或柱状图进行可视化。
- 房价与面积分析
功能描述:
分析房屋面积与房价的关系,帮助用户了解面积对房价的影响程度。
技术实现:
通过散点图展示面积与房价的分布情况,同时可以使用回归线拟合分析两者之间的关系。使用Echarts生成交互式散点图,用户可以通过鼠标操作查看具体数据点。
- 房价与户型分析
功能描述:
分析不同户型(如一居室、两居室、三居室等)的房价分布情况,帮助用户了解户型对房价的影响。
技术实现:
使用pandas
对数据进行分组统计,计算不同户型的房价均值,并通过Echarts生成柱状图或饼图展示结果。
- 房价与厅数量分析
功能描述:
分析房屋厅的数量(如一厅、两厅等)对房价的影响,通过图表展示厅数量与房价的关系。
技术实现:
与户型分析类似,使用pandas
进行数据处理,通过Echarts生成柱状图或折线图展示分析结果。
- 房价与楼层分析
功能描述:
分析楼层对房价的影响,帮助用户了解不同楼层的房价差异。
技术实现:
对楼层数据进行分组统计,计算不同楼层的房价均值,并通过Echarts生成折线图或柱状图展示楼层与房价的关系。
- 房价预测
功能描述:
基于机器学习的决策树算法,对房价进行预测。用户输入房屋相关特征(如面积、户型、楼层等),模型将输出预测房价。
技术实现:
使用scikit-learn
库中的决策树模型进行训练和预测。通过Flask框架将模型部署为Web服务,用户可以通过前端页面输入特征,后端调用模型返回预测结果。
- 后台数据管理
功能描述:
提供后台数据管理功能,管理员可以对爬取的数据进行查看、更新、删除等操作,确保数据的准确性和完整性。
技术实现:
使用Flask框架构建后台管理系统,结合HTML和CSS实现界面交互。通过数据库(如SQLite或MySQL)存储和管理数据,管理员可以通过Web界面操作数据库。
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
#
print(" 5、 模型加载----已完成!")
🍅✌感兴趣的可以先收藏起来,点赞关注不迷路,想学习更多项目可以查看主页,大家在毕设选题,项目代码以及论文编写等相关问题都可以给我留言咨询,希望可以帮助同学们顺利毕业!🍅✌
5、源码获取方式
🍅由于篇幅限制,获取完整文章或源码、代做项目的,拉到文章底部即可看到个人联系方式。🍅
点赞、收藏、关注,不迷路,下方查看👇🏻获取联系方式👇🏻