文章目錄
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
%matplotlib inline
plt.rcParams['font.family'] = 'SimHei' # 全局設置爲黑體
plt.rcParams['font.size'] = 15
1 數據處理
1.1 預處理:觀察
shfj = pd.read_csv('house.csv',index_col=0,na_values=['暫無資料','暫無資料年'])#讀取,並指定索引、缺失值
shfj.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 240 entries, 0 to 239
Data columns (total 14 columns):
標題 240 non-null object
產權性質 228 non-null object
住宅類別 218 non-null object
建築類別 188 non-null object
參考月供 0 non-null float64
年代 223 non-null object
建築面積 240 non-null float64
戶型 240 non-null object
樓層 228 non-null object
物 業 費 215 non-null object
物業類型 240 non-null object
結構 181 non-null object
裝修 228 non-null object
總價 237 non-null float64
dtypes: float64(3), object(11)
memory usage: 17.8+ KB
shfj.head(1)
標題 | 產權性質 | 住宅類別 | 建築類別 | 參考月供 | 年代 | 建築面積 | 戶型 | 樓層 | 物 業 費 | 物業類型 | 結構 | 裝修 | 總價 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 急售70年產權房源 房東裝修 戶型正氣 產證清晰 隨時看房 | 個人產權 | 普通住宅 | 板樓 | NaN | 1989年 | 70.4 | 2室2廳1廚1衛 | 中層(共6層) | NaN | 住宅 | 平層 | 精裝修 | 30.6 |
1.2 缺失值處理
- 缺失值統計
- 根據需求,捨棄或填充缺失值
- 拆分字符串列
shfj.isnull().sum() # 缺失值統計
標題 0
產權性質 12
住宅類別 22
建築類別 52
參考月供 240
年代 17
建築面積 0
戶型 0
樓層 12
物 業 費 25
物業類型 0
結構 59
裝修 12
總價 3
dtype: int64
shfj.isnull().sum()/shfj.count()# 統計各列缺失值佔比
標題 0.000000
產權性質 0.052632
住宅類別 0.100917
建築類別 0.276596
參考月供 inf
年代 0.076233
建築面積 0.000000
戶型 0.000000
樓層 0.052632
物 業 費 0.116279
物業類型 0.000000
結構 0.325967
裝修 0.052632
總價 0.012658
dtype: float64
shfj.drop('參考月供',axis=1,inplace=True) # 刪除全爲缺失值的列
1.2.1 【物業費】 列的處理
- 找規律,整理爲單一數字
- 填充缺失值
(shfj['物 業 費'].dropna().str.contains('元/')).sum()# 尋找列中各元素 包含的 共同特徵
215
shfj['物業費(元/平米)']=shfj['物 業 費'].str.split('元',expand=True)[0].astype(float)# 只取數組,創建新列
shfj['物業費(元/平米)'].fillna(shfj['物業費(元/平米)'].median(),inplace=True)# 缺失值填充爲該列 中位數
1.2.2 【總價】 列的處理
- 缺失值填充爲:每平米均價 * 建築面積
- 0~1標準化
shfj['總價(萬元)']=shfj['總價'].fillna((shfj['總價']/shfj['建築面積']).mean()*shfj['建築面積'])# 填充缺失值=每平米價格的平均值 * 建築面積
shfj['均價(元/平米)']=shfj['總價(萬元)']*10000/shfj['建築面積'] # 注意單位
shfj['均價標準化'] = shfj[['均價(元/平米)']].apply(lambda x:(x-x.min())/(x.max() - x.min()),axis=0) # 0~1 標準化
1.2.3 【物業類型】 列的處理
- 創建虛擬變量
shfj['物業類型'].value_counts()
住宅 228
別墅 12
Name: 物業類型, dtype: int64
df = pd.get_dummies(shfj['物業類型']) # 創建虛擬變量 ,用於繪製 熱力圖
shfj = shfj.join(df) # 按索引連接
1.2.4 【戶型】【建築年代】 列處理
shfj['建築年代']=shfj['年代'].str.split('年',expand=True).get(0).astype(float)
(shfj['戶型'].str.split('室').map(len)!=2).sum()# 尋找拆分規律
0
shfj['幾室'] = shfj['戶型'].str.split('室',expand=True)[0].astype(int)
shfj['幾廳']=shfj['戶型'].str.split('室',expand=True)[1].str.split('廳',expand=True)[0].astype(int)
1.3離散化
- 連續數據離散化,作爲查看數據分佈使用
shfj['總價分箱'] = pd.cut(shfj['總價(萬元)'],bins=[0,50,100,500,1000,12345])
shfj['總價分位'] = pd.qcut(shfj['總價(萬元)'],q=10,labels=list('abcdefghij'))
1.4 行列取捨——整理完畢
demos = shfj[['建築年代','物業費(元/平米)','物業類型','總價(萬元)',
'均價(元/平米)','建築面積','結構','住宅類別','產權性質','建築類別','幾室','幾廳']]
2 數據分析
2.1 數據特徵分析
- 相關性分析
- 集中趨勢,離散趨勢
2.1.1集中趨勢、離散趨勢
demos['總價(萬元)'].describe()
count 240.000000
mean 642.626819
std 1292.586408
min 30.600000
25% 219.998355
50% 400.000000
75% 564.500000
max 11000.000000
Name: 總價(萬元), dtype: float64
demos['總價(萬元)'].plot.box()
demos['總價(萬元)'].kurt() # 峯度
40.52782565750391
demos['總價(萬元)'].skew() # 偏度
6.0171911532748075
2.1.2 相關性分析
# pd.scatter_matrix(demos,figsize=(8,8),marker='+')
plt.scatter(demos['均價(元/平米)'],demos['物業費(元/平米)'])
u = demos['均價(元/平米)'].mean()
s = demos['均價(元/平米)'].std()
stats.kstest(demos['均價(元/平米)'],'norm',(u,s))#正態性檢驗
KstestResult(statistic=0.10648411593817408, pvalue=0.007990960793191837)
u1 = demos['物業費(元/平米)'].mean()
s1 = demos['物業費(元/平米)'].std()
stats.kstest(demos['物業費(元/平米)'],'norm',(u,s))#正態性檢驗
KstestResult(statistic=0.9515180129660263, pvalue=0.0)
demos[['均價(元/平米)','物業費(元/平米)']].corr(method='spearman')# 斯皮爾曼相關係數
均價(元/平米) | 物業費(元/平米) | |
---|---|---|
均價(元/平米) | 1.000000 | 0.096254 |
物業費(元/平米) | 0.096254 | 1.000000 |
- 物業費與總價,斯皮爾曼相關係數低於0.3,不存在線性相關
2.2 可視化分析
-
三維度的散點圖:
-
箱線圖——分佈分析
fig = plt.figure(figsize=(12,12))
ax1=fig.add_subplot(2,1,1)
shfj.plot.scatter(y='建築面積',x='建築年代',ax=ax1,c=shfj['均價標準化'],cmap='Blues',s=shfj['均價(元/平米)']/100,alpha=0.5)
ax2 = fig.add_subplot(2,1,2)
shfj.dropna().boxplot(column='建築面積',by='總價分箱',ax=ax2)
- 各個裝修的房屋成交總價分佈
- 低於50平米的房屋成家量很少
sns.stripplot(x='裝修',y='總價(萬元)',data=shfj,jitter=True,hue='住宅類別',size=8)
zj = shfj['總價分箱'].value_counts(normalize=True)
zj.plot.pie(figsize=(6,6),startangle=90,explode=(0,0.5,0.3,0,0))
設置表格樣式
- 設置極值 背景高亮
- 缺失值填充爲指定顏色
- 數字分類設置顏色
def colors(val):
if val>50000:
color='red'
else:
color='blue'
return('color:%s'%color)
def colorss(val):
if val>500:
color='red'
elif val<100:
color = 'blue'
else:
color='pink'
return('color:%s'%color)
demos.to_csv('上海房屋2017成交信息.csv',encoding='gbk',index=False)