기본 콘텐츠로 건너뛰기

[ML] 결정트리(Decision Tree) 모델

R 빈도표와 교차표

내용

빈도표와 교차표

독립성 테스트, 연관 측정 및 결과를 그래픽으로 표시하는 방법과 함께 범주형 변수의 빈도 및 분할표를 살펴보겠습니다. 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)입니다. 각 변수의 수준은 다음과 같습니다.

VariableTreatmentSexImpoved
levelPlacebo, Treated Female, MaleNone, 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)
two
Improved
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); twoCProp
Improved
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); ex1
Sex 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

댓글

이 블로그의 인기 게시물

[Linear Algebra] 유사변환(Similarity transformation)

유사변환(Similarity transformation) n×n 차원의 정방 행렬 A, B 그리고 가역 행렬 P 사이에 식 1의 관계가 성립하면 행렬 A와 B는 유사행렬(similarity matrix)이 되며 행렬 A를 가역행렬 P와 B로 분해하는 것을 유사 변환(similarity transformation) 이라고 합니다. $$\tag{1} A = PBP^{-1} \Leftrightarrow P^{-1}AP = B $$ 식 2는 식 1의 양변에 B의 고유값을 고려한 것입니다. \begin{align}\tag{식 2} B - \lambda I &= P^{-1}AP – \lambda P^{-1}P\\ &= P^{-1}(AP – \lambda P)\\ &= P^{-1}(A - \lambda I)P \end{align} 식 2의 행렬식은 식 3과 같이 정리됩니다. \begin{align} &\begin{aligned}\textsf{det}(B - \lambda I ) & = \textsf{det}(P^{-1}(AP – \lambda P))\\ &= \textsf{det}(P^{-1}) \textsf{det}((A – \lambda I)) \textsf{det}(P)\\ &= \textsf{det}(P^{-1}) \textsf{det}(P) \textsf{det}((A – \lambda I))\\ &= \textsf{det}(A – \lambda I)\end{aligned}\\ &\begin{aligned}\because \; \textsf{det}(P^{-1}) \textsf{det}(P) &= \textsf{det}(P^{-1}P)\\ &= \textsf{det}(I)\end{aligned}\end{align} 유사행렬의 특성 유사행렬인 두 정방행렬 A와 B는 'A ~ B' 와 같

[matplotlib] 히스토그램(Histogram)

히스토그램(Histogram) 히스토그램은 확률분포의 그래픽적인 표현이며 막대그래프의 종류입니다. 이 그래프가 확률분포와 관계가 있으므로 통계적 요소를 나타내기 위해 많이 사용됩니다. plt.hist(X, bins=10)함수를 사용합니다. x=np.random.randn(1000) plt.hist(x, 10) plt.show() 위 그래프의 y축은 각 구간에 해당하는 갯수이다. 빈도수 대신 확률밀도를 나타내기 위해서는 위 함수의 매개변수 normed=True로 조정하여 나타낼 수 있다. 또한 매개변수 bins의 인수를 숫자로 전달할 수 있지만 리스트 객체로 지정할 수 있다. 막대그래프의 경우와 마찬가지로 각 막대의 폭은 매개변수 width에 의해 조정된다. y=np.linspace(min(x)-1, max(x)+1, 10) y array([-4.48810153, -3.54351935, -2.59893717, -1.65435499, -0.70977282, 0.23480936, 1.17939154, 2.12397372, 3.0685559 , 4.01313807]) plt.hist(x, y, normed=True) plt.show()

R 미분과 적분

내용 expression 미분 2차 미분 mosaic를 사용한 미분 적분 미분과 적분 R에서의 미분과 적분 함수는 expression()함수에 의해 생성된 표현식을 대상으로 합니다. expression expression(문자, 또는 식) 이 표현식의 평가는 eval() 함수에 의해 실행됩니다. > ex1<-expression(1+0:9) > ex1 expression(1 + 0:9) > eval(ex1) [1] 1 2 3 4 5 6 7 8 9 10 > ex2<-expression(u, 2, u+0:9) > ex2 expression(u, 2, u + 0:9) > ex2[1] expression(u) > ex2[2] expression(2) > ex2[3] expression(u + 0:9) > u<-0.9 > eval(ex2[3]) [1] 0.9 1.9 2.9 3.9 4.9 5.9 6.9 7.9 8.9 9.9 미분 D(표현식, 미분 변수) 함수로 미분을 실행합니다. 이 함수의 표현식은 expression() 함수로 생성된 객체이며 미분 변수는 다음 식의 분모의 변수를 의미합니다. $$\frac{d}{d \text{변수}}\text{표현식}$$ 이 함수는 어떤 함수의 미분의 결과를 표현식으로 반환합니다. > D(expression(2*x^3), "x") 2 * (3 * x^2) > eq<-expression(log(x)) > eq expression(log(x)) > D(eq, "x") 1/x > eq2<-expression(a/(1+b*exp(-d*x))); eq2 expression(a/(1 + b * exp(-d * x))) > D(eq2, "x") a * (b * (exp(-d * x) * d))/(1 + b