Intro to Stata

JeongHoon Min

0. Getting Started

Stata로 통계분석을 수행하기 위한 첫 단계는 자료를 확보하는 것이다. 이상적으로는 본인의 가설을 검증할 수 있는 자료를 직접 설계하고 구축해야겠지만, 여건이 되지 않는 경우 공개된 자료를 이용하여 연구할 수밖에 없다. 한국에서 정치과정 분야 연구자라면 활용해봄직한 자료로는 우선 성균관대학교 서베이리서치센터에서 2년 주기로 실시하는 한국종합사회조사가 있다. KGSS는 한국에서는 드물게 표본 추출 등 방법론적 측면을 세심하게 고려하여 설계된 질 좋은 설문 자료이지만, 사회과학 내 여러 전공이 협동하여 진행하는 프로젝트이기에 정치학-specific한 질문들은 충분치 않으며, 대면조사라는 이유로 감정 온도계나 이슈 태도를 variation이 적은 5점 척도로 측정하는 등 아쉬운 측면도 없지는 않다. 만약 연구 관심이 특정 선거와 관련되어 있다면 한국사회과학센터한국사회과학자료원에서 제공하는, 선거 전후에 정치학자들에 의해 실시된 설문조사 자료들이 유용할 수 있다. 이 튜토리얼에서 우리는 KSDC에 탑재된 제19대 대통령선거 관련 유권자 의식조사를 이용하여 기본적인 전처리, 분석, 시각화를 학습할 것이다.

먼저 다음의 링크를 클릭하여 KSDC에 접속하자: http://www.ksdcdb.kr. 연구실 등 교내 IP를 이용할 경우에는 별도의 로그인 절차를 요구하지 않지만, 교외에서 접속한다면 학교 도서관 홈페이지학술DB 메뉴를 경유해야 한다.1 FIND DATA > 조사자료 > 주제별 검색 > 선거를 클릭하면2 목록 최상단에서 제19대 대통령선거 관련 유권자 의식조사를 발견할 수 있을 것이다. 전체 다운로드를 클릭하고, 다운로드된 .zip 파일은 원하는 경로에 압축 해제하자.3 이제 Stata 창을 열고, 상단 메뉴의 File > Change working directory ...를 클릭하여4 자료가 있는 경로를 선택하면, 기본적인 준비는 끝났다.

User Interface

UI

Stata 창을 처음 열면 화면이 여러 창들로 분할되어 있는 것을 볼 수 있다. 가장 큰 공간을 차지하는, Stata 로고가 표시된 창은 Results 창으로, 입력한 명령어의 결과들이 출력된다. Results 창 바로 아래에는 명령어를 입력할 수 있는 창인 Command 창이 위치하며, 가장 하단(status bar) 좌측에는 현재 working directory가 표시된다(우측에는 Caps Lock이 눌려 있는지 여부나 현재 Stata가 계산을 수행 중이라는 의미의 로딩 아이콘 등이 표시된다). Variables 창과 그 아래의 Properties 창은 데이터 전처리 과정에서 자주 확인하게 되는 창들로, 변수명, 변수라벨명, 특정 변수에 부착되어 있는 값라벨명 등을 확인할 수 있고, 변수 검색 역시 가능하다(스패너 아이콘 옆의 Filter variables here). 혹시 실수로 어떤 창을 닫았다면, 상단 메뉴의 Window에서 해당 창을 선택하여 다시 열 수 있다.

Preferences…

Results 창의 아무 데서나 마우스 오른쪽 클릭을 하고 Preferences...를 선택하면, Results 창이나 Viewer 창(help 명령어로 열리는 창) 등의 설정을 조정할 수 있는 창이 열린다. 이하에서는 Results > Colors > Color scheme: Classic을 선택하였다고 가정하고 설명할 것이다.

SPSS to Stata

유감스럽게도, 이 튜토리얼에서 우리가 이용할 제19대 대통령선거 관련 유권자 의식조사는 Stata의 데이터 포맷이 아니라, SPSS 또는 Excel의 데이터 포맷으로만 제공되고 있다. Stata 16부터는 두 가지 데이터 포맷 모두 별도의 절차를 거치지 않고 Stata에서 바로 열 수 있지만, 15 이하의 버전들에서 SPSS 데이터 포맷을 열기 위해서는 변환 작업을 먼저 해주어야 한다. 변환 작업이 필요 없는 Excel 데이터 포맷의 경우 변수와 값에 라벨이 부착되어 있지 않다는 아쉬움이 있기 때문에(라벨이 없는 자료는 데이터 전처리 과정에서 코드북을 매번 확인해야 하는 번거로움이 있다), 이 튜토리얼에서 우리는 SPSS 데이터 포맷을 Stata 데이터 포맷으로 변환하는 방법들을 학습할 것이다.

