본문 바로가기

Projects

[월데노] 헬스장 만 1년차, 애플 건강 데이터로 전 후 비교하기

목차
1. 개요
2. 애플 건강 데이터 추출
3. 데이터 주요 특징 정리
4. 가설 검증 : 일상에서의 심박수 변동폭이 작아졌을 것이다
5. 추가 분석 및 마무리

1. 개요

2024년 3월부터 출근 전에 헬스장을 다니기 시작했다.
기록에 대한 광기 어린 집착이 있는 편이라 초반엔 헬스장 월간 출석률 80% 이상, 애플워치 링 3종 매일 채우기를 목표로 열심히 다녔다. 그렇게 헬스장을 다닌지 만 1년이 되었고, 이제는 어느정도 루틴처럼 자리 잡은 듯하다. 

그러다 가을 쯤 친구들과 등산을 갔을 때 숨이 덜 차는 모습을 발견했다. 그 순간 느낀 묘한 뿌듯함과 궁금증. 진짜 체력이 좋아진 걸까? 매일 착용해온 애플워치에 기록된 데이터를 꺼내보며, 헬스장 운동 전후 내 몸의 변화, 특히 체력 향상을 분석해보기로 했다.


2. 애플 건강 데이터 추출

운동 전후의 체력 변화를 분석하려면, 먼저 기록된 데이터를 꺼내는 작업부터 시작해야 했다. 대부분의 생활을 애플워치를 차고 하기 때문에 아이폰에 기본으로 탑재된 [건강 앱] 데이터를 활용하기로했다. 그리고 1차로 당황한건 처음보는 파일 유형이었다. XML 파일이라는 정체불명의 형식으로 제공되는데, 어떻게 전처리해야하는지 막막했다.

+) XML 파일이란?

XML은 <태그> 구조로 된 일종의 문서 데이터로, 사람보다는 기계가 읽기 편한 포맷이다. 엑셀처럼 행과 열로 된 표는 아니기 때문에, 데이터 분석을 위해선 테이블 형태로 변환하는 전처리 작업이 꼭 필요하다. 다행히도 구글링을 통해 이 과정을 정리해둔 분이 계셨다. (🔗 도움 받은 글: leehaesung님의 GitHub - Apple Watch 심박수 데이터를 시계열로 분석하기 )

이 글에 소개된 XML → CSV 변환 함수를 참고해, 나도 내 데이터를 테이블로 만들 수 있었다.

💠전처리 요약

XML을 테이블화한 후, 날짜/시간을 한국 표준시(KST) 기준으로 바꾸었다.(혹시나 싶어 진행했지만 달라진 것 없었음)

[전처리 후 데이터 프레임 형태]

RecordType  Value  Unit  DateTime_KST
HKQuantityTypeIdentifierDietaryWater 92.65 mL 2025-01-14 09:01:19+09:00
HKQuantityTypeIdentifierDietaryWater 92.65 mL 2025-01-14 09:01:22+09:00
HKQuantityTypeIdentifierDietaryWater 0.0 mL 2025-01-14 09:01:38+09:00

[컬럼 별 정보]

컬럼 명 데이터 타입 설명
RecordType object 기록된 건강 데이터의 유형 (예: 수분 섭취량, 신장, 체중, 심박수 등)
DateTime_KST datetime64[ns, Asia/Seoul] 데이터가 기록된 날짜 및 시간 (타임스탬프)
Value object 기록된 측정값
Unit object 측정 단위

💠데이터 유형, 생각보다 많다!

전체 데이터를 살펴보니 72개의 건강 정보 유형(RecordType)이 존재했다. 이 중에는 익숙한 지표도 있었고, "이건 뭐지?" 싶은 항목도 있었다.

예를 들어:

  • HKQuantityTypeIdentifierHeartRate → 심박수
  • HKQuantityTypeIdentifierActiveEnergyBurned → 활동 칼로리
  • HKQuantityTypeIdentifierBodyMass → 체중
  • HKQuantityTypeIdentifierHeartRateVariabilitySDNN → 심박수 변이성 (HRV)

대부분 자동으로 수집된 데이터지만, 일부는 수동으로 입력한 흔적(Yazio 앱 활용 등)도 있었다.

 

+) 건강 정보 유형 정보

더보기

 

RecordType 설명 정보
HKQuantityTypeIdentifierDietaryWater 섭취한 물의 양 (mL) 물 마신 시간, 양 기록(Yazio)
HKQuantityTypeIdentifierBodyMassIndex 체질량지수 (BMI) (Yazio)
HKQuantityTypeIdentifierHeight 키 (cm) - 내가 수기로 입력한 듯
- 2020년, 2022년
HKQuantityTypeIdentifierBodyMass 체중 (kg) - 내가 수기로 입력한 듯
- 2020~2025년
HKQuantityTypeIdentifierHeartRate 심박수 (bpm) - 아마 운동하면서 자동으로 입력되지 않았을까 하는 추측
- 2020년~2025년
HKQuantityTypeIdentifierRespiratoryRate 호흡수 (회/분) - ???
- 2021~2025
HKQuantityTypeIdentifierBodyFatPercentage 체지방 비율 (%) (Yazio)
HKQuantityTypeIdentifierStepCount 걸음 수 (보) - 자동 입력 추측
- 2020년~2025년
HKQuantityTypeIdentifierDistanceWalkingRunning 걷기/달리기 거리 (m, km) - 자동 입력 추측
- 2020년~2025년
HKQuantityTypeIdentifierBasalEnergyBurned 기초 대사량 (kcal) - 자동 입력 추측
- 2020년~2025년
HKQuantityTypeIdentifierActiveEnergyBurned 활동 대사량 (kcal) - 자동 입력 추측
- 2020년~2025년
HKQuantityTypeIdentifierFlightsClimbed 오른 층수 (층) - 자동 입력 추측
- 2020년~2025년
HKQuantityTypeIdentifierDietaryFatTotal 총 지방 섭취량 (g) (Yazio)
HKQuantityTypeIdentifierDietaryFatPolyunsaturated 불포화 지방 섭취량 (g) (Yazio)
HKQuantityTypeIdentifierDietaryFatMonounsaturated 단일 불포화 지방 섭취량 (g) (Yazio)
HKQuantityTypeIdentifierDietaryFatSaturated 포화 지방 섭취량 (g) (Yazio)
HKQuantityTypeIdentifierDietaryCholesterol 콜레스테롤 섭취량 (mg) (Yazio)
HKQuantityTypeIdentifierDietarySodium 나트륨 섭취량 (mg) (Yazio)
HKQuantityTypeIdentifierDietaryCarbohydrates 탄수화물 섭취량 (g) (Yazio)
HKQuantityTypeIdentifierDietaryFiber 섬유질 섭취량 (g) (Yazio)
HKQuantityTypeIdentifierDietarySugar 당류 섭취량 (g) (Yazio)
HKQuantityTypeIdentifierDietaryEnergyConsumed 섭취한 총 에너지 (kcal) (Yazio)
HKQuantityTypeIdentifierDietaryProtein 단백질 섭취량 (g) (Yazio)
HKQuantityTypeIdentifierDietaryVitaminA 비타민 A 섭취량 (IU) (Yazio)
HKQuantityTypeIdentifierDietaryVitaminB6 비타민 B6 섭취량 (mg) (Yazio)
HKQuantityTypeIdentifierDietaryVitaminB12 비타민 B12 섭취량 (mcg) (Yazio)
HKQuantityTypeIdentifierDietaryVitaminC 비타민 C 섭취량 (mg) (Yazio)
HKQuantityTypeIdentifierDietaryVitaminD 비타민 D 섭취량 (IU) (Yazio)
HKQuantityTypeIdentifierDietaryVitaminE 비타민 E 섭취량 (mg) (Yazio)
HKQuantityTypeIdentifierDietaryVitaminK 비타민 K 섭취량 (mcg) (Yazio)
HKQuantityTypeIdentifierDietaryCalcium 칼슘 섭취량 (mg) (Yazio)
HKQuantityTypeIdentifierDietaryIron 철 섭취량 (mg) (Yazio)
HKQuantityTypeIdentifierDietaryThiamin 티아민 (비타민 B1) 섭취량 (mg) (Yazio)
HKQuantityTypeIdentifierDietaryRiboflavin 리보플라빈 (비타민 B2) 섭취량 (mg) (Yazio)
HKQuantityTypeIdentifierDietaryNiacin 나이아신 (비타민 B3) 섭취량 (mg) (Yazio)
HKQuantityTypeIdentifierDietaryFolate 엽산 (비타민 B9) 섭취량 (mcg) (Yazio)
HKQuantityTypeIdentifierDietaryBiotin 비오틴 (비타민 B7) 섭취량 (mcg) (Yazio)
HKQuantityTypeIdentifierDietaryPantothenicAcid 판토텐산 (비타민 B5) 섭취량 (mg) (Yazio)
HKQuantityTypeIdentifierDietaryPhosphorus 인 섭취량 (mg) (Yazio)
HKQuantityTypeIdentifierDietaryMagnesium 마그네슘 섭취량 (mg) (Yazio)
HKQuantityTypeIdentifierDietaryZinc 아연 섭취량 (mg) (Yazio)
HKQuantityTypeIdentifierDietarySelenium 셀레늄 섭취량 (mcg) (Yazio)
HKQuantityTypeIdentifierDietaryCopper 구리 섭취량 (mg) (Yazio)
HKQuantityTypeIdentifierDietaryManganese 망간 섭취량 (mg) (Yazio)
HKQuantityTypeIdentifierDietaryMolybdenum 몰리브덴 섭취량 (mcg) (Yazio)
HKQuantityTypeIdentifierDietaryPotassium 칼륨 섭취량 (mg) (Yazio)
HKQuantityTypeIdentifierAppleExerciseTime 운동 시간 (분) 다 1분
HKQuantityTypeIdentifierDistanceCycling 자전거 주행 거리 (m, km) - 자동 입력 추측
- 2022년~2025년
HKQuantityTypeIdentifierRestingHeartRate 안정 시 심박수 (bpm) - 자동 입력 추측
- 2020년~2025년
HKQuantityTypeIdentifierVO2Max 최대 산소 섭취량 (mL/kg/min) - 자동 입력 추측
- 2020년~2025년
HKQuantityTypeIdentifierWalkingHeartRateAverage 평균 걷기 심박수 (bpm) - 자동 입력 추측
- 2020년~2025년
HKQuantityTypeIdentifierEnvironmentalAudioExposure 환경 소음 노출량 (dB) - 자동 입력 추측
- 2020년~2025년
HKQuantityTypeIdentifierHeadphoneAudioExposure 헤드폰 오디오 노출량 (dB) - 자동 입력 추측
- 2019년~2025년
HKQuantityTypeIdentifierWalkingDoubleSupportPercentage 보행 중 양발 지지 비율 (%) - 자동 입력 추측
- 2020년~2025년
HKQuantityTypeIdentifierSixMinuteWalkTestDistance 6분 보행 검사 거리 (m) - 자동 입력 추측
- 2020년~2025년
HKQuantityTypeIdentifierAppleStandTime 선 시간 (분) - 자동 입력 추측
- 2020년~2025년
HKQuantityTypeIdentifierWalkingSpeed 걷기 속도 (m/s) - 자동 입력 추측
- 2020년~2025년
HKQuantityTypeIdentifierWalkingStepLength 걸음 길이 (cm) - 자동 입력 추측
- 2020년~2025년
HKQuantityTypeIdentifierWalkingAsymmetryPercentage 보행 비대칭 비율 (%) - 자동 입력 추측
- 2020년~2025년
HKQuantityTypeIdentifierStairAscentSpeed 계단 오르기 속도 (m/s) - 자동 입력 추측
- 2020년~2025년
HKQuantityTypeIdentifierStairDescentSpeed 계단 내리기 속도 (m/s) - 자동 입력 추측
- 2020년~2025년
HKDataTypeSleepDurationGoal 목표 수면 시간 (시간) -
HKQuantityTypeIdentifierAppleWalkingSteadiness 보행 안정성 (점수) - 자동 입력 추측
- 2021년~2025년
HKQuantityTypeIdentifierHeartRateRecoveryOneMinute 1분 후 심박수 회복 (bpm) - 뭘까
- 2023~2024년
HKQuantityTypeIdentifierRunningSpeed 달리기 속도 (m/s) - 2024년
- 한창 열심히 뛰었던 시즌이군,,,
HKQuantityTypeIdentifierPhysicalEffort 신체 활동 강도 (점수) - 자동 입력 추측
- 2023년~2025년
HKCategoryTypeIdentifierSleepAnalysis 수면 분석 (카테고리) - Value 종류에 아래와 같이 기록됨
ㄴ HKCategoryValueSleepAnalysisAsleepUnspecified
ㄴ HKCategoryValueSleepAnalysisInBed
HKCategoryTypeIdentifierAppleStandHour 스탠드 시간 기록 (시간) - Value 종류에 아래와 같이 기록됨
ㄴ HKCategoryValueAppleStandHourIdle
ㄴ HKCategoryValueAppleStandHourStood
HKCategoryTypeIdentifierMenstrualFlow 월경 흐름 상태 - Value 종류에 아래와 같이 기록됨
ㄴ HKCategoryValueVaginalBleedingUnspecified
ㄴ HKCategoryValueVaginalBleedingLight
ㄴ HKCategoryValueVaginalBleedingMedium
ㄴHKCategoryValueVaginalBleedingNone
HKCategoryTypeIdentifierMindfulSession 명상 세션 기록 -
HKQuantityTypeIdentifierHeartRateVariabilitySDNN 심박수 변이성 (ms) - 자동 입력 추측
- 2020년~2025년
InstantaneousBeatsPerMinute 순간 심박수 (bpm) - 자동 입력 추측
- 2020년~2025년

 

 


3. 데이터 주요 특징 정리

  • 수집기간 : 2020.07.25 ~ 2025.02.24
  • 헬스장 등록 시점 : 2024.03.01

운동량 데이터의 전반적인 패턴을 살펴보기 위해, 두 가지 지표를 시각화했다.

 

  • Daily Exercise Duration (min)
    매일 기록된 운동 시간(분)으로, Apple Watch에서 측정한 AppleExerciseTime 데이터를 기반으로 한다.
    1분 단위로 측정되며, 하루에 여러 개의 기록이 존재할 수 있다. 
  • 30-Day Moving Average
    해당 날짜 포함 이전 30일 동안의 평균 운동 시간을 계산한 값으로,
    일별 데이터의 변동성을 줄이고 전체적인 운동 루틴의 흐름을 파악하기 위한 지표다.

그래프를 보면,

  • 헬스장에 다니기 시작한 시점(2024년 3월)을 기준으로 30일 이동 평균선이 (변동폭이 존재하긴 하나;) 이전 기간 대비 점진적으로 상승하는 모습이 보여진다.
  • 또한 2025년 2월 경 하루에 운동 시간이 400분을 초과한 날이 있는데, 이정도로 운동한 기억은 절대 네버 없기에 자동 측정 오류가 확실하다.

4. 가설 검증 : 일상에서의 심박수 변동폭이 작아졌을 것이다

✅ 분석 포인트

운동 루틴이 자리 잡으면, 같은 자극에도 신체의 반응이 더 안정적으로 변화할 수 있다.
즉, 일상생활 중 심박수의 출렁임(변동폭)이 줄어들 것이라는 가설을 세웠다.

여기서 말하는 '일상'은 일반적으로 활동하는 시간대를 의미하며, 분석에서는 08시 30분부터 22시까지의 심박 데이터만 활용했다. (주말의 경우, 오전 운동을 고려해 12시~23시로 시간 범위를 따로 설정함)

 

✅ 활용 지표 및 분석 지표

  • 활용 지표 : HKQuantityTypeIdentifierHeartRate
    → Apple Watch에서 자동 측정되는 심박수 데이터 (1~5분 단위 기록)
    → 단위 : bpm( beats per minute, count/min)
    의미 : 일정 시간 간격으로 측정된 심박수 값을 통해, 사용자의 활동량, 자극 반응, 회복력 등을 간접적으로 파악할 수 있음
  • 분석 지표 (일자별 통계 기준)
    지표 계산 방식 의미 의미
    표준 편차 하루 측정 값의 std 전체 심박 변화의 폭 하루 동안 심박 변화의 폭 (전체 출렁임)
    범위 max - min 극단적인 심박 변화 이상치
    변동계수 표준 편차 / 평균 평균 대비 출렁임의 비율 baseline 심박수 보정 가능

 

✅ 그래프 해석

표준편차 / max-min / 변동계수

① 표준편차
→ 운동 전보다 후에 약간 더 높은 중앙값
→ 일상 중 심박 변화 폭이 약간 커졌을 가능성

