근처 참여자 · 설문 알림 · 무보행일 기록
그리고 운영 대시보드
클라이언트에 3가지 기능을 더하고, 그렇게 쌓인 데이터를 운영자·연구자가 감시하는 대시보드를 설계합니다. 핵심은 셋 다 연구 데이터를 오염시키지 않으면서 참여를 끌어올리는 방식으로 구현하는 것입니다.
클라이언트에 3가지 기능을 더하고, 그렇게 쌓인 데이터를 운영자·연구자가 감시하는 대시보드를 설계합니다. 핵심은 셋 다 연구 데이터를 오염시키지 않으면서 참여를 끌어올리는 방식으로 구현하는 것입니다.
요청을 그대로 구현하지 않고, 연구 설계와 충돌하지 않는 형태로 바꿨습니다.
| 요청 | 그대로 하면 | 바꾼 설계 | 얻는 것 |
|---|---|---|---|
| 5km 내 걷는 친구 수 | 실시간 위치 상시 수집 → 재식별 위험 최상위 사회적 압박 → 좋은 날만 걷는 편향 |
위치 대신 코스 체크인 기반 "황성공원에 지금 8명" + 지회 단위 집계 |
GPS 없이 동일 효과 · 프라이버시 비용 0 "어디로 가면 사람이 있다"는 실용 정보 |
| 특정 시간 설문 발송 | 응답만 저장 → 3시간 뒤 답한 것과 즉시 답한 것이 같은 데이터로 섞임 |
알림→응답 지연(latency) 기록 기한 경과 시 자동 '무응답' 저장 |
실시간 응답과 회상 응답을 분리 가능 응답률이 참여자 품질 지표가 됨 |
| 안 걸은 날 상세 상태 | 항목만 늘면 입력 부담↑ → 완결률↓ 데이터 품질은 항목 수가 아니라 완결률 |
계층 입력(없음 1탭 / 있으면 상세) + 안 걸은 날도 몸·마음 상태 필수 |
개인 내 대조 성립 — 같은 사람의 걸은 날 vs 안 걸은 날 비교 |
새 탭을 만들지 않습니다. 기존 4탭 안에 흡수시켜 초보자 부담을 늘리지 않습니다.
| 기능 | 붙는 위치 | 새 화면 | 수집 데이터 | 동의 필요 |
|---|---|---|---|---|
| 근처 참여자 | 오늘 탭 카드 + 걷기 탭 코스 목록 | A1~A4 | course_presence, nudge_shown | 선택 동의(끄기 가능) |
| 설문 알림 | 푸시 → 전용 응답 화면 (탭 무관) | A5~A8 | survey_response, latency_sec | 기존 동의 범위 |
| 무보행일 상세 | 내 기록 탭 · 3단계 확장 | A9~A12 | daily_context(음주·흡연·회식…) | 민감정보 별도 고지 |
코스 체크인 데이터만으로 "지금 어디에 몇 명"을 계산합니다.
알림 발송 → 응답 → 전송. 언제 답했는지가 응답 내용만큼 중요합니다.
걷지 않은 날에도 같은 항목을 받습니다. 그래야 비교가 됩니다.
화면을 기능이 아니라 질문 단위로 설계했습니다.
| 질문 | 화면 | 핵심 지표 | 조치 |
|---|---|---|---|
| 오늘 데이터가 제대로 들어오나? | D1 메인 | 활성 참여자 · 수신 레코드 · 전송 실패 | 장애 원인 추적 |
| 설문이 잘 걷히고 있나? | D2 설문 운영 | 응답률 · 평균 지연 · 무응답 | 발송 시각 조정 |
| 데이터에 편향이 끼고 있나? | D3 품질 감시 | 무보행일 기록률 · 교란변수 입력률 | 참여자 독려 |
| 누가 이탈하려 하나? | D4 참여자 관리 | 연속 미기록 · 순응도 하락 | 개별 연락 |
| 걸은 날과 안 걸은 날이 다른가? | D5 대조 분석 | 보행일 vs 무보행일 지표 차 | 가설 탐색 |
| 논문용 데이터를 어떻게 빼나? | D6 내보내기 | 추출 조건 · 감사 이력 | CSV 생성 |
운영자가 아침에 열어 30초 안에 이상 유무를 판단하는 화면입니다.
| 구분 | 내용 | 규모 | 영향 | 조치 |
|---|---|---|---|---|
| 전송 | 인증 만료로 업로드 실패 | 14명 | 데이터 지연 | 푸시 발송 |
| 품질 | 무보행일 기록률 임계 미달 | 코호트 전체 9% | 생존자 편향 위험 | 안내 발송 |
| 설문 | 어제 19시 발송분 응답률 저조 | 61% | 표본 축소 | 시각 조정 검토 |
| 참여 | 7일 이상 미기록 | 23명 | 이탈 임박 | 개별 연락 |
응답률만 보면 안 됩니다. 언제 답했는지가 데이터 가치를 결정합니다.
| 발송일 | 응답률 | 평균 지연 | 즉시응답(≤30분) | 무응답 | 판정 |
|---|---|---|---|---|---|
| 07-22 | 83% | 18분 | 77% | 218 | 양호 |
| 07-21 | 61% | 47분 | 52% | 500 | 저조 |
| 07-20 | 85% | 15분 | 81% | 193 | 양호 |
편향이 끼는 것을 조기에 잡고, 이탈 직전 참여자를 찾아냅니다.
| 원칙 | 지표 | 현재 | 임계 | 추세 | 판정 |
|---|---|---|---|---|---|
| 정직성 | 무보행일 기록 비율 | 9% | ≥ 10% | ↓ | 미달 |
| 맥락 | 교란변수 입력 완료율 | 81% | ≥ 90% | → | 주의 |
| 일관성 | 혈압 측정 시각 편차 | ±22분 | ≤ 30분 | → | 양호 |
| 최소기간 | 4주 이상 연속 참여 | 68% | ≥ 70% | ↑ | 주의 |
| 편향 통제 | 넛지 노출 후 걷기 비율 | 34% | 모니터링 | ↑ | 관찰 |
| 참여자 | 마지막 기록 | 순응도 | 무보행 기록 | 설문 응답 | 조치 |
|---|---|---|---|---|---|
| P-004077 | 6일 전 | 41% | 0건 | 29% | 연락 필요 |
| P-004210 | 8일 전 | 38% | 2건 | 14% | 연락 필요 |
| P-003995 | 1일 전 | 72% | 0건 | 91% | 편향 주의 |
무보행일 상세 데이터가 쌓이면 이 화면이 연구의 중심이 됩니다.
| 지표 | 보행일 평균 | 무보행일 평균 | 차이 | 음주일 제외 시 | 비고 |
|---|---|---|---|---|---|
| 수면 시간 | 6h 48m | 6h 21m | +27분 | +31분 | 일관 |
| HRV 주간평균 | 34.2 | 31.8 | +2.4 | +3.1 | 일관 |
| 스트레스(1~10) | 4.1 | 5.0 | −0.9 | −0.7 | 일관 |
| 기분(1~10) | 7.0 | 6.2 | +0.8 | +0.5 | 약화 |
기존 설계에 더해지는 엔드포인트와 저장 필드입니다.
| 기능 | 엔드포인트 | 메서드 | 핵심 필드 | 비고 |
|---|---|---|---|---|
| 근처 참여자 | /presence/nearby/ | GET | course_id, count | 5명 미만 코스는 응답에서 제외 |
| 근처 참여자 | /presence/heartbeat/ | POST | course_id, session_active | 좌표 전송 없음 · 세션 중에만 |
| 넛지 로깅 | /events/nudge/ | POST | type, shown_at, clicked | 편향 통제용 · 필수 |
| 설문 | /surveys/pending/ | GET | survey_id, sent_at, deadline | 문항 정의 포함 |
| 설문 | /surveys/{id}/respond/ | POST | answers, responded_at, latency_sec | 기한 초과 시 400 |
| 설문 | /surveys/{id}/miss/ | POST | reason=timeout | 무응답도 레코드로 저장 |
| 무보행일 | /records/day/ | POST | walked=false, no_walk_reason, context[] | 기존 엔드포인트 확장 |
| 상세 맥락 | /records/day/ | POST | alcohol_level, smoking, gathering_hours… | 구간값 저장 · 민감정보 분류 |
| 대시보드 | /admin/dashboard/summary/ | GET | kpi[], alerts[] | 5분 캐시 |
| 대시보드 | /admin/surveys/stats/ | GET | response_rate, latency_dist | 일자별 |
| 대시보드 | /admin/quality/metrics/ | GET | integrity[], risk_participants[] | 임계값은 설정에서 |
| 대시보드 | /admin/analysis/within/ | GET | walk_vs_nowalk, stratify_by | 무거운 쿼리 · 야간 집계 권장 |