Experiment C Results — CGM 창 재분석
실행일: 2026-04-10
상태: Completed
분석 스크립트: ../../scripts/analyze_expC_cgm.py
출력 데이터: expC-results.json (이 디렉토리)
상위 요약: ../../finding-50g-rule.md
0. 한 줄 결론
가설 H1("식후 30분 이내 ≥500 걸음 걷기가 Δpeak을 10 mg/dL 이상 낮춘다")은 검증 불가능했다. 검증에 필요한 데이터 구조가 존재하지 않았기 때문이다. 그러나 이 분석은 훨씬 더 강한 신호 하나를 드러냈다: 식사당 탄수화물량이 내 혈당 반응의 거의 유일한 지배 변수다.
1. 왜 원래 가설이 검증 불가능했는가
1.1 데이터 가용성 확인
- CGM 창: 2026-01-28 ~ 2026-04-05 (36일 실제 측정, 68일 창 중 결측 존재)
- CGM 창 안의 식사 이벤트(dietaryEnergyConsumed 기반 클러스터): 396건
- 식후 90분 이내 ≥3건의 glucose reading이 존재하는 식사: 43건
- 나머지 353건은 CGM 결측 구간에 속해 있어 분석 불가
1.2 Walk flag 희소성
2025년 교과서 권장 기준대로 "식후 30분 이내 ≥500 걸음"을 walk flag로 설정한 결과:
- walk flag = True: 2건
- walk flag = False: 41건
n=2는 어떤 분석도 불가능한 크기다. 원인을 추적해 본 결과 두 가지였다:
- Taeho의 "걷기"는 식사 끝난 30분 이후에 시작되는 경우가 많다. [0, 30] 창은 여전히 식사 중이거나 식탁을 막 떠난 직후다.
- 500 걸음의 임계값은 강한 intentional walk에만 맞고, casual walk(200-400 걸음)는 잡히지 않는다.
그래서 사전 등록 문서의 §3.3 Walk 판정 규칙대로 데이터 가용성 확인 후 완화 기준을 도입했다: "식후 10-60분 사이 ≥200 걸음". 이 기준으로 walk n=12, no-walk n=31이 된다. n이 올랐지만 여전히 작다.
1.3 구조적 편향: walk week
walk=True 12건을 날짜순으로 정렬하면 모두 2026-02-02 ~ 2026-02-09 8일 사이에 몰려 있다. 즉 "walk 그룹"은 사실상 2026년 2월 초 단 한 주의 식사들이다. 이는 계절 효과, 주간 라이프스타일 효과, 특정 음식 선택 등과 walk flag가 완전히 얽혀 있다는 뜻이다. 매칭으로 제거할 수 없는 구조적 교란이다.
1.4 매칭 쌍 분석
그럼에도 탄수 ±30g, 시간 ±2h 기준으로 greedy nearest-neighbor pair matching을 돌린 결과:
- 매칭된 쌍: 8쌍
- Δpeak(walk) − Δpeak(no-walk)의 중앙값: +10.85 mg/dL
- 평균: +9.64 mg/dL
- stdev: 20.75
- 쌍별 차이: −23.4, −12.5, +4.0, +4.5, +17.2, +20.5, +27.5, +39.3 (sorted)
즉 walk 그룹이 no-walk 그룹보다 Δpeak이 ~10 mg/dL 더 높다. 원 가설과는 정반대 방향이다. 그러나 8쌍 중 6쌍이 양수(walk > no-walk), 2쌍이 음수. 중앙값 부호는 명확하지만, 20 mg/dL 수준의 스프레드는 이 결과를 노이즈로부터 구분하지 못한다.
결정: 해석 불가 → H1 reject/not-reject 모두 불가 → 이 가설은 재설계 후 Week 4 이후 재실험 대상.
2. 진짜로 나온 결과 — 탄수 용량 반응 곡선
walk flag를 제쳐두고 탄수화물 버킷으로 나누면 매우 명확한 신호가 나온다.
| 버킷 | n | 중앙 Δpeak (mg/dL) | 중앙 TIR 70-140 (2시간) | 메모 |
|---|---|---|---|---|
| <50 g | 18 | +10.5 | 1.00 | 거의 완벽한 혈당 통제 |
| 50~100 g | 14 | +32.5 | 0.46 | TIR이 절반 이하로 떨어짐 |
| ≥100 g | 6 | +45.25 | 0.50 | 가장 큰 스파이크 |
2.1 해석
<50g 탄수 식사는 2시간 내내 혈당이 70~140 범위 안에 머물며, Δpeak 중앙값이 10 mg/dL 수준이다. 이는 TIR = 100%, 즉 이 크기의 식사에서는 혈당이 거의 움직이지 않는다는 뜻이다.
탄수가 50g을 넘어서는 순간 TIR이 0.46으로 떨어진다. Δpeak도 3배 이상이다. 그리고 100g을 넘기면 Δpeak은 45 mg/dL 이상으로, 식후 2시간의 절반 정도는 140 mg/dL을 넘는 상태가 된다.
이 용량 반응은 너무 선명해서 "식후 걷기" 같은 부수 변수의 영향을 뚫고 올라온다. 따라서 Taeho 개인에 대한 식사 설계의 제1 원칙은 명백하다:
식사당 탄수를 50g 아래로 유지하면 급성 혈당 반응이 거의 사라진다.
100g 이상의 탄수 식사를 할 때는 스파이크가 기정사실이다. 걷든 안 걷든, 타이밍이 어떻든, 이 데이터 안에서는 대체 수단이 보이지 않는다.
2.2 시간대별 패턴
시간대별 중앙 Δpeak(n≥2):
| 시간 (KST) | n | 중앙 Δpeak |
|---|---|---|
| 07-09 (아침) | 12 | +5 ~ +11 |
| 12-14 (점심) | 12 | +27 ~ +42 |
| 15-16 (오후 간식) | 6 | +15 ~ +23 |
| 17-18 (저녁) | 5 | +36 ~ +41 |
| 19-20 (늦저녁) | 7 | −3 ~ +12 |
아침 식사는 크게 스파이크하지 않는다 (탄수 규모 작음이 주 이유). 늦저녁 식사도 작은 스파이크 — 늦저녁 식사는 크기가 작은 편이다. 점심과 저녁이 Δpeak의 하이 피크다. 이 두 시간대가 탄수 큰 식사가 집중되는 창이므로 자연스러운 결과다.
3. Week 2 결과와의 화해
Week 2 카드 3(탄수화물 무게)은 "하루 탄수 총량과 다음 날 아침 HRV/RHR 사이에 의미 있는 연결이 없다"고 결론지었다. 실험 C의 결과는 반대 방향 같지만, 사실 두 결과는 다른 시간 스케일에서 같은 이야기를 한다.
- 개별 식사 단위 (수 시간): 탄수 용량이 급성 혈당 스파이크를 선명하게 결정한다. 이것이 실험 C의 결론이다.
- 하루 총량 단위 (밤 사이): 하루 총 탄수량이 다음 날 아침 HRV/RHR에 뚜렷한 신호를 남기지 않는다. 이것이 Week 2 카드 3의 결론이다.
두 결론은 공존 가능하다. 급성 혈당 반응이 있다고 해서 8-12시간 뒤의 HRV가 떨어질 필요는 없다. Taeho의 몸은 식사당 스파이크를 적절히 회복시키고, 다음 날 아침에는 baseline으로 돌아와 있는 것처럼 보인다.
이는 흥미로운 개인 프로필이다: "급성 혈당 변동은 크지만 일 단위 회복에는 영향이 없다". 이 두 진술이 모두 참일 수 있다는 사실은, 단일 "건강 지표"에 얽매이지 말고 다양한 시간 스케일에서 각각의 패턴을 봐야 한다는 것을 알려준다.
4. 실험 C에서 파생된 새 가설 (Week 3+)
이 분석에서 원래 계획에 없던 가설 두 개가 새로 생겼다.
4.1 새 가설 1 — "50g 식사 규칙"
- H(new-1): Taeho가 의도적으로 식사당 탄수 < 50g을 7일 연속 유지할 때, TIR이 한 번도 0.85 아래로 떨어지지 않는다.
- 검증 방법: 새 CGM 센서 + 사전 식사 설계 + 일일 TIR 계산.
- 실행 가능 시점: 새 CGM 센서 확보 + 1주 식사 통제가 가능한 주간.
4.2 새 가설 2 — "식후 걷기 재정의"
- H(new-2): Walk flag를 "식후 30-90분 사이 연속 600초 이상 지속되는 ≥1000 걸음의 세션"으로 재정의하면 walk effect가 다르게 보일 수 있다. 이 정의는 "의도된 운동 산책"에 해당한다.
- 필요 데이터: CGM + stepCount raw가 동시에 풍부한 새 창 (지금까지의 36일로는 부족).
- 우선순위: 낮음. Week 4 Personal Operating Manual 단계에서 재검토.
5. 제한 및 한계
- n 부족: 43 식사 중 walk 12 / no-walk 31, matched 8쌍. 어떤 통계적 결론도 탐색적 수준.
- 날짜 편향: walk 플래그가 2월 초 1주일에 몰려 있어, 계절성·생활 패턴 효과와 분리 불가.
- Meal 클러스터링: dietary raw를 15분 창으로 묶었지만, 한 번의 식사를 두 클러스터로 쪼갤 가능성이 있다. 이 경우 첫 클러스터의 "식후 반응"이 다음 클러스터의 추가 입력으로 오염된다.
- CGM 측정 정확도: 센서 교체 첫 24시간을 배제해야 했으나, 이 분석은 그 구분을 하지 않았다. 재분석 시 보완 필요.
- GI 정보 없음: "50g 탄수"라고 해도 쌀밥과 콩류는 글루코스 반응이 다르다. 현재 raw 데이터에는 GI 정보가 없다.
6. 결론
실험 C의 원래 질문(식후 걷기가 혈당 스파이크를 낮추는가)에는 답할 수 없었다. 걸음 데이터의 희소성과 구조적 편향이 원인이다.
그러나 새롭게 발견한 결론은 더 실행 가능하다:
내 몸에서 혈당 반응의 지배 변수는 "걷는지 여부"가 아니라 "한 끼에 들어온 탄수량"이다. 50g 미만 식사는 TIR = 1.0을 유지하고, 100g 이상은 TIR이 0.5까지 떨어진다.
이 발견은 finding-50g-rule.md에 narrative로 정리되어 있다. 한 줄로 요약하면:
식후 걷기보다 식사 크기가 더 중요하다. 탄수 50g 이하 식사는 스파이크가 거의 없다.
그리고 sugar 분리 분석을 추가하면 2축 모델이 된다: 탄수 총량 = 피크 높이, sugar 함량 = 피크 지속시간. 세부 내용은 finding-50g-rule.md §Sugar를 분리해 보면 참조.