본문 바로가기
  • plotly로 바로쓰는 동적시각화 in R & 파이썬
데이터 전처리

빈도표(분할표, Contingency table)로 데이터 개수, 비율 구하기 in R

by 아참형인간 2022. 6. 4.
table.knit

사용데이터 : https://2stndard.tistory.com/68

R을 사용하여 데이터를 전처리하기 위해서는 먼저 전체적으로 데이터의 형태를 살펴봐야한다. 이 때 사용하는 명령이 glimpse()str()을 사용하여 데이터의 전반적 기술통계치를 확인하거나 head()를 사용하여 실 데이터를 확인한다.

하지만 특정 컬럼의 변량에 따른 다양한 빈도표를 만들어서 데이터의 분포를 확인하거나 간단한 시각화를 해야할 때가 있다. 또 많은 수의 데이터를 간단하게 요약해야 하는 경우도 있다. 이럴때 사용하는 것이 빈도표, 분할표(contingency tables)이라고 한다.

빈도표는 변수의 이산형, 연속형에 따라 산출하는 방법이 다르고 산출되는 값이 사례수, 비율에 따라 산출하는 방법이 다르다.

table()

빈도표를 만드는데 가장 쉽게 사용하는 방법이 table()을 사용하는 방법이다. table()은 지정한 변수에 사용된 변량에 따른 사례수를 산출해주는 함수이다.

table(df_취업률$대계열)
## 
##   공학계열   교육계열   사회계열 예체능계열   의약계열   인문계열   자연계열 
##       2589        452       1866       1487        418        989       1489

위의 예는 하나의 변수 변량에 따른 1차원 테이블이다. 그러나 두 개의 변수 변량에 따른 2차원 크로스 테이블로 만들려면 table()에 두 개의 변수를 전달해준다. 첫 번째 변수는 행으로 표현되고 두 번째 변수는 열로 표현되어 사례수가 산출된다.

table(df_취업률$대계열, df_취업률$과정구분)
##             
##              대학과정 대학원과정 전문대학과정
##   공학계열        990        972          627
##   교육계열        170        239           43
##   사회계열        819        557          490
##   예체능계열      688        277          522
##   의약계열        105        190          123
##   인문계열        510        387           92
##   자연계열        603        678          208

table()이 중요한 이유는 단지 table()의 결과로 산출되는 변량별 사례수를 확인하기 위해서이지만 table()로 파생되는 빈도표를 생성하기 위해 table()의 결과를 사용한다는 점이다.

prop.table()

prop.table()은 앞선 table()과 유사한 빈도표를 만드는데 사례수를 산출하는 것이 아니고 그 변량의 비율을 산출해준다. 이 비율에 100을 곱하면 백분률이 된다. prop.table()을 사용하기 위해서는 앞서 산출했던 table()의 결과를 매개변수로 전달해주어야 한다.

tbl <- table(df_취업률$대계열)

glimpse(tbl)
##  'table' int [1:7(1d)] 2589 452 1866 1487 418 989 1489
##  - attr(*, "dimnames")=List of 1
##   ..$ : chr [1:7] "공학계열" "교육계열" "사회계열" "예체능계열" ...
glimpse(prop.table(tbl))
##  'table' num [1:7(1d)] 0.2787 0.0487 0.2009 0.1601 0.045 ...
##  - attr(*, "dimnames")=List of 1
##   ..$ : chr [1:7] "공학계열" "교육계열" "사회계열" "예체능계열" ...
prop.table(tbl)*100
## 
##   공학계열   교육계열   사회계열 예체능계열   의약계열   인문계열   자연계열 
##  27.868676   4.865447  20.086114  16.006459   4.499462  10.645856  16.027987
tbl_2 <- table(df_취업률$대계열, df_취업률$과정구분)