SPSS

내 컴퓨터에 SPSS가 이미 설치되어 있다면, 해결 방법은 간단하다: .sav 파일을 SPSS로 열고, 파일 > 다른 이름으로 저장 > 저장 유형 > Stata 버전 14 SE(*.dta)를 선택하면 된다. 혹시 SPSS에서 다른 이름으로 저장을 지원하는 Stata의 최신 버전이 13 이하인 경우, 변환한 .dta 파일을 Stata로 열었을 때 한글이 깨지는 문제가 발생할 수 있다. 이런 때에는 unicode encoding set koreanunicode translate filename.dta , invalid를 차례대로 Stata의 Command 창에 입력하면 한글이 깨지지 않게 할 수 있다.

the usespss package

내 컴퓨터에 SPSS가 설치되어 있지 않고, Windows 64비트 환경이며, 변환할 자료가 한글이 아니라면 Stata의 user-written package인 usespss 명령어를 이용하는 것도 가능하다. 설치를 위한 코드는 다음의 링크에서 확인할 수 있다: http://www.radyakin.org/transfer/usespss/faq/info/installation.txt.

. net from http://radyakin.org/transfer/usespss/beta
───────────────────────────────────────────────────────────────────────────────────────────────────────
http://radyakin.org/transfer/usespss/beta/
(no title)
───────────────────────────────────────────────────────────────────────────────────────────────────────

PACKAGES you could -net describe-:
    usespss           usespss.pkg Import data in SPSS (*.sav) data format !BETA!
───────────────────────────────────────────────────────────────────────────────────────────────────────

Results 창에서 하늘색으로 출력된 usespss를 클릭하고, 스크롤을 하단으로 이동하여 (click here to install)을 클릭하면 설치가 진행된다.5 설치 후, usespss filename.savsave filename.dta를 차례대로 Stata의 Command 창에 입력하면 자료가 변환된다.

R

내 컴퓨터에 SPSS가 설치되어 있지 않을 때 시도할 수 있는 또 하나의 방법은 R의 설치를 요구한다. 우선 다음의 링크에서 R binary를 설치하자: https://cran.r-project.org/. R의 설치가 완료되면, 역시 Stata의 user-written package인 importsav 명령어를 설치하자. 설치를 위한 코드는 다음의 링크에서 확인할 수 있다: https://github.com/jh-min/importsav#installation.

. importsav dfile_2553 "new data.dta"
dfile_2553.sav was successfully converted using haven

. importsav dfile_2553.sav
dfile_2553.sav was successfully converted using haven

설치 후, Stata의 Command 창에 importsav "변환 전 파일명" "변환 후 파일명"을 입력하면 자료가 변환된다(.dta 파일명을 생략시 변환된 자료는 자동으로 .sav 파일명과 동일한 이름으로 저장된다). 안타깝게도 이 명령어는 앞서 설정했던 working directory 경로나 SPSS/Stata 데이터 포맷의 파일명에 한글이 포함되어 있으면 작동하지 않는데, 이것은 R 자체의 한계이다.

the import command

Stata에서 .dta 파일은 상단 메뉴의 File > open으로 열지만, .sav(16부터 지원)나 .xlsx, .csv 등 비-Stata 데이터 포맷의 파일들은 상단 메뉴의 File > import를 통해 열 수 있다.

Do-file Editor

Stata를 잘 사용하기 위한 첫 걸음은 do-file에 익숙해지는 것이다. do-file을 만들어야 하는 가장 큰 이유는 작업을 쉽게 반복[재현]할 수 있다는 것이다. 예컨대 데이터 전처리 과정을 do-file로 작성해두면, 원자료인 .dta 파일은 그대로 보존하면서도, do-file을 실행함으로써 변수를 매번 새로 코딩해야 하는 번거로움은 피할 수 있다. 변수를 모두 코딩하고 나서 변경된 데이터를 .dta 파일로 저장하는 것도 가능하지만, 원자료를 직접 수정하는 것은 (돌이킬 수 없기 때문에) 권장되지 않는다. 인간은 실수를 할 수 있고, 원자료 자체를 수정하게 되면 나중에 데이터 전처리 과정에 실수가 있었다거나 하는 이유로 원자료를 복원해야 할 때 대처하기가 어렵다. Stata 종료시 자료를 저장하겠냐고 묻는 창이 뜨면 반드시 Don't save를 누르자.

keyboard shortcut

do-file에 작성해둔 명령어들은 ctrl+d를 눌러 한 번에 실행할 수 있으며, 드래그를 통해 일부만 실행하는 것도 가능하다.

comments in Stata

Stata는 /와 *를 주석 처리 기호로 사용한다. 왜 do-file에 주석이 필요할까? 내가 만든 변수라도 1년 후에 보면 낯설 수 있고, 다른 사람과 공동 작업을 할 수도 있기 때문이다. 주석을 이용해 코드에 설명을 달아두면 이해가 쉽다. 다음은 Stata의 do-file에서 주석이 작동하는 방식이다:

. * asterisk는 기호가 있는 행 전체를 무시하며, 행 제일 처음에만 사용할 수 있다.
. // forward slash 2개는 기호가 쓰인 행의 나머지 부분을 무시하며,
. di 6*100+7 // 행 중간에도 사용할 수 있다.
607

. di as input "ezstata.weebly.com" /// forward slash 3개는 행 중간에 사용할 수 있으며,
> /// 기호가 사용된 행의 나머지 부분을 무시할 뿐만 아니라, 
> /// 기호가 있는 행과 다음 행을 하나의 명령어로 인식하게 한다.
> as text ///
> ": offers a guide for Sublime Text 3 with Stata" /* forward slash+asterisk는
> asterisk+forward slash가 등장할 때까지의
> 모든 내용(행 변화까지!)을 무시한다. */
ezstata.weebly.com: offers a guide for Sublime Text 3 with Stata

. di as input "ezstata.weebly.com" as text ": offers a guide for Sublime Text 3 with Stata"
ezstata.weebly.com: offers a guide for Sublime Text 3 with Stata

. ** forward slash 2개 또는 3개를 행 중간에 삽입할 경우, 
. *** 반드시 기호 앞에 한 칸 띄어쓰고 //나 ///를 삽입해야 오류가 발생하지 않는다.

di는 어떤 문자열(""로 감싸진) 혹은 수식(6*100+7)의 결과를 출력해주는 명령어이다. as input 혹은 as text는 뒤따르는 문자열 혹은 수식 계산 결과가 표시될 색을 지정해준다.

1. Managing Data

전처리를 시작하기 전에, 작업하기 편하게끔 몇 가지 간단한 설정을 할 것이다. 코드는 다음과 같다:

. cls

. clear

. use dfile_2553

. // use "the\path\where\data\located\dfile_2553.dta"
. set more off, perm // 설치 후 최초 1회
(set more preference recorded)

. rename * , low

. numlabel , add

cls는 Results 창을 깨끗하게 지워주는 명령어로, 기존에 하고 있던 작업과 구분되는 새 작업을 하고 싶을 때 편리하다. clear는 이미 불러온 자료를 닫는 명령어인데, Variables 창을 비워주고 값라벨들을 모두 삭제한다. use는 .dta 파일을 여는 명령어이다. 자료가 작업 디렉토리 안에 있다면 파일명만 입력해도 불러올 수 있지만, 그렇지 않다면 "" 안에 전체 경로를 입력해주어야 한다.6 set more off, perm은 Stata를 설치하고 나서 최초로 실행하였을 때 1회 입력하는 명령어로, 설정해두지 않으면 Stata가 결과를 분할 출력하기 때문에 귀찮다.7 rename * , low는 변수명의 대문자를 일괄적으로 소문자로 바꿔준다. Stata의 모든 명령어는 소문자이고, 명령어를 입력하고 변수명을 입력하는 과정에서 매번 대소문자를 전환하는 것은 매우 번거롭다. numlabel , add는 빈도표 출력시 값라벨과 응답값을 모두 출력하게 해준다. 무슨 역할을 하는지는 예시를 보면서 확인하면 좋겠다.

1.1. Labels (1): numlabel, add

. numlabel , remove

. tab dq3

     선문3. │
     응답자 │
       성별 │      Freq.     Percent        Cum.
