分析目标:
将波士顿房价的数据集进行描述性数据分析、预测性数据分析(主要用了回归分析),可用于预测房价。
数据集介绍:
卡内基梅隆大学收集,StatLib库,1978年,涵盖了麻省波士顿的506个不同郊区的房屋数据。
一共含有506条数据。每条数据14个字段,包含13个属性,和一个房价的平均值。
腾讯文档 docs.qq.com
一、数据预处理
①导入常用的数据分析库
#导入Python常用数据分析的库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set() #设置画图空间为 Seaborn 默认风格
names=['CRIM','ZN','INDUS','CHAS','NOX','RM','GE','DIS','RAD','TAX','PRTATIO','B','LSTAT','PRICE']
boston=pd.read_csv("/Users/glenji/Desktop/housing.csv",names=names,delim_whitespace=True)
boston.head(10)
②指标解释:
#指标解释
#CRIM犯罪率
#ZN住宅用地所占比例
#INDUS城镇中非住宅用地所占比例
#CHAS是否穿过查尔斯河
#NOX氮氧化污染物
#RM每栋住宅的房间数
#GE1940年以前建成的自住单位的比例
#DIS距离5个波士顿的就业中心的加权距离
#RAD距离高速公路的便利指数
#TAX每一万美元的不动产税率
#PRTATIO城镇中的教师学生比例
#B城镇中的黑人比例
#LSTAT低收入群比例
#PRICE价格
查看数据集大小:
#查看数据集大小
boston.shape
查看各字段基础信息:
boston.info()
查看缺失值:
#查看缺失值
boston.isnull().sum()
二、描述性数据分析
①查看描述性数据统计:可以看到各个字段的均值、中位数、标准差等。
#描述性数据统计
boston.describe()
②查看各字段的相关性:可以看到房子价格跟住宅的房间数成比较强的正相关,而跟低收入人数比例有比较强的负相关。
#查看相关性
corrboston = boston.corr()
corrboston
plt.figure(figsize=(10,10)) #设置画布
sns.heatmap(corrboston,annot=True,cmap='RdGy')
plt.show()
③查看是否穿过查尔斯河对房价的影响:可以看到被河流穿过的豪宅仅占比6.92%,而被查尔斯河穿过的豪宅,比没有被穿过的豪宅平均贵了28.7%。
#查看是否穿过查尔斯河的两类占比
#可以看到被河流穿过的豪宅仅占比6.92%
fig,ax = plt.subplots(1,2,figsize=(10,5))
boston['CHAS'].value_counts().plot.pie(ax=ax[0],shadow=False,autopct='%1.2f%%')
ax[0].set_ylabel('') #设置y轴标签
ax[0].set_xlabel('CHAS') #设置x轴标签
sns.countplot('CHAS',data=boston,ax=ax[1])
ax[1].set_ylabel('')
ax[1].set_xlabel('CHAS')
plt.show()
#再来看看两种不同类型的房子的价值如何
#可以看到被查尔斯河穿过的豪宅,比没有被穿过的豪宅平均贵了28.7%
bostonCHAS = boston[['CHAS','PRICE']] #先将CHAS和PRICE两列数据取出
bostonCHAS1=bostonCHAS.pivot_table(values='PRICE', #计算的值
index='CHAS', #透视的行,分组的依据
aggfunc='mean') #聚合函数
# 对透视表进行降序排列
bostonCHAS1 = bostonCHAS1.sort_values(by='PRICE', # 排序依据
ascending=False # 是否升序排列
)
bostonCHAS1
④看看各个字段与价格的散点图:以初步了解价格与相应字段的关系。可以看到不是所有的字段与价格都有较强的相关关系,但本例中不涉及多元线性回归的向后删除,仅做最简单的多元性性回归的分析处理。
x_data = boston[['CRIM','ZN','INDUS','CHAS','NOX','RM','GE','DIS','RAD','TAX','PRTATIO','B','LSTAT']] # 导入所有特征变量
y_data = boston[['PRICE']] # 导入目标值(房价)
plt.figure(figsize=(18,10))
for i in range(13):
plt.subplot(4,4,i+1)
plt.scatter(x_data.values[:,i],y_data,s = 5) #.values将DataFrame对象X_df转成ndarray数组
plt.xlabel(names[i])
plt.ylabel('Price')
plt.title(str(i+1)+'. '+names[i]+' - Price')
plt.tight_layout()
plt.show()
三、预测性数据分析
①选取线性回归字段:
from sklearn import linear_model
#定义线性回归的x和y变量
x=pd.DataFrame(boston[['CRIM','ZN','INDUS','CHAS','NOX','RM','GE','DIS','RAD','TAX','PRTATIO','B','LSTAT']])
y=boston['PRICE']
x
②建立线性回归模型,并调用:可以看到各个字段的回归系数,可以写出一个回归方程:y=ax1+bx2+……,理论上你知道一套新房子的各个字段,带入公式即可预测出价格。
#建立线性回归模型,并将变量带入模型进行训练。
clf = linear_model.LinearRegression()
clf.fit(x, y)
#查看回归系数。本例为一元回归,所以只有一个系数。
print('回归系数:', clf.coef_)
③计算回归系数:计算出的回归系数为0.74,回归拟合效果较好。
from sklearn.metrics import r2_score
score = r2_score(y, y_pred)
score
④可以进行简单的预测:
y_pred =clf.predict(x)
print(y_pred)
以上,谢谢,喜欢的话可以关注一下。
参考资料: