Factor
변수는 명목형(nominal), 순서형(ordinal) 또는 연속형(continumous)으로 설명할 수 있습니다. 명목 변수는 암시적 순서 없이 범주형입니다. 당뇨병(Type1, Type2)은 명목 변수의 예입니다. 데이터에서 Type1이 1로 코딩되고 Type2가 2로 코딩되더라도 순서를 의미하지 않습니다. 순서 변수는 순서를 의미하지만 양은 의미하지 않습니다. 상태(나쁨, 개선됨, 우수함)는 각각의 순서를 지정할 수 있지만 그 순서간의 차이는 명확하지 않습니다. 연속 변수는 특정 범위 내에서 임의의 값을 취할 수 있으며 순서와 양이 모두 암시됩니다. 연령(년)은 연속 변수이며 14.5 또는 22.8 및 그 사이의 값들을 사용할 수 있습니다. 15세인 사람이 14세인 사람보다 한 살 많다는 것을 알고 있습니다. R의 범주형 및 순서형 변수를 요인(factor)이라고 합니다. 요인은 데이터를 시각적으로 분석하고 표시하는 방법을 결정하기 때문에 R에서 중요하며 R의 factor() 함수는 범주형(순서형을 포함) 값을 [1... k] 범위의 정수 벡터로 저장하고(여기서 k는 명목 변수의 고유값 수) 문자열의 내부 벡터(원래 값) 이 정수에 매핑됩니다. 다음 벡터 diabetes는 두 개의 범주로 목록화 할 수 있습니다. 이렇게 데이터의 고유값들을 수준(level)이라고 합니다. factor()함수는 벡터의 값들과 level을 함께 반환합니다.diabetes<-c('type1', 'type2', 'type1', 'type1') diafact<-factor(diabetes); diafact
[1] type1 type2 type1 type1 Levels: type1 type2순서형 변수의 경우 인자 ordered=TRUE를 첨가하여 각 목록의 순서를 지정합니다. 이 경우 순서는 기본적으로 알파벳 순으로 지정됩니다. 예를 들어 다음의 경우 excellent=1, improved=2, poor=3으로 순서가 지정됩니다.
status<-c('poor', 'improved', 'excellent', 'poor') statfac<-factor(status, ordered=TRUE); statfac
[1] poor improved excellent poor Levels: excellent < improved < poor많은 경우 default인 알파벳 정렬은 데이터의 목록화에 불충분합니다. 대신에 factor()함수에서 그 순서를 지정합니다.
factor(벡터, order=TRUE, levels=수준벡터
statfac<-factor(status, order=TRUE, levels=c('poor','improved', 'excellent')); statfac
[1] poor improved excellent poor Levels: poor < improved < excellent위 두 요인들을 데이터프레임으로 묶어 봅니다.
da<-data.frame(diafact, statfac); da
diafact statfac 1 type1 poor 2 type2 improved 3 type1 excellent 4 type1 poor위 객체의 정보는
str()
함수에 의해 확인할 수 있습니다.
str(da)
'data.frame': 4 obs. of 2 variables: $ diafact: Ord.factor w/ 2 levels "type1"<"type2": 1 2 1 1 $ statfac: Ord.factor w/ 3 levels "poor"<"improved"<..: 1 2 3 1
summary()
함수는 객체의 요약 통계량을 반환합니다. 요인변수인 경우는 각 levle의 빈도수를 나타냅니다.
summary(da)
diafact statfac type1:3 poor :2 type2:1 improved :1 excellent:1위 결과 역시 데이터프레임 구조이므로 인덱스에 의해 각 요소를 호출할 수 있습니다.
summary(da)[,1]
type1:3 " "type2:1 " NA
summary(da)[,2]
"poor :2 " "improved :1 " "excellent:1 "다음은 숫자형 벡터를 요인으로 목록화 한 것입니다. 1에서 4번의 공들 중에서 무작위로 10개를 선택한 것이라고 합시다.
x<-sample(1:4, 10, replace=TRUE); x
[1] 2 3 3 1 2 4 2 4 2 4위 객체는 각각 1번 공, 2번 공, 3번 공, 그리고 4번 공으로 그룹화할 수 있습니다. 이 경우 1,2,3,4를 데이터의 수준(level)으로 합니다.
xf<-factor(x); xf
[1] 2 3 3 1 2 4 2 4 2 4 Levels: 1 2 3 4
attributes(xf)
$levels [1] "1" "2" "3" "4" $class [1] "factor"factor 객체의 levels은 인덱스 1이나
levels()
함수로 확인할 수 있습니다.
xf[1]
[1] 2 Levels: 1 2 3 4
levels(xf)
[1] "1" "2" "3" "4"다음은 'languag', 'math', 'science'의 시험 결과들 중 25개를 선택하여 각 과목의 평균을 계산해 봅니다.
dep<-sample(c('language', 'math', 'science'), 25, replace=TRUE); dep
[1] "math" "language" "science" "language" "math" "science" [7] "math" "science" "math" "language" "language" "language" [13] "language" "math" "math" "math" "science" "science" [19] "math" "language" "language" "science" "language" "language" [25] "language"이 경우 위 세 학과를 level로 하는 요인(factor) 객체를 생성할 수 있습니다.
depf<-factor(dep);depf
[1] math .... language Levels: language math science
y<-sample(c('a', 'c', 'v'), 10, replace=TRUE); y
[1] "a" "a" "c" "a" "v" "c" "a" "c" "v" "v"
yf<-factor(y); yf
[1] a a c a v c a c v v Levels: a c v
levels(yf)
[1] "a" "c" "v"선택한 시험의 값들로 구성한 객체는 다음과 같습니다.
score<-sample(65:100, 25); score
[1] 89 96 85 70 88 98 79 73 71 78 75 69 87 76 65 95 93 80 74 [20] 68 94 77 90 72 100객체 score의 각 요소에 이름을
names()
함수를 사용하여 부여 할 수 있습니다.
score1<-score names(score1)<-unclass(dep) score1
math language science language math science math science 89 96 85 70 88 98 79 73 math language language language language math math math 71 78 75 69 87 76 65 95 science science math language language science language language 93 80 74 68 94 77 90 72 language 100객체 score의 각 원소들을 'language','math','science'로 그룹화하여 각 그룹의 평균을 계산하기 위해
tapply(vector, factor, 함수)
함수를 적용합니다. 이 함수는 vector를 factor의 level로 그룹화하여 각 그룹에 함수를 적용합니다.
tapply(score, dep, mean)language math science 81.72727 79.62500 84.33333 같은 그룹에 대한 표준오차를 계산합니다. 표준오차는 분산과 길이를 반환하는 함수
var()
과 length()
를 사용하여 다음과 같이 정의할 수 있습니다.
stdErr<-function(x)sqrt(var(x)/length(x)) tapply(score, dep, stdErr)
language math science 3.600735 3.605242 3.929942
댓글
댓글 쓰기