────────────┼───────────────────────────────────
       남자 │        595       49.58       49.58
       여자 │        605       50.42      100.00
────────────┼───────────────────────────────────
      Total │      1,200      100.00

numlabel , removenumlabel, add를 입력하기 이전으로 되돌리기 위한 명령어이다. dq3은 이 자료에서 성별 정보를 담고 있는 변수인데, tab 명령어로 빈도표를 출력하면 남자여자라는 값라벨만 출력되는 것을 확인할 수 있다.

. tab dq3 , nolab

     선문3. │
     응답자 │
       성별 │      Freq.     Percent        Cum.
────────────┼───────────────────────────────────
          1 │        595       49.58       49.58
          2 │        605       50.42      100.00
────────────┼───────────────────────────────────
      Total │      1,200      100.00

한편, tab 명령어의 옵션을 이용하면, 값라벨 대신 응답값만 출력할 수도 있다. 하지만 값라벨 없이 응답값만 출력된 이 빈도표만 봐서는 1과 2중 어느 쪽이 여자인지, 설문조사 응답자들 가운데 여자가 더 많은지 남자가 더 많은지를 알 수가 없다. 값라벨남자여자는 우리가 이해하기 위한 이름이고, 응답값12는 Stata가 이해하는 이름이라고 생각하면 편하다.

. numlabel , add

. tab dq3

     선문3. │
     응답자 │
       성별 │      Freq.     Percent        Cum.
────────────┼───────────────────────────────────
    1. 남자 │        595       49.58       49.58
    2. 여자 │        605       50.42      100.00
────────────┼───────────────────────────────────
      Total │      1,200      100.00

numlabel , add 명령어를 수행한 후 빈도표를 출력하면 값라벨응답값이 둘 다 출력된다. 왜 이 작업이 필요할까? 회귀분석을 전체 표본에서가 아니라 남자/여자로 나누어 돌리는 경우를 생각해보자. Stata가 이해할 수 있는 명령은 변수 dq3의 응답값이 2인 경우에만 회귀분석을 수행하라는 것이지, 성별 변수의 값라벨이 여자인 경우에만 회귀분석을 수행하라는 것이 아니다. 응답값 2값라벨 여자에 대응한다는 것을 모르면, Stata에게 여자인 경우에만 회귀분석을 돌리라고 명령할 수조차 없다. 우리는 값라벨만 이해하는데, Stata는 응답값만 이해하므로, 우리가 Stata와 대화하기 위해서는 둘을 동시에 출력해서 어떤 값라벨이 어떤 응답값에 대응하는지를 확인해야 하는 것이다.

1.2. Variables (1): gen, recode and replace

. sum sq12

    Variable │        Obs        Mean    Std. Dev.       Min        Max
─────────────┼─────────────────────────────────────────────────────────
        sq12 │      1,200    1970.427    13.97291       1935       1997

. gen age=2017-sq12

. sum age

    Variable │        Obs        Mean    Std. Dev.       Min        Max
─────────────┼─────────────────────────────────────────────────────────
         age │      1,200    46.57333    13.97291         20         82
. recode age (20/29=2) (30/39=3) (40/49=4) (50/59=5) (60/82=6), gen(age2)
(1200 differences between age and age2)

. tab age2

  RECODE of │
        age │      Freq.     Percent        Cum.
────────────┼───────────────────────────────────
          2 │        194       16.17       16.17
          3 │        221       18.42       34.58
          4 │        257       21.42       56.00
          5 │        243       20.25       76.25
          6 │        285       23.75      100.00
────────────┼───────────────────────────────────
      Total │      1,200      100.00
. tab q42

             문42. 선생님께서는 │
                대통령후보자 TV │
           토론회를 얼마나 자주 │
                    보셨습니까? │      Freq.     Percent        Cum.
────────────────────────────────┼───────────────────────────────────
1. 거의 모두 보았다(5-6회 이상) │        151       12.58       12.58
        2. 대부분 보았다(3-4회) │        454       37.83       50.42
     3. 거의 보지 못했다(1-2회) │        439       36.58       87.00
            4. 전혀 보지 못했다 │        156       13.00      100.00
────────────────────────────────┼───────────────────────────────────
                          Total │      1,200      100.00

. gen tv=q42

. replace tv=5-tv
(1,200 real changes made)

. tab tv

         tv │      Freq.     Percent        Cum.
