項目內容:通過分析房價中的建筑面積,年代,樓層等來分析人們現在在購房時的偏好,進而分析出哪種二手房比較受歡迎。
數據采集
數據采集是利用市面上的采集軟件8爪魚對房天下官網上的數據進行采集,八爪魚的工作原理是設計一套規則,然后就會自動的根據這套規則進行采集數據。如下圖所示(僅僅是其中一部分)。
采集完成的數據如下圖所示:
數據清洗
首先導入自己的數據:
import pandas as pd import matplotlib from matplotlib import pyplot as plt %matplotlib inline %config InlineBackend.figure_format = 'retina' font = { 'family' : 'SimHei' } matplotlib.rc('font', **font)#設置中文字體 df = pd.read_csv("C:/Users/Administrator/Desktop/sh2.csv")
然后進行第一步清洗工作,找出里面的重復值并刪除:
dIndex = df.duplicated() df[dIndex]#找出重復的數據,并將重復數據提取出來 df.drop_duplicates()#刪除重復值
要將價格,建筑面積,年代,樓層這些數據可視化表現出來就要求他們都是數值型數據。而原始數據是這樣的。
此時的工作就是要講其中的數字提取出來,并將其轉化為數值型。
價格的清洗:
df_p=df['總價'].str.split('(', 1, True)#將該數據中的單價抽取出來 df_p.columns = ['zongjia', 'danjia'] df_pr=df_p['danjia'].str.split('元', 1, True) df_pr.columns = ['price', 'meiyongde'] df_price=df_pr['price'] df_price = df_price.astype(int)#將字符型轉化為數值型 df['總價']=df_price#將清洗后的賦值回去
面積的清洗:
df_s=df['建筑面積'].str.split('㎡',0,True)#將面積中的數字抽取出來 df_s.columns=['area', 'meiyongde'] df_area = df_s['area'] df_area = df_area.astype(float)#因為存在小數的關系,所以轉化為浮點型 df['建筑面積']=df_area
與上述代碼有一個區別,就是面積存在小數,而轉化為int就默認為整數,所以將其轉化為float形式。
(由于價格及面積的數據完整,而且沒有異常數據,所以價格的清洗工作是最順利的。)
年代的清洗:
df_a=df['年代'].str.split(':', 1, True) df_a.columns = ['meiyong', 'nian'] df_ag = df_a['nian'].str.split('年',1, True) df_ag.columns =['age', 'meiyongde'] df_age = df_ag['age'] df['年代']=df_age
將其轉化為數值型的時候,代碼開始報錯,里面存在著無法轉化成數值的字符串。查看原始數據,發現存在這樣的值。
這個朝向南北我們這串代碼是無法對其工作的。接下來就是要將這些無法轉化為數值的字符串變成NA值,然后刪除。
df['年代']=df['年代'].convert_objects(convert_numeric=True)#強制將字符串的列轉化為適當的數據類型 isNA=df.isnull() df[isNA[['年代']].any(axis=1)]#找出NA值 nedf = df.dropna()#濾除NA值
然而其中依然存在著問題,在對其進行統計分析的時候:
nedf['年代'].describe()
出現了這樣一個問題:
最小值是88,這顯然不符合我們要得到的數據,所以我們要將其修改為1988。
import numpy as np data=nedf['年代'] newdata = data.replace(88,1988)
在對其進行統計分析
newdata.describe()
發現數據正常:
(在此處,我沒有將NA值用新的值填充進去,是因為我并不知道用什么值填充進去比較好,而且數據量很大,去掉幾個值對最后整體數據的影響較小,所以我選在直接清除)
樓層的清洗:
df_f=df['樓層'].str.split('共', 1, True) df_f.columns = ['meiyong', 'gaodu'] df_flo = df_f['gaodu'].str.split('層',1, True) df_flo.columns =['floor', 'meiyongde'] df_floor = df_flo['floor'] df['樓層']=df_floor
發現其中存在大量的NA值,需要將其刪除。
isNA=df.isnull() df[isNA[['樓層']].any(axis=1)]#找出NA值 newdf = df.dropna()#濾除NA值 newdf['樓層']=newdf['樓層'].astype(int)
數據可視化
在可視化階段選用最常用的直方圖類型。
價格的可視化:
plt.hist(df['總價'], bins = 50,rwidth=0.9,normed=True) plt.title('價格分布圖') plt.xlabel('價格') plt.ylabel('數量') plt.show()
面積的可視化:
plt.hist(df['建筑面積'], bins = 70,rwidth=0.9) plt.title('建筑面積分布圖') plt.xlabel('建筑面積') plt.ylabel('數量') plt.show()
年代的可視化:
plt.hist(newdata, bins=50,rwidth=0.9) plt.title('年代分布圖') plt.xlabel('年代') plt.ylabel('數量') plt.show()
樓層的可視化:
plt.hist(newdf['樓層'], bins=35,rwidth=0.9) plt.title('樓層分布圖') plt.xlabel('樓層') plt.ylabel('數量') plt.show()
(此為一個數據小白的作品,存在很多瑕疵和不足,希望各位大神不吝賜教。)