接下来处理下之前收集到的房地产数据数据: 先分享一个学习数据预处理,数据挖掘,机器学习的实用网站:http://scikit-learn.org/stable/,有很多对应的教程。

本文中提到的数据清洗以及数据图形化都是通过pandas,以及matplotlib包等实现,通过学习一个比较有名的tutorial,来实现自己的小项目, tutorial地址:https://www.kaggle.com/c/house-prices-advanced-regression-techniques#tutorials

首先需要把存入MongoDB的数据读出来,直接读入pandas的DataFrame里,pandas包含了丰富的数据处理方法,下面会列举几个比较常用的,当然真正用的时候还是查文档比较好

从MongoDB读数据代码(相比之前的代码,对数据类型,表头稍作修改,具体请看Github源码):

defload_data():try:

client= MongoClient('localhost', 27017) #connect db

db = client['test'] #my db

info = db['text_set'] #my collection

except:print('connection error')

data= pd.DataFrame(list(info.find())) #find all data

del data['_id'] #filter data

dataset = data[['小区名称', '住房面积(平方米)', '平均价格(每平方)']]return dataset

通过pd的DataFrame方法,可以把数据库中的数据读入data中,设置title后,去除数据库中的_id字段,然后返回dataset

pandas有很多对数据的操作,仅仅是列举:

def pandas_operations(dataset): #pandas基本操作

dataset.info() #数据表基本信息

dataset.dtypes #每一列的数据类型

dataset.isnull() #拿到空值

dataset['area'].unique() #看某一列的唯一值

dataset.columns #查看列名称

dataset.head() #前10行数据

dataset.tail()

dataset['column'].drop_duplicates() #删除重复值

dataset['column'].replace('bj','test') #替换

通过seaborn包,这是一个简化了matlib操作的包,能简单的帮你生成漂亮的统计图

代码如下:

defkaggle_party(dataset):print(dataset['平均价格(每平方)'].describe())

dataset['平均价格(每平方)'] = pd.to_numeric(dataset['平均价格(每平方)'], errors='coerce') #转化为int mpl.rcParams['font.sans-serif'] = ['SimHei']

sns.distplot(dataset['平均价格(每平方)']);

plt.show()

注:在MongoDB中存储的数据是str类型的,所以要通过pandas的to_numeric()方法先将其转化为int类型

运行代码就生成统计图了:

我们会发现,大概平均的价格峰值在45000/平方米左右,但是我们会发现,极小值在6000-7000左右,而极大值在200000/平方左右,看似有些数据是不合理的,所以接下来我们会处理非合理数据。