────────────┼───────────────────────────────────
          1 │        156       13.00       13.00
          2 │        439       36.58       49.58
          3 │        454       37.83       87.42
          4 │        151       12.58      100.00
────────────┼───────────────────────────────────
      Total │      1,200      100.00
. tab tv age2

           │                     RECODE of age
        tv │         2          3          4          5          6 │     Total
───────────┼───────────────────────────────────────────────────────┼──────────
         1 │        50         30         32         15         29 │       156 
         2 │        85         85         90         83         96 │       439 
         3 │        46         81        100        107        120 │       454 
         4 │        13         25         35         38         40 │       151 
───────────┼───────────────────────────────────────────────────────┼──────────
     Total │       194        221        257        243        285 │     1,200 
. recode tv (1=1) (2 3 4=0), pre(no_)
(1044 differences between tv and no_tv)

. tab tv no_tv

           │     RECODE of tv
        tv │         0          1 │     Total
───────────┼──────────────────────┼──────────
         1 │         0        156 │       156 
         2 │       439          0 │       439 
         3 │       454          0 │       454 
         4 │       151          0 │       151 
───────────┼──────────────────────┼──────────
     Total │     1,044        156 │     1,200 
. gen young=1 if age2==2
(1,006 missing values generated)

. replace young=0 if age2!=2
(1,006 real changes made)

. tab age2 young

 RECODE of │         young
       age │         0          1 │     Total
───────────┼──────────────────────┼──────────
         2 │         0        194 │       194 
         3 │       221          0 │       221 
         4 │       257          0 │       257 
         5 │       243          0 │       243 
         6 │       285          0 │       285 
───────────┼──────────────────────┼──────────
     Total │     1,006        194 │     1,200 
. tab no_tv young, col

┌───────────────────┐
│ Key               │
├───────────────────┤
│     frequency     │
│ column percentage │
└───────────────────┘

 RECODE of │         young
        tv │         0          1 │     Total
───────────┼──────────────────────┼──────────
         0 │       900        144 │     1,044 
           │     89.46      74.23 │     87.00 
───────────┼──────────────────────┼──────────
         1 │       106         50 │       156 
           │     10.54      25.77 │     13.00 
───────────┼──────────────────────┼──────────
     Total │     1,006        194 │     1,200 
           │    100.00     100.00 │    100.00 

if versus options

. tab no_tv young

 RECODE of │         young
        tv │         0          1 │     Total
───────────┼──────────────────────┼──────────
         0 │       900        144 │     1,044 
         1 │       106         50 │       156 
───────────┼──────────────────────┼──────────
     Total │     1,006        194 │     1,200 

if는 명령어를 수행할 대상을 한정한다. , 이후에 붙는 옵션은 명령어가 수행되는 방식을 지정한다.

. tab no_tv young if age<40

 RECODE of │         young
        tv │         0          1 │     Total
───────────┼──────────────────────┼──────────
         0 │       191        144 │       335 
         1 │        30         50 │        80 
───────────┼──────────────────────┼──────────
     Total │       221        194 │       415 

tab 명령어에 if 조건문을 덧붙이면, Stata는 if 조건문이 성립하는 관측치에 대해서만, 즉 예시에서는 연령이 40세 미만인 응답자에 대해서만 tab 명령어를 수행한다. if age<40을 덧붙인 결과와 그렇지 않은 결과의 Total 값에 차이가 있는 것을 확인할 수 있다.

. tab no_tv young, col

┌───────────────────┐
│ Key               │
├───────────────────┤
│     frequency     │
│ column percentage │
└───────────────────┘

 RECODE of │         young
        tv │         0          1 │     Total
───────────┼──────────────────────┼──────────
         0 │       900        144 │     1,044 
           │     89.46      74.23 │     87.00 
───────────┼──────────────────────┼──────────
         1 │       106         50 │       156 
           │     10.54      25.77 │     13.00 
───────────┼──────────────────────┼──────────
     Total │     1,006        194 │     1,200 
           │    100.00     100.00 │    100.00 

. help tab

tab 명령어에 , col 옵션을 덧붙이면, Stata는 tab 명령어를 수행할 때 각 cell의 절대 빈도뿐만 아니라 열별로 계산된 상대 빈도(%)를 함께 표시한다. tab 명령어의 결과 출력 방식을 지정하는 옵션으로는 col 외에도 row, cell 등이 있다. Stata의 모든 명령어들은 help document에서 각 명령어가 지원하는 옵션을 안내하고 있으니, 잘 모르겠으면 help 명령어를 활용해보자.

