데이터 타입 지정
str(titanic)을 살펴보면 pclass는 1등석이 1, 2등석이 2, 3등석이 3인 정수(int)로 표현되어 있다. 그러나 이들 사이에 사칙 연산 관계가 존재하는 것은 아니므로, 숫자로 취급하기보다는 범주형 변수인 팩터로 표현하는 것이 낫다.
survived 역시 생존 여부를 뜻하므로 팩터 타입으로 설정해야 R의 기계 학습 함수를 호출했을 때 분류classification 알고리즘이 수행된다. 만약 현재처럼 정수int로 둘 경우 회귀 분석regression을 수행해버리게 된다.
마지막으로 name, ticket, cabin은 레벨level의 수가 너무 많으므로 팩터로 나타내기보다는 단순 문자열character로 취급하도록 하자.
> titanic$pclass <- as.factor(titanic$pclass) > titanic$name <- as.character(titanic$name) > titanic$ticket <- as.character(titanic$ticket) > titanic$cabin <- as.character(titanic$cabin) > titanic$survived <- factor(titanic$survived, levels=c(0, 1), labels=c("dead", "survived")) > str(titanic) 'data.frame': 1309 obs. of 11 variables: $ pclass : Factor w/ 3 levels "1","2","3": 1 1 1 1 1 1 1 1 1 1 ... $ survived: Factor w/ 2 levels "dead","survived": 2 2 1 1 1 2 2 1 ... $ name : chr "Allen, Miss. Elisabeth Walton" ... $ sex : Factor w/ 2 levels "female","male": 1 2 1 2 1 2 1 2 1 ... $ age : num 29 0.92 2 30 25 48 63 39 53 71 ... $ sibsp : int 0 1 1 1 1 0 1 0 2 0 ... $ parch : int 0 2 2 2 2 0 0 0 0 0 ... $ ticket : chr "24160" "113781" "113781" "113781" ... $ fare : num 211 152 152 152 152 ... $ cabin : chr "B5" "C22 C26" "C22 C26" "C22 C26" ... $ embarked: Factor w/ 4 levels "","C","Q","S": 4 4 4 4 4 4 4 4 4 2 ...
str( )을 확인해본 결과 값이 올바른 데이터 타입으로 저장되었음을 볼 수 있다.
그런데 embarked에 조금 이상한 값이 보인다. 팩터 레벨에 “” 값이 있다. 이 값이 어떻게 쓰이고 있는지 확인해보자.
> levels(titanic$embarked) [1] "" "C" "Q" "S" > table(titanic$embarked) C Q S 2 270 123 914
“” 값이 2개 행에 존재하고 있음을 볼 수 있다. read.csv( )가 CSV 파일을 그대로 읽어들인다는 점을 생각해보면, 빈 문자열인 “”는 NA를 의미함을 짐작할 수 있다. “”를 NA로 수정해보자.
> levels(titanic$embarked)[1] <- NA > table(titanic$embarked, useNA="always") C Q S270 123 914 2
수정 결과 “”가 NA로 잘 치환되었다. table( ) 함수는 NA 값을 제외하고 값을 출력시키므로, useNA에 always를 지정해 NA에 대한 개수도 출력하도록 하여 빈도를 확인했다.
cabin 컬럼에도 빈 문자열이 저장되어 있다. 이 값 역시 NA로 바꿔보자.
> titanic$cabin <- ifelse(titanic$cabin == "", NA, titanic$cabin)
이처럼 팩터의 레벨을 바꾸는 경우와 달리 문자열은 직접 값을 수정하면 된다. 마지막으로 str( ), head( ), View( ) 등의 명령을 사용해 데이터가 잘 변경되었는지 확인해본다.
> str(titanic)
'data.frame': 1309 obs. of 11 variables:
$ pclass : Factor w/ 3 levels "1","2","3": 1 1 1 1 1 1 1 1 1 1 ...
$ survived: Factor w/ 2 levels "dead","survived": 2 2 1 1 1 2 2 ...
$ name : chr "Allen, Miss. Elisabeth Walton" ...
$ sex : Factor w/ 2 levels "female","male": 1 2 1 2 1 2 1 2 ...
$ age : num 29 0.92 2 30 25 48 63 39 53 71 ...
$ sibsp : int 0 1 1 1 1 0 1 0 2 0 ...
$ parch : int 0 2 2 2 2 0 0 0 0 0 ...
$ ticket : chr "24160" "113781" "113781" "113781" ...
$ fare : num 211 152 152 152 152 ...
$ cabin : chr "B5" "C22 C26" "C22 C26" "C22 C26" ...
$ embarked: Factor w/ 3 levels "C","Q","S": 3 3 3 3 3 3 3 3 3 1 ...