實例二:上海房屋2017年成交信息分析

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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章