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

학회 스타일에 맞는 회귀분석 결과표 만들기 in R - p 값의 표현

by 아참형인간 2022. 11. 1.
stargazer.knit

R에서 회귀분석 후 결과 테이블을 만들기 위해서는 대부분 사용하는 방법이 회귀분석 결과에 따른 계수들을 기록해서 워드프로세서에서 표를 만드는 방법이다. 이러한 방법은 회귀분석 표를 만드는데 매우 번거로운 작업을 거쳐야하고 특히 p 값의 표현과 같이 약속된 표식을 사용할 때 매우 불편한 점이 있다. 앞선 포스트에서 apaTables를 사용하여 미국 심리학회(APA : American Psychological Association) 형태의 표를 만드는 방법을 알아보았다. 이번 포스트에서는 stargazer 패키지의 기능을 사용하는 방법에 대해 알아보겠다.

사용 데이터

이번 포스트에서 사용하는 데이터는 ‘연도별 시도별 비정규 교원 1인당 학생수 in R - rank()’(https://2stndard.tistory.com/114)에서 사용한 데이터를 재활용하겠다.

df_provinfo_21 <- read_excel('D:/R/data/유초 주요-03 시도별 교육통계 현황_방통포함(1999-2021)_20220523y.xlsx', 
                               sheet = '2021', skip = 11,
                               col_types = c(rep('text', 3), rep('numeric', 170)), 
                               col_names = FALSE)

df_provinfo_1520 <- read_excel('D:/R/data/유초 주요-03 시도별 교육통계 현황_방통포함(1999-2021)_20220523y.xlsx', 
                               sheet = '2015-2020', skip = 12,
                               col_types = c(rep('text', 3), rep('numeric', 138)), 
                               col_names = FALSE)

## 21년 데이터 전처리
df_provinfo_21 <- df_provinfo_21 |> select(1, 2, 3, 15, 25, 73, 112, 115)

colnames(df_provinfo_21) <- c('연도', '시도', '학제', '학급수', '학생수', '전체교원수', '기간제교원수', '시간강사수')

df_provinfo_21 <- df_provinfo_21 |> 
  mutate(비정규교원당학생수 = 학생수 / (기간제교원수 + 시간강사수))

df_비정규교원당학생수_21 <- df_provinfo_21 |> 
  filter(학제 %in% c('초등학교', '중학교', '고등학교'))

## 15~20년 데이터 전처리
df_provinfo_1520 <- df_provinfo_1520 |> select(1, 2, 3, 5, 20, 41, 80, 83)

colnames(df_provinfo_1520) <- c('연도', '시도', '학제', '학급수', '학생수', '전체교원수', '기간제교원수', '시간강사수')

df_provinfo_1520 <- df_provinfo_1520 |> 
  mutate(비정규교원당학생수 = 학생수 / (기간제교원수 + 시간강사수))

df_비정규교원당학생수_1520 <- df_provinfo_1520 |> 
  filter(학제 %in% c('초등학교', '중학교', '고등학교')) |> arrange(연도)

df_비정규교원당학생수 <- rbind(df_비정규교원당학생수_1520, df_비정규교원당학생수_21)

stargazer

stargazer 패키지는 R에서 직접 출판이 가능한 품질의 표를 생성해주는 패키지이다. stargazer 패키지가 생성하는 표는 LaTex, HTML의 형태로 출력이 가능하기 때문에 워드프로세스 등에서 바로 사용할 수 있다. 특히 회귀분석 표를 만드는데 매우 편리한 기능을 제공하고 있고, 데이터프레임에 저장된 데이터들에 대한 요약표를 만드는데도 활용성이 높다.

패키지 설치

stargazer 패키지를 사용하기 위해 먼저 설치부터 하겠다. stargazer 패키지는 CRAN에 등록되어 있는 정식 패키지이기 때문에 install.packages()를 사용하여 설치가 가능하다.

if (!require(stargazer)) {
  install.packages('stargazer')
  library(stargazer)
}

데이터 요약표 생성

먼저 stargazer 패키지를 사용하여 데이터 요약표를 만들어 본다. 데이터 요약표를 만드는 데에는 stargazer()를 사용한다.

stargazer(as.data.frame(df_비정규교원당학생수[, 4:9]), type = 'text', title = '표 1. 요약표', out = '1.txt')
## 
## 표 1. 요약표
## ======================================================
## Statistic  N     Mean      St. Dev.    Min      Max   
## ------------------------------------------------------
## 학급수       378  8,625.730  18,980.740   220    124,047 
## 학생수       378 208,486.100 446,487.500 5,112  2,747,219
## 전체교원수     378 15,965.600  32,959.070   529    191,224 
## 기간제교원수    378  1,709.497   3,777.715    21    24,929  
## 시간강사수     378   249.693     567.007     0      4,279  
## 비정규교원당학생수 378   176.310     168.201   34.410  801.868 
## ------------------------------------------------------

위의 결과를 보면 전체 테이블 요약표가 텍스트 형태로 생성되었고 결과는 ‘1.txt’파일에 저장되었다. 만약 이를 HTML 형태로 출력하고자 한다면 ’type’ 매개변수를 조절하여 사용하는데 다음과 같이 할 수 있다.

stargazer(as.data.frame(df_비정규교원당학생수[, 4:9]), type = 'html', title = '표 1. 요약표', out = '1.html')

만약 가로축과 세로축을 바꾸고자 한다면 ‘flip’ 매개변수를 사용한다.

stargazer(as.data.frame(df_비정규교원당학생수[, 4:9]), type = 'text', title = '표 1. 요약표', out = '1.txt', flip = TRUE)
## 
## 표 1. 요약표
## =======================================================================
## Statistic    학급수         학생수       전체교원수     기간제교원수    시간강사수  비정규교원당학생수
## -----------------------------------------------------------------------
## N            378         378        378        378      378      378   
## Mean      8,625.730  208,486.100 15,965.600 1,709.497 249.693  176.310 
## St. Dev.  18,980.740 446,487.500 32,959.070 3,777.715 567.007  168.201 
## Min          220        5,112       529        21        0     34.410  
## Max        124,047    2,747,219   191,224    24,929    4,279   801.868 
## -----------------------------------------------------------------------

회귀분석표 생성

stargazer 패키지의 가장 큰 장점은 회귀분석표를 생성하기 편리하다는 점이다. 회귀분석 결과표를 생성해 본 사람들은 대부분 느끼는 문제가 회귀분석 결과로 산출되는 많은 계수들을 정리하는데 어려움이 있고 특히 *을 사용하는 p 값의 표현에 혼동이 온다는 점이다. stargazer패키지는 이러한 어려움을 자동화해준다.

stargazer 패키지의 회귀분석 표 생성을 알아보기 위해 먼저 다음과 같은 회귀분석 모델을 생성한다.

lm_model = lm(학생수 ~ 전체교원수 + 기간제교원수 + 시간강사수, data = df_비정규교원당학생수)

summary(lm_model)
## 
## Call:
## lm(formula = 학생수 ~ 전체교원수 + 기간제교원수 + 시간강사수, 
##     data = df_비정규교원당학생수)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -138308  -10623   -2498    3986  154651 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -1.729e+03  1.704e+03  -1.014    0.311    
## 전체교원수    1.525e+01  8.713e-02 175.011  < 2e-16 ***
## 기간제교원수 -2.560e+01  8.082e-01 -31.670  < 2e-16 ***
## 시간강사수    4.214e+01  5.168e+00   8.153 5.43e-15 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 29670 on 374 degrees of freedom
## Multiple R-squared:  0.9956, Adjusted R-squared:  0.9956 
## F-statistic: 2.833e+04 on 3 and 374 DF,  p-value: < 2.2e-16

R에서 표시해주는 회귀분석 결과는 위와 같은데 이를 표의 형태로 정리되지는 않는다.

stargazer에서 회귀분석 결과표를 만드는 데에도 stargazer()를 사용한다. 앞서 요약표에서는 데이터프레임을 첫 번째 매개변수로 전달하였는데 회귀모델을 전달하면 회귀분석 결과표를 만들어 준다.

stargazer(lm_model, type = 'text', title = '표 2. 회귀분석 결과', out = '2.txt', single.row = TRUE)
## 
## 표 2. 회귀분석 결과
## ===============================================
##                         Dependent variable:    
##                     ---------------------------
##                                 학생수            
## -----------------------------------------------
## 전체교원수                    15.248*** (0.087)     
## 기간제교원수                  -25.596*** (0.808)     
## 시간강사수                    42.136*** (5.168)     
## Constant              -1,728.813 (1,704.429)   
## -----------------------------------------------
## Observations                    378            
## R2                             0.996           
## Adjusted R2                    0.996           
## Residual Std. Error    29,674.280 (df = 374)   
## F Statistic         28,325.080*** (df = 3; 374)
## ===============================================
## Note:               *p<0.1; **p<0.05; ***p<0.01

만약 변수의 차이에 따른 몇 개의 회귀분석 결과를 비교하고자 한다면 stargazer()의 매개변수로 회귀모델을 전달해주면 비교표가 생성된다.

lm_model_1 = lm(학생수 ~ 전체교원수 + 기간제교원수 + 시간강사수 + (기간제교원수 * 시간강사수), data = df_비정규교원당학생수)

stargazer(lm_model, lm_model_1, type = 'text', title = '표 3. 회귀분석 비교 결과', out = '3.txt')
## 
## 표 3. 회귀분석 비교 결과
## ===========================================================================
##                                       Dependent variable:                  
##                     -------------------------------------------------------
##                                               학생수                          
##                                 (1)                         (2)            
## ---------------------------------------------------------------------------
## 전체교원수                        15.248***                   15.189***         
##                               (0.087)                     (0.096)          
##                                                                            
## 기간제교원수                      -25.596***                  -24.272***         
##                               (0.808)                     (1.213)          
##                                                                            
## 시간강사수                        42.136***                   50.585***         
##                               (5.168)                     (7.747)          
##                                                                            
## 기간제교원수:시간강사수                                              -0.001           
##                                                           (0.001)          
##                                                                            
## Constant                    -1,728.813                  -3,215.955         
##                             (1,704.429)                 (1,982.573)        
##                                                                            
## ---------------------------------------------------------------------------
## Observations                    378                         378            
## R2                             0.996                       0.996           
## Adjusted R2                    0.996                       0.996           
## Residual Std. Error    29,674.280 (df = 374)       29,629.230 (df = 373)   
## F Statistic         28,325.080*** (df = 3; 374) 21,308.990*** (df = 4; 373)
## ===========================================================================
## Note:                                           *p<0.1; **p<0.05; ***p<0.01

만약 이 결과표에 신뢰구간의 표시가 필요하다면 ‘ci’ 매개변수와 ‘ci.level’ 매개변수를 사용하면 신뢰구간의 범위가 표시된다.

stargazer(lm_model, lm_model_1, type = 'text', title = '표 4. 회귀분석 비교 결과(신뢰구간 포함)', out = '4.txt', ci = TRUE, ci.level = 0.95)
## 
## 표 4. 회귀분석 비교 결과(신뢰구간 포함)
## ===========================================================================
##                                       Dependent variable:                  
##                     -------------------------------------------------------
##                                               학생수                          
##                                 (1)                         (2)            
## ---------------------------------------------------------------------------
## 전체교원수                        15.248***                   15.189***         
##                          (15.078, 15.419)            (15.001, 15.377)      
##                                                                            
## 기간제교원수                      -25.596***                  -24.272***         
##                         (-27.180, -24.012)          (-26.649, -21.895)     
##                                                                            
## 시간강사수                        42.136***                   50.585***         
##                          (32.006, 52.266)            (35.401, 65.768)      
##                                                                            
## 기간제교원수:시간강사수                                              -0.001           
##                                                      (-0.002, 0.0003)      
##                                                                            
## Constant                    -1,728.813                  -3,215.955         
##                       (-5,069.432, 1,611.806)      (-7,101.727, 669.817)   
##                                                                            
## ---------------------------------------------------------------------------
## Observations                    378                         378            
## R2                             0.996                       0.996           
## Adjusted R2                    0.996                       0.996           
## Residual Std. Error    29,674.280 (df = 374)       29,629.230 (df = 373)   
## F Statistic         28,325.080*** (df = 3; 374) 21,308.990*** (df = 4; 373)
## ===========================================================================
## Note:                                           *p<0.1; **p<0.05; ***p<0.01

위의 결과는 95% 신뢰구간이 표시된 회귀분석 결과표를 보이고 있다.

학회 스타일링

stargazer의 가장 큰 장점이라고 생각되는 것은 여러 학회에서 제안하는 스타일을 제공한다는 점이다. stargazer의 ‘style’ 매개변수를 설정하면 해당 학회에서 요구하는 형태의 표로 그려진다는 것이다.

stargazer에서 지원하는 학회 스타일은 다음과 같다.

  • all : 모든 가능한 통계를 출력
  • all2 : 모든 가능한 통계를 출력하지만 t-통계값과 p-value는 제외
  • aer : American Economic Review
  • ajps : American Journal of Political Science
  • ajs : American Journal of Sociology
  • asq : Administrative Science Quarterly
  • asr : American Sociological Review
  • apsr : American Political Science Review
  • demography : Demography
  • io : International Organization
  • jpam : Journal of Policy Analysis and Management
  • qje : Quarterly Journal of Economics
## American Economic Review 스타일의 회귀분석 결과표
stargazer(lm_model, lm_model_1, type = 'text', title = '표 5. 회귀분석 비교 결과(American Economic Review)', out = '5.txt', ci = TRUE, ci.level = 0.95, style = 'aer')
## 
## 표 5. 회귀분석 비교 결과(American Economic Review)
## ===========================================================================
##                                               학생수                          
##                                 (1)                         (2)            
## ---------------------------------------------------------------------------
## 전체교원수                        15.248***                   15.189***         
##                          (15.078, 15.419)            (15.001, 15.377)      
##                                                                            
## 기간제교원수                      -25.596***                  -24.272***         
##                         (-27.180, -24.012)          (-26.649, -21.895)     
##                                                                            
## 시간강사수                        42.136***                   50.585***         
##                          (32.006, 52.266)            (35.401, 65.768)      
##                                                                            
## 기간제교원수:시간강사수                                              -0.001           
##                                                       (-0.002, 0.000)      
##                                                                            
## Constant                    -1,728.813                  -3,215.955         
##                       (-5,069.432, 1,611.806)      (-7,101.727, 669.817)   
##                                                                            
## Observations                    378                         378            
## R2                             0.996                       0.996           
## Adjusted R2                    0.996                       0.996           
## Residual Std. Error    29,674.280 (df = 374)       29,629.230 (df = 373)   
## F Statistic         28,325.080*** (df = 3; 374) 21,308.990*** (df = 4; 373)
## ---------------------------------------------------------------------------
## Notes:              ***Significant at the 1 percent level.                 
##                     **Significant at the 5 percent level.                  
##                     *Significant at the 10 percent level.

댓글