내용
빈도표와 교차표
독립성 테스트, 연관 측정 및 결과를 그래픽으로 표시하는 방법과 함께 범주형 변수의 빈도 및 분할표를 살펴보겠습니다. vcd 및 gmodels 패키지의 기능과 함께 기본 설치의 기능을 사용할 것입니다. 다음 예에서 A, B 및 C가 범주형 변수를 나타낸다고 가정합니다. 이 섹션의 데이터는 vcd 패키지에 포함된 관절염 데이터 세트에서 가져옵니다.library(vcd)
head(Arthritis)
ID Treatment Sex Age Improved 1 57 Treated Male 27 Some 2 46 Treated Male 29 None 3 77 Treated Male 30 None 4 17 Treated Male 32 Marked 5 36 Treated Male 46 Marked 6 23 Treated Male 58 Marked위 데이터셋의 변수 age를 제외하고 모두 범주형변수(categorical variable)입니다. 각 변수의 수준은 다음과 같습니다.
Variable | Treatment | Sex | Impoved |
---|---|---|---|
level | Placebo, Treated | Female, Male | None, Some, Marked |
R은 빈도표와 교차표를 작성하는 몇가지 방법을 제공합니다.
Function | Description |
---|---|
table(var1, var2, …, varN) | N개의 범주형 변수(요인, factor)에서 N-방향 교차표(분할표)를 생성합니다. |
xtabs(formula, data) | formula과 matrix 또는 data frame을기반으로 N-way 분할표를 만듭니다. |
prop.table(table, margins) | 합에 대한 각 성분의 비율을 나타냅니다. margins=1은 행합, 2는 열합 |
margin.table(table, margins) | margins에 전달된 차원에 대한 합을 계산. 1:행 합, 2: 열 합 |
addmargins(table, margins) | table에 margin을 요약합니다.(default: sum) |
ftable(table) | 관련된 변수(요인) 수준의 각 조합의 개수가 포함됩니다. |
one-awy table
oneway<-with(Arthritis, table(Improved)) oneway
Improved None Some Marked 42 14 28
다음은 각 성분의 비율을 나타냅니다.
round(prop.table(oneway), 2)
Improved None Some Marked 0.50 0.17 0.33
다음은 지정된 방향(margins)에 따라 합을 계산합니다. oneway의 경우 1차원이므로 행방향만 존재합니다.
round(margin.table(oneway), 2)
[1] 84
위 결과를 일반 교차표에 부착하여 나타냅니다.
round(addmargins(oneway), 2)
Improved None Some Marked Sum 42 14 28 84
각 클래스의 값과 수준의 수를 나타냅니다.
ftable(oneway)
oneway 14 28 42 1 1 1
two-way table
two-way table은 두 개의 변수에 대한 교차표이며 각각 행과 열에 위치합니다. table()함수와 xtab() 함수로 작성할 수 있습니다.
- table(A, B)
- A: 행 변수, B: 열 변수
- 기본적으로 NA를 무시합니다. 빈도수가 NA인 cell을 유지하기 위해서는 함수의 인수 useNA='ifany'를 설정합니다.
- xtabs(~A+B, data=)
- A, B는 분류할 변수들이며 이 변수들이 여러변수들을 적용할 경우 "+" 기호로 구분하여 공식의 오른쪽(즉, ~의 오른쪽)에 위치합니다.
- ~의 왼쪽에 위치한 변수는 빈도벡터이며 데이터가 이미 table로 작성된 경우 적용
two<-xtabs(~Treatment+Improved, data=Arthritis) twoImproved
Treatment None Some Marked Placebo 29 7 7 Treated 13 7 21
위 표의 행 또는 열의 합을 margin.table()
함수로 나타낼 수 있습니다.
margin.table(two, 1)
Treatment Placebo Treated 43 41
행 또는 열의 합에 대한 비율로 나타내기 위해서는 prop.table()
을 사용합니다.
prop.table(two, 1)
Improved Treatment None Some Marked Placebo 0.6744186 0.1627907 0.1627907 Treated 0.3170732 0.1707317 0.5121951
twoCProp<-prop.table(two, 2); twoCPropImproved
Treatment None Some Marked Placebo 0.6904762 0.5000000 0.2500000 Treated 0.3095238 0.5000000 0.7500000
addmargins()
함수를 사용하여 교차표에 행과 열의 합 즉, margin을 결합하여 나타낼 수 있습니다.
addmargins(two)
Improved Treatment None Some Marked Sum Placebo 29 7 7 43 Treated 13 7 21 41 Sum 42 14 28 84
round(addmargins(prop.table(two)), 2)
Treatment None Some Marked Sum Placebo 0.35 0.08 0.08 0.51 Treated 0.15 0.08 0.25 0.49 Sum 0.50 0.17 0.33 1.00
위 결과와 같이 addmargins() 함수의 default는 객체의 모든 성분의 합에 대한 각 성분의 비율을 나타냅니다. 다른 형식으로 각 행에 대한 열의 합이 1이 되도록 하기 위해서는 행합에 대한 비율을 다시 열합을 계산합니다.
round(addmargins(prop.table(two, 1), 2), 2)
Improved Treatment None Some Marked Sum Placebo 0.67 0.16 0.16 1.00 Treated 0.32 0.17 0.51 1.00
round(addmargins(prop.table(two, 2), 1), 2)
Improved Treatment None Some Marked Placebo 0.69 0.50 0.25 Treated 0.31 0.50 0.75 Sum 1.00 1.00 1.00
gmodels 패키지의 CrossTable(x, y)
함수는 위에서 적용한 여러함수들의 결과를 종합적으로 반환합니다.
library(gmodels)
CrossTable(Arthritis$Treatment, Arthritis$Improved)
Cell Contents |-------------------------| | N | | Chi-square contribution | | N / Row Total | | N / Col Total | | N / Table Total | |-------------------------| Total Observations in Table: 84 | Arthritis$Improved Arthritis$Treatment | None | Some | Marked | Row Total | --------------------|-----------|-----------|-----------|-----------| Placebo | 29 | 7 | 7 | 43 | | 2.616 | 0.004 | 3.752 | | | 0.674 | 0.163 | 0.163 | 0.512 | | 0.690 | 0.500 | 0.250 | | | 0.345 | 0.083 | 0.083 | | --------------------|-----------|-----------|-----------|-----------| Treated | 13 | 7 | 21 | 41 | | 2.744 | 0.004 | 3.935 | | | 0.317 | 0.171 | 0.512 | 0.488 | | 0.310 | 0.500 | 0.750 | | | 0.155 | 0.083 | 0.250 | | --------------------|-----------|-----------|-----------|-----------| Column Total | 42 | 14 | 28 | 84 | | 0.500 | 0.167 | 0.333 | | --------------------|-----------|-----------|-----------|-----------|
CrossTable()은 위의 결과외에 chisq, 기대값 등 다양한 통계량들을 나타낼 수 있습니다. (help(CrossTable) 참조)
다차원 테이블
table() 및 xtabs() 모두 세 개 이상의 범주형 변수를 기반으로 하는 다차원 테이블을 생성하는 데 사용할 수 있습니다. margin.table(), prop.table() 및 addmargins() 함수는 자연스럽게 2차원 이상으로 확장됩니다. 또한 ftable() 함수를 사용하여 다차원 테이블을 간결하고 매력적인 방식으로 인쇄할 수 있습니다.
multi<-xtabs(~Treatment+Sex+Improved, data=Arthritis); multi
, , Improved = None Sex Treatment Female Male Placebo 19 10 Treated 6 7 , , Improved = Some Sex Treatment Female Male Placebo 7 0 Treated 5 2 , , Improved = Marked Sex Treatment Female Male Placebo 6 1 Treated 16 5
ftable(multi)
Improved None Some Marked Treatment Sex Placebo Female 19 7 6 Male 10 0 1 Treated Female 6 5 16 Male 7 2 5다음은 테이블은 2번째 변수인 Sex에 대한 margin을 계산한 것입니다.
ex1<-margin.table(multi, 2); ex1Sex Female Male 59 25 다음 결과 역시 Sex에 대해 각 성분의 비율을 계산한 것입니다. 예를 들어 ex[1,1]값은 ex1로 부터 계산된 Female 값을 기준으로 Improved-Female-Placebo 값을 나눈것과 같습니다.
ex<-ftable(prop.table(multi, 2));round(ex, 2)
Improved None Some Marked Treatment Sex Placebo Female 0.32 0.12 0.10 Male 0.40 0.00 0.04 Treated Female 0.10 0.08 0.27 Male 0.28 0.08 0.20
ex[1,1]
[1] 0.3220339
multi[1,1,1] #3차원이므로 인덱스는 3개
[1] 19
multi[1,1,1]/ex1[1]
Female 0.3220339같은 방식으로 2개의 변수를 기준으로 한 결과는 다음과 같습니다.
margin.table(multi, c(1,3))
Improved Treatment None Some Marked Placebo 29 7 7 Treated 13 7 21
round(ftable(prop.table(multi, c(1, 3))), 2)
Improved None Some Marked Treatment Sex Placebo Female 0.66 1.00 0.86 Male 0.34 0.00 0.14 Treated Female 0.46 0.71 0.76 Male 0.54 0.29 0.24
round(ftable(addmargins(prop.table(multi, c(1, 2)), 3)),2)
Improved None Some Marked Sum Treatment Sex Placebo Female 0.59 0.22 0.19 1.00 Male 0.91 0.00 0.09 1.00 Treated Female 0.22 0.19 0.59 1.00 Male 0.50 0.14 0.36 1.00
댓글
댓글 쓰기