. tab no_tv young if age<40, col

┌───────────────────┐
│ Key               │
├───────────────────┤
│     frequency     │
│ column percentage │
└───────────────────┘

 RECODE of │         young
        tv │         0          1 │     Total
───────────┼──────────────────────┼──────────
         0 │       191        144 │       335 
           │     86.43      74.23 │     80.72 
───────────┼──────────────────────┼──────────
         1 │        30         50 │        80 
           │     13.57      25.77 │     19.28 
───────────┼──────────────────────┼──────────
     Total │       221        194 │       415 
           │    100.00     100.00 │    100.00 

if 조건문과 옵션을 동시에 적용하는 것도 가능한데, 항상 ,를 가장 마지막에 적는 것이 원칙이다(다시 말해, if 조건문이 언제나 옵션에 선행한다).

missing values

설문조사 자료들을 다룰 때 항상 주의해야 하는 지점 중 하나는 결측치의 처리이다. 설문조사에서는 종종 응답자들이 일부 질문에 대해 응답을 거부하거나, 또는 주어진 보기에 없는 답변을 하는 상황이 발생하고, 대개 자료 구축시 이러한 정보를 함께 포함한다. 이 자료에서 문54가 전형적인데, 대통령 후보들과 응답자 자신의 이념을 11점 척도로 조사하면서 추가적으로 ‘모른다’‘들어본 적 없다’를 구분하고 있다. 그런데 우리가 응답을 거부하는 응답자들의 특성에 관심이 있다면 이러한 정보가 유용하겠지만, 그렇지 않은 경우에는 이러한 정보가 분석 결과를 해석하기 어렵게 만들 수도 있다.

. tab q54a1

    문54-1. 문재인 │      Freq.     Percent        Cum.
───────────────────┼───────────────────────────────────
          0. ⓞ진보 │         92        7.67        7.67
              1. ① │        186       15.50       23.17
              2. ② │        294       24.50       47.67
              3. ③ │        337       28.08       75.75
              4. ④ │        142       11.83       87.58
              5. ⑤ │         46        3.83       91.42
              6. ⑥ │         21        1.75       93.17
              7. ⑦ │          9        0.75       93.92
              8. ⑧ │         16        1.33       95.25
              9. ⑨ │          2        0.17       95.42
         10. ⑩보수 │          3        0.25       95.67
        98. 모른다 │         52        4.33      100.00
───────────────────┼───────────────────────────────────
             Total │      1,200      100.00

. recode q54a1 (96 98=.), pre(re_)
(52 differences between q54a1 and re_q54a1)

. sum q54a1 re_q54a1

    Variable │        Obs        Mean    Std. Dev.       Min        Max
─────────────┼─────────────────────────────────────────────────────────
       q54a1 │      1,200    6.703333    19.50142          0         98
    re_q54a1 │      1,148    2.567944    1.598195          0         10

예를 들어, 응답자들 자신의 이념 성향이 대통령 후보들의 이념 평가에 영향을 주는지 확인하고 싶다고 해보자. 이때 98과 96으로 기록된 무응답값을 분석에서 제외하지 않으면, 예컨대 응답자 자신의 이념 응답값이 커질수록 대통령 후보의 이념 응답값이 커진다고 할 때, 그러한 상관관계가 무슨 의미인지 해석하기가 어렵다. 0부터 10까지는 값이 커질수록 보수적이지만, 10에서 98까지는 값이 커지는 것이 보수적인 정도와 관련이 없기 때문이다. 만약 응답자들 자신이 더 보수적일수록 후보들의 이념도 더 보수적으로 평가하는지가 궁금하다면, ‘모른다’와 ‘들어본 적 없다’에 해당하는 응답값인 98과 96을 결측치(.)로 변경하여 분석 대상에서 제외해야 한다.

Loops: while

이 자료의 문54는 동일한 문항을 대상만 바꾸어 6번 질문하고 있다. 따라서 문54의 무응답을 결측 처리하는 코드는 변수명의 문항 번호만 제외하고는 완전히 동일할 것이다. 이처럼 같은 작업을 반복해서 수행해야 하는 상황에서는 반복문(loop)이 유용하다. 반복문은 예컨대 recode q54a1 (96 98=.), pre(re)에서 변수명 마지막 숫자를 우리가 수동으로 수정하는 대신에, Stata가 자동으로 수정하게끔 명령하는 것이다. Stata는 while, foreach, forvalues 등 다양한 반복문 명령어를 제공하고 있는데, 이 튜토리얼에서는 가장 간단한 while 문을 사용하였다.