不过在处理之前,我们继续通过统计图来分析,接下来介绍一种scatter diagram 散点图,可以用来观测两个变量的关系以及偏离值,在收集的数据中,住房面积和均价可以说是老朋友了。 Tutorial的作者是这样说的:“One of the figures we may find interesting is the one between 'price' and 'area'. In this figure we can see the dots drawing a linear line, which almost acts like a border. It totally makes sense that the majority of the dots stay below that line. Basement areas can be equal to the above ground living area, but it is not expected a basement area bigger than the above ground living area (unless you're trying to buy a bunker).”

那么现在就用散点图来展示一下他们的关系:

代码如下:

def kaggle_party2(dataset): #散点状分布图

var = '住房面积(平方米)'data= pd.concat([dataset['平均价格(每平方)'], dataset[var]], axis=1)

mpl.rcParams['font.sans-serif'] = ['SimHei']

data.plot.scatter(x=var, y='平均价格(每平方)', ylim=(0, 800000));

plt.show()

运行结果如下:

从这幅统计图中,发现了贫穷,真的可以限制你的想象力:-D, 还有超过50万/平米和大于800平米的房子,当然这些数据都不是我们要考虑的范围。因为我们要做的数据分析是根据大部分人的需求以及偏好为基础。所以,既然这么贵,删!!在清洗数据之前,首先继续对数据进行visualization。

接下来分析 Missing data

Missing data为在一个数据集里面,值为空的数据,因为我们抓取得数据都是百分百从html静态页面抓下来的,所以不存在null数据,但是我们还是需要验证一下:

代码如下:

def kaggle_party4(dataset): #check missing data and rates

total = dataset.isnull().sum().sort_values(ascending=False)

percent= (dataset.isnull().sum() / dataset.isnull().count().sort_values(ascending=False))

missing_data= pd.concat([total, percent], axis=1, keys=['Total','Percent'])print(missing_data.head(20))#deal with missing data call drop

并且通过简单的运算,来算出null数据的比率,然后打印:

结果果然是,并没有null数据的存在:

在tutorial中,如果某个column的空值数据的比率过高,就要采取一定的手段,去删除空值关联的其他column的数据,但是也要考虑到column之间的关系等。

接下来,进行 Univariate analysis

就是要设定一个中间标准值,然后查看偏离点的值的分布

代码如下:

def kaggle_party5(dataset): #consider the range of price deviation

saleprice_scaled = StandardScaler().fit_transform(dataset['平均价格(每平方)'][:, np.newaxis]);

low_range= saleprice_scaled[saleprice_scaled[:, 0].argsort()][:10]

high_range= saleprice_scaled[saleprice_scaled[:, 0].argsort()][-10:]print('outer range (low) of the distribution:')print(low_range)print('\nouter range (high) of the distribution:')print(high_range)

运行后,得出的结果如下:

我们很明显的能发现,high of the distribution 对于标准值1的偏离度,明显大于low的值,尤其是10以上的偏离度,这是需要在数据处理中,需要被考虑的。

现在根据散点图,偏离分析等等得出的分析结果,我们需要删除一些偏离中心值过大的数据。我们准备把住房面积大于600的和平均价格大于30000的数据砍掉,代码如下:

defdrop_data(dataset):

dataset= dataset.drop(dataset[dataset['平均价格(每平方)'] > 300000].index)

dataset= dataset.drop(dataset[dataset['住房面积(平方米)'] > 600].index)return dataset

然后我们再次用散点图表示出处理过的dataset:

可以发现,数据的分布更加的集中,更加的趋于合理化。

接下来

Who is 'SalePrice'?

我们已经对于房产售价做了很多分析,以及数据清理。So now it's time to go deep and understand how 'SalePrice' complies with the statistical assumptions that enables us to apply multivariate techniques.

从统计学的角度来看问题:引用Hair et al. (2013) 提出的四个标准

1.Normality :数据应该遵循自然分配

2.Homoscedasticity :假设依赖数值的元素是在预测范围之内

3.Linearity:利用散点图去找线性规律

4.Absence of correlated errors:错误之间的一致性关系

接下来我们测试显示一下,清洗过后的数据显示的峰度图,偏态分布

如图所示:

好吧,看起来,图形化的信息并没有像我们预料到的normal distribution,在tutorial作者的提示下,我们试着用统计学书上提到最常用的,把斜率变得更加positive,用log!

代码如下:

defkaggle_party7(dataset):#histogram and normal probability plot

mpl.rcParams['font.sans-serif'] = ['SimHei']

dataset['平均价格(每平方)'] = np.log(dataset['平均价格(每平方)']) #log

sns.distplot(dataset['平均价格(每平方)'], fit=norm);

fig=plt.figure()

res= stats.probplot(dataset['平均价格(每平方)'], plot=plt)

plt.show()

运行结果如下:

我们会惊喜的发现运用了这种数据转换的方式,满足了我们的需求!log在统计学中,可以避免极值的出现,从而使得分布更加趋于Normality。

数据分析整体代码如下:

1 #invite people for the Kaggle party

2 importpandas as pd3 importnumpy as np4 importseaborn as sns5 importmatplotlib as mpl6 from scipy.stats importnorm7 from scipy importstats8 from sklearn.preprocessing importStandardScaler9 importwarnings10 importmatplotlib.pyplot as plt11 from pymongo importMongoClient12 warnings.filterwarnings('ignore')13

14

15 defload_data():16 try:17 client = MongoClient('localhost', 27017) #connect db

18 db = client['test'] #my db

19 info = db['text_set'] #my collection

20 except:21 print('connection error')22

23 data = pd.DataFrame(list(info.find())) #find all data

24 del data['_id'] #filter data

25 dataset = data[['小区名称', '住房面积(平方米)', '平均价格(每平方)']]26 returndataset27

28

29 def pandas_operations(dataset): #pandas基本操作

30 dataset.info() #数据表基本信息

31 dataset.dtypes #每一列的数据类型

32 dataset.isnull() #拿到空值

33 dataset['area'].unique() #看某一列的唯一值

34 dataset.columns #查看列名称

35 dataset.head() #前10行数据

36 dataset.tail()37 dataset['column'].drop_duplicates() #删除重复值

38 dataset['column'].replace('bj','test') #替换

39

40

41 def kaggle_party1(dataset): #线图加直方图

42 print(dataset['平均价格(每平方)'].describe())43 mpl.rcParams['font.sans-serif'] = ['SimHei']44 sns.distplot(dataset['平均价格(每平方)']);45 plt.show()46

47 def kaggle_party2(dataset): #散点状分布图

48 var = '住房面积(平方米)'

49 data = pd.concat([dataset['平均价格(每平方)'], dataset[var]], axis=1)50 mpl.rcParams['font.sans-serif'] = ['SimHei']51 data.plot.scatter(x=var, y='平均价格(每平方)', ylim=(0, 800000));52 plt.show()53

54 defkaggle_party3(dataset):55 k = 10 #number of variables for heatmap

56 corrmat =dataset.corr()57 cols = corrmat.nlargest(k, '平均价格(每平方)')['平均价格(每平方)'].index58 mpl.rcParams['font.sans-serif'] = ['SimHei']59 cm =np.corrcoef(dataset[cols].values.T)60 sns.set(font_scale=1.25)61 hm = sns.heatmap(cm, cbar=True, annot=True, square=True, fmt='.2f', annot_kws={'size': 10}, yticklabels=cols.values,62 xticklabels=cols.values)63 plt.show()64

65

66 def kaggle_party4(dataset): #check missing data and rates

67 total = dataset.isnull().sum().sort_values(ascending=False)68 percent = (dataset.isnull().sum() / dataset.isnull().count().sort_values(ascending=False))69 missing_data = pd.concat([total, percent], axis=1, keys=['Total','Percent'])70 print(missing_data.head(20))71 #deal with missing data call drop

72

73

74 def kaggle_party5(dataset): #consider the range of price deviation

75 saleprice_scaled = StandardScaler().fit_transform(dataset['平均价格(每平方)'][:, np.newaxis]);76 low_range = saleprice_scaled[saleprice_scaled[:, 0].argsort()][:10]77 high_range = saleprice_scaled[saleprice_scaled[:, 0].argsort()][-10:]78 print('outer range (low) of the distribution:')79 print(low_range)80 print('\nouter range (high) of the distribution:')81 print(high_range)82

83 defkaggle_party6(dataset):84 #histogram and normal probability plot

85 mpl.rcParams['font.sans-serif'] = ['SimHei']86 sns.distplot(dataset['平均价格(每平方)'], fit=norm);87 fig =plt.figure()88 res = stats.probplot(dataset['平均价格(每平方)'], plot=plt)89 plt.show()90

91

92 defkaggle_party7(dataset):93 #histogram and normal probability plot

94 mpl.rcParams['font.sans-serif'] = ['SimHei']95 dataset['平均价格(每平方)'] = np.log(dataset['平均价格(每平方)']) #log

96 sns.distplot(dataset['平均价格(每平方)'], fit=norm);97 fig =plt.figure()98 res = stats.probplot(dataset['平均价格(每平方)'], plot=plt)99 plt.show()100

101

102 defkaggle_party8(dataset):103 #using normality data

104 mpl.rcParams['font.sans-serif'] = ['SimHei']105 dataset['平均价格(每平方)'] = np.log(dataset['平均价格(每平方)']) #log

106 plt.scatter(dataset['住房面积(平方米)'], dataset['平均价格(每平方)']);107 plt.show()108

109

110 defdrop_data(dataset):111 dataset = dataset.drop(dataset[dataset['平均价格(每平方)'] > 300000].index)112 dataset = dataset.drop(dataset[dataset['住房面积(平方米)'] > 600].index)113 returndataset114

115

116 defmain():117 dataset =load_data()118 dataset['住房面积(平方米)'] = pd.to_numeric(dataset['住房面积(平方米)'], errors='coerce')#convert str to int

119 dataset['平均价格(每平方)'] = pd.to_numeric(dataset['平均价格(每平方)'], errors='coerce')#convert str to int

120 #kaggle_party1(dataset)

121 #kaggle_party2(dataset)

122 #kaggle_party3(dataset)

123 #kaggle_party4(dataset)

124 #kaggle_party5(dataset)

125

126 #data has been cleaned

127 #dataset = drop_data(dataset)

128 #kaggle_party2(dataset)

129 #kaggle_party6(dataset)

130 #kaggle_party7(dataset)

131 kaggle_party8(dataset)132

133

134 if __name__ == '__main__':135 main()

python地产成本_Python3抓取 深圳房地产均价数据,通过真实数据为购置不动产做决策分析(二)...相关推荐

  1. python爬虫代码房-Python爬虫一步步抓取房产信息

    原标题:Python爬虫一步步抓取房产信息 前言 嗯,这一篇文章更多是想分享一下我的网页分析方法.玩爬虫也快有一年了,基本代码熟悉之后,我感觉写一个爬虫最有意思的莫过于研究其网页背后的加载过程了,也就 ...

  2. python 爬虫学习:抓取智联招聘网站职位信息(二)

    在第一篇文章(python 爬虫学习:抓取智联招聘网站职位信息(一))中,我们介绍了爬取智联招聘网站上基于岗位关键字,及地区进行搜索的岗位信息,并对爬取到的岗位工资数据进行统计并生成直方图展示:同时进 ...

  3. jupyter分割代码块_科研分享—Python根据关键词自动抓取Pubmed文献标题(附全部代码)文末有福利...

    写在前面:接触Python应该是8月初的一篇公众号文章,大致内容是使用py爬取数据库并汇总到本地.正好手头需要对某个领域的文献进行调研,不妨学习一下. 什么是Python? 百度说:Python (计 ...

  4. python爬取百度贴吧中的所有邮箱_使用 Python 编写多线程爬虫抓取百度贴吧邮箱与手机号...

    原标题:使用 Python 编写多线程爬虫抓取百度贴吧邮箱与手机号 不知道大家过年都是怎么过的,反正栏主是在家睡了一天,醒来的时候登QQ发现有人找我要一份贴吧爬虫的源代码,想起之前练手的时候写过一个抓 ...

  5. python实现人脸识别抓取人脸并做成熊猫头表情包(2)之优化

    上次做完python实现人脸识别抓取人脸并做成熊猫头表情包之后就放了一下,因为还要好好学习Springboot毕竟这才是找工作的硬实力.但是优化这个代码心里面一直很想,借用<clean code ...

  6. python beautifulsoup抓取网页内容_利用Python和Beautiful Soup抓取网页内容

    利用Python和Beautiful Soup抓取网页内容 Posted on 2012-08-09 00:08 SamWei 阅读(381) 评论(1) 编辑 收藏 Python 3中提供了url打 ...

  7. Python爬虫项目:抓取智联招聘信息

    来自https://mp.weixin.qq.com/s/0SzLGqv2p0-IWSN3r8bOHA ''' Python爬虫之五:抓取智联招聘基础版 该文件运行后会产生一个代码,保存在这个Pyth ...

  8. Python利用bs4批量抓取网页图片并下载保存至本地

    Python利用bs4批量抓取网页图片并下载保存至本地 使用bs4抓取网页图片,bs4解析比较简单,需要预先了解一些html知识,bs4的逻辑简单,编写难度较低.本例以抓取某壁纸网站中的壁纸为例.(b ...

  9. python将视频像素抓取替换导出mosaic效果的文本视频

    python将视频像素抓取替换导出mosaic效果的文本视频 第一次写博客,关于python的. 全网关于这种视频的的合成代码几乎没有,所以我提供了一套这样的思路. 完成过程很痛苦.因为全网类似的太少 ...

最新文章

  1. Javascript 数字时钟
  2. ASP.NET 文件操作实例
  3. Basic Level 1023. 组个最小数 (20)
  4. DevExpress RichEditControl 上下翻页功能 z
  5. 编译 / __attribute__(constructor)和__attribute__(destructor)
  6. Asp.net(asp,jsp)+JavaScript动态实现添加数据行
  7. linux 安装库 编译提示-lcrypto 无法链接,缺少 crypto 库
  8. 【Http协议】深入理解HTTP协议
  9. Linux 命令之 tcpdump -- 监听网络流量
  10. Ubuntu 18.04-20.04开机自动root用户登录(测试可用)
  11. 3D Vision | 移动机器人视觉三维感知的现在与将来
  12. (68)FPGA模块调用(Verilog调用VHDL)
  13. .Net开发人员通过WCF使用Node.js
  14. 【TensorFlow实战】TensorFlow实现经典卷积神经网络之ResNet
  15. Android单元测试(七):Robolectric,在JVM上调用安卓的类
  16. xUtils3 注解模块
  17. 我从零开始学黑莓开发的过程
  18. 本地差分隐私 随机响应_本地化差分隐私:如何面对非可信的世界
  19. 浏览器安全级别怎么设置,设置浏览器安全级别的方法
  20. 基于以太坊开发的类似58同城的DApp开发与应用案例

热门文章

  1. 【Opencv项目实战】背景替换:动态背景移除与替换(cvzone+MediaPipe)
  2. killall 命令使用
  3. 【ROS2】【机器人导航navigation2】参数调整分析
  4. 哈佛结构和冯·诺依曼结构
  5. win10进入不了系统修复方法
  6. 【Linux】linux的vim文件怎么全选复制、粘贴
  7. Android手机开发
  8. 微信小程序盲盒系统源码 附带教程
  9. t版免费申请esim
  10. openstack创建云主机流程