목차
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)
→ Before/After 간 큰 차이는 없지만 이상치가 존재
→ 극단적인 피크/저점은 운동 여부보다는 다른 요인과도 관련 가능
③ CV 변동계수)
→ 운동 후 CV도 증가한 경향
→ 평균 심박수는 낮아졌지만 반응성은 높아졌을 수 있음
✅ 결과
- "심박수 변동폭이 줄어들 것"이라는 가설은 데이터 상에서 명확히 확인되지는 않았다. 오히려 운동 루틴이 생기며, 운동 전보다 운동 후에 **일상 속 심박수의 변화 폭(표준편차, 범위, 변동계수)**이 더 커지는 경향이 관찰되었다.
- 단순히 심박수 변동폭이 커졌다는 사실만으로 심박 리듬이 불안정해졌다고 단정하기는 어려운것으로 생각된다. 왜냐하면 운동 이후 baseline(평균 심박수)은 오히려 더 낮아졌고, 활동 자극에 대한 심박 반응은 더 적극적이었기 때문이다.
변동폭이 커진 것 건강한 생리적 적응인지, 아니면 불규칙한 심박 리듬의 신호인지추가 분석이 필요하다는 생각이 들었다.
5. 추가 분석 및 마무리
✅ 분석 포인트
앞선 분석에서는 운동 이후 일상 속 심박수의 변동폭(표준편차, 범위, 변동계수)이 커지는 경향이 관찰되었다.
그런데 심박수 변동폭이 커진 것이 과연 '불안정한 리듬'인지, 아니면 '건강한 생리적 적응'인지를 판단하려면 단순한 하루 평균 변화량만으로는 부족하다.
그래서 이번에는 자극(운동) 이후 심박수가 얼마나 빠르게 baseline으로 회복되는지,즉 심박 회복 속도를 분석하여, 심박수 변동폭 증가가 긍정적인 변화인지 아닌지"를 판단하고자 했다.
운동 직후 높은 심박수가 빠르게 떨어진다면 → 심장 회복력이 좋아진 것
→ 이는 심박수 변동폭 증가가 건강한 자극-회복 구조의 일부일 가능성을 보여준다.
✅ 활용 지표 및 분석 지표
- 활용 지표 : HKQuantityTypeIdentifierHeartRate
- 분석 지표 (일자별 통계 기준)
지표 계산 방식 의미 recovery_delta 1분 후 심박수 - peak 심박수 음수일수록 회복 속도가 빠름 (더 많이 내려왔다는 뜻)
✅ 그래프 해석

그래프는 운동 전(Before)과 운동 후(After)를 기준으로 1분 후 심박수의 회복량(recovery_delta)을 비교한 박스플롯이다.
- 두 구간 모두 평균적으로 음수 → 심박은 운동 후 1분 안에 회복되고 있음
- After 구간의 중앙값이 더 낮고, 회복 폭이 더 큼 → 운동 후에 더 빠르게, 더 많이 회복하는 경향이 나타남
- 극단 이상치 제거 없이도 전체 분포가 내려간 것이 포인트
✅ 결과
- 심박수 회복 데이터를 분석한 결과, 운동 후 구간에서 1분 내 심박수 회복량이 더 큰 경향이 관찰
- 이는 운동 자극 후 심박이 더 빠르게 baseline으로 복귀하고 있다는 정량적 신호로, 회복력 개선 가능성을 시사
심박수 변동폭과 심박 회복 속도 분석을 통해 그동안 막연히 느껴왔던 ‘체력 좋아진 것 같다?’는 감각을 숫자로 조금 더 확실하게 확인해볼 수 있었다.
처음엔 운동 후 심박수가 더 출렁이는 걸 보고 "이거 혹시 몸이 더 불안정해진 거 아냐?" 싶었는데,
1분 내 회복 속도를 같이 보니까 자극엔 확실히 반응하고, 회복은 오히려 더 빨라진 모습이었다.
물론, 이게 전부는 아니고 운동 강도, 측정 시간, 컨디션 같은 변수들도 많아서 결론을 내기엔 좀 이르지만, 단순히 수치가 요동친다고 해서 무조건 나쁜 건 아니라는 것만은 분명해진 듯 하다.
'Projects' 카테고리의 다른 글
[월데노] 나만의 새는 돈을 찾아 여유자금 확보하기(feat.편한 가계부 N년 데이터 분석) (11) | 2025.05.25 |
---|---|
[월데노] 광고 시장은 정말 침체 중인가? (1) | 2025.04.26 |
[음식배달앱 주문율 개선-EP2] 가설 설정 및 문제 정의(feat.올바른 가설 설정하는 방법) (0) | 2025.02.20 |
[음식배달앱 주문율 개선-EP1] 사이드 프로젝트 계기, EDA 레포트 (2) | 2025.01.05 |