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)
python数据分析
只展示了十条数据,总共有20条
df.info()  #读取信息数量与属性
python数据分析
可看到没有缺失值,所以不用做缺失值处理

2、条形图展示总价

df['总价(万)'].plot.bar()  #总价用条形图形式展示
python数据分析

3、箱线图展示总价

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = "Microsoft YaHei" #展示字体以防乱码
df['总价(万)'].plot.box()   #箱线图
python数据分析
画这个箱线图其目的是在上述条形图了解总价的分布情况下再一次看总价细致分布情况,能展现最小值、第一四分位数(Q1)、中位数(Q2)、第三四分位数(Q3)以及最大值,同时从图中能看到有两个异常值,再回看那个csv文件或者dataframe,发现分别是总价为300和327的

4、去掉异常值的行并再用箱线图展示异常值是否排除

df = df[~df['总价(万)'].isin([300,327])]
df.head(10)
python数据分析
df['总价(万)'].plot.box()   #箱线图
python数据分析
可看到两个异常值被去掉

5、直方图展示总价分布情况

df['总价(万)'].plot.hist()  
python数据分析
可看到每个价格区间的分布个数

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

python数据分析
结果是没有

7、为了看一看均价的分布是否也有异常值,所以也画一个箱线图展示一下均价的情况,但是所建的dataframe中均价不是数值类型,那么在此就应该先按‘元’分隔开并转化为float类型再画

df['均价(元/平方米)'] = df['均价'].str.split('元').str[0].astype(float)
df.info() 
python数据分析
把均价分割并类型转化为float,可看到已经起新列为‘均价(元/平方米)’,类型为float
df['均价(元/平方米)'].plot.box()
python数据分析
可看到均价分布无异常值

8、把室卫厅加一下起新列为‘房间’以下面进行关系分析

df['房间(个数)'] = df['室']+df['厅']+df['卫']
df.head(10)
python数据分析

9、然后突然发现由于csv文件内容的问题,列‘面积’的单位不对,于是改了一下

df = df.rename(columns={'面积(千米)':"面积(平方米)"})
df.head(10)
python数据分析

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()
python数据分析
从这可知道,总价、均价与面积的关系是总价一定,均价低,面积高,均价高,面积低,比如房价180左右黄色的那个,均价很高但是面积很低,而偏蓝色那个则是均价比较低但是面积大,因为房价还受地域影响,有些地方房价高,而有些低。

11、再探索一下地区、均价、总价的关系,由于地区不是数值型,所以先转码,把地区转化为数值型

from sklearn.preprocessing import LabelEncoder
labelE = LabelEncoder()
df['区域'] = labelE.fit_transform(df['地区'])
df.head(10)
python数据分析

绘制总价、均价、区域三者关系散点图:

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()
python数据分析
可看到总价、均价两者也受区域影响,但是影响也不是很强,因为还受面积的影响

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()
python数据分析
可看到在我这csv文件里李沧的均价是略高于其他地区的

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()
python数据分析
上述散点图中散点的大小代表厅的数量,可知,面积越大,房间数量是多一点,而且在数量差不太多情况下,室多,厅多,那卫就少,就是其中一个多,那其余俩就少,大致就这样

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)
python数据分析
按价格分并给与标签
df['类型'].value_counts().plot.pie() 
python数据分析
可知道价格在150到200的数量是最多的,证明此地区的价格还是比较偏贵

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}')
python数据分析
# 可视化预测结果
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()
python数据分析
这是用区域和面积来预测总价,由上述模型可看到均方误差为467,可决系数为0.47,证明模型是可用但不接近完美,由最终的可视化图也看得出来确实模型预测的与真实还是有差距

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}')
python数据分析
# 可视化预测结果
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()
python数据分析
这是用区域和均价来预测总价,由上述模型可知道,均方误差456.5,可决系数为0.62,证明模型是可用但也不接近完美,由最终的可视化图也看得出来确实模型预测的比起回归的还是好了点也大致预测,但还是误差略大

17、预测结果,用决策树模型

import numpy as np
y_out = modelD.predict(np.array([1,13050]).reshape(1,-1))
print(y_out)
python数据分析
可知用决策树模型去预测结果,当区域选定为市北,房价为13050元/平方米,预测值为178.0万

结束!