PSPP 강의 9편 — 스크립트로 돌리기와 자동화

이 시리즈의 PSPP 출력은 전부 GUI 없이 만들었다. 신택스 파일 15개를 셸 스크립트 하나로 돌리고, 텍스트 출력에서 숫자를 뽑아 대조표를 만들었다. 이 편은 그 방법이다. 그리고 이 대목이 PSPP가 SPSS보다 나은 지점이다.

배치 모드 기본

pspp -b가 신택스 파일을 GUI 없이 실행한다. -o로 출력 파일을, -O format=으로 형식을 정한다.

export LC_ALL=C.UTF-8
pspp -b syntax/04_ttest.sps -o output/04.txt  -O format=txt -O width=100
pspp -b syntax/04_ttest.sps -o output/04.html -O format=html

-o를 여러 번 주면 한 번 실행으로 여러 형식을 동시에 낸다. 형식을 생략하면 파일 확장자로 정한다.

지원하는 출력 형식은 열 가지다.

형식 용도
txt 사람이 읽는 표. 이 시리즈의 출력 인용이 전부 이것
csv 표를 다시 계산하거나 다른 도구로 넘길 때
html 브라우저로 볼 때. 그래프 png가 옆에 생긴다
pdf, ps 인쇄용
odt LibreOffice 문서
spv SPSS 출력 뷰어 형식
svg, png 그림
tex LaTeX

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

알아둘 옵션이 몇 개 더 있다.

  • -O width=100: txt 출력의 폭. 기본값이면 넓은 표가 두 조각으로 잘린다.
  • -e 파일: 오류와 경고를 따로 모은다.
  • --no-output: 출력 없이 실행만 한다. .sav 저장이 목적일 때.
  • 종료 코드: 오류가 하나라도 있으면 1, 없으면 0이다. 오류가 나도 다음 명령을 계속 실행하므로, 파일 하나에 여러 절차가 있을 때 하나만 실패해도 나머지 결과는 나온다. 단 8편에서 본 BEGIN PROGRAM처럼 처리를 중단하는 경우가 있다.

신택스 15개를 한 번에 돌리는 스크립트

저장소의 run_pspp.sh다. 버전 번호를 읽어 output/pspp/<버전>/에 txt와 html을 넣고, 파일마다 종료 코드와 오류 줄 수를 찍는다.

#!/usr/bin/env bash
set -u
export LC_ALL=C.UTF-8 LANG=C.UTF-8

VER=$(pspp --version | head -1 | awk '{print $NF}')
OUT="output/pspp/${VER}"
mkdir -p "$OUT/html"
echo "PSPP ${VER} -> ${OUT}"

for f in syntax/[0-9]*.sps; do
  name=$(basename "$f" .sps)
  echo "==> $name"
  pspp -b "$f" -o "$OUT/${name}.txt" -O format=txt -O width=100 > "$OUT/${name}.log" 2>&1
  rc=$?
  pspp -b "$f" -o "$OUT/html/${name}.html" -O format=html >/dev/null 2>&1
  errs=$(grep -c -i 'error' "$OUT/${name}.log" 2>/dev/null)
  echo "    exit=$rc  error lines=${errs:-0}"
done

cat "$OUT"/[0-9]*.txt > "$OUT/ALL_OUTPUT.txt"

실행하면 이렇게 나온다. 10, 11, 13, 14, 15번의 exit=1은 8편의 예상된 오류다.

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

출력을 버전별 폴더에 두는 이유는 나중에 새 버전이 나왔을 때 같은 스크립트로 돌리고 diff로 비교하기 위해서다. 실제로 2.0.0과 2.1.1의 출력은 png 경로 문자열 외에 바이트 단위로 같았다.

.sav를 csv로 — pspp-convert

PSPP에는 데이터 파일 변환 도구가 따로 있다. .sav를 csv로 바꿀 때 신택스도 GUI도 필요 없다.

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가 없으면 오류 없이 틀린 값이 나온다. 배치로 돌리면 화면을 안 보니 더 놓치기 쉽다.

Claude Code로 돌린 흐름

이 시리즈는 신택스 작성, 실행, 결과 확인, 대조표 작성까지 Claude Code에 맡겼다. 신택스가 텍스트이고 출력도 텍스트라서 가능한 일이다. 흐름은 이랬다.

  1. 기획서에 절차 목록과 기대 결과(“실험군 향상분 ≈ +8”)를 적는다.
  2. 절차마다 신택스 파일을 쓰게 하고 run_pspp.sh로 돌린다.
  3. 로그에서 오류를 확인하고, txt 출력에서 기준값(t, χ², F, R², α, Exp(B))을 뽑아 RESULT.md에 표로 정리하게 한다.
  4. 같은 신택스를 SPSS에서 돌린 결과를 받아 두 RESULT.md를 대조하게 한다.
  5. 새 버전이 나오면 1~4를 다시 돌리고 diff를 본다.

사람이 한 일은 기획, SPSS 쪽 실행, 그리고 결과 검토다. AGGREGATE 함정도 이 과정에서 “부서가 셋인데 케이스 수가 1~7이다”라는 이상한 값을 사람이 보고 잡았다. 자동화는 실행을 대신하지 검산을 대신하지 않는다.

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만 조용히 없다. 다른 이름을 써야 한다.

정리

PSPP SPSS 데스크톱
신택스 파일 배치 실행 pspp -b 없음 (GUI에서 실행)
출력 형식 txt, csv, html, pdf, odt, spv, svg, png, ps, tex spv + OUTPUT EXPORT
데이터 파일 변환 도구 pspp-convert 없음 (GUI 저장)
라이선스·만료 없음 체험판 14일
피벗 테이블 편집 없음 있음

시리즈를 여기서 마친다. 결론은 0편에 있다. 기초부터 중급까지는 PSPP로 충분하고 숫자가 같으며, 갈리는 것은 정확도가 아니라 절차의 존재 여부다. 데이터, 신택스, 양쪽 출력, 대조표는 저장소의 태그 v1.0에 있다.


시리즈 목차: 0편 총론 · 1편 · 2편 · 3편 · 4편 · 5편 · 6편 · 7편 · 8편 · 9편 스크립트로 돌리기와 자동화

댓글 남기기

이 사이트는 Akismet을 사용하여 스팸을 줄입니다. 댓글 데이터가 어떻게 처리되는지 알아보세요.