. *** while 문 시작 ***
. local i=2 // loop를 시작할 값 설정, i=2부터

. while `i'<7 { // loop를 종료할 값 설정, i=6까지
  2. recode q54a`i' (96 98=.), pre(re_) // loop를 돌 때마다 현재 i값에 해당하는 변수의 recode를 수행
  3. local i=`i'+1 // loop를 돌 때마다 i의 값을 1씩 증가
  4. }
(44 differences between q54a2 and re_q54a2)
(54 differences between q54a3 and re_q54a3)
(47 differences between q54a4 and re_q54a4)
(51 differences between q54a5 and re_q54a5)
(30 differences between q54a6 and re_q54a6)

. *** while 문 종료 ***
. sum q54a2-q54a6

    Variable │        Obs        Mean    Std. Dev.       Min        Max
─────────────┼─────────────────────────────────────────────────────────
       q54a2 │      1,200      11.725    16.87923          1         98
       q54a3 │      1,200    8.913333    19.41709          0         98
       q54a4 │      1,200    10.05167    17.83926          0         98
       q54a5 │      1,200       7.005    19.25805          0         98
       q54a6 │      1,200    7.258333    14.68797          0         98

. sum re_q54a2-re_q54a6

    Variable │        Obs        Mean    Std. Dev.       Min        Max
─────────────┼─────────────────────────────────────────────────────────
    re_q54a2 │      1,156    8.442907    1.311036          1         10
    re_q54a3 │      1,146    4.715532     1.69491          0         10
    re_q54a4 │      1,153    6.468343    1.760656          0         10
    re_q54a5 │      1,149    2.966057    1.782531          0         10
    re_q54a6 │      1,170    4.931624    2.131785          0         10

while 문을 사용하기 위해서는 명령어에서 반복되는 부분과 변화하는 부분을 구분하고, 변화하는 부분을 Stata에게 알려주어야 한다. 이 경우, 변수명에서 q54a까지는 반복되고, 마지막의 숫자만 변화한다. 이 변화하는 부분을 임의로 `i'로 표시하면, 우리의 명령어는 recode q54a`i' (96 98=.), pre(re_)가 된다. while 문의 첫 두 줄은 `i'가 변화를 시작하는 값과 종료하는 값을 지정하는 역할을 하며, 반복될 명령어는 중괄호({}) 안에 적는다. 중괄호 안에는 `i' 값을 변화시키는 local 명령어가 반드시 포함되어야 한다(이 명령어를 빠뜨리면 while 문이 중단되지 않고 무한히 반복된다).

1.3. Labels (2): the label command

1.4. Variables (2): gen revisited, clonevar and egen

Subgroups: bysort

🔼

🔽


  1. 자료검색 > Browse > 학술DB↩︎

  2. KSDC는 설문항 검색을 지원한다. 이 기능은 원하는 질문이 포함된 설문조사 자료를 찾거나, 새로운 질문 설계시 원하는 키워드가 포함된 기존 설문항들을 찾는 용도로 유익하다.↩︎

  3. 경로에 한글이 포함되지 않는 편이 좋다.↩︎

  4. Stata에 친숙해진다면, GUI보다는 다음처럼 명령어를 입력하는 편을 선호하게 될 것이다: cd "the\path\where\data\located"↩︎

  5. 설치해야 할 package의 이름을 정확히 알고 있다면, 다음의 명령어가 더 편할 것이다: net install usespss , from(http://radyakin.org/transfer/usespss/beta)↩︎

  6. 경로를 직접 입력하는 것이 귀찮다면 ctrl+o를 눌러 탐색기 창에서 열고 싶은 파일을 선택할 수도 있다.↩︎

  7. Results 창이 20행 크기라고 해보자. 어떤 명령어를 수행했을 때 그 결과가 22행 크기라면, Stata는 19행까지의 결과만 출력하고, Results 창의 마지막 행에 결과 대신 –more– 메시지를 출력한다. 출력되지 않은 결과를 마저 보고 싶으면 아무 키나 누르면 되는데, 이 경우 남은 세 줄을 마저 출력하려면 아무 키나 누르는 일을 세 번 반복해야 한다.↩︎