PSPP 강의 2편 — 데이터 불러오기, 레이블, .sav 저장

이번 편에서는 CSV 파일을 읽어 들여 변수 레이블과 값 레이블을 붙이고, 파생 변수를 만든 다음 .sav 파일로 저장합니다. 여기서 만드는 파일이 이 시리즈 내내 쓰는 예제 데이터입니다. 3편부터는 매번 CSV를 다시 읽지 않고 이 .sav 파일을 열어서 시작합니다.

마지막으로 호환성도 확인합니다. PSPP가 저장한 .sav를 SPSS가 제대로 여는지, 반대로 SPSS가 저장한 .sav를 PSPP가 제대로 여는지 확인합니다. 연구실이나 회사에서 SPSS를 쓰는 사람과 파일을 주고받아야 한다면 PSPP로 갈아탈 수 있을지는 이 부분에서 판가름 납니다.

데이터

어느 회사가 사내 교육 프로그램을 운영하면서, 교육을 받은 실험군과 받지 않은 대조군의 교육 전후 평가 점수, 만족도 설문, 재수강 의향을 조사했다는 설정의 가상 데이터입니다. 응답자는 200명입니다. 저장소의 data/training_survey.csv가 원본이고, 난수 시드를 고정해 두었기 때문에 data/make_data.py를 돌리면 똑같은 파일을 다시 만들 수 있습니다.

변수 형식 의미
id 정수 응답자 ID
gender 1/2 남성/여성
age 정수 나이
dept 1~3 영업/개발/관리
edu 1~4 고졸/학사/석사/박사
group 1/2 대조군/실험군
pre_score, post_score 실수 교육 전/후 평가 점수
q1~q5 1~5 만족도 5문항 (리커트)
salary 정수 연봉(만원)
reenroll 0/1 재수강 의향

CSV의 첫 줄은 변수 이름이고, 그 아래 값은 전부 숫자입니다. 성별도 ‘남성’, ‘여성’이 아니라 1, 2로 들어 있습니다. 한글은 CSV에 한 글자도 없고, 뒤에서 레이블을 붙일 때 처음 들어갑니다. 설문 데이터를 코딩하는 흔한 방식입니다. 이렇게 해 두면 원본 파일은 인코딩 문제에서 자유롭고, 사람이 읽을 이름은 통계 프로그램 쪽에서 관리하게 됩니다.

id,gender,age,dept,edu,group,pre_score,post_score,q1,q2,q3,q4,q5,salary,reenroll
1,2,47,3,3,1,44.6,44.4,4,3,3,3,3,4201,0
2,1,36,3,2,2,72.2,83.8,5,4,4,2,2,3318,1

첫 번째 응답자를 예로 들면 여성(gender=2), 47세, 관리부서(dept=3), 석사(edu=3), 대조군(group=1)이고, 교육 전 44.6점에서 교육 후 44.4점으로 거의 변화가 없었습니다. 재수강 의향은 ‘아니오'(0)입니다.

이 데이터에는 일부러 효과를 심어 두었습니다. 실험군의 점수 향상분은 약 +8, 대조군은 약 +1이 되게 만들었습니다. 연봉은 나이, 학력, 개발부서 여부로 정해지게 했고, 만족도 5문항은 하나의 요인으로 묶이게 했습니다. 정답을 알고 만든 데이터이기 때문에 이후 편에서 “이 값이 나와야 정상”이라고 말할 수 있습니다. 결과가 기대와 다르면 프로그램이 잘못 계산했거나 신택스를 잘못 쓴 것이니, 도구를 검증하는 데 쓰기 좋습니다.

메뉴로 하기

File > Import Data를 고르면 텍스트 파일 가져오기 마법사가 뜹니다. 단계는 다섯 개입니다.

  1. 가져올 파일을 고릅니다.
  2. 파일에서 몇 줄을 가져올지 정합니다.
  3. 데이터가 시작하는 첫 줄을 고릅니다. 그 위 줄을 변수 이름으로 쓸지도 여기서 정합니다.
  4. 구분자(여기서는 쉼표)와 인용부호를 지정합니다.
  5. 변수마다 형식이 맞게 잡혔는지 확인합니다.

