前言
1. 關(guān)于數(shù)據(jù)集
數(shù)據(jù)來源:日月光華老師的《Python數(shù)據(jù)分析從入門到機器學(xué)習(xí)》的 lianjia 數(shù)據(jù)。
數(shù)據(jù)概況:
- cjtaoshu:成交套數(shù)
- mendian:門店
- cjzongjia:成交總價
- zhiwei:職位
- haoping:好評
- cjdanjia:成交單價
- cjxiaoqu:成交小區(qū)
- xingming:姓名
- cjzhouqi:成交周期
- biaoqian:經(jīng)紀人標簽
- cjlouceng:成交樓層
- cjshijian:成交時間
- congyenianxian:經(jīng)紀人從業(yè)年限
- bankuai:板塊
2. 分析環(huán)境
- Python3
- jupyter notebook
一、數(shù)據(jù)讀取、數(shù)據(jù)觀察與合并數(shù)據(jù)
1. 數(shù)據(jù)讀取
可以看到一共有7個csv文件篇恒,而且由于數(shù)據(jù)文件的編碼方式不統(tǒng)一,在循環(huán)讀取的時候需要做一下處理藏古。
代碼:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
data_list = []
for i in range(1, 8):
try:
data = pd.read_csv('./lianjia/lianjia{}.csv'.format(i), encoding='gbk')
except:
data = pd.read_csv('./lianjia/lianjia{}.csv'.format(i))
data_list.append(data)
2. 合并數(shù)據(jù)
concat()方法
data_list里的數(shù)據(jù)的數(shù)據(jù)格式都是完全統(tǒng)一的吧碾,這里用pandas的concat()方法俺孙。
data = pd.concat(data_list)
data.head()
3. 確定分析目標辣卒,提取需要數(shù)據(jù)
分析目標:做一個房產(chǎn)估價模型,給定一些房子信息睛榄,模型估計出單價荣茫。這里需要:cjdanjia(成交單價),cjxiaoqu(成交小區(qū))场靴,cjlouceng(成交樓層)啡莉,bankuai(板塊)。
data = data[['cjdanjia', 'cjxiaoqu', 'cjlouceng', 'bankuai']]
二旨剥、處理缺失值與重復(fù)值
1. 缺失值
isnull()方法
# 刪除全部為null的值
data.dropna(how='all', inplace=True)
這里(bankuai)板塊部分數(shù)據(jù)相對來說不是那么的重要咧欣,所以有缺失值問題不大,這里不做處理轨帜。
2. 重復(fù)值
duplicated()方法
由于在處理缺失值時魄咕,對板塊數(shù)據(jù)沒有進一步處理,在判斷是否是重復(fù)值時就會存在這樣一種情況:非null數(shù)據(jù)相同蚌父,但是板塊數(shù)據(jù)一個為null,一個不為null哮兰,這其實是重復(fù)數(shù)據(jù),所以在判斷是否為重復(fù)值時苟弛,使用非null的數(shù)據(jù)判斷:
(data.duplicated(subset=['cjdanjia','cjxiaoqu','cjlouceng'])).sum()
>>> 20012
drop_duplicates()方法
sort_values()方法
使用drop_duplicates()方法刪除重復(fù)值時喝滞,會默認把后面的重復(fù)值刪除掉,為了盡量保留有板塊值不為null的數(shù)據(jù)膏秫,這里先使用sort_values()方法排序右遭,該方法默認把包含null的值放后面。
data.sort_values(by='bankuai', inplace=True)
data.drop_duplicates(subset=['cjdanjia','cjxiaoqu','cjlouceng'], inplace=True)
三荔睹、數(shù)據(jù)類型轉(zhuǎn)換狸演、異常值處理以及數(shù)據(jù)離散化分析
1. 數(shù)據(jù)類型轉(zhuǎn)換
將cjdanjia轉(zhuǎn)換為數(shù)值類型言蛇,以萬元為單位僻他,保留兩位小數(shù)。
# 判斷數(shù)據(jù)是否都包含'元/平' ~:取反
(~data.cjdanjia.str.contains('元/平')).sum()
>>> 0
data = data.assign(cjdanjia = np.round(data.cjdanjia.str.replace('元/平', '').astype(np.float32).map(lambda x:x/10000), 2))
2. 異常值處理
按照北京房價行情分析腊尚,成交單價的最小值應(yīng)該在5000元以上(主觀推測)吨拗,所以去掉成交單價小于5000的數(shù)據(jù)。
data = data[data.cjdanjia > 0.5]
3. 數(shù)據(jù)離散化分析
區(qū)間畫圖顯示分析
bins = [0, 1, 2, 3, 4, 5, 7, 10, 15]
pd.cut(data.cjdanjia, bins).value_counts().plot.bar(rot=20)
由于這里分析的數(shù)據(jù)是2011~2016年之間的數(shù)據(jù),所以可以看到成交單價大部分分布在2到4萬之間劝篷。
四哨鸭、字符串處理
這里以成交樓層(cjlouceng)數(shù)據(jù)為例學(xué)習(xí)字符串處理方法。由前面的圖可以看到成交樓層(cjlouceng)數(shù)據(jù)都是以兩個'/'分成了三部分娇妓,這里先判斷一下像鸡。
(data.cjlouceng.str.split('/').map(len) != 3).sum()
>>> 0
然后從成交樓層數(shù)據(jù)中提取朝向和樓層信息,并以此添加兩列數(shù)據(jù)哈恰。
data = data.assign(chaoxiang = data.cjlouceng.map(lambda x:x.split('/')[0]))
data = data.assign(louceng = data.cjlouceng.map(lambda x:x.split('/')[1]))
查看樓層數(shù)據(jù)都有哪些:
unipue()方法:返回唯一值
data.louceng.unique()
>>> array(['低樓層', '中樓層', '高樓層', '地下室', '未知', ''], dtype=object)
經(jīng)分析這里louceng數(shù)據(jù)包含 '未知' 和 '' 的數(shù)據(jù)數(shù)量很少只估,而且信息不全,這里將其刪除掉着绷。
data = data[(data.louceng != '')&(data.louceng != '未知')]
get_dummies()方法
樓層數(shù)據(jù)不是數(shù)值蛔钙,無法丟進模型進行分析,這里用pandas的get_dummies()方法數(shù)值化信息荠医。
data.join(pd.get_dummies(data.louceng))
其他字符串類型數(shù)據(jù)處理方式大致相同吁脱。
五、分組運算與布爾過濾
在前面第一節(jié):確定分析目標彬向,提取需要數(shù)據(jù)中再加上 'xingming' 和 'cjzongjia'兼贡,'congyenianxian',其他不變娃胆。
1. 分組運算
分析:所有的板塊中紧显,經(jīng)紀人成交總價值超過1億的經(jīng)紀人。
groupby()方法
data_group = data.groupby(['bankuai','xingming'])['cjzongjia'].sum()
2. 布爾過濾
data_group[data_group > 10000]
3. 透視表分析
進一步思考:這些成交總價超過一億的經(jīng)紀人有什么特點缕棵?跟從業(yè)年限(congyenianxian)的關(guān)系孵班。
pivot_table()方法
data_1w = data.pivot_table('cjzongjia', index='xingming', columns='congyenianxian', aggfunc=sum)
#繪制餅圖
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用來正常顯示中文標簽
(data_1w > 10000).sum().plot.pie(figsize=(6,6))
此圖很明顯的說明了一個問題:對經(jīng)紀人來說,從業(yè)年限越高招驴,他的成交總價超過一億的人數(shù)就越多篙程。
總結(jié)
通過對lianjia數(shù)據(jù)的分析處理,進一步鞏固了Python數(shù)據(jù)分析數(shù)據(jù)預(yù)處理的一些方法别厘。