범위(Max - Min)
→ Before/After 간 큰 차이는 없지만 이상치가 존재
→ 극단적인 피크/저점은 운동 여부보다는 다른 요인과도 관련 가능

CV 변동계수)
→ 운동 후 CV도 증가한 경향
평균 심박수는 낮아졌지만 반응성은 높아졌을 수 있음

✅ 결과

 

  • "심박수 변동폭이 줄어들 것"이라는 가설은 데이터 상에서 명확히 확인되지는 않았다. 오히려 운동 루틴이 생기며, 운동 전보다 운동 후에 **일상 속 심박수의 변화 폭(표준편차, 범위, 변동계수)**이 더 커지는 경향이 관찰되었다.
  • 단순히 심박수 변동폭이 커졌다는 사실만으로 심박 리듬이 불안정해졌다고 단정하기는 어려운것으로 생각된다. 왜냐하면 운동 이후 baseline(평균 심박수)은 오히려 더 낮아졌고, 활동 자극에 대한 심박 반응은 더 적극적이었기 때문이다.

변동폭이 커진 것 건강한 생리적 적응인지, 아니면 불규칙한 심박 리듬의 신호인지추가 분석이 필요하다는 생각이 들었다.

 


5. 추가 분석 및 마무리

✅ 분석 포인트

앞선 분석에서는 운동 이후 일상 속 심박수의 변동폭(표준편차, 범위, 변동계수)이 커지는 경향이 관찰되었다.
그런데 심박수 변동폭이 커진 것이 과연 '불안정한 리듬'인지, 아니면 '건강한 생리적 적응'인지를 판단하려면 단순한 하루 평균 변화량만으로는 부족하다.

그래서 이번에는 자극(운동) 이후 심박수가 얼마나 빠르게 baseline으로 회복되는지,즉 심박 회복 속도를 분석하여, 심박수 변동폭 증가가 긍정적인 변화인지 아닌지"를 판단하고자 했다.

운동 직후 높은 심박수가 빠르게 떨어진다면 → 심장 회복력이 좋아진 것
→ 이는 심박수 변동폭 증가가 건강한 자극-회복 구조의 일부일 가능성을 보여준다.

 

✅ 활용 지표 및 분석 지표

  • 활용 지표 : HKQuantityTypeIdentifierHeartRate
  • 분석 지표 (일자별 통계 기준)
    지표 계산 방식 의미
    recovery_delta  1분 후 심박수 - peak 심박수 음수일수록 회복 속도가 빠름 (더 많이 내려왔다는 뜻)

 

✅ 그래프 해석

그래프는 운동 전(Before)과 운동 후(After)를 기준으로 1분 후 심박수의 회복량(recovery_delta)을 비교한 박스플롯이다.

 

  • 두 구간 모두 평균적으로 음수 → 심박은 운동 후 1분 안에 회복되고 있음
  • After 구간의 중앙값이 더 낮고, 회복 폭이 더 큼 → 운동 후에 더 빠르게, 더 많이 회복하는 경향이 나타남
  • 극단 이상치 제거 없이도 전체 분포가 내려간 것이 포인트

 

✅ 결과

  • 심박수 회복 데이터를 분석한 결과, 운동 후 구간에서 1분 내 심박수 회복량이 더 큰 경향이 관찰
  • 이는 운동 자극 후 심박이 더 빠르게 baseline으로 복귀하고 있다는 정량적 신호로, 회복력 개선 가능성을 시사

심박수 변동폭과 심박 회복 속도 분석을 통해 그동안 막연히 느껴왔던 ‘체력 좋아진 것 같다?’는 감각을 숫자로 조금 더 확실하게 확인해볼 수 있었다.

처음엔 운동 후 심박수가 더 출렁이는 걸 보고 "이거 혹시 몸이 더 불안정해진 거 아냐?" 싶었는데,
1분 내 회복 속도를 같이 보니까 자극엔 확실히 반응하고, 회복은 오히려 더 빨라진 모습이었다.

물론, 이게 전부는 아니고 운동 강도, 측정 시간, 컨디션 같은 변수들도 많아서 결론을 내기엔 좀 이르지만, 단순히 수치가 요동친다고 해서 무조건 나쁜 건 아니라는 것만은 분명해진 듯 하다.