데이터 분석/R 데이터 처리 & 분석

[R데이터분석] factor함수 범주형 변수 다루기

love R 2020. 1. 23. 03:17
반응형

[R데이터분석] 범주형 변수 다루기 (factor함수 활용)

 

이번 포스팅은 factor형 데이터 타입에 대해 자세히 알아보겠습니다.
R의 factor형은 범주화된 변수의 종류를 나타내기 위해 사용합니다.
범주형 자료란 변수를 특정 기준으로 배타적으로 나눌 수 있는 자료입니다.

 

예를 들면 다음과 같은 자료입니다.
성별(남/여), 학점(A/B/C/D/…), 지역(서울시/경기도/충청도/강원도/…)

 

R에서 범주형자료를 다룰 때는 문자형 자료와 잘 구별할 수 있어야 합니다.

미리 범주형인지 문자형인지 확인하고 적절하게 분석 목적에 맞게끔 변환시켜야 합니다.
이러한 과정들이 모두 데이터전처리의 일부입니다.

factor 함수 형태는 다음과 같습니다.

 

 

여기서 예제를 하나 보겠습니다.

데이터에는 카페 별 커피 가격이 나와있습니다.

 

이 때 오른쪽 테이블처럼 D업체의 아메리카노 가격을 추가하고 싶습니다.

 

먼저 데이터셋을 만듭니다.

data_test <- data.frame(name=c("A","B","C"),americano_cost = c(4800,4100,4300))

data_test 
  name americano_cost
1    A           4800
2    B           4100
3    C           4300

잘 만들어졌죠?
이제 D업체의 아메리카노가격을 데이터셋에 추가해봅시다.

 

 

하지만 그 전에 데이터셋의 구조를 확인합니다.
데이터셋의 구조는 str(데이터셋명) 이라는 함수를 써서 확인할 수 있습니다.
참고로 데이터셋 구조를 확인하는 것은 어떤 분석을 하든 상관없이 필수적으로 수행해야 합니다.

str(data_test)
'data.frame':   3 obs. of  2 variables:
 $ name          : Factor w/ 3 levels "A","B","C": 1 2 3
 $ americano_cost: num  4800 4100 4300

 

 

 

결과를 보니 프랜차이즈명에 factor 형으로 설정되어 있네요. 추가적으로 levels(수준) 가 A,B,C 로 설정되어 있습니다.
이 상태에서는 D업체를 추가하지 못합니다.

data_test2 <- rbind(data_test,c("D",2700))
Warning in `[<-.factor`(`*tmp*`, ri, value = "D"): invalid factor level, NA
generated

유효하지 않은 범주형 변수 수준(invalid factor level)을 가진다고 나오네요.

 

 

data_test2
  name americano_cost
1    A           4800
2    B           4100
3    C           4300
4 <NA>           2700

데이터를 보면 D가 아니라 NA(결측값)으로 입력이 되었네요. 먼저 levels(수준)을 A,B,C,D 로 설정해주어야 합니다.
다시 말해서, factor형 변수의 levels(수준)을 A,B,C에 D를 추가해야 합니다.

다음 코드를 통해 현재 설정되어 있는 범주형 변수의 수준을 확인합니다.

levels(데이터셋명$변수명) 를 쓰면 확인할 수 있습니다.

 

 

levels(data_test2$name)
[1] "A" "B" "C"

위 결과를 보니 D가 없네요.
그러면 여기에 D를 추가하겠습니다.

 

levels(data_test$name) <- c('A','B','C','D')
levels(data_test$name) 
[1] "A" "B" "C" "D"

c(‘A’,‘B’,‘C’,‘D’) 는 벡터의 요소가 A,B,C,D 이고 왼쪽에 있는 범주형 변수의 levels(수준)에 할당하였습니다.
여기까지 작업을 마쳤다면 정상적으로 값이 추가될 수 있습니다.

 

 

data_test3 <- rbind(data_test,c("D",2700))
data_test3
  name americano_cost
1    A           4800
2    B           4100
3    C           4300
4    D           2700

결과에서 D업체의 아메리카노 가격이 정상적으로 추가되었네요.

 

그러면~! 이제 반대로 카페 범주에서 A업체를 제거해보겠습니다.

data_test4 <- data_test3
data_test4$name<- factor(data_test3$name,levels = c('B','C','D'))
data_test4
  name americano_cost
1 <NA>           4800
2    B           4100
3    C           4300
4    D           2700

위 결과를 보면 A업체가 없어진 걸 볼 수 있습니다.

 

이해 안가는 부분이 있으면 댓글로 남겨주시고 공감 꾹 눌러주세요^^

 

 

 

 

 

 

반응형