prop.table(tbl_2)
##             
##                 대학과정  대학원과정 전문대학과정
##   공학계열   0.106566200 0.104628633  0.067491927
##   교육계열   0.018299247 0.025726588  0.004628633
##   사회계열   0.088159311 0.059956943  0.052744887
##   예체능계열 0.074058127 0.029817008  0.056189451
##   의약계열   0.011302476 0.020452099  0.013240043
##   인문계열   0.054897740 0.041657696  0.009903122
##   자연계열   0.064908504 0.072981701  0.022389666
prop.table(tbl_2)*100
##             
##                대학과정 대학원과정 전문대학과정
##   공학계열   10.6566200 10.4628633    6.7491927
##   교육계열    1.8299247  2.5726588    0.4628633
##   사회계열    8.8159311  5.9956943    5.2744887
##   예체능계열  7.4058127  2.9817008    5.6189451
##   의약계열    1.1302476  2.0452099    1.3240043
##   인문계열    5.4897740  4.1657696    0.9903122
##   자연계열    6.4908504  7.2981701    2.2389666

margin.table()

margin.table()table()로 만들어진 빈도표의 가로합, 세로합을 산출하는 함수이다. margin.table()에 설정하는 ‘margin’ 매개변수를 1로 설정하면 행 단위의 합계를 산출하고 2로 설정하면 열단위의 합계를 산출해준다. 따라서 margin.table()을 사용하려면 table()을 2차원 이상의 크로스 탭 테이블로 만들어야 효과를 낸다. 하지만 사실 구지 헤깔리게 ’margin’을 사용하여 열, 행을 지정해서 해당 변수의 변량별 합계를 내는 것보다는 그냥 해당 변수에 따른 1차원 빈도표를 만들어주는 것이 쉽다. 그래서 많이 사용되지는 않는 함수이다.

margin.table(tbl_2, margin = 1)
## 
##   공학계열   교육계열   사회계열 예체능계열   의약계열   인문계열   자연계열 
##       2589        452       1866       1487        418        989       1489
table(df_취업률$대계열)
## 
##   공학계열   교육계열   사회계열 예체능계열   의약계열   인문계열   자연계열 
##       2589        452       1866       1487        418        989       1489
margin.table(tbl_2, margin = 2)
## 
##     대학과정   대학원과정 전문대학과정 
##         3885         3300         2105
table(df_취업률$과정구분)
## 
##     대학과정   대학원과정 전문대학과정 
##         3885         3300         2105
margin.table(prop.table(tbl_2), margin = 1)
## 
##   공학계열   교육계열   사회계열 예체능계열   의약계열   인문계열   자연계열 
## 0.27868676 0.04865447 0.20086114 0.16006459 0.04499462 0.10645856 0.16027987
prop.table(table(df_취업률$대계열))
## 
##   공학계열   교육계열   사회계열 예체능계열   의약계열   인문계열   자연계열 
## 0.27868676 0.04865447 0.20086114 0.16006459 0.04499462 0.10645856 0.16027987
margin.table(prop.table(tbl_2), margin = 2)
## 
##     대학과정   대학원과정 전문대학과정 
##    0.4181916    0.3552207    0.2265877
prop.table(table(df_취업률$과정구분))
## 
##     대학과정   대학원과정 전문대학과정 
##    0.4181916    0.3552207    0.2265877

addmargins()

앞선 margin.table()은 행, 열 단위의 합계를 구해서 단일 행으로 이루어져 있는 빈도표로 리턴한다. 하지만 이렇게 사용하기 보다는 원래 빈도표에 행별, 열별 합계가 붙어있는 빈도표의 형태로 사용하는 경우가 더 많다. 이렇게 빈도표에 합계를 붙여주는 함수가 addmargin()이다. addmargin()은 기본적으로 행별, 열별 합계를 붙여주지만 ‘margin’ 매개변수를 통해 행별 합계나 열별 합계만을 붙여주는것이 가능하고 ‘FUN’ 매개변수를 사용하여 합계 외에도 평균이나 표준편차와 같은 특정 기술 통계 함수를 사용하는 것도 가능하다.

