3.2 범주형 변수

3.2.1 기술 통게량 (Descriptive Statistics)

하나의 범주형 변수에 대해서는 도수와 백분율, 또는 비율로 간단히 기술한다.

R을 설치할 때 기본적으로 함께 설치되는 MASS package내의 VA라는 자료(재향 군인의 폐암 생존자료)를 이용해 보자.

다음의 명령어로 VA가 어떤 자료인지 확인해 보자.

require(MASS)
?VA

이 중에 cell이라는 컬럼은 폐암 세포의 유형을 구분해 놓은 것이다. str 함수로 구조를 볼 수 있다.

str(VA)
'data.frame':   137 obs. of  8 variables:
 $ stime    : num  72 411 228 126 118 10 82 110 314 100 ...
 $ status   : num  1 1 1 1 1 1 1 1 1 0 ...
 $ treat    : Factor w/ 2 levels "1","2": 1 1 1 1 1 1 1 1 1 1 ...
 $ age      : num  69 64 38 63 65 49 69 68 43 70 ...
 $ Karn     : num  60 70 60 60 70 20 40 80 50 70 ...
 $ diag.time: num  7 5 3 9 11 5 10 29 18 6 ...
 $ cell     : Factor w/ 4 levels "1","2","3","4": 1 1 1 1 1 1 1 1 1 1 ...
 $ prior    : Factor w/ 2 levels "0","10": 1 2 1 2 2 1 2 1 1 1 ...

cell 컬럼은 factor type으로 1, 2, 3, 4 등 4개의 수준(level)으로 이루어졌음을 알 수 있다.

연속형 변수의 경우에는 cut 함수를 이용하여 구간으로 잘라주어야 했지만, 여기서는 그럴 필요가 없다.

table(VA$cell)

 1  2  3  4 
35 48 27 27 

 

만약 output을 SAS나 SPSS와 같은 모양으로 보고 싶다면 gmodels package의 CrossTable이라는 함수를 사용한다. 비율(분율, proportion)도 기본적으로 보여준다.

require(gmodels)
CrossTable(VA$cell)

 
   Cell Contents
|-------------------------|
|                       N |
|         N / Table Total |
|-------------------------|

 
Total Observations in Table:  137 

 
          |         1 |         2 |         3 |         4 | 
          |-----------|-----------|-----------|-----------|
          |        35 |        48 |        27 |        27 | 
          |     0.255 |     0.350 |     0.197 |     0.197 | 
          |-----------|-----------|-----------|-----------|



 

CrossTable은 변수가 여러 개인 것에도 쓸 수 있고 Chi-square test, Fisher’s exact test, McNemar’s test도 수행해 준다.

 

3.2.2 Plotting

plot을 사용하면 factor type에 맞게 histogram을 보여준다.

oPar = par(mfrow=c(1, 2))
plot(VA$cell, main="plot(VA$cell)", cex.axis=0.8, cex.main=0.9) # histogram
barplot(table(VA$cell), main="barplot(table(VA$cell))", cex.axis=0.8, cex.main=0.9)
The same plot by two different ways

Figure 3.8: The same plot by two different ways

 

여기에서 cell은 연속형 변수가 아니므로 hist 함수를 사용할 수 없고, barplot을 써야 하는데, table 함수로 미리 계수(counting)를 해야 한다.

 

범주형 자료에는 pie chart도 유용하다.

pie(table(VA$cell))
An example of pie graph

Figure 3.9: An example of pie graph

각종 label이나 제목, 색상 등의 옵션은 목적에 맞게 적절히 지정해 준다.

 

3.2.3 통계적 추론 (Statistical Inference)

만약 이분형 자료였다면 비율과 그에 대한 신뢰구간을 구해야 할 때가 있다.

만약 총 10개 중에 3개가 어떤 특성을 가졌다면 그에 대한 신뢰구간을 prop.test를 사용하여 구할 수 있다.

prop.test(3, 10)

    1-sample proportions test with continuity correction

data:  3 out of 10, null probability 0.5
X-squared = 0.9, df = 1, p-value = 0.3
alternative hypothesis: true p is not equal to 0.5
95 percent confidence interval:
 0.08095 0.64633
sample estimates:
  p 
0.3 

옵션 p를 이용하여 가설 검정도 할 수 있다.

이외에도 binom.test 와 sasLM::ScoreCI 를 참고한다.

[예시] 10회 시도하여 3회 성공하였다. 미지모수 성공확률 p에 대한 추론을 시작하려고 한다. 가로축을 p, 세로축을 p에 따른 10회 시도중 3회 성공할 확률로 하여 그림을 그리시오.

y = 3
n = 10
Lik = function(p) choose(n, y)*p^y*(1 - p)^(n - y) # same as dbinom
curve(Lik, 0, 1, xlab="Unknown parameter p", ylab="Probability of y/n = 3/10")
Likelihood curve of a binomial distribution

Figure 3.10: Likelihood curve of a binomial distribution

위와 같이 실험이 행해진 후 관찰값(여기서는 y)을 이용하여 계산한 (결과가 이산인 경우) 확률을 likelihood(우도)라 한다. 만약 관찰 결과(확률변수가 가질 수 있는 값)가 연속형이면 확률 대신 density(밀도)들의 곱을 likelihood라 한다. 더 자세한 것은 뒤 장들에서 논의한다.

앞의 그림에서 p=0.3 근처에서 최대의 확률을 가짐을 알 수 있다. (y가 이산형이라고 이 그림까지 이산형이 되지는 않고, 오히려 p로(with respect to p) 두 번 이상 미분가능한 smooth curve가 된다.) 좀 더 확실하게 확인하는 단순한 script는 다음과 같다.

x = seq(0, 1, by=0.001)
x[which.max(Lik(x))]
[1] 0.3

위는 1/000 정밀도로 답을 찾는 script이다. 좀 더 정밀하게는 다음과 같이 찾을 수 있다.

mLL = function(p) -log(Lik(p))
nlminb(0.5, mLL, lower=0, upper=1)
$par
[1] 0.3

$objective
[1] 1.321

$convergence
[1] 0

$iterations
[1] 7

$evaluations
function gradient 
       9       10 

$message
[1] "relative convergence (4)"

nlminb는 초기값(여기서는 0.5를 주었지만, 실제로는 y/n이 더 좋다.)을 주고, 어떤 함수의 결과값(return value)이 최소가 되게 하는 input을 찾아주는 일반적인 함수이다. 이 어떤 함수는 사용자의 목적을 이루게 해주는 함수라고 해서, 목적함수(objective function)라고 부른다. 자료분석에서는 likelihood를 maximize해야하는 경우가 많은데, 이 때 주로 minus log likelihood 함수를 목적함수로 두고 최소화하여 답(주로 모수, parameter)을 구한다. 수학에서는 최대화(maximization)와 최소화(minimization)를 아울러서 최적화(optimization)라 한다. 다른 말로, optimization에는 maximization과 minimization이 있는데, R이 제공하는 여러 최적화 함수(nlminb, nlm, optimize, optim, constrOptim 등)는 주로 minimization에 특화되어 있다.

참고로 앞의 Lik (likelihood) 함수는 underflow를 일으키기 쉬우므로 위와 같이 coding하는 것은 바람직하지 않고 다음과 같이 mLL (minus log likelihood) 함수를 바로 작성하는 것이 좋다.

mLL = function(p) -dbinom(y, n, p, log=TRUE)