当前位置:   article > 正文

17IOT 房价回归分析

17IOT 房价回归分析
  1. import pandas as pd
  2. import numpy as np
  3. import seaborn as sns
  4. import statsmodels.api as sm
  5. import matplotlib.pyplot as plt
  6. import scipy.stats as sci
  7. from sklearn.model_selection import train_test_split
  8. from statsmodels.formula.api import ols
  9. from statsmodels.sandbox.regression.predstd import wls_prediction_std
  10. import statsmodels.formula.api as smf
  11. from sklearn.preprocessing import OneHotEncoder,LabelEncoder
  12. #copyright by Interstellar-Ark-AI on 2020_5_23
  13.     
  14. #读取数据集-查看数据形状和类型以及分布
  15.     
  16. data = pd.read_csv("house_train.csv")
  17. data.head() #查看数据
  18. data.shape #查看数据集形状
  19. print(data['price'].describe()) #查看价值目标类型和分布、有无异常值
  20. sns.distplot(data['price']) # 查看价格分布的散点图
  21. plt.show()
  22. #预处理和数据清洗,去除价格-面积的离群点
  23. sns.jointplot(x='area',y='price',data=data) #查看价格和面积的分布图
  24. plt.show()
  25. index_del = data[(data['area'] > 100) & (data['price'] < 700)].index
  26. data.drop(index=index_del, inplace=True)    #噪声去除
  27. sns.jointplot(x='area',y='price',data=data) #再次查看价格和面积的分布图
  28. plt.show()
  29. #预处理和数据清洗,去除价格-PM2.5的离群点
  30. sns.jointplot(x='pm25',y='price',data=data) #查看价格和PM2.5的分布图
  31. plt.show()
  32. index_del = data[(data['pm25'] > 80) & (data['price'] < 400)].index
  33. data.drop(index=index_del, inplace=True)    #噪声去除
  34. sns.jointplot(x='pm25',y='price',data=data) #再次查看价格和PM2.5的分布图
  35. plt.show()
  36. #预处理和数据清洗,去除犯罪率-价格的离群点
  37. sns.jointplot(x='crime_rate',y='price',data=data) #查看犯罪率和价格的分布图
  38. plt.show()
  39. index_del = data[(data['crime_rate'] > 7.5) & (data['price'] < 500)].index
  40. data.drop(index=index_del, inplace=True)    #噪声去除
  41. sns.jointplot(x='crime_rate',y='price',data=data) #再次查看犯罪率和价格的分布图
  42. plt.show()
  43. #进行预处理数据清洗,查看什么特征拥有空值,去除空值列
  44. total = data.isnull().sum().sort_values(ascending=False)
  45. percent = (data.isnull().sum() / data.isnull().count()).sort_values(ascending = False)
  46. missing_data = pd.concat([total,percent],axis = 1,keys = ['Total','Percent'])
  47. data['distirct'] = data['distirct'].astype(str) #对于distirct数据,需要转化为object类型进行分类
  48. print(missing_data.head(13)) #查看空值列
  49. data1 = data.drop(['id'], axis = 1)  #删除id列,id列是无效的数据
  50. data2 = data1.drop(data1.loc[data1['crime_rate'].isnull()].index) #删除犯罪率为空的行
  51. data3 = data2.drop(data2.loc[data2['green_rate'].isnull()].index) #删除绿化率为空的行
  52. print(data3.isnull().sum().max()) #检查最后数据
  53. #可以使用热力图表示变量相关性
  54. plt.rcParams['figure.figsize'] = (15, 10)# 计算相关系数
  55. corrmatrix = data3.corr()
  56. sns.heatmap(corrmatrix,square = True,vmax = 1,vmin = -1,center = 0.0,cmap = 'coolwarm')
  57. plt.show()
  58. #特征工程:求出各个特征之间的皮尔逊相关系数
  59. k = 10  #十个特征
  60. cols = corrmatrix.nlargest(k,'price')['price'].index
  61. cm = np.corrcoef(data3[cols].values.T)
  62. sns.set(font_scale = 1.25)
  63. hm = sns.heatmap(cm,cmap = 'RdPu',annot = True,square = True,fmt = '.2f',annot_kws = {'size':10},yticklabels = cols.values,xticklabels = cols.values)
  64. plt.show()
  65. #算法1:ols回归分析数据建模
  66. feature_data = data3.drop(['price'],axis = 1)
  67. target_data = data3['price'] #预测目标列为price
  68. X_train,X_test,y_train, y_test = train_test_split(feature_data, target_data, test_size = 0.3) #划分数据集和测试集进行交叉验证
  69. df_train = pd.concat([X_train,y_train],axis=1)
  70. print(data['distirct'].describe())
  71. lr_model = ols("price~area+C(floor)+C(oriented)+crime_rate+pm25+C(distirct)",data = df_train).fit()

 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号