AI 文章摘要
本文展示了基于Jupyter Notebook对安居客房源数据的分析流程:首先读取并检查数据,通过条形图、箱线图等可视化总价、均价、面积分布并处理异常值;接着分析地区、房间数等因素与房价的关系;最后使用线性回归和决策树模型预测总价,其中决策树模型效果稍优。
阅读时间约3分钟。
摘要更新时间:2026-06-27 04:16
还是一样,用上次的那个房源数据进行简单的数据分析,基于jupyter notebook
1、首先,读取文件数据并创建DataFrame,同时查看数据信息
import pandas as pd
df = pd.read_csv('安居客房源.csv') #读取csv文件
df.head(10)

df.info() #读取信息数量与属性

2、条形图展示总价
df['总价(万)'].plot.bar() #总价用条形图形式展示

3、箱线图展示总价
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = "Microsoft YaHei" #展示字体以防乱码
df['总价(万)'].plot.box() #箱线图

4、去掉异常值的行并再用箱线图展示异常值是否排除
df = df[~df['总价(万)'].isin([300,327])]
df.head(10)

df['总价(万)'].plot.box() #箱线图

5、直方图展示总价分布情况
df['总价(万)'].plot.hist()

6、查看面积箱线图以观察是否有异常值

7、为了看一看均价的分布是否也有异常值,所以也画一个箱线图展示一下均价的情况,但是所建的dataframe中均价不是数值类型,那么在此就应该先按‘元’分隔开并转化为float类型再画
df['均价(元/平方米)'] = df['均价'].str.split('元').str[0].astype(float)
df.info()

df['均价(元/平方米)'].plot.box()

8、把室卫厅加一下起新列为‘房间’以下面进行关系分析
df['房间(个数)'] = df['室']+df['厅']+df['卫']
df.head(10)

9、然后突然发现由于csv文件内容的问题,列‘面积’的单位不对,于是改了一下
df = df.rename(columns={'面积(千米)':"面积(平方米)"})
df.head(10)

10、如果想探索一下总价、均价、面积的关系,于是用散点图展示
# 绘制散点图
plt.figure(figsize=(7, 4))
plt.scatter(df['总价(万)'], df['面积(平方米)'], c=df['均价(元/平方米)'], cmap='viridis', s=100, alpha=0.8)
plt.colorbar(label='均价(元/平方米)')
plt.xlabel('总价(万)')
plt.ylabel('面积(平方米)')
plt.title('总价 vs 面积 vs 均价 散点图')
plt.show()

11、再探索一下地区、均价、总价的关系,由于地区不是数值型,所以先转码,把地区转化为数值型
from sklearn.preprocessing import LabelEncoder
labelE = LabelEncoder()
df['区域'] = labelE.fit_transform(df['地区'])
df.head(10)

绘制总价、均价、区域三者关系散点图:
plt.figure(figsize=(5, 3))
plt.scatter(df['区域'], df['总价(万)'], c=df['均价(元/平方米)'], cmap='viridis', s=100, alpha=0.8)
plt.colorbar(label='均价(元/平米)')
plt.xlabel('区域')
plt.ylabel('总价(万)')
plt.title('总价 vs 区域 vs 均价 散点图')
plt.show()

12、再看一下不同地区均价对比分布情况以看看谁高一点或低一点
plt.figure(figsize=(5, 3))
plt.boxplot([df[df['地区'] == region]['均价(元/平方米)'] for region in df['地区'].unique()],
labels=df['地区'].unique(), vert=False)
plt.xlabel('均价(元/平米)')
plt.ylabel('地区')
plt.title('不同地区的均价箱线图对比')
plt.show()

13、下面看一下面积与房间总数(室卫厅)的关系
plt.figure(figsize=(7, 3))
plt.scatter(df['面积(平方米)'], df['室'], c=df['卫'],
cmap='viridis', s=df['厅'] * 75, alpha=0.8)
plt.colorbar(label='卫的数量')
plt.xlabel('面积(平方米)')
plt.ylabel('室的数量')
plt.title('面积 vs 房间数 散点图')
plt.show()

14、下面把总价分割一下,统计一下每个标签内的数量有多少个并展示
bins = [0,50,100,150,200]
binresult = pd.cut(df['总价(万)'],bins)
print(binresult.value_counts().sort_index(axis = 0)) #计每个分段的数量
df['类型'] = pd.cut(df['总价(万)'],bins,labels = ['便宜','正常','较贵','昂贵'])
df.head(20)

df['类型'].value_counts().plot.pie()

15、下面就开始用模型来预测总价了,先采用线性回归模型
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# 分离特征和目标变量
X = df[['区域','面积(平方米)']]
y = df[['总价(万)']]
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# 划分训练集和测试集
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=43)
# 划分训练集和测试集
model = LinearRegression()
# 训练模型
model.fit(X_train, y_train)
#进行预测
y_pred = model.predict(X_test)
# 评估模型性能
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f'均方误差:{mse}')
print(f'R-squared:{r2}')

# 可视化预测结果
plt.scatter(X_test['区域'], y_test, color='black', label='实际值')
plt.scatter(X_test['区域'], y_pred, color='blue', label='预测值')
plt.xlabel('区域')
plt.ylabel('总价(万)')
plt.legend()
plt.show()

16、采用决策树模型预测
from sklearn.tree import DecisionTreeRegressor
# 分离特征和目标变量
X = df[['区域','均价(元/平方米)']]
y = df[['总价(万)']]
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=35)
# 创建决策树模型
modelD = DecisionTreeRegressor(random_state=35)
# 训练模型
modelD.fit(X_train, y_train)
# 进行预测
y_pred = modelD.predict(X_test)
# 评估模型性能
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f'均方误差:{mse}')
print(f'R-squared:{r2}')

# 可视化预测结果
plt.scatter(X_test['区域'], y_test, color='black', label='实际值')
plt.scatter(X_test['区域'], y_pred, color='blue', label='预测值')
plt.xlabel('区域')
plt.ylabel('总价(万)')
plt.legend()
plt.show()

17、预测结果,用决策树模型
import numpy as np
y_out = modelD.predict(np.array([1,13050]).reshape(1,-1))
print(y_out)

结束!