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

이 편에서는 CSV 파일을 읽어 변수 레이블과 값 레이블을 붙이고, 파생 변수를 만들어 .sav로 저장한다. 시리즈 내내 쓸 예제 데이터를 여기서 만든다. 그리고 PSPP가 저장한 .sav를 SPSS가, SPSS가 저장한 .sav를 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의 첫 줄은 변수 이름이고 값은 전부 숫자다. 한글은 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

데이터에는 일부러 효과를 심어 뒀다. 실험군의 점수 향상분은 약 +8, 대조군은 약 +1이다. 연봉은 나이·학력·개발부서 여부의 함수이고, 만족도 5문항은 요인 하나로 묶인다. 이후 편에서 “이 값이 나와야 정상”이라고 말할 수 있는 근거다.

메뉴로 하기

File > Import Data를 고르면 텍스트 파일 가져오기 마법사가 뜬다. 다섯 단계다. 파일 선택, 가져올 줄 수, 데이터가 시작하는 첫 줄(그 위 줄을 변수 이름으로 쓸지), 구분자(쉼표)와 인용부호, 변수 형식 확인. SPSS의 텍스트 가져오기 마법사와 같은 순서다. 아래는 세 번째 단계로, 파일 내용을 보여 주면서 첫 줄이 변수 이름인지 묻는다.

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

마법사를 마치면 데이터 편집기에 200행 15열이 들어온다. 레이블은 변수 보기 탭에서 Label 칸과 Value Labels 칸을 직접 채우면 된다. 다만 변수 17개에 값 레이블까지 손으로 넣는 것보다 신택스가 훨씬 빠르고, 다시 만들 수도 있다. 이 시리즈는 여기서부터 신택스를 기본으로 한다.

신택스로 하기

저장소의 syntax/01_import_labels.sps 전체다. PSPP와 SPSS에서 한 글자도 바꾸지 않고 돌아간다.

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   '재수강 의향'.

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 '만족도 평균'.
FORMATS gain (F6.1) sat_mean (F4.2).

SAVE OUTFILE='data/training_survey.sav'.
EXECUTE.

읽는 법을 짚어 두면 이렇다.

  • GET DATA /TYPE=TXT가 CSV를 읽는다. FIRSTCASE=2는 첫 줄이 변수 이름이니 2행부터 데이터라는 뜻이고, /VARIABLES= 아래에 변수 이름과 형식(F5.1은 소수 한 자리 숫자)을 나열한다.
  • VARIABLE LABELSVALUE LABELS는 SPSS와 같다. q1 TO q5처럼 범위 지정도 된다.
  • COMPUTE로 향상분(gain)과 만족도 평균(sat_mean)을 만든다. MEAN(q1 TO q5)은 SPSS와 같은 함수다.
  • SAVE OUTFILE로 .sav를 쓴다. 경로는 프로젝트 루트 기준 상대 경로라, 신택스를 돌리기 전에 작업 디렉터리를 프로젝트 루트로 두어야 한다. 배치 실행이면 그 폴더에서 실행하면 되고, GUI에서는 File > Open으로 연 파일의 위치가 기준이 된다.

실행하면 변수 보기가 이렇게 된다. 한글 레이블이 그대로 보인다.

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

측도(Measure) 칸이 전부 Scale인 것이 보일 것이다. 신택스에 측도를 지정하지 않으면 PSPP는 숫자 변수를 전부 척도로 잡는다. 값 레이블이 붙은 변수를 명목으로 잡고 싶으면 한 줄 더 쓰면 된다. 이 명령도 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                                                                    |

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

변수명, 레이블, 값 레이블, 자료형, 소수점 자리는 양쪽 다 완전히 보존된다.

함정과 메모

  • .sav 헤더에는 생성 시각이 들어간다. 같은 신택스를 다시 돌리면 내용은 같아도 파일은 바이트 단위로 달라진다. .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편