本文將使用Python的繪圖庫Matplotlib,通過數(shù)據(jù)可視化分析影響房價(jià)的主要因素。
波士頓房價(jià)數(shù)據(jù)集
波士頓房價(jià)數(shù)據(jù)集來源于1978年美國某經(jīng)濟(jì)學(xué)雜志上。該數(shù)據(jù)集包含若干波士頓房屋的價(jià)格及其各項(xiàng)數(shù)據(jù),每個(gè)數(shù)據(jù)項(xiàng)包含14個(gè)數(shù)據(jù),分別是犯罪率、是否在河邊和平均房間數(shù)等相關(guān)信息,其中最后一個(gè)數(shù)據(jù)是房屋中間價(jià)。
數(shù)據(jù)來源:https://archive.ics.uci.edu/ml/datasets/Housing
變量名稱解釋
- CRIM: per capita crime rate by town 每個(gè)城鎮(zhèn)人均犯罪率
- ZN: proportion of residential land zoned for lots over 25,000 sq.ft. 超過25000平方英尺用地劃為居住用地的百分比
- INDUS: proportion of non-retail business acres per town 非零售商用地百分比
- CHAS: Charles River dummy variable (= 1 if tract bounds river; 0 otherwise) 是否靠近查爾斯河
- NOX: nitric oxides concentration (parts per 10 million) 氮氧化物濃度
- RM: average number of rooms per dwelling 住宅平均房間數(shù)目
- AGE: proportion of owner-occupied units built prior to 1940 1940年前建成自用單位比例
- DIS: weighted distances to five Boston employment centres 到5個(gè)波士頓就業(yè)服務(wù)中心的加權(quán)距離
- RAD: index of accessibility to radial highways 無障礙徑向高速公路指數(shù)
- TAX: full-value property-tax rate per $10,000 每萬元物業(yè)稅率
- PTRATIO: pupil-teacher ratio by town 小學(xué)師生比例
- B: 1000(Bk - 0.63)^2 where Bk is the proportion of blacks by town 黑人比例指數(shù)
- LSTAT: % lower status of the population 下層經(jīng)濟(jì)階層比例
- MEDV: Median value of owner-occupied homes in $1000's 業(yè)主自住房屋中值
數(shù)據(jù)導(dǎo)入和查看
波士頓房價(jià)數(shù)據(jù)集在機(jī)器學(xué)習(xí)的sklearn.datasets
包中,用datasets.load_boston()
導(dǎo)入數(shù)據(jù)。接著使用.data
和.target
分別加載房屋屬性參數(shù)值和房屋中間價(jià)。
import pandas as pd
from sklearn import datasets
boston_dataset = datasets.load_boston()
X_full = boston_dataset.data
Y = boston_dataset.target
用房屋屬性參數(shù)值創(chuàng)建DataFrame,使用.columns
修改行標(biāo)簽為房屋屬性名稱,并添加一列房屋中間價(jià)數(shù)據(jù)。分別使用.head()
和.info()
查看數(shù)據(jù),可以看到數(shù)據(jù)導(dǎo)入和整理成功,便于下一步的可視化分析。
boston = pd.DataFrame(X_full)
boston.columns = boston_dataset.feature_names
boston['PRICE'] = Y
boston.head()
boston.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 506 entries, 0 to 505
Data columns (total 14 columns):
CRIM 506 non-null float64
ZN 506 non-null float64
INDUS 506 non-null float64
CHAS 506 non-null float64
NOX 506 non-null float64
RM 506 non-null float64
AGE 506 non-null float64
DIS 506 non-null float64
RAD 506 non-null float64
TAX 506 non-null float64
PTRATIO 506 non-null float64
B 506 non-null float64
LSTAT 506 non-null float64
PRICE 506 non-null float64
dtypes: float64(14)
memory usage: 55.4 KB
數(shù)據(jù)可視化分析
從上文的數(shù)據(jù)可以看出,接下來要分析13個(gè)房屋屬性參數(shù)與房屋中間價(jià)的關(guān)系。房屋屬性參數(shù)中有一個(gè)數(shù)據(jù)是離散數(shù)據(jù)(CHAS,0 或者 1),其余的均為連續(xù)數(shù)據(jù)。
首先,使用matplotlib繪圖分析河邊CHAS(離散數(shù)據(jù))和價(jià)格PRICE是否有相關(guān)性,可以看到二者沒有明顯的相關(guān)性,接下來的數(shù)據(jù)分析可以剔除屬性CHAS。
import matplotlib.pyplot as plt
%matplotlib inline
%config InlineBackend.figure_format = 'retina'
plt.style.use('seaborn-whitegrid')
plt.scatter(boston.CHAS, boston.PRICE)
plt.xlabel('CHAS')
plt.ylabel('PRICE')
plt.show()
接下來,需要分析12個(gè)連續(xù)數(shù)據(jù)與房屋中間價(jià)的相關(guān)性。因?yàn)樽兞勘容^多,為了迅速找出影響房屋中間價(jià)的因素,可以使用matplotlib中的Seaborn模塊繪制多變量圖。多變量圖的對(duì)角線上是變量分布的直方圖,非對(duì)角線上是兩個(gè)變量的散點(diǎn)圖。
把12個(gè)房屋屬性分成兩組與中間價(jià)繪圖,第一組:CRIM, ZN, INDUS, NOX, RM 和 AGE。
從圖中可以看出,CRIM(犯罪率)和 RM(平均房間數(shù)目)與PRICE(房屋中間價(jià))有明顯相關(guān)性,RM和 PRICE呈現(xiàn)正態(tài)分布。
import seaborn as sns
sns.pairplot(boston, vars=['CRIM', 'ZN', 'INDUS', 'NOX', 'RM', 'AGE', 'PRICE'])
第二組:DIS, RAD, TAX, PTRATIO, B 和 LSTAT。從圖中可以看出,LSTAT(下層經(jīng)濟(jì)階層比例)與PRICE有明顯相關(guān)性。
sns.pairplot(boston, vars=['DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'PRICE'])
將CRIM,RM,LSTAT 與 PRICE繪圖,可以更清楚的觀察和分析數(shù)據(jù)的相關(guān)性。從圖中看出 PRICE 與 LSTAT 及 CRIM 呈非線性關(guān)系,而與 RM 更呈線性關(guān)系。
sns.pairplot(boston, vars=['CRIM', 'RM', 'LSTAT', 'PRICE'])
總結(jié):
通過數(shù)據(jù)可視化分析,獲得波士頓地區(qū)自住房屋中間價(jià)與下層經(jīng)濟(jì)階層比例、平均房間數(shù)目和犯罪率有明顯的相關(guān)性。具體符合哪種相關(guān)性,進(jìn)一步分析將會(huì)涉及到線性回歸等模型的應(yīng)用。