기본 콘텐츠로 건너뛰기

벡터와 행렬에 관련된 그림들

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' 와 같...

[sympy] Sympy객체의 표현을 위한 함수들

Sympy객체의 표현을 위한 함수들 General simplify(x): 식 x(sympy 객체)를 간단히 정리 합니다. import numpy as np from sympy import * x=symbols("x") a=sin(x)**2+cos(x)**2 a $\sin^{2}{\left(x \right)} + \cos^{2}{\left(x \right)}$ simplify(a) 1 simplify(b) $\frac{x^{3} + x^{2} - x - 1}{x^{2} + 2 x + 1}$ simplify(b) x - 1 c=gamma(x)/gamma(x-2) c $\frac{\Gamma\left(x\right)}{\Gamma\left(x - 2\right)}$ simplify(c) $\displaystyle \left(x - 2\right) \left(x - 1\right)$ 위의 예들 중 객체 c의 감마함수(gamma(x))는 확률분포 등 여러 부분에서 사용되는 표현식으로 다음과 같이 정의 됩니다. 감마함수는 음이 아닌 정수를 제외한 모든 수에서 정의됩니다. 식 1과 같이 자연수에서 감마함수는 factorial(!), 부동소수(양의 실수)인 경우 적분을 적용하여 계산합니다. $$\tag{식 1}\Gamma(n) =\begin{cases}(n-1)!& n:\text{자연수}\\\int^\infty_0x^{n-1}e^{-x}\,dx& n:\text{부동소수}\end{cases}$$ x=symbols('x') gamma(x).subs(x,4) $\displaystyle 6$ factorial 계산은 math.factorial() 함수를 사용할 수 있습니다. import math math.factorial(3) 6 a=gamma(x).subs(x,4.5) a.evalf(3) 11.6 simpilfy() 함수의 알고리즘은 식에서 공통사항을 찾아 정리하...

sympy.solvers로 방정식해 구하기

sympy.solvers로 방정식해 구하기 대수 방정식을 해를 계산하기 위해 다음 함수를 사용합니다. sympy.solvers.solve(f, *symbols, **flags) f=0, 즉 동차방정식에 대해 지정한 변수의 해를 계산 f : 식 또는 함수 symbols: 식의 해를 계산하기 위한 변수, 변수가 하나인 경우는 생략가능(자동으로 인식) flags: 계산 또는 결과의 방식을 지정하기 위한 인수들 dict=True: {x:3, y:1}같이 사전형식, 기본값 = False set=True :{(x,3),(y,1)}같이 집합형식, 기본값 = False ratioal=True : 실수를 유리수로 반환, 기본값 = False positive=True: 해들 중에 양수만을 반환, 기본값 = False 예 $x^2=1$의 해를 결정합니다. solve() 함수에 적용하기 위해서는 다음과 같이 식의 한쪽이 0이 되는 형태인 동차식으로 구성되어야 합니다. $$x^2-1=0$$ import numpy as np from sympy import * x = symbols('x') solve(x**2-1, x) [-1, 1] 위 식은 계산 과정은 다음과 같습니다. $$\begin{aligned}x^2-1=0 \rightarrow (x+1)(x-1)=0 \\ x=1 \; \text{or}\; -1\end{aligned}$$ 예 $x^4=1$의 해를 결정합니다. solve() 함수의 인수 set=True를 지정하였으므로 결과는 집합(set)형으로 반환됩니다. eq=x**4-1 solve(eq, set=True) ([x], {(-1,), (-I,), (1,), (I,)}) 위의 경우 I는 복소수입니다.즉 위 결과의 과정은 다음과 같습니다. $$x^4-1=(x^2+1)(x+1)(x-1)=0 \rightarrow x=\pm \sqrt{-1}, \; \pm 1=\pm i,\; \pm1$$ 실수...