SPSS의 텍스트 가져오기 마법사와 순서가 같아서 SPSS를 써 본 분이라면 헤매지 않을 것입니다. 아래는 세 번째 단계 화면입니다. 파일 내용을 미리 보여 주면서 첫 줄이 변수 이름인지 묻습니다.

PSPPIRE 텍스트 가져오기 마법사 — 첫 줄 선택 단계

마법사를 마치면 데이터 편집기에 200행 15열이 들어옵니다. 레이블은 변수 보기(Variable View) 탭에서 Label 칸과 Value Labels 칸을 직접 채우면 됩니다.

다만 변수 레이블 17개와 값 레이블 수십 개를 손으로 입력하는 것은 번거롭고, 데이터를 다시 받을 때마다 같은 작업을 반복해야 합니다. 신택스로 적어 두면 한 번 실행으로 끝나고, 몇 달 뒤에도 똑같이 다시 만들 수 있습니다. 그래서 이 시리즈는 여기서부터 신택스를 기본으로 합니다. 메뉴는 “어디에 있는지”를 보여 주는 용도로 함께 소개합니다.

신택스로 하기

아래는 저장소의 syntax/01_import_labels.sps에 명령마다 설명 주석을 덧붙인 것입니다. 주석을 뺀 명령 부분은 원본 파일과 같고, PSPP와 SPSS에서 한 글자도 바꾸지 않고 돌아갑니다.

신택스를 처음 보는 분을 위해 규칙 두 가지만 먼저 말씀드리겠습니다. 명령 하나는 여러 줄에 걸쳐 써도 되고, 끝에 마침표(.)가 와야 끝납니다. 별표(*)로 시작해서 마침표로 끝나는 줄은 주석이라 실행되지 않습니다.

* CSV 파일을 읽는다. TYPE=TXT 는 텍스트(CSV 포함) 파일이라는 뜻.
* DELIMITERS 는 구분자(쉼표), QUALIFIER 는 문자열을 감싸는 따옴표.
* FIRSTCASE=2 는 1행이 변수 이름이므로 2행부터 데이터라는 뜻.
* VARIABLES 아래에는 변수 이름과 형식을 CSV 열 순서대로 적는다.
* F4.0 은 전체 4자리·소수 0자리 숫자, F5.1 은 전체 5자리·소수 1자리 숫자.
GET DATA
  /TYPE=TXT
  /FILE='data/training_survey.csv'
  /DELIMITERS=','
  /QUALIFIER='"'
  /FIRSTCASE=2
  /VARIABLES=
    id F4.0
    gender F1.0
    age F2.0
    dept F1.0
    edu F1.0
    group F1.0
    pre_score F5.1
    post_score F5.1
    q1 F1.0 q2 F1.0 q3 F1.0 q4 F1.0 q5 F1.0
    salary F6.0
    reenroll F1.0.

* 변수 레이블: 변수 이름 옆에 붙는 설명. 출력 표에 변수 이름 대신 찍힌다.
VARIABLE LABELS
  id         '응답자 ID'
  gender     '성별'
  age        '나이'
  dept       '부서'
  edu        '최종 학력'
  group      '실험 집단'
  pre_score  '교육 전 평가 점수'
  post_score '교육 후 평가 점수'
  q1 '만족도1: 강의 내용이 업무에 도움이 되었다'
  q2 '만족도2: 강사의 설명이 명확했다'
  q3 '만족도3: 교육 자료가 유용했다'
  q4 '만족도4: 교육 시간이 적절했다'
  q5 '만족도5: 동료에게 추천하고 싶다'
  salary     '연봉(만원)'
  reenroll   '재수강 의향'.

* 값 레이블: 숫자 코드마다 뜻을 붙인다. 변수가 바뀔 때마다 빗금(/)으로 구분.
* q1 TO q5 는 q1 부터 q5 까지 파일 안에서 연달아 있는 변수 다섯 개를 한꺼번에 가리킨다.
VALUE LABELS
  gender 1 '남성' 2 '여성'
  /dept 1 '영업' 2 '개발' 3 '관리'
  /edu 1 '고졸' 2 '학사' 3 '석사' 4 '박사'
  /group 1 '대조군' 2 '실험군'
  /reenroll 0 '아니오' 1 '예'
  /q1 TO q5 1 '전혀 아니다' 2 '아니다' 3 '보통' 4 '그렇다' 5 '매우 그렇다'.

