##########################################################################
본 게시글은 Kaggle Competition에서 House prices의 TOP Kernel 중 하나를 번역한 것임.
저작권에는 문제가 없어 보이나 문제가 될시 바로 삭제하겠음.
##########################################################################
Housing Data Exploratory Analysis
AiO
September 26, 2016
library(data.table)
library(testthat)
library(gridExtra)
library(corrplot)
library(GGally)
library(ggplot2)
library(e1071)
library(dplyr)
## -------------------------------------------------------------------------
## data.table + dplyr 패키지는 dtplyr에 담겨져 있다.
## dtplyr을 불러오자! library(dtplyr)!
## -------------------------------------------------------------------------
## dplyr도 불러온다.
## 다음 객체는
'package:GGally'에서 불러온것이다.
## nasa
## 다음 객체는 'package:gridExtra'에서 불러온것이다.
## combine
## 다음 객체는 'package:testthat' 에서 불러온 것이다.
## matches
## 다음 객체는 'package:data.table' 에서 불러온 것이다.
## between, last
## 다음 객체는 'package:stats' 에서 불러온 것이다.
## filter, lag
## 다음 객체는 'package:base' 에서 불러온 것이다.
## intersect, setdiff, setequal, union
cat_var <- names(train)[which(sapply(train, is.character))] # train의 변수 중 character변수의 이름을 할당.
cat_car <- c(cat_var, 'BedroomAbvGr', 'HalfBath', ' KitchenAbvGr','BsmtFullBath', 'BsmtHalfBath', 'MSSubClass')
numeric_var <- names(train)[which(sapply(train, is.numeric))]
# train의 변수 중 numeric변수의 이름을 할당.
Structure of the data
dim(train)
## [1] 1460 81
str(train)
## Classes 'data.table' and 'data.frame': 1460 obs. of 81 variables:
## $ Id : int 1 2 3 4 5 6 7 8 9 10 ...
## $ MSSubClass : int 60 20 60 70 60 50 20 60 50 190 ...
## $ MSZoning : chr "RL" "RL" "RL" "RL" ...
## $ LotFrontage : int 65 80 68 60 84 85 75 NA 51 50 ...
## $ LotArea : int 8450 9600 11250 9550 14260 14115 10084 10382 6120 7420 ...
## $ Street : chr "Pave" "Pave" "Pave" "Pave" ...
## $ Alley : chr NA NA NA NA ...
## $ LotShape : chr "Reg" "Reg" "IR1" "IR1" ...
## $ LandContour : chr "Lvl" "Lvl" "Lvl" "Lvl" ...
## $ Utilities : chr "AllPub" "AllPub" "AllPub" "AllPub" ...
## $ LotConfig : chr "Inside" "FR2" "Inside" "Corner" ...
## $ LandSlope : chr "Gtl" "Gtl" "Gtl" "Gtl" ...
## $ Neighborhood : chr "CollgCr" "Veenker" "CollgCr" "Crawfor" ...
## $ Condition1 : chr "Norm" "Feedr" "Norm" "Norm" ...
## $ Condition2 : chr "Norm" "Norm" "Norm" "Norm" ...
## $ BldgType : chr "1Fam" "1Fam" "1Fam" "1Fam" ...
## $ HouseStyle : chr "2Story" "1Story" "2Story" "2Story" ...
## $ OverallQual : int 7 6 7 7 8 5 8 7 7 5 ...
## $ OverallCond : int 5 8 5 5 5 5 5 6 5 6 ...
## $ YearBuilt : int 2003 1976 2001 1915 2000 1993 2004 1973 1931 1939 ...
## $ YearRemodAdd : int 2003 1976 2002 1970 2000 1995 2005 1973 1950 1950 ...
## $ RoofStyle : chr "Gable" "Gable" "Gable" "Gable" ...
## $ RoofMatl : chr "CompShg" "CompShg" "CompShg" "CompShg" ...
## $ Exterior1st : chr "VinylSd" "MetalSd" "VinylSd" "Wd Sdng" ...
## $ Exterior2nd : chr "VinylSd" "MetalSd" "VinylSd" "Wd Shng" ...
## $ MasVnrType : chr "BrkFace" "None" "BrkFace" "None" ...
## $ MasVnrArea : int 196 0 162 0 350 0 186 240 0 0 ...
## $ ExterQual : chr "Gd" "TA" "Gd" "TA" ...
## $ ExterCond : chr "TA" "TA" "TA" "TA" ...
## $ Foundation : chr "PConc" "CBlock" "PConc" "BrkTil" ...
## $ BsmtQual : chr "Gd" "Gd" "Gd" "TA" ...
## $ BsmtCond : chr "TA" "TA" "TA" "Gd" ...
## $ BsmtExposure : chr "No" "Gd" "Mn" "No" ...
## $ BsmtFinType1 : chr "GLQ" "ALQ" "GLQ" "ALQ" ...
## $ BsmtFinSF1 : int 706 978 486 216 655 732 1369 859 0 851 ...
## $ BsmtFinType2 : chr "Unf" "Unf" "Unf" "Unf" ...
## $ BsmtFinSF2 : int 0 0 0 0 0 0 0 32 0 0 ...
## $ BsmtUnfSF : int 150 284 434 540 490 64 317 216 952 140 ...
## $ TotalBsmtSF : int 856 1262 920 756 1145 796 1686 1107 952 991 ...
## $ Heating : chr "GasA" "GasA" "GasA" "GasA" ...
## $ HeatingQC : chr "Ex" "Ex" "Ex" "Gd" ...
## $ CentralAir : chr "Y" "Y" "Y" "Y" ...
## $ Electrical : chr "SBrkr" "SBrkr" "SBrkr" "SBrkr" ...
## $ 1stFlrSF : int 856 1262 920 961 1145 796 1694 1107 1022 1077 ...
## $ 2ndFlrSF : int 854 0 866 756 1053 566 0 983 752 0 ...
## $ LowQualFinSF : int 0 0 0 0 0 0 0 0 0 0 ...
## $ GrLivArea : int 1710 1262 1786 1717 2198 1362 1694 2090 1774 1077 ...
## $ BsmtFullBath : int 1 0 1 1 1 1 1 1 0 1 ...
## $ BsmtHalfBath : int 0 1 0 0 0 0 0 0 0 0 ...
## $ FullBath : int 2 2 2 1 2 1 2 2 2 1 ...
## $ HalfBath : int 1 0 1 0 1 1 0 1 0 0 ...
## $ BedroomAbvGr : int 3 3 3 3 4 1 3 3 2 2 ...
## $ KitchenAbvGr : int 1 1 1 1 1 1 1 1 2 2 ...
## $ KitchenQual : chr "Gd" "TA" "Gd" "Gd" ...
## $ TotRmsAbvGrd : int 8 6 6 7 9 5 7 7 8 5 ...
## $ Functional : chr "Typ" "Typ" "Typ" "Typ" ...
## $ Fireplaces : int 0 1 1 1 1 0 1 2 2 2 ...
## $ FireplaceQu : chr NA "TA" "TA" "Gd" ...
## $ GarageType : chr "Attchd" "Attchd" "Attchd" "Detchd" ...
## $ GarageYrBlt : int 2003 1976 2001 1998 2000 1993 2004 1973 1931 1939 ...
## $ GarageFinish : chr "RFn" "RFn" "RFn" "Unf" ...
## $ GarageCars : int 2 2 2 3 3 2 2 2 2 1 ...
## $ GarageArea : int 548 460 608 642 836 480 636 484 468 205 ...
## $ GarageQual : chr "TA" "TA" "TA" "TA" ...
## $ GarageCond : chr "TA" "TA" "TA" "TA" ...
## $ PavedDrive : chr "Y" "Y" "Y" "Y" ...
## $ WoodDeckSF : int 0 298 0 0 192 40 255 235 90 0 ...
## $ OpenPorchSF : int 61 0 42 35 84 30 57 204 0 4 ...
## $ EnclosedPorch: int 0 0 0 272 0 0 0 228 205 0 ...
## $ 3SsnPorch : int 0 0 0 0 0 320 0 0 0 0 ...
## $ ScreenPorch : int 0 0 0 0 0 0 0 0 0 0 ...
## $ PoolArea : int 0 0 0 0 0 0 0 0 0 0 ...
## $ PoolQC : chr NA NA NA NA ...
## $ Fence : chr NA NA NA NA ...
## $ MiscFeature : chr NA NA NA NA ...
## $ MiscVal : int 0 0 0 0 0 700 0 350 0 0 ...
## $ MoSold : int 2 5 9 2 12 10 8 11 4 1 ...
## $ YrSold : int 2008 2007 2008 2006 2008 2009 2007 2009 2008 2008 ...
## $ SaleType : chr "WD" "WD" "WD" "WD" ...
## $ SaleCondition: chr "Normal" "Normal" "Normal" "Abnorml" ...
## $ SalePrice : int 208500 181500 223500 140000 250000 143000 307000 200000 129900 118000 ...
## - attr(*, ".internal.selfref")=<externalptr>
Summarize the missing values in the data.
데이터셋의 첫 5행을 보는것은 결측치가 있는 열이 있는지를 보여준다. (번역가의 생각으론 첫 5행 그리고 마지막 5행을 보는것은 데이터가 제대로 불러와 졌는지를 보기위함이다. 그러나 이 말도 뭐 아주 틀린말은 아니다. 사실 결측치가 있는 열을 보기 위해서는 summary 함수가 더 올바른 방법일 것이다.) 범주형 변수들중 가장 많은 결측치를 가진 것은 Alley, FirePlaceQu, PoolQC, Fence, 그리고 MiscFeature 이다.
- Alley: 골목길 접근성 종류를 나타냄.
- FirePlaceQu: 벽난로의 품질
- PoolQC: 수영장의 품질.
- Fence: 울타리의 품질.
- MiscFeature: Miscellaneous features는 다른 카테고리에서 다루어지지 않은 변수들을 말한다.
결측값들은 주택의 대다수가 골목길 접근성이 없고, 수영장이 없고, 울타리가 없고, 엘레베이터도 없다는 것을 나타낸다. 2번째 차고(집에 달려있는 차고외의 것), 오두막, 또는 테니스코트는 MiscFeature로 다뤘다.
수치형변수들은 결측값이 범주형만큼 많이 있진 않지만, 여전히 몇몇개가 존재한다. LotFrontage 변수에서 259개의 결측치, MasVnrArea 에서 8개의 결측치 그리고 GarageYrBlt에서 81개의 결측치들이 있다.
- LotFrontage: 집까지 연결된 거리(street)의 발자국거리(Linear feet)
- GarageYrBlt: 차고가 지어진 년도Year garage was built
- MasVnrArea: 평방 Masonry veener 공간(외부벽돌이 쌓여진 공간, 주로 집의 모양새(appearance)를 위한 것이라고 함.)
구글링 하여 찾은 Masonry Veener의 정의: Veneer masonry는 집을 건축하거나 리모델링하는데 많이 선택되는 것이다. 왜냐하면 이것은 훨씬 더 싸고 절연효과를 주면서 붉은벽돌 혹은 석조의 외형을 살린다. 이 공법은 기존목조구조에 추가하여 사용되어 질 수 있으며 콘크리트벽돌 벽을 대체할 수 있다.
Brick veeners 는 집의 건축에 반드시 필요한 부분은 아니나 더 나은 절연효과를 가져오면서, 벽의 외관을 유지하기위해 사용된다. 이 공법은 주로 단일 벽돌층만을 갖는 경향이 있다.
head(train)
## Id MSSubClass MSZoning LotFrontage LotArea Street Alley LotShape
## 1: 1 60 RL 65 8450 Pave NA Reg
## 2: 2 20 RL 80 9600 Pave NA Reg
## 3: 3 60 RL 68 11250 Pave NA IR1
## 4: 4 70 RL 60 9550 Pave NA IR1
## 5: 5 60 RL 84 14260 Pave NA IR1
## 6: 6 50 RL 85 14115 Pave NA IR1
## LandContour Utilities LotConfig LandSlope Neighborhood Condition1
## 1: Lvl AllPub Inside Gtl CollgCr Norm
## 2: Lvl AllPub FR2 Gtl Veenker Feedr
## 3: Lvl AllPub Inside Gtl CollgCr Norm
## 4: Lvl AllPub Corner Gtl Crawfor Norm
## 5: Lvl AllPub FR2 Gtl NoRidge Norm
## 6: Lvl AllPub Inside Gtl Mitchel Norm
## Condition2 BldgType HouseStyle OverallQual OverallCond YearBuilt
## 1: Norm 1Fam 2Story 7 5 2003
## 2: Norm 1Fam 1Story 6 8 1976
## 3: Norm 1Fam 2Story 7 5 2001
## 4: Norm 1Fam 2Story 7 5 1915
## 5: Norm 1Fam 2Story 8 5 2000
## 6: Norm 1Fam 1.5Fin 5 5 1993
## YearRemodAdd RoofStyle RoofMatl Exterior1st Exterior2nd MasVnrType
## 1: 2003 Gable CompShg VinylSd VinylSd BrkFace
## 2: 1976 Gable CompShg MetalSd MetalSd None
## 3: 2002 Gable CompShg VinylSd VinylSd BrkFace
## 4: 1970 Gable CompShg Wd Sdng Wd Shng None
## 5: 2000 Gable CompShg VinylSd VinylSd BrkFace
## 6: 1995 Gable CompShg VinylSd VinylSd None
## MasVnrArea ExterQual ExterCond Foundation BsmtQual BsmtCond
## 1: 196 Gd TA PConc Gd TA
## 2: 0 TA TA CBlock Gd TA
## 3: 162 Gd TA PConc Gd TA
## 4: 0 TA TA BrkTil TA Gd
## 5: 350 Gd TA PConc Gd TA
## 6: 0 TA TA Wood Gd TA
## BsmtExposure BsmtFinType1 BsmtFinSF1 BsmtFinType2 BsmtFinSF2 BsmtUnfSF
## 1: No GLQ 706 Unf 0 150
## 2: Gd ALQ 978 Unf 0 284
## 3: Mn GLQ 486 Unf 0 434
## 4: No ALQ 216 Unf 0 540
## 5: Av GLQ 655 Unf 0 490
## 6: No GLQ 732 Unf 0 64
## TotalBsmtSF Heating HeatingQC CentralAir Electrical 1stFlrSF 2ndFlrSF
## 1: 856 GasA Ex Y SBrkr 856 854
## 2: 1262 GasA Ex Y SBrkr 1262 0
## 3: 920 GasA Ex Y SBrkr 920 866
## 4: 756 GasA Gd Y SBrkr 961 756
## 5: 1145 GasA Ex Y SBrkr 1145 1053
## 6: 796 GasA Ex Y SBrkr 796 566
## LowQualFinSF GrLivArea BsmtFullBath BsmtHalfBath FullBath HalfBath
## 1: 0 1710 1 0 2 1
## 2: 0 1262 0 1 2 0
## 3: 0 1786 1 0 2 1
## 4: 0 1717 1 0 1 0
## 5: 0 2198 1 0 2 1
## 6: 0 1362 1 0 1 1
## BedroomAbvGr KitchenAbvGr KitchenQual TotRmsAbvGrd Functional
## 1: 3 1 Gd 8 Typ
## 2: 3 1 TA 6 Typ
## 3: 3 1 Gd 6 Typ
## 4: 3 1 Gd 7 Typ
## 5: 4 1 Gd 9 Typ
## 6: 1 1 TA 5 Typ
## Fireplaces FireplaceQu GarageType GarageYrBlt GarageFinish GarageCars
## 1: 0 NA Attchd 2003 RFn 2
## 2: 1 TA Attchd 1976 RFn 2
## 3: 1 TA Attchd 2001 RFn 2
## 4: 1 Gd Detchd 1998 Unf 3
## 5: 1 TA Attchd 2000 RFn 3
## 6: 0 NA Attchd 1993 Unf 2
## GarageArea GarageQual GarageCond PavedDrive WoodDeckSF OpenPorchSF
## 1: 548 TA TA Y 0 61
## 2: 460 TA TA Y 298 0
## 3: 608 TA TA Y 0 42
## 4: 642 TA TA Y 0 35
## 5: 836 TA TA Y 192 84
## 6: 480 TA TA Y 40 30
## EnclosedPorch 3SsnPorch ScreenPorch PoolArea PoolQC Fence MiscFeature
## 1: 0 0 0 0 NA NA NA
## 2: 0 0 0 0 NA NA NA
## 3: 0 0 0 0 NA NA NA
## 4: 272 0 0 0 NA NA NA
## 5: 0 0 0 0 NA NA NA
## 6: 0 320 0 0 NA MnPrv Shed
## MiscVal MoSold YrSold SaleType SaleCondition SalePrice
## 1: 0 2 2008 WD Normal 208500
## 2: 0 5 2007 WD Normal 181500
## 3: 0 9 2008 WD Normal 223500
## 4: 0 2 2006 WD Abnorml 140000
## 5: 0 12 2008 WD Normal 250000
## 6: 700 10 2009 WD Normal 143000
colSums(sapply(train, is.na))
## Id MSSubClass MSZoning LotFrontage LotArea
## 0 0 0 259 0
## Street Alley LotShape LandContour Utilities
## 0 1369 0 0 0
## LotConfig LandSlope Neighborhood Condition1 Condition2
## 0 0 0 0 0
## BldgType HouseStyle OverallQual OverallCond YearBuilt
## 0 0 0 0 0
## YearRemodAdd RoofStyle RoofMatl Exterior1st Exterior2nd
## 0 0 0 0 0
## MasVnrType MasVnrArea ExterQual ExterCond Foundation
## 8 8 0 0 0
## BsmtQual BsmtCond BsmtExposure BsmtFinType1 BsmtFinSF1
## 37 37 38 37 0
## BsmtFinType2 BsmtFinSF2 BsmtUnfSF TotalBsmtSF Heating
## 38 0 0 0 0
## HeatingQC CentralAir Electrical 1stFlrSF 2ndFlrSF
## 0 0 1 0 0
## LowQualFinSF GrLivArea BsmtFullBath BsmtHalfBath FullBath
## 0 0 0 0 0
## HalfBath BedroomAbvGr KitchenAbvGr KitchenQual TotRmsAbvGrd
## 0 0 0 0 0
## Functional Fireplaces FireplaceQu GarageType GarageYrBlt
## 0 0 690 81 81
## GarageFinish GarageCars GarageArea GarageQual GarageCond
## 81 0 0 81 81
## PavedDrive WoodDeckSF OpenPorchSF EnclosedPorch 3SsnPorch
## 0 0 0 0 0
## ScreenPorch PoolArea PoolQC Fence MiscFeature
## 0 0 1453 1179 1406
## MiscVal MoSold YrSold SaleType SaleCondition
## 0 0 0 0 0
## SalePrice
## 0
colSums(sapply(train[,.SD, .SDcols = cat_var], is.na)) # .SD로 서브셋 불러오기
## MSZoning Street Alley LotShape LandContour
## 0 0 1369 0 0
## Utilities LotConfig LandSlope Neighborhood Condition1
## 0 0 0 0 0
## Condition2 BldgType HouseStyle RoofStyle RoofMatl
## 0 0 0 0 0
## Exterior1st Exterior2nd MasVnrType ExterQual ExterCond
## 0 0 8 0 0
## Foundation BsmtQual BsmtCond BsmtExposure BsmtFinType1
## 0 37 37 38 37
## BsmtFinType2 Heating HeatingQC CentralAir Electrical
## 38 0 0 0 1
## KitchenQual Functional FireplaceQu GarageType GarageFinish
## 0 0 690 81 81
## GarageQual GarageCond PavedDrive PoolQC Fence
## 81 81 0 1453 1179
## MiscFeature SaleType SaleCondition
## 1406 0 0
colSums(sapply(train[,.SD, .SDcols = numeric_var], is.na))
## Id MSSubClass LotFrontage LotArea OverallQual
## 0 0 259 0 0
## OverallCond YearBuilt YearRemodAdd MasVnrArea BsmtFinSF1
## 0 0 0 8 0
## BsmtFinSF2 BsmtUnfSF TotalBsmtSF 1stFlrSF 2ndFlrSF
## 0 0 0 0 0
## LowQualFinSF GrLivArea BsmtFullBath BsmtHalfBath FullBath
## 0 0 0 0 0
## HalfBath BedroomAbvGr KitchenAbvGr TotRmsAbvGrd Fireplaces
## 0 0 0 0 0
## GarageYrBlt GarageCars GarageArea WoodDeckSF OpenPorchSF
## 81 0 0 0 0
## EnclosedPorch 3SsnPorch ScreenPorch PoolArea MiscVal
## 0 0 0 0 0
## MoSold YrSold SalePrice
## 0 0 0
리모델링된 집들의 숫자에 대해서 인사이트를 좀 얻어 보자. 데이터 설명에 따르면, YearBuilt의 날짜가 YearRemodAdd의 날짜와 다르다면, 그 집은 리모델링 된것이다. 이 두 열을 비교해보면 696개의 집들이 리모델링 되었고 764개의 집들이 리모델링 되지 않았다
#with =FALSE는 문자열을 컬럼 이름으로 취급한다.
sum(train[,'YearRemodAdd', with = FALSE] != train[,'YearBuilt', with = FALSE])
## [1] 696
cat('Percentage of houses remodeled',sum(train[,'YearRemodAdd', with = FALSE] != train[,'YearBuilt', with = FALSE])/ dim(train)[1])
## Percentage of houses remodeled 0.4767123
train %>% select(YearBuilt, YearRemodAdd) %>% mutate(Remodeled = as.integer(YearBuilt != YearRemodAdd)) %>% ggplot(aes(x= factor(x = Remodeled, labels = c( 'No','Yes')))) + geom_bar() + xlab('Remodeled') + theme_light()
Summarize the numeric values and the structure of the data.
summary(train[,.SD, .SDcols =numeric_var])
## Id MSSubClass LotFrontage LotArea
## Min. : 1.0 Min. : 20.0 Min. : 21.00 Min. : 1300
## 1st Qu.: 365.8 1st Qu.: 20.0 1st Qu.: 59.00 1st Qu.: 7554
## Median : 730.5 Median : 50.0 Median : 69.00 Median : 9478
## Mean : 730.5 Mean : 56.9 Mean : 70.05 Mean : 10517
## 3rd Qu.:1095.2 3rd Qu.: 70.0 3rd Qu.: 80.00 3rd Qu.: 11602
## Max. :1460.0 Max. :190.0 Max. :313.00 Max. :215245
## NA's :259
## OverallQual OverallCond YearBuilt YearRemodAdd
## Min. : 1.000 Min. :1.000 Min. :1872 Min. :1950
## 1st Qu.: 5.000 1st Qu.:5.000 1st Qu.:1954 1st Qu.:1967
## Median : 6.000 Median :5.000 Median :1973 Median :1994
## Mean : 6.099 Mean :5.575 Mean :1971 Mean :1985
## 3rd Qu.: 7.000 3rd Qu.:6.000 3rd Qu.:2000 3rd Qu.:2004
## Max. :10.000 Max. :9.000 Max. :2010 Max. :2010
##
## MasVnrArea BsmtFinSF1 BsmtFinSF2 BsmtUnfSF
## Min. : 0.0 Min. : 0.0 Min. : 0.00 Min. : 0.0
## 1st Qu.: 0.0 1st Qu.: 0.0 1st Qu.: 0.00 1st Qu.: 223.0
## Median : 0.0 Median : 383.5 Median : 0.00 Median : 477.5
## Mean : 103.7 Mean : 443.6 Mean : 46.55 Mean : 567.2
## 3rd Qu.: 166.0 3rd Qu.: 712.2 3rd Qu.: 0.00 3rd Qu.: 808.0
## Max. :1600.0 Max. :5644.0 Max. :1474.00 Max. :2336.0
## NA's :8
## TotalBsmtSF 1stFlrSF 2ndFlrSF LowQualFinSF
## Min. : 0.0 Min. : 334 Min. : 0 Min. : 0.000
## 1st Qu.: 795.8 1st Qu.: 882 1st Qu.: 0 1st Qu.: 0.000
## Median : 991.5 Median :1087 Median : 0 Median : 0.000
## Mean :1057.4 Mean :1163 Mean : 347 Mean : 5.845
## 3rd Qu.:1298.2 3rd Qu.:1391 3rd Qu.: 728 3rd Qu.: 0.000
## Max. :6110.0 Max. :4692 Max. :2065 Max. :572.000
##
## GrLivArea BsmtFullBath BsmtHalfBath FullBath
## Min. : 334 Min. :0.0000 Min. :0.00000 Min. :0.000
## 1st Qu.:1130 1st Qu.:0.0000 1st Qu.:0.00000 1st Qu.:1.000
## Median :1464 Median :0.0000 Median :0.00000 Median :2.000
## Mean :1515 Mean :0.4253 Mean :0.05753 Mean :1.565
## 3rd Qu.:1777 3rd Qu.:1.0000 3rd Qu.:0.00000 3rd Qu.:2.000
## Max. :5642 Max. :3.0000 Max. :2.00000 Max. :3.000
##
## HalfBath BedroomAbvGr KitchenAbvGr TotRmsAbvGrd
## Min. :0.0000 Min. :0.000 Min. :0.000 Min. : 2.000
## 1st Qu.:0.0000 1st Qu.:2.000 1st Qu.:1.000 1st Qu.: 5.000
## Median :0.0000 Median :3.000 Median :1.000 Median : 6.000
## Mean :0.3829 Mean :2.866 Mean :1.047 Mean : 6.518
## 3rd Qu.:1.0000 3rd Qu.:3.000 3rd Qu.:1.000 3rd Qu.: 7.000
## Max. :2.0000 Max. :8.000 Max. :3.000 Max. :14.000
##
## Fireplaces GarageYrBlt GarageCars GarageArea
## Min. :0.000 Min. :1900 Min. :0.000 Min. : 0.0
## 1st Qu.:0.000 1st Qu.:1961 1st Qu.:1.000 1st Qu.: 334.5
## Median :1.000 Median :1980 Median :2.000 Median : 480.0
## Mean :0.613 Mean :1979 Mean :1.767 Mean : 473.0
## 3rd Qu.:1.000 3rd Qu.:2002 3rd Qu.:2.000 3rd Qu.: 576.0
## Max. :3.000 Max. :2010 Max. :4.000 Max. :1418.0
## NA's :81
## WoodDeckSF OpenPorchSF EnclosedPorch 3SsnPorch
## Min. : 0.00 Min. : 0.00 Min. : 0.00 Min. : 0.00
## 1st Qu.: 0.00 1st Qu.: 0.00 1st Qu.: 0.00 1st Qu.: 0.00
## Median : 0.00 Median : 25.00 Median : 0.00 Median : 0.00
## Mean : 94.24 Mean : 46.66 Mean : 21.95 Mean : 3.41
## 3rd Qu.:168.00 3rd Qu.: 68.00 3rd Qu.: 0.00 3rd Qu.: 0.00
## Max. :857.00 Max. :547.00 Max. :552.00 Max. :508.00
##
## ScreenPorch PoolArea MiscVal MoSold
## Min. : 0.00 Min. : 0.000 Min. : 0.00 Min. : 1.000
## 1st Qu.: 0.00 1st Qu.: 0.000 1st Qu.: 0.00 1st Qu.: 5.000
## Median : 0.00 Median : 0.000 Median : 0.00 Median : 6.000
## Mean : 15.06 Mean : 2.759 Mean : 43.49 Mean : 6.322
## 3rd Qu.: 0.00 3rd Qu.: 0.000 3rd Qu.: 0.00 3rd Qu.: 8.000
## Max. :480.00 Max. :738.000 Max. :15500.00 Max. :12.000
##
## YrSold SalePrice
## Min. :2006 Min. : 34900
## 1st Qu.:2007 1st Qu.:129975
## Median :2008 Median :163000
## Mean :2008 Mean :180921
## 3rd Qu.:2009 3rd Qu.:214000
## Max. :2010 Max. :755000
##
cat('Train has', dim(train)[1], 'rows and', dim(train)[2], 'columns.')
## Train has 1460 rows and 81 columns.
cat('Test has', dim(test)[1], 'rows and', dim(test)[2], ' columns.')
## Test has 1459 rows and 80 columns.
# train셋에서 결측데이터의 비율.
sum(is.na(train)) / (nrow(train) *ncol(train))
## [1] 0.05889565
# test셋에서 결측데이터의 비율.
sum(is.na(test)) / (nrow(test) * ncol(test))
## [1] 0.05997258
# 중복된 행 데이터 확인.
cat("The number of duplicated rows are", nrow(train) - nrow(unique(train)))
## The number of duplicated rows are 0
####문자를 팩터형으로 바꾸기
train[,(cat_var) := lapply(.SD, as.factor), .SDcols = cat_var]
train_cat <- train[,.SD, .SDcols = cat_var]
train_cont <- train[,.SD,.SDcols = numeric_var]
plotHist <- function(data_in, i) {
data <- data.frame(x=data_in[[i]])
p <- ggplot(data=data, aes(x=factor(x))) + stat_count() + xlab(colnames(data_in)[i]) + theme_light() +
theme(axis.text.x = element_text(angle = 90, hjust =1))
return (p)
}
doPlots <- function(data_in, fun, ii, ncol=3) {
pp <- list()
for (i in ii) {
p <- fun(data_in=data_in, i=i)
pp <- c(pp, list(p))
}
do.call("grid.arrange", c(pp, ncol=ncol))
}
plotDen <- function(data_in, i){
data <- data.frame(x=data_in[[i]], SalePrice = data_in$SalePrice)
p <- ggplot(data= data) + geom_line(aes(x = x), stat = 'density', size = 1,alpha = 1.0) +
xlab(paste0((colnames(data_in)[i]), '\n', 'Skewness: ',round(skewness(data_in[[i]], na.rm = TRUE), 2))) + theme_light()
return(p)
}
Barplots for the categorical features
밑에 있는 막대 그래프는 데이터에 대한 더 많은 인사이트를 제공한다. MSZoning : 막대그래프는 대부분의 집들이 저밀도 거주지역과 중밀도 거주지역에 있다는것을 나타낸다.
집으로 연결된 도로의 종류는 포장도로인 경우가 많고 집들은 골목을 가지고 있지 않다.(아마 집들이 많이 떨어져 있다는 말 같다.)
- Landcontour: 평평한 땅에 집들이 지어졌다.
- Utilities: 거의 모든 집들은공동시설을 갖추었다. (E,G,W, & S)
- LandSlope: 대부분의 땅들은 완만한 경사를 가진다.
doPlots(train_cat, fun = plotHist, ii = 1:4, ncol = 2)
doPlots(train_cat, fun = plotHist, ii = 4:8, ncol = 2)
doPlots(train_cat, fun = plotHist, ii = 8:12, ncol = 2)
doPlots(train_cat, fun = plotHist, ii = 13:18, ncol = 2)
doPlots(train_cat, fun = plotHist, ii = 18:22, ncol = 2)
급격한 경사를 가진 집들은 Clear Creek과 Timberland에 위치해 있다. 적당한 경사를 가진 집들은 다른 동네에 있다. Clear Creek과 Timberland 주위가 높은 경사를 가지고 있는것 처럼 보인다.
train %>% select(LandSlope, Neighborhood, SalePrice) %>% filter(LandSlope == c('Sev', 'Mod')) %>% arrange(Neighborhood) %>% group_by(Neighborhood, LandSlope) %>% summarize(Count = n()) %>% ggplot(aes(Neighborhood, Count)) + geom_bar(aes(fill = LandSlope), position = 'dodge', stat = 'identity') + theme_light() +theme(axis.text.x = element_text(angle = 90, hjust =1))
지역들과 Sale Price 간에 막대그래프를 그리면 BrookSide와 South & West of Iowa State University가 값싼 집들을 가지고 있는 것을 볼수 있다. 반면 Northridge와 Northridge Heights는 가격의 관점에서는 이상치를 가진 부자동네이다.
train %>% select(Neighborhood, SalePrice) %>% ggplot(aes(factor(Neighborhood), SalePrice)) + geom_boxplot() + theme(axis.text.x = element_text(angle = 90, hjust =1)) + xlab('Neighborhoods')
Density plots for numeric variables.
변수에 대한 밀도 그래프는 변수들이 왜도가 있는지를 나타낸다. YearBuilt에 대한 밀도함수는 데이터셋이 새로지은 집과 오래된 집이 섞여 있다는걸 보여준다. 이것은 아마도 주택 위기 때문에, 최근 주택수의 하락세을 보여준다.
doPlots(train_cont, fun = plotDen, ii = 2:6, ncol = 2)
## Warning: Removed 259 rows containing non-finite values (stat_density).
doPlots(train_cont, fun = plotDen, ii = 7:12, ncol = 2)
## Warning: Removed 8 rows containing non-finite values (stat_density).
doPlots(train_cont, fun = plotDen, ii = 13:17, ncol = 2)
아래 히스토그램은 대부분의 집이 2개의 full bath와 0개의 half baths 그리고 평균 3개의 bedrooms를 가진다는 것을 보았다.
doPlots(train_cont, fun = plotHist, ii = 18:23, ncol = 2)
Explore the correlation
correlations <- cor(na.omit(train_cont[,-1, with = FALSE]))
# correlations
row_indic <- apply(correlations, 1, function(x) sum(x > 0.3 | x < -0.3) > 1)
correlations<- correlations[row_indic ,row_indic ]
corrplot(correlations, method="square")
Plot scatter plot for variables that have high correlation.
아래 상관계수 행렬은 housing price와 양이고 강하게 상관있는 몇몇 변수가 있다는걸 보여준다.
The correlation matrix below shows that there are several variables that are strongly and positively correlated with housing price.
높은 양의 상관관계의 변수들:
- OverallQual
- YearBuilt
- YearRemodAdd
- MasvnrArea
- BsmtFinSF1
- TotalBsmtSF
- 1stFlrSF
- GrLiveArea
- FullBath
- TotRmsAbvGrd
- FirePlaces
- GarageYrBlt
- GarageCars
- GarageArea
- WoodDeskSF
- OpenPorchSF
enclosed porches의 숫자와 year built는 음의 상관관계를 가진다. 잠재적인 집 구매자들이 enclosed porch를 싫어하고 최근 주택건설자들이 enclosed porch를 덜 짓는 것처럼 보인다. 이것은 또한 SalsPrice와 음의 상관관계를 갖는 데 이 또한 말이 된다.
OverallCond 와 SalePrice 간에 약한 음의 상관관계를 가지고 있다. Yearbuilt 와 OverallCond 사이에는 강한 음의 상관관계가 있다. 이것은 최근 지어진 집들이 전반적으로 더 나쁜 상태인 것으로 보인다.
train %>% select(OverallCond, YearBuilt) %>% ggplot(aes(factor(OverallCond),YearBuilt)) + geom_boxplot() + xlab('Overall Condition')
plotCorr <- function(data_in, i){
data <- data.frame(x = data_in[[i]], SalePrice = data_in$SalePrice)
p <- ggplot(data, aes(x = x, y = SalePrice)) + geom_point(shape = 1, na.rm = TRUE) + geom_smooth(method = lm ) + xlab(paste0(colnames(data_in)[i], '\n', 'R-Squared: ', round(cor(data_in[[i]], data$SalePrice, use = 'complete.obs'), 2))) + theme_light()
return(suppressWarnings(p))
}
highcorr <- c(names(correlations[,'SalePrice'])[which(correlations[,'SalePrice'] > 0.5)], names(correlations[,'SalePrice'])[which(correlations[,'SalePrice'] < -0.2)])
data_corr <- train[,highcorr, with = FALSE]
doPlots(data_corr, fun = plotCorr, ii = 1:6)
doPlots(data_corr, fun = plotCorr, ii = 6:11)
## Warning: Removed 81 rows containing non-finite values (stat_smooth).
종속변수 SalePrice 에 대한 히스토그램은 왜도를 보인다. 따라서 로그를 취하여 정규화 시켜보자.
library(scales)
ggplot(train, aes(x=SalePrice)) + geom_histogram(col = 'white') + theme_light() +scale_x_continuous(labels = comma)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
summary(train[,.(SalePrice)])
## SalePrice
## Min. : 34900
## 1st Qu.:129975
## Median :163000
## Mean :180921
## 3rd Qu.:214000
## Max. :755000
# 정규분포화 시키기
ggplot(train, aes(x=log(SalePrice+1))) + geom_histogram(col = 'white') + theme_light()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
'Kaggle > House Prices' 카테고리의 다른 글
Detailed Data Exploration in Python by Angela (With Python) (0) | 2016.11.15 |
---|---|
Ensemble Modeling : Stack Model Example by J.Thompson (with R) (0) | 2016.11.13 |
Boruta Feature Importance Analysis by Jim Thompson (With R) (0) | 2016.11.09 |
Regularized Linear Models by Alexandru Papiu (With Python) (0) | 2016.11.08 |
Data Description (0) | 2016.10.31 |