본문으로 바로가기



능선회귀분석 with R - 1. 데이터 마련하기

category Statistics/Linear models 2017.06.12 13:30
능선회귀분석 with R - 1. 데이터 마련하기

앞으로의 포스팅은 예전 포스팅에서 알아봤던 능선회귀의 해를 실제 데이터를 가지고 어떻게 구하는지에 대하여 알아보도록 하겠다. 이것을 위해서는 먼저 인터넷에 있는 데이터를 받아와 R 프로그램에서 다룰 수 있도록 데이터를 R로 import 방법에 대하여 알아보자.

이번 포스팅에서 사용할 패키지는 다음과 같다.

library(magrittr)
library(knitr)

Housing Data set

이번 포스팅에 쓰일 데이터 셋은 University of California, Irvine의 머신러닝 repository에서 제공하는 [Housing](https://archive.ics.uci.edu/ml/datasets/Housing) 데이터이다. 이 데이터 셋은 보스턴 외각지역의 집값과 그것들과 관계가 되어있는 여러 변수들을 포함하고 있다.


다음은 각 변수들에 대한 설명이다. 데이터에 대한 좀 더 자세한 사항은 설명 페이지를 참고하도록 하자.

1. CRIM      per capita crime rate by town
2. ZN        proportion of residential land zoned for lots over 
             25,000 sq.ft.
3. INDUS     proportion of non-retail business acres per town
4. CHAS      Charles River dummy variable (= 1 if tract bounds 
             river; 0 otherwise)
5. NOX       nitric oxides concentration (parts per 10 million)
6. RM        average number of rooms per dwelling
7. AGE       proportion of owner-occupied units built prior to 1940
8. DIS       weighted distances to five Boston employment centres
9. RAD       index of accessibility to radial highways
10. TAX      full-value property-tax rate per $10,000
11. PTRATIO  pupil-teacher ratio by town
12. B        1000(Bk - 0.63)^2 where Bk is the proportion of blacks 
             by town
13. LSTAT    % lower status of the population
14. MEDV     Median value of owner-occupied homes in $1000's

우리는 MEDV를 종속변수로, 나머지 1에서 13까지의 변수들을 독립변수로 하는 능선회귀를 적용하는 방법에 대하여 알아보도록 하자. 따라서 사용될 총 독립변수의 수는 13개이며, 이 중에서 CHAS 변수(Charles 강이 집 주변에 있는지 없는지는 나타내는 변수)는 0 혹은 1을 가지는 바이너리 변수라는 것을 알 수 있다.

데이터 셋 불러오기

데이터를 UCI페이지에서 직접 불러 올 수도 있지만, 테이터가 이미 탭으로 나뉘어져진 파일을 필자의 github 페이지에 올려놓았으므로 이를 이용하도록 하자. 필자의 데이터셋은 첫번째 변수가 종속변수인 MEDV이며, 나머지 변수들이 위의 순서대로 위치하고 있다.

houseData <- readLines("https://raw.githubusercontent.com/issactoast/Machine-Learning-with-R/master/Data/house.txt") %>% paste(collapse = "\n")
houseData <- read.table(text = houseData, header = FALSE, sep = ":")
colnames(houseData) <- c("MEDV", "CRIM", "ZN", "INDUS",
                         "CHAS", "NOX", "RM", "AGE",
                         "DIS", "RAD", "TAX", "PTRATIO",
                         "B", "LSTAT")
kable(head(houseData), format = "markdown", padding = 2)
MEDV CRIM ZN INDUS CHAS NOX RM AGE DIS RAD TAX PTRATIO B LSTAT
24.0 1 0.00632 2 18.00 3 2.310 4 0 5 0.5380 6 6.5750 7 65.20 8 4.0900 9 1 10 296.0 11 15.30 12 396.90 13 4.98
21.6 1 0.02731 2 0.00 3 7.070 4 0 5 0.4690 6 6.4210 7 78.90 8 4.9671 9 2 10 242.0 11 17.80 12 396.90 13 9.14
34.7 1 0.02729 2 0.00 3 7.070 4 0 5 0.4690 6 7.1850 7 61.10 8 4.9671 9 2 10 242.0 11 17.80 12 392.83 13 4.03
33.4 1 0.03237 2 0.00 3 2.180 4 0 5 0.4580 6 6.9980 7 45.80 8 6.0622 9 3 10 222.0 11 18.70 12 394.63 13 2.94
36.2 1 0.06905 2 0.00 3 2.180 4 0 5 0.4580 6 7.1470 7 54.20 8 6.0622 9 3 10 222.0 11 18.70 12 396.90 13 5.33
28.7 1 0.02985 2 0.00 3 2.180 4 0 5 0.4580 6 6.4300 7 58.70 8 6.0622 9 3 10 222.0 11 18.70 12 394.12 13 5.21

위의 결과값을 자세히 살펴보면, 각 값들 뒤에 변수들의 인덱스(index)가 붙어있는 것을 알 수 있다. 붙어있는 인덱스 값 앞에 띄어쓰기가 한 칸씩 되어있는 것을 이용하여 다음과 같은작업을 해주도록 하자.

for (i in 1:dim(houseData)[2]){
houseData[,i] <- gsub(paste("",i), "", houseData[,i])
}
dim(houseData)
## [1] 506  14
kable(head(houseData), format = "markdown", padding = 2)
MEDV CRIM ZN INDUS CHAS NOX RM AGE DIS RAD TAX PTRATIO B LSTAT
24.0 0.00632 18.00 2.310 0 0.5380 6.5750 65.20 4.0900 1 296.0 15.30 396.90 4.98
21.6 0.02731 0.00 7.070 0 0.4690 6.4210 78.90 4.9671 2 242.0 17.80 396.90 9.14
34.7 0.02729 0.00 7.070 0 0.4690 7.1850 61.10 4.9671 2 242.0 17.80 392.83 4.03
33.4 0.03237 0.00 2.180 0 0.4580 6.9980 45.80 6.0622 3 222.0 18.70 394.63 2.94
36.2 0.06905 0.00 2.180 0 0.4580 7.1470 54.20 6.0622 3 222.0 18.70 396.90 5.33
28.7 0.02985 0.00 2.180 0 0.4580 6.4300 58.70 6.0622 3 222.0 18.70 394.12 5.21

이것으로 데이터 클리닝 작업이 끝났다. 얻어진 데이터의 수를 확인해보면 총 506개의 관측값이 존재하는 것을 알 수 있다.

다음 포스팅에서는 이렇게 얻은 데이터를 사용하여 실제 능선회귀의 해를 추정하는 방법에 대하여 알아보도록 하겠다.


추가내용: 앞으로의 포스팅에서 능선회귀를 구하는 과정에서 수치적인 내용을 설명하기 위해서 행렬곱이나 역행렬들을 구하기 위해서 데이터를 dataframe에서 numeric matrix로 바꿔서 다루고 있습니다. 코드는 다음과 같습니다.

houseData <- houseData %>% unlist() %>% as.numeric() %>% matrix(ncol = 14)

SHARE TO



티스토리 툴바