* 파생 변수: 점수 향상분, 만족도 평균.
COMPUTE gain = post_score - pre_score.
COMPUTE sat_mean = MEAN(q1 TO q5).
VARIABLE LABELS gain '점수 향상분(사후-사전)' sat_mean '만족도 평균'.
* 새 변수의 표시 형식. 향상분은 소수 1자리, 만족도 평균은 소수 2자리로 보이게 한다.
FORMATS gain (F6.1) sat_mean (F4.2).

* 지금까지 만든 데이터를 .sav 로 저장한다. 경로는 프로젝트 루트 기준.
SAVE OUTFILE='data/training_survey.sav'.
* 쌓여 있는 변환을 실제로 실행시킨다.
EXECUTE.

블록이 길어 보이지만 하는 일은 다섯 가지입니다. 하나씩 짚어 보겠습니다.

  • GET DATA /TYPE=TXT 가 CSV를 읽습니다. 메뉴의 가져오기 마법사가 하는 일을 한 명령으로 적은 것입니다. FIRSTCASE=2는 마법사 세 번째 단계에서 “첫 줄은 변수 이름”이라고 고른 것과 같고, /VARIABLES= 아래의 목록은 다섯 번째 단계에서 변수 형식을 확인한 것과 같습니다. 형식 F5.1은 소수 한 자리까지 있는 숫자라는 뜻입니다.
  • VARIABLE LABELS와 VALUE LABELS 는 SPSS와 문법이 같습니다. 변수 레이블은 “이 변수가 무엇인가”를, 값 레이블은 “이 숫자가 무엇을 뜻하는가”를 적습니다. q1 TO q5처럼 범위를 지정하면 다섯 문항에 같은 척도 레이블을 한 번에 붙일 수 있습니다.
  • COMPUTE 로 새 변수를 만듭니다. 향상분(gain)은 사후 점수에서 사전 점수를 뺀 값이고, 만족도 평균(sat_mean)은 다섯 문항의 평균입니다. MEAN(q1 TO q5)은 SPSS와 같은 함수입니다. 이 두 변수는 뒤의 t-검정과 상관·회귀에서 계속 씁니다.
  • FORMATS 는 값 자체를 바꾸지 않고 보이는 모양만 정합니다. 반올림해서 저장하는 것이 아니니 계산에는 영향을 주지 않습니다.
  • SAVE OUTFILE 로 .sav를 씁니다. 경로가 프로젝트 루트 기준 상대 경로라서, 신택스를 돌리기 전에 작업 디렉터리가 프로젝트 루트여야 합니다. 배치로 실행할 때는 그 폴더에서 실행하면 되고, GUI에서는 File > Open으로 연 파일의 위치가 기준이 됩니다.

마지막의 EXECUTE는 SPSS를 쓰던 분에게 익숙할 것입니다. COMPUTE 같은 변환 명령은 바로 계산되지 않고 쌓여 있다가 데이터를 실제로 읽어야 하는 명령을 만날 때 한꺼번에 처리됩니다. EXECUTE는 “지금 처리하라”는 명령입니다.

실행하고 나면 변수 보기가 아래처럼 바뀝니다. Label 칸에 한글 레이블이 그대로 보이고, Values 칸에도 값 레이블이 들어가 있습니다.

PSPPIRE 변수 보기 — 레이블이 붙은 상태

측도(Measure) 칸을 보시면 전부 Scale(척도)로 잡혀 있습니다. 신택스에서 측도를 따로 지정하지 않으면 PSPP는 숫자 변수를 모두 척도로 봅니다. 성별이나 부서는 평균을 내는 것이 의미 없는 범주형 변수이니 명목(Nominal)으로 두는 것이 맞습니다. 그렇게 하려면 한 줄을 더 쓰면 됩니다. 이 명령도 PSPP와 SPSS가 둘 다 받습니다.

* 값 레이블이 붙은 범주형 변수를 명목 측도로 지정한다.
VARIABLE LEVEL gender dept edu group reenroll (NOMINAL).

