마지막 편입니다. 사실 이 시리즈에 실린 PSPP 출력은 전부 GUI를 한 번도 띄우지 않고 만들었습니다. 신택스 파일 15개를 셸 스크립트 하나로 한꺼번에 돌리고, 텍스트로 나온 출력에서 숫자를 뽑아 SPSS와의 대조표를 만들었습니다. 이번 편에서는 그 방법을 처음부터 순서대로 설명드리겠습니다.
앞 편에서 PSPP에 없는 절차들을 보셨는데, 이번 편은 반대로 PSPP가 SPSS보다 분명히 나은 지점입니다. 같은 분석을 여러 번 반복해야 하거나, 결과를 다른 프로그램으로 넘겨야 하거나, 프로그램 버전이 바뀌었을 때 결과가 그대로인지 확인해야 하는 분께 특히 쓸모가 있을 것입니다.
배치 모드 기본
배치 모드란 창을 띄우지 않고 명령 한 줄로 신택스 파일을 실행하는 방식을 말합니다. SPSS에서 신택스 편집기를 열고 전체 선택 후 실행하던 과정을, 터미널 명령 하나로 대신한다고 생각하시면 됩니다.
PSPP에서는 pspp -b가 그 역할을 합니다. 실행할 신택스 파일을 넘기고, -o로 결과를 저장할 출력 파일을, -O format=으로 출력 형식을 정합니다.
# 한글 레이블이 깨지지 않도록 UTF-8 로케일을 켠다 (아래 '함정 셋' 참고).
export LC_ALL=C.UTF-8
# 04번 신택스를 실행해 텍스트 표로 저장한다. width=100 은 표 폭을 100글자로 넓힌다.
pspp -b syntax/04_ttest.sps -o output/04.txt -O format=txt -O width=100
# 같은 신택스를 html 로 저장한다. 브라우저에서 열어 볼 수 있다.
pspp -b syntax/04_ttest.sps -o output/04.html -O format=html
위 예에서는 두 번 실행했지만, -o를 여러 번 주면 한 번 실행으로 여러 형식을 동시에 낼 수도 있습니다. -O format=을 생략하면 PSPP가 출력 파일의 확장자를 보고 형식을 알아서 정합니다.
지원하는 출력 형식은 열 가지입니다. 용도에 따라 골라 쓰시면 됩니다.
| 형식 | 용도 |
|---|---|
| txt | 사람이 읽는 표. 이 시리즈의 출력 인용이 전부 이것 |
| csv | 표를 다시 계산하거나 다른 도구로 넘길 때 |
| html | 브라우저로 볼 때. 그래프 png가 옆에 생긴다 |
| pdf, ps | 인쇄용 |
| odt | LibreOffice 문서 |
| spv | SPSS 출력 뷰어 형식 |
| svg, png | 그림 |
| tex | LaTeX |
이 중에서 자동화에 가장 유용한 것은 csv입니다. csv 출력은 표마다 제목 줄이 붙고, 표의 셀 값이 쉼표로 구분되어 그대로 나옵니다. 다음은 4편의 독립표본 t-검정 표를 csv로 뽑은 것입니다.
Table: Independent Samples Test
,,Levene's Test for Equality of Variances,,T-Test for Equality of Means,,,,,,
,,F,Sig.,t,df,Sig. (2-tailed),Mean Difference,Std. Error Difference,95% Confidence Interval of the Difference,
,,,,,,,,,Lower,Upper
점수 향상분(사후-사전),Equal variances assumed,1.29,.258,-8.96,198.00,.000,-7.54,.84,-9.20,-5.88
첫 줄 Table: Independent Samples Test가 표 이름이고, 그다음 세 줄이 표의 머리글(여러 단으로 나뉜 제목)입니다. 마지막 줄이 실제 값인데, 4편에서 읽었던 Levene F 1.29, t -8.96, 자유도 198 등이 차례로 들어 있습니다. 엑셀에서 바로 열 수 있고, Python이나 R에서 몇 줄이면 원하는 칸을 뽑아낼 수 있어 스크립트로 값을 다루기에 가장 편합니다.
그 밖에 알아 두시면 좋은 옵션이 몇 가지 더 있습니다.
-O width=100: txt 출력의 폭을 정합니다. 기본값으로 두면 열이 많은 표가 두 조각으로 잘려 나오기 때문에, 넓혀 두는 편이 읽기 편합니다.-e 파일: 오류와 경고만 따로 파일에 모읍니다. 출력이 길 때 문제만 빠르게 확인하는 데 좋습니다.--no-output: 출력 없이 실행만 합니다. 데이터를 가공해 .sav로 저장하는 것이 목적일 때 씁니다.- 종료 코드: 프로그램이 끝나면서 셸에 돌려주는 숫자로, 오류가 하나라도 있으면 1, 없으면 0입니다. 스크립트에서 이 값을 보고 성공 여부를 판단할 수 있습니다. 참고로 PSPP는 오류가 나도 다음 명령을 계속 실행하므로, 파일 하나에 여러 절차가 있을 때 하나가 실패해도 나머지 결과는 나옵니다. 다만 8편에서 본 BEGIN PROGRAM처럼 처리 자체를 중단하는 경우가 있으니 주의하세요.
신택스 15개를 한 번에 돌리는 스크립트
이제 여러 파일을 한꺼번에 돌려 보겠습니다. 저장소의 run_pspp.sh가 그 스크립트입니다. 하는 일을 요약하면, 설치된 PSPP의 버전 번호를 읽어 output/pspp/<버전>/ 폴더를 만들고, syntax/ 폴더의 번호 붙은 신택스 파일을 하나씩 실행해 txt와 html 출력을 넣은 뒤, 파일마다 종료 코드와 오류 줄 수를 화면에 찍어 줍니다.
#!/usr/bin/env bash
# 정의하지 않은 변수를 쓰면 바로 멈추게 한다 (오타로 엉뚱한 경로에 쓰는 것 방지).
set -u
# 한글 레이블이 ????로 나오는 문제를 막기 위해 UTF-8 로케일을 켠다.
export LC_ALL=C.UTF-8 LANG=C.UTF-8
# 'pspp --version' 첫 줄의 마지막 단어(예: 2.1.1)를 버전 번호로 쓴다.
VER=$(pspp --version | head -1 | awk '{print $NF}')
# 출력 폴더를 버전별로 나눈다. html 하위 폴더도 함께 만든다.
OUT="output/pspp/${VER}"
mkdir -p "$OUT/html"
echo "PSPP ${VER} -> ${OUT}"
# 숫자로 시작하는 신택스 파일(01~15)만 차례로 실행한다.
for f in syntax/[0-9]*.sps; do
# 확장자를 뗀 파일 이름. 예: syntax/04_ttest.sps -> 04_ttest
name=$(basename "$f" .sps)
echo "==> $name"
# txt 출력을 만들고, 화면 메시지(오류 포함)는 .log 파일에 모은다.
pspp -b "$f" -o "$OUT/${name}.txt" -O format=txt -O width=100 > "$OUT/${name}.log" 2>&1
# 방금 실행의 종료 코드(0이면 성공, 1이면 오류 있음)를 기억해 둔다.
rc=$?
# 같은 파일을 한 번 더 실행해 html 출력을 만든다.
pspp -b "$f" -o "$OUT/html/${name}.html" -O format=html >/dev/null 2>&1
# 로그에서 'error'가 들어간 줄 수를 센다.
errs=$(grep -c -i 'error' "$OUT/${name}.log" 2>/dev/null)
echo " exit=$rc error lines=${errs:-0}"
done
# 모든 txt 출력을 하나로 이어 붙여 한 번에 훑어볼 수 있게 한다.
cat "$OUT"/[0-9]*.txt > "$OUT/ALL_OUTPUT.txt"
프로젝트 루트에서 이 스크립트를 실행하면 화면에 다음과 같이 나옵니다(일부만 옮겼습니다).
PSPP 2.1.1 -> output/pspp/2.1.1
==> 01_import_labels
exit=0 error lines=0
==> 04_ttest
exit=0 error lines=0
==> 10_unsupported_glm_repeated
exit=1 error lines=1
==> 13_unsupported_graphs
exit=1 error lines=3
exit=0 error lines=0이면 그 파일은 오류 없이 끝났다는 뜻입니다. 10번과 13번처럼 exit=1이 찍힌 파일은 오류가 있었다는 뜻인데, 이것은 8편에서 일부러 던져 본 미지원 절차들이라 예상된 결과입니다. 전체 실행에서는 10, 11, 13, 14, 15번이 exit=1로 나옵니다. 이렇게 한 화면에서 어느 파일이 성공했고 어느 파일이 실패했는지 바로 보이기 때문에, 출력 파일을 하나하나 열어 볼 필요가 없습니다.
출력을 버전별 폴더에 따로 두는 데에는 이유가 있습니다. 나중에 PSPP 새 버전이 나왔을 때 같은 스크립트를 돌리면 새 폴더에 결과가 쌓이고, 두 폴더를 diff로 비교하면 버전 사이에 결과가 달라졌는지 바로 확인할 수 있습니다. 실제로 이 시리즈에서 2.0.0과 2.1.1의 출력을 비교해 보니 png 경로 문자열 외에는 바이트 단위로 같았습니다. 버전을 올려도 숫자가 바뀌지 않았다는 것을 눈으로 비교하지 않고 확인한 것입니다.
.sav를 csv로 — pspp-convert
PSPP에는 데이터 파일만 변환해 주는 도구가 따로 들어 있습니다. .sav 파일을 csv로 바꾸고 싶을 때 신택스를 쓸 필요도, GUI를 열 필요도 없습니다.
# SPSS 데이터 파일(.sav)을 csv 로 바꾼다. 출력 형식은 확장자로 정해진다.
pspp-convert data/training_survey.sav out.csv
Flatpak으로 설치하셨다면 flatpak run --command=pspp-convert org.gnu.pspp ... 형태로 실행합니다. 반대 방향(csv → sav)도 되고, SPSS의 이식용 형식(.por)도 읽을 수 있습니다. 누군가 SPSS 파일을 보내 왔는데 내 컴퓨터에 SPSS가 없을 때, 내용을 확인하는 가장 빠른 방법입니다.
함정 셋
자동화를 하면서 실제로 겪은 문제 세 가지를 적어 둡니다.
로케일. 로케일은 프로그램이 문자를 어떤 인코딩으로 다룰지 정하는 환경 설정입니다. 우분투의 apt 패키지(2.0.0)로 처음 돌렸을 때 셸 로케일이 UTF-8이 아니어서 한글 레이블이 전부 ????로 나왔습니다. 스크립트 앞부분에 export LC_ALL=C.UTF-8이 들어간 것이 그 때문입니다. Flatpak의 2.1.1에서는 이 문제가 재현되지 않았지만, 넣어 두어서 손해 볼 일은 없으니 그대로 두시기를 권합니다.
Flatpak 샌드박스. Flatpak으로 설치한 프로그램은 보안상 격리된 환경(샌드박스)에서 돌아가서, 홈 디렉터리 밖의 경로가 보이지 않습니다. 그래서 출력 경로를 /tmp에 두면 “No such file or directory” 오류가 납니다. 프로젝트 폴더를 홈 디렉터리 아래에 두면 해결됩니다. pspp 명령이 PATH에 없어 실행되지 않는 문제는 1편에서 만든 래퍼로 해결합니다.
AGGREGATE. 7편에서 본 대로, MODE=ADDVARIABLES 앞에 SORT CASES가 없으면 오류 메시지 없이 틀린 값이 나옵니다. 오류가 안 나니 종료 코드도 0입니다. GUI에서라면 결과 표를 보다가 이상하다고 느낄 수도 있지만, 배치로 돌리면 화면을 볼 일이 없어 더 놓치기 쉽습니다.
Claude Code로 돌린 흐름
이 시리즈는 신택스 작성, 실행, 결과 확인, 대조표 작성까지를 AI 코딩 도구인 Claude Code에 맡겨 진행했습니다. 이것이 가능했던 이유는 신택스도 텍스트이고 출력도 텍스트이기 때문입니다. 클릭으로만 조작하는 프로그램이었다면 이렇게 할 수 없었을 것입니다. 실제 흐름은 다음과 같았습니다.
- 기획서에 돌릴 절차 목록과 기대 결과(“실험군 향상분 ≈ +8”)를 적습니다.
- 절차마다 신택스 파일을 쓰게 하고
run_pspp.sh로 돌립니다. - 로그에서 오류를 확인하고, txt 출력에서 기준값(t, χ², F, R², α, Exp(B))을 뽑아
RESULT.md에 표로 정리하게 합니다. - 같은 신택스를 SPSS에서 돌린 결과를 받아 두
RESULT.md를 대조하게 합니다. - 새 버전이 나오면 1~4를 다시 돌리고 diff를 봅니다.
1번에서 기대 결과를 미리 적어 두는 것이 중요합니다. 예제 데이터를 만들 때 실험군 향상분이 약 +8이 되도록 설계했으니, 출력에서 그와 동떨어진 값이 나오면 신택스나 데이터에 문제가 있다는 신호가 됩니다.
사람이 한 일은 기획, SPSS 쪽 실행, 그리고 결과 검토였습니다. 앞에서 말한 AGGREGATE 함정도 이 검토 과정에서 잡혔습니다. “부서가 셋인데 케이스 수가 1~7이다”라는 이상한 값을 사람이 보고 알아챈 것입니다. 오류 없이 틀린 값이 나오는 문제는 자동화가 잡아 주지 못합니다. 자동화는 실행을 대신해 줄 뿐, 검산까지 대신해 주지는 않는다는 점을 꼭 기억해 두세요.
SPSS 쪽은 어떤가
그렇다면 SPSS에서도 같은 방식이 될까요? 결론부터 말씀드리면 데스크톱판에서는 어렵습니다.
SPSS 데스크톱 체험판에는 배치 실행기가 들어 있지 않습니다. 배치 실행용 statisticsb.exe는 SPSS Statistics Server 전용이고, 데스크톱판의 stats.exe에 신택스 파일을 넘기면 신택스 편집기에 열어 주기만 할 뿐 실행하지 않습니다. -f 같은 스위치를 붙여 보면 “명령줄에 알 수 없는 스위치” 오류가 뜹니다. 결국 이 시리즈의 SPSS 쪽 출력은 GUI를 띄우고 신택스 편집기에서 Ctrl+A(전체 선택), Ctrl+R(실행)을 눌러 받아야 했습니다. 반복 실행과 자동화가 목적이라면 PSPP가 한 수 위입니다.
SPSS 쪽에서 겪은 함정도 하나 적어 둡니다. 출력 문서 이름을 OUTPUT NEW NAME=all로 지으면 all이 예약어라서 이 명령이 실패합니다. 문제는 여기서 끝나지 않고, 신택스 맨 끝의 OUTPUT SAVE까지 같이 실패한다는 점입니다. 그래서 html과 pdf는 생겼는데 .spv 파일만 아무 표시 없이 빠져 있게 됩니다. allout처럼 예약어가 아닌 다른 이름을 쓰시면 됩니다.
정리
두 프로그램의 자동화 관련 차이를 표로 정리하면 다음과 같습니다.
| PSPP | SPSS 데스크톱 | |
|---|---|---|
| 신택스 파일 배치 실행 | pspp -b |
없음 (GUI에서 실행) |
| 출력 형식 | txt, csv, html, pdf, odt, spv, svg, png, ps, tex | spv + OUTPUT EXPORT |
| 데이터 파일 변환 도구 | pspp-convert | 없음 (GUI 저장) |
| 라이선스·만료 | 없음 | 체험판 14일 |
| 피벗 테이블 편집 | 없음 | 있음 |
마지막 줄처럼 SPSS가 앞서는 부분도 있습니다. 출력 표를 마우스로 끌어 행과 열을 바꾸거나 꾸미는 피벗 테이블 편집은 PSPP에 없습니다. 보고서용 표를 화면에서 다듬는 작업이 많다면 이 점은 감안하셔야 합니다.
이것으로 시리즈를 마칩니다. 전체 결론은 0편에 정리해 두었습니다. 한 줄로 줄이면, 기초부터 중급까지의 분석은 PSPP로 충분하고 SPSS와 숫자도 같게 나옵니다. 두 프로그램이 갈리는 것은 계산의 정확도가 아니라 절차가 있느냐 없느냐입니다. 시리즈에서 쓴 데이터, 신택스, 양쪽 출력, 대조표는 모두 저장소의 태그 v1.0에 있으니, 직접 돌려 보시면서 확인해 보시기 바랍니다.
시리즈 목차: 0편 총론 · 1편 · 2편 · 3편 · 4편 · 5편 · 6편 · 7편 · 8편 · 9편 스크립트로 돌리기와 자동화