코딩기반 범부형 데이터 분석

코딩기반 통계적 추론을 살펴보자. 범주형 데이터의 가장 기본은 비율(Proportion, \(p\))부터 시작한다. 성별을 얘기할 때, 남성과 여성의 비율이 대표적일 수 있다. 미국의 GSS(General Socail Survey)에 견주는 대한민국 한국복지패널 데이터를 얻을 수 있는데, stata, spss, sas 등 상용통계팩키지에 의존성이 있어 이를 R과 같은 오픈소스 소프트웨어에서 작업할 경우 haven 팩키지를 동원해야 한다. 그리고 상당량의 변환작업과정과 데이터사전을 보고 일일이 데이터와 대조하는 과정을 거쳐야 한다.

그래서 forcats 팩키지에 내장되어 있는 gss_cat 범주형 데이터를 가지고 작업을 진행한다.

데이터 가져오기

gss_cat 데이터에서 2014년 데이터만 뽑아내서 범주형 데이터 분석을 위한 샘플데이터로 준비한다.

# 0. 환경설정 -----
library(infer)
library(haven)
library(tidyverse)

# data(package="forcats")

gss_cat_df  <- gss_cat %>% 
    filter(year==2014)

탐색적 데이터분석

본격적인 데이터 분석에 들어가기 앞서 가장 먼저 데이터에 익숙해지는 과정이 필요하다. 이를 위해서 탐색적 데이터 분석을 진행하는데, 데이터를 glimpse로 살펴보고, ggplot으로 시각화하고, 범주형 데이터에 대한 기술통계량을 뽑아보는 것부터 시작한다.

그리고 나서, 혼인상태(marital)에 대한 현재 혼인비율을 추정한다.

# 2. 탐색적 데이터 분석 -----
## 2.1. 시각화 ----
gss_cat_df %>% 
    ggplot(aes(x=fct_infreq(marital) %>% fct_rev)) +
    geom_bar()

## 2.2. 기술통계량 ----
gss_cat_df %>% 
    count(marital, sort=TRUE) %>% 
    mutate(pcnt = scales::percent(n/sum(n)))
# A tibble: 6 x 3
  marital           n pcnt 
  <fct>         <int> <chr>
1 Married        1158 45.6%
2 Never married   675 26.6%
3 Divorced        411 16.2%
4 Widowed         209 8.2% 
5 Separated        81 3.2% 
6 No answer         4 0.2% 
## 2.3. 이혼율 ----
(married_hat <- gss_cat_df %>% 
    summarise(p = mean(marital == "Married")) %>% 
    pull())
[1] 0.4562648

혼인비율 신뢰구간

fct_lump() 함수는 가장 큰 범주를 중심으로 범주를 자동으로 줄여줘서 코딩량을 획기적으로 줄일 수 있다. 혼인상태 범주형 변수를 두가지 수준 혼인(Married)와 그외로 나눌 경우 infer 팩키지를 통해 부츠트랩 표본추출을 할 수 있다.

이를 바탕으로 ggplotgeom_density 함수로 부츠트랩 표본으로부터 혼인비율을 시각화하고, 표준편차를 계산할 수 있으니, 신뢰구간도 쉽게 구할 수 있다.

# 3. 신뢰구간 구하기 -----
## 3.1. 부츠트랩: 결혼과 비혼으로 구분
married_boots <- gss_cat_df %>%
    mutate(marital = fct_lump(marital, 1)) %>%
    specify(response = marital, success = "Married") %>%
    generate(reps = 500, type = "bootstrap") %>%
    calculate(stat = "prop")

## 3.2. 시각화
married_boots %>% 
    ggplot(aes(x=stat)) +
      geom_density()

## 3.3. 신뢰구간
### 3.3.1. 부츠트랩 신뢰구간
married_se <- married_boots %>%
    summarize(se = sd(stat)) %>%
    pull()

c(married_hat - 2 * married_se, married_hat + 2 * married_se)
[1] 0.4364035 0.4761261

정규분포 가정 신뢰구간

비율(\(p\))가 $n \(\geq\) 10$ 혹은 $n (1 - ) \(\geq\) 10$인 경우 정규분포로 근사하여 신뢰구간을 계산할 수 있다. 그리고 표준오차는 다음 공식으로 계산이 가능하다.

\[\text{표준오차(SE)}=\sqrt{\frac{\hat{p}\times(1-\hat{p})}{n}}\]

이를 바탕으로 부츠트랩 혼인비율에 대한 신뢰구간을 시각화하고, 계산하면 다음과 같다. 부츠트랩으로 산출한 혼인비율에 대한 추정값과 신뢰구간이 근사적으로 동일함이 확인된다.

### 3.3.2. 정규분포 신뢰구간
### 가정 검사
nrow(gss_cat_df) * married_hat >= 10
[1] TRUE
nrow(gss_cat_df) * (1 - married_hat) >= 10
[1] TRUE
### SE 계산
married_approx_se <- sqrt(married_hat * (1 - married_hat) / nrow(gss_cat_df))
c(married_hat - 2 * married_approx_se, married_hat + 2 * married_approx_se)
[1] 0.4364911 0.4760384
## 3.4. 시각화
married_boots %>% 
    ggplot(aes(x=stat)) +
    geom_density() +
    stat_function(fun = dnorm, args = list(mean = married_hat, sd=married_approx_se), color = "red")

비율 검정

표본 반응 범주 검정
1 2 단일 표본 \(\chi^2\) 검정, 이항 검정(Binomial Test)
1 2 이상 단일 표본 \(\chi^2\) 검정, 다항 검정(multinomial Test)
1이상 2 이상 \(N\) 표본 \(\chi^2\) 검정, G-검정, 피셔의 정확검정