--- id: wiki-2026-0508-ssq-questionnaire title: SSQ Questionnaire category: 10_Wiki/Topics status: verified canonical_id: self aliases: [Simulator Sickness Questionnaire, Cybersickness Eval, VR Sickness Score] duplicate_of: none source_trust_level: A confidence_score: 0.9 verification_status: applied tags: [vr, ar, cybersickness, ssq, ux-research] raw_sources: [] last_reinforced: 2026-05-10 github_commit: pending tech_stack: language: Python framework: pandas --- # SSQ Questionnaire ## 매 한 줄 > **"매 SSQ 는 VR/AR cybersickness 의 standard 측정 — 매 16 symptom × 4-point Likert → 3 subscale (Nausea, Oculomotor, Disorientation) + Total"**. 매 origin 은 1993 Kennedy et al. (Naval Air Warfare Center, military flight simulator); 매 modern state 는 VR HMD (Quest 4, Vision Pro 2) UX 평가 의 default, VRSQ/CSQ-VR 같은 매 최신 variant 도 등장. ## 매 핵심 ### 매 SSQ (Kennedy 1993) 구조 - 매 16 항목 — 매 0 (None) ~ 3 (Severe) 의 4-point. - **N (Nausea, 7 items)**: general discomfort, increased salivation, sweating, nausea, difficulty concentrating, stomach awareness, burping. - **O (Oculomotor, 7 items)**: general discomfort, fatigue, headache, eyestrain, difficulty focusing, difficulty concentrating, blurred vision. - **D (Disorientation, 7 items)**: difficulty focusing, nausea, fullness of head, blurred vision, dizzy(eyes open), dizzy(eyes closed), vertigo. - 매 일부 항목 매 multiple subscale 에 share (overlap). ### 매 score 공식 (Kennedy 1993) - N = (Σ N items) × 9.54 - O = (Σ O items) × 7.58 - D = (Σ D items) × 13.92 - TS (Total Score) = (Σ all 16 items) × 3.74 ### 매 modern alternative - **VRSQ (Kim 2018)**: 9 items, oculomotor + disorientation only (매 nausea 제거 — 매 modern HMD 가 nausea 적게). - **CSQ-VR (Sevinc 2020)**: 6 items, very short, mobile VR friendly. - **MSSQ (Motion Sickness Susceptibility)**: 매 baseline trait. ### 매 응용 1. VR app UX QA (pre/post comparison). 2. Locomotion 방식 비교 (teleport vs smooth). 3. Hardware iteration (refresh rate, FOV). 4. Medical (vestibular research, exposure therapy). ## 💻 패턴 ### 매 SSQ 항목 (Likert 0-3) ```python SSQ_ITEMS = [ "General discomfort", # N, O "Fatigue", # O "Headache", # O "Eyestrain", # O "Difficulty focusing", # O, D "Increased salivation", # N "Sweating", # N "Nausea", # N, D "Difficulty concentrating", # N, O "Fullness of head", # D "Blurred vision", # O, D "Dizzy (eyes open)", # D "Dizzy (eyes closed)", # D "Vertigo", # D "Stomach awareness", # N "Burping", # N ] LIKERT = {0: "None", 1: "Slight", 2: "Moderate", 3: "Severe"} ``` ### 매 scoring (Kennedy 1993, 매 weights) ```python import numpy as np # 매 16 items × 3 subscales mask (1 = belongs to subscale) N_MASK = np.array([1,0,0,0,0,1,1,1,1,0,0,0,0,0,1,1]) # 7 items O_MASK = np.array([1,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0]) # 7 items D_MASK = np.array([0,0,0,0,1,0,0,1,0,1,1,1,1,1,0,0]) # 7 items def ssq_score(responses: np.ndarray) -> dict: """responses: shape (16,), values 0-3""" N_raw = (responses * N_MASK).sum() O_raw = (responses * O_MASK).sum() D_raw = (responses * D_MASK).sum() TS_raw = N_raw + O_raw + D_raw # 매 with overlap return { "Nausea": N_raw * 9.54, "Oculomotor": O_raw * 7.58, "Disorientation": D_raw * 13.92, "Total": TS_raw * 3.74, } # 매 example resp = np.array([1,2,1,2,1,0,0,1,1,0,1,2,1,1,0,0]) print(ssq_score(resp)) # {'Nausea': 19.08, 'Oculomotor': 60.64, 'Disorientation': 97.44, 'Total': 49.79} ``` ### 매 study protocol (pre/post design) ```python import pandas as pd from scipy import stats # 매 typical study: pre-SSQ baseline → 20min VR → post-SSQ df = pd.read_csv("ssq_study.csv") # cols: pid, condition, timepoint, item_1..16 scores = df.groupby(["pid","condition","timepoint"]).apply( lambda g: pd.Series(ssq_score(g.filter(regex="item_").values.flatten())) ).reset_index() # 매 paired t-test: pre vs post 의 Total pre = scores.query("timepoint=='pre' and condition=='smooth'")["Total"] post = scores.query("timepoint=='post' and condition=='smooth'")["Total"] t, p = stats.ttest_rel(post, pre) print(f"Δ Total = {(post.mean() - pre.mean()):.1f}, t={t:.2f}, p={p:.4f}") ``` ### 매 severity benchmark (Kennedy 매 referenced) ```python def interpret_total(ts: float) -> str: if ts < 5: return "Negligible (typical baseline)" if ts < 10: return "Minimal" if ts < 15: return "Significant" if ts < 20: return "Concerning" return "Bad simulator (redesign needed)" # 매 modern HMD goal: post-session Total < 15. # 매 Total > 20 → 매 build problem (locomotion, frame drop). ``` ### 매 collection UI (Unity / Unreal — 매 in-VR survey) ```csharp // Unity, 매 in-VR Likert with XR Toolkit public class SSQItem : MonoBehaviour { public string symptomText; public int response = -1; // -1 = not answered public Action onSelect; public void Select(int v) { response = v; onSelect?.Invoke(v); } } // 매 16 items 순회, 매 0/1/2/3 button ``` ### 매 VRSQ (매 2018, 9 items, modern HMD recommended) ```python VRSQ_ITEMS = [ "General discomfort", "Fatigue", "Eyestrain", "Difficulty focusing", "Headache", "Fullness of head", "Blurred vision", "Dizzy (eyes closed)", "Vertigo", ] # 매 Oculomotor + Disorientation 만 — 매 nausea 제외 def vrsq_score(resp): O = sum(resp[:4]) / (4 * 3) * 100 D = sum(resp[4:]) / (5 * 3) * 100 return {"Oculomotor": O, "Disorientation": D, "Total": (O + D) / 2} ``` ### 매 Claude Opus 4.7 — 매 open-ended comment 코딩 ```python import anthropic client = anthropic.Anthropic() def code_comments(comments: list[str]) -> list[dict]: """매 SSQ open-ended 'other discomfort' field → theme tag.""" msg = client.messages.create( model="claude-opus-4-7", max_tokens=2048, system=( "Tag each VR-sickness participant comment with: " "1+ tags from [oculomotor, nausea, disorientation, " "thermal, audio, latency, controls, other]. " "Output JSON list." ), messages=[{"role": "user", "content": "\n".join(f"{i+1}. {c}" for i,c in enumerate(comments))}], ) return msg.content[0].text # 매 JSON parse downstream ``` ## 매 결정 기준 | 상황 | Approach | |---|---| | 매 standard VR study | SSQ (16 items, Kennedy 1993) | | 매 modern HMD, 매 short session | VRSQ (9 items) | | 매 mobile VR, 매 minimal | CSQ-VR (6 items) | | 매 longitudinal (매 매일) | SSQ pre/post + MSSQ baseline | | 매 medical | SSQ + objective (postural sway, HRV) | **기본값**: pre/post SSQ 16-item + open-ended "other" 항목, MSSQ baseline at recruitment. ## 🔗 Graph - 부모: [[Cybersickness]] ## 🤖 LLM 활용 **언제**: 매 open-ended free-text 의 thematic coding. 매 multi-language SSQ translation review. **언제 X**: 매 score 계산 자체 — 매 deterministic. 매 LLM 의 baseline 추정 위험. ## ❌ 안티패턴 - **Single post-only**: 매 baseline 없이 — 매 individual difference confound. - **Wrong weights**: 매 weight 잘못 적용 (매 9.54/7.58/13.92). - **Long session before SSQ**: 매 30+ min 후 측정 — 매 fatigue confound. - **Item omit**: 매 16 → 12 임의 제거 — 매 weight invalid. - **TS-only report**: 매 subscale 분리 안 함 — 매 cause 못 봄. ## 🧪 검증 / 중복 - Verified (Kennedy et al. 1993 IJAP, Kim et al. 2018 VRSQ, Stanney "Handbook of VR" Ch.32). - 신뢰도 A. ## 🕓 Changelog | 날짜 | 변경 | |---|---| | 2026-05-08 | Phase 1 | | 2026-05-10 | Manual cleanup — Kennedy 1993 SSQ + VRSQ + scoring code |