addmargins(tbl_2)
##             
##              대학과정 대학원과정 전문대학과정  Sum
##   공학계열        990        972          627 2589
##   교육계열        170        239           43  452
##   사회계열        819        557          490 1866
##   예체능계열      688        277          522 1487
##   의약계열        105        190          123  418
##   인문계열        510        387           92  989
##   자연계열        603        678          208 1489
##   Sum            3885       3300         2105 9290
addmargins(prop.table(tbl_2))
##             
##                 대학과정  대학원과정 전문대학과정         Sum
##   공학계열   0.106566200 0.104628633  0.067491927 0.278686760
##   교육계열   0.018299247 0.025726588  0.004628633 0.048654467
##   사회계열   0.088159311 0.059956943  0.052744887 0.200861141
##   예체능계열 0.074058127 0.029817008  0.056189451 0.160064586
##   의약계열   0.011302476 0.020452099  0.013240043 0.044994618
##   인문계열   0.054897740 0.041657696  0.009903122 0.106458558
##   자연계열   0.064908504 0.072981701  0.022389666 0.160279871
##   Sum        0.418191604 0.355220667  0.226587729 1.000000000
addmargins(round(prop.table(tbl_2), 3)*100)
##             
##              대학과정 대학원과정 전문대학과정   Sum
##   공학계열       10.7       10.5          6.7  27.9
##   교육계열        1.8        2.6          0.5   4.9
##   사회계열        8.8        6.0          5.3  20.1
##   예체능계열      7.4        3.0          5.6  16.0
##   의약계열        1.1        2.0          1.3   4.4
##   인문계열        5.5        4.2          1.0  10.7
##   자연계열        6.5        7.3          2.2  16.0
##   Sum            41.8       35.6         22.6 100.0
addmargins(tbl_2, margin = 1)
##             
##              대학과정 대학원과정 전문대학과정
##   공학계열        990        972          627
##   교육계열        170        239           43
##   사회계열        819        557          490
##   예체능계열      688        277          522
##   의약계열        105        190          123
##   인문계열        510        387           92
##   자연계열        603        678          208
##   Sum            3885       3300         2105
addmargins(tbl_2, margin = 2)
##             
##              대학과정 대학원과정 전문대학과정  Sum
##   공학계열        990        972          627 2589
##   교육계열        170        239           43  452
##   사회계열        819        557          490 1866
##   예체능계열      688        277          522 1487
##   의약계열        105        190          123  418
##   인문계열        510        387           92  989
##   자연계열        603        678          208 1489
addmargins(round(prop.table(tbl_2), 3)*100, margin = 1)
##             
##              대학과정 대학원과정 전문대학과정
##   공학계열       10.7       10.5          6.7
##   교육계열        1.8        2.6          0.5
##   사회계열        8.8        6.0          5.3
##   예체능계열      7.4        3.0          5.6
##   의약계열        1.1        2.0          1.3
##   인문계열        5.5        4.2          1.0
##   자연계열        6.5        7.3          2.2
##   Sum            41.8       35.6         22.6
addmargins(round(prop.table(tbl_2), 3)*100, margin = 2)
##             
##              대학과정 대학원과정 전문대학과정  Sum
##   공학계열       10.7       10.5          6.7 27.9
##   교육계열        1.8        2.6          0.5  4.9
##   사회계열        8.8        6.0          5.3 20.1
##   예체능계열      7.4        3.0          5.6 16.0
##   의약계열        1.1        2.0          1.3  4.4
##   인문계열        5.5        4.2          1.0 10.7
##   자연계열        6.5        7.3          2.2 16.0
addmargins(tbl_2, margin = 1, FUN = mean)
##             
##              대학과정 대학원과정 전문대학과정
##   공학계열   990.0000   972.0000     627.0000
##   교육계열   170.0000   239.0000      43.0000
##   사회계열   819.0000   557.0000     490.0000
##   예체능계열 688.0000   277.0000     522.0000
##   의약계열   105.0000   190.0000     123.0000
##   인문계열   510.0000   387.0000      92.0000
##   자연계열   603.0000   678.0000     208.0000
##   mean       555.0000   471.4286     300.7143
addmargins(tbl_2, margin = 2, FUN = sd)
##             
##               대학과정 대학원과정 전문대학과정        sd
##   공학계열   990.00000  972.00000    627.00000 204.58006
##   교육계열   170.00000  239.00000     43.00000  99.41998
##   사회계열   819.00000  557.00000    490.00000 173.86489
##   예체능계열 688.00000  277.00000    522.00000 206.76154
##   의약계열   105.00000  190.00000    123.00000  44.79211
##   인문계열   510.00000  387.00000     92.00000 214.81698
##   자연계열   603.00000  678.00000    208.00000 252.50413

댓글