사용데이터 : 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
'데이터 전처리' 카테고리의 다른 글
특정 조건 행의 데이터만 바꾸기 (0) | 2022.06.11 |
---|---|
데이터 행의 제거 in R (0) | 2022.06.04 |
데이터 프레임 피봇(pivot) in R - pivot_longer, pivot_wider (0) | 2022.04.30 |
apply, lapply, sapply, tapply in R (0) | 2022.03.12 |
for loop, apply, 벡터 연산의 속도 차이 in R (0) | 2022.02.26 |
댓글