SPSS와 대조 — .sav는 양쪽으로 통한다

이 신택스로 PSPP가 저장한 .sav를 SPSS 32에서 열어 보았습니다. 변수 레이블과 값 레이블이 한글 그대로 나옵니다.

SPSS 32에서 연 PSPP의 .sav — 변수 보기

반대 방향도 확인했습니다. 같은 신택스를 SPSS 32에서 돌려 저장한 .sav를 PSPP로 열어도 변수 17개, 케이스 200개, 레이블이 전부 그대로 들어옵니다. PSPP에서 SYSFILE INFO 명령으로 파일 정보를 출력하면 이렇게 나옵니다.

|Created       |19 Sep 26 01:11:03 by @(#) IBM SPSS STATISTICS 64-bit MS Windows 32.0.0.0|
|Variables     |                                                                       17|
|Cases         |                                                                      200|
|Encoding      |UTF-8                                                                    |

첫 줄 Created에서 이 파일을 IBM SPSS Statistics 32가 윈도우에서 썼다는 것을 알 수 있습니다. 그 아래 Variables 17은 CSV의 15개 변수에 COMPUTE로 만든 gain, sat_mean 두 개를 더한 수이고, Cases 200은 응답자 수입니다. Encoding이 UTF-8이라는 것은 한글 레이블이 유니코드로 저장되어 있다는 뜻입니다.

.sav 파일의 첫 64바이트에는 어느 프로그램이 이 파일을 썼는지가 문자열로 적혀 있습니다. 파일 형식은 같고 이 서명만 다릅니다.

$FL2@(#) SPSS DATA FILE GNU pspp 2.1.1 - x86_64-pc-linux-gnu
$FL2@(#) IBM SPSS STATISTICS 64-bit MS Windows 32.0.0.0

윗줄이 PSPP가 쓴 파일, 아랫줄이 SPSS가 쓴 파일입니다. 맨 앞의 $FL2가 .sav 형식이라는 표시이고, 그 뒤는 작성 프로그램의 이름과 버전입니다.

굳이 차이를 찾자면 두 가지가 있습니다.

항목 PSPP가 쓴 .sav SPSS 32가 쓴 .sav
측도 기본값 (VARIABLE LEVEL 없을 때) 전부 척도 전부 “알 수 없음” (PSPP로 열면 Nominal로 표시)
gain, sat_mean 열 너비 8 10

둘 다 분석 결과에는 영향이 없는 차이입니다. 측도는 앞에서 본 VARIABLE LEVEL 한 줄로 맞출 수 있고, 열 너비는 데이터 편집기에서 칸이 얼마나 넓게 보이는지의 문제입니다. 변수 이름, 레이블, 값 레이블, 자료형, 소수점 자리는 양쪽 모두 온전히 보존됩니다. SPSS 사용자와 .sav 파일을 주고받는 데는 문제가 없다고 보셔도 됩니다.

함정과 메모

  • .sav 헤더에는 생성 시각이 들어갑니다. 위 SYSFILE INFO의 Created 줄이 그것입니다. 그래서 같은 신택스를 다시 돌리면 내용은 같아도 파일은 바이트 단위로 달라집니다. .sav를 git 같은 버전 관리 도구로 관리하면 실행할 때마다 “변경됨”으로 잡히는데, 정상이니 걱정하지 않으셔도 됩니다.
  • 한글 인코딩. 신택스 파일은 BOM 없는 UTF-8로 저장합니다. PSPP는 그대로 읽고, SPSS 32도 유니코드 모드가 기본이라 그대로 읽습니다. SPSS를 코드페이지 모드로 쓰고 있다면 한글이 깨질 수 있으니, 다른 신택스 파일을 불러올 때 INSERT FILE='...' ENCODING='UTF8'처럼 인코딩을 명시하면 됩니다. PSPP도 같은 구문을 받습니다.

다음 편

3편에서는 이번에 만든 데이터로 빈도표, 기술통계량, 상자그림, 교차표와 카이제곱 검정을 돌려 봅니다.


시리즈 목차: 0편 총론 · 1편 · 2편 데이터 불러오기 · 3편 · 4편 · 5편 · 6편 · 7편 · 8편 · 9편