准备阶段:爬取网站数据,可参考github相关源码,也可自行设计。
1. 读入爬虫数据
注:需注意包含中文时,需添加encoding='gbk',否则可能报错
数据表头如图所示:
读入代码如下:
import pandas as pd
dfershou=pd.DataFrame(pd.read_csv(r'D:/LianjiaDatas/ershou清洗前.csv',header=0,encoding='gbk'))
2. 观察数据类型
print(dfershou.dtypes)
观察发现部分类型不准确,因此需要做数据类型转换,此处将室、厅、价格、面积转为float64:
dfershou[['面积','厅','室','价格']]=dfershou[['面积','厅','室','价格']].apply(pd.to_numeric,errors='coerce')
日期 int64
辖区 object
板块 object
标签 object
价格 float64
小区 object
室 float64
厅 float64
面积 float64
朝向 object
装修 object
3.检查数据缺失量
#列级别的判断,但凡某一列有null值或空的,则为真
dfershou.isnull().any()
total=dfershou.isnull().sum().sort_values(ascending=False)
print(total)
预览图 6046
厅 2277
装修 326
朝向 326
面积 326
室 326
价格 13
小区 1
标签 0
板块 0
行政区 0
日期 0
dtype: int64
缺失值所占比例:
percent=(dfershou.isnull().sum()/dfershou.isnull().count().sort_values(ascending=False))
print(percent)
价格 0.000208
厅 0.036442
室 0.005218
小区 0.000016
日期 0.000000
朝向 0.005218
板块 0.000000
标签 0.000000
行政区 0.000000
装修 0.005218
面积 0.005218
丢弃面积和价格均为null的行数据:
dfershou.dropna(subset=['价格','面积'],axis=0)
4.异常值检测:
先整体看下数据分布状况:
dfershou.describe()
可以发现:
1.日期没有问题,因为都是同一天爬取的数据。
2.价格的极差较大,最大价格4.6亿好像还可以接受(毕竟魔都),最小价格3万肯定是有问题的(二手房)
3.室最大值可能存在异常。
4.厅最大值9,面积最大值3984,看了网站上的数据后,emmmm还是保留吧,或许真的是贫穷限制了我的想象力。
因此,我按照以下规则进行了异常值的检出与清理:
#找出价格低于50万 或 室超过10个的数据
dfInvalid=dfershou[(dfershou['价格']<50) | (dfershou['室']>10)]
print(dfInvalid)
dfershou=dfershou.drop(dfInvalid.index)
print(dfershou.shape)
清理后,通过箱线图看下整体数据分布情况吧:
import matplotlib.pyplot as plt
#data=dfershou[['面积','厅','室','价格']]
data=dfershou[['室','厅']]
data.boxplot()
plt.show()
室,厅 值分布(4室3厅以内居多):
注:由于中文的原因,底部标签未正确显示。
面积 值分布:
价格 值分布(有钱人的世界实在不敢想象):
数据上看尽管有较多异常值的存在,在实际中属于正常案例,可以保留。
完成清理后,输出csv文件用于后续的统计分析:
dfershou.to_csv(r'D:/LianjiaDatas/ershou_transformed.csv',encoding='gbk')
后续将会继续整理相关的数据分析过程。