본문 바로가기
데이터분석/일상

어느 심박구간이 살이 가장 잘빠질까? 내가 직접 18일간 달려서 알아본 체지방 불태우는 심박구간

by 바른 곰 2025. 7. 6.

주제 선정 배경

저는 고3까지 체대입시를 준비하다 수능으로 갈아탔습니다. 수능을 준비하는중 운동하면서 먹던 양은 유지했는데, 운동량이 줄어드니까 약 9개월동안 25KG정도 쪘었습니다. 그렇게 거의 100KG에 다와가던 때 영장이 날아왔습니다. 그리고 향한 군대에서 25KG을 빼왔죠. 전역하고 4년이 지난 지금 체중 신경안쓰고 손 가는데로 밥먹고, 술먹고 하다가 정신차려보니 이제는 몸무게가 더이상 다이어트를 미룰 수 없는 지경까지 오게됐습니다.

 

이대로는 안되겠다. 다이어트를 다짐하고 밤에 5KM정도 러닝을 시작했는데요. 뛰다 보니까 좀 효율적으로 뛰면 좋겠다는 생각에 이번 주제를 고르게 됐습니다.

 

어느 심박구간으로 달려야 가장 높은 효율로 체지방을 태울 수 있을까?
한번 확인해 보자.

분석 과정 및 결론

 

1. 데이터 수집

나에게 가장 맞는 심박구간을 찾아야 하기 때문에 이번에는 내가 직접 달려서 데이터를 수집했다. 비슷한 시간에, 같은 운동 방식(인터벌)으로, 같은 거리(5KM)를 달렸다. 운동을 하면서 갤럭시 워치가 자동으로 내 심박구간별 유지시간을 측정해줬고, 운동 전과 운동 후에 갤럭시 워치 인바디 기능을 사용해서 체지방률을 측정했다.

 

이런식으로 총 18일 동안 약 90KM를 달렸다. 살이 빠졌는지는 비밀이다. 아 체력은 조금 늘은 것 같다. 점점 달리는게 편해지긴 했다.

 

92-110, 111-128 등 숫자로 된 컬럼은 심박구간을 나타내고, 각 값은 해당 심박구간에 머문 시간을 나타낸다. 예를들어 92-110 컬럼의 6.4라는 값은 92-110bpm을 6분 40초동안 유지했다는 뜻이다.

다음은 운동전체지방률과 운동후체지방률이다. 이건 말 그대로 갤럭시 워치를 통해 측정한 운동 전후 체지방률을 나타낸다.

 

2. 데이터 전처리

총 2가지 전처리가 필요한데 하나하나 살펴보자.

 

먼저 시간값으로 변환해야 한다. 앞에서 예시로 살펴본 6.4라는 값은 6분 40초를 의미하는 값이다. 하지만 6.4는 현재 float값이기 때문에 실제로는 6분 24초로 인식된다. 이를 원래의 값인 6분 40초로 변환해주는 작업을 진행했다.

# 시간변환

def convert_to_minutes(raw_time):
    minutes = int(raw_time)
    seconds = (raw_time - minutes) * 100
    return round(minutes + seconds / 60, 2)

# 심박구간 열
zones = ['92-110', '111-128', '129-147', '148-165', '166-184']

# 시간 변환 적용
for zone in zones:
    data[zone] = data[zone].apply(convert_to_minutes)

 

첫번째 값인 6.4 즉 6분 40초가 올바른 값으로 변환된 것을 확인할 수 있다.

 

다음은 체지방감소율을 계산하는 것이다. 체지방률이 높은 사람이 1KG 빠지는 것과, 체지방률이 낮은 사람이 1KG 빠지는 것은 운동 효과나 노력 측면에서 의미가 다르다. 따라서 체지방감소율을 계산해서 사용하기로 했다.

# 체지방 감소율 계산

data['체지방감소율'] = round((data['운동전체지방률'] - data['운동후체지방률']) / data['운동전체지방률'] * 100, 2)
data.head()

 

위의 코드를 이용해서 체지방감소율을 계산했다.

 

3. 상관계수 확인

어느 심박구간이 체지방 감소율과 상관계수가 높은지 확인함으로써 1차적인 분석을 진행했다.

그 결과 111-128bpm 흔히들 Zone2라고 부르는 유산소에 가장 적합한 심박구간이 체지방 감소율과 가장 강한 양의 상관관계를 보였다. 이 구간에서 운동한 시간이 많을수록, 실제로 체지방이 더 잘타는 경향을 확인할 수 있었다. 반대로, 심박수 166-184bpm의 고강도 구간은 체지방 감소율과 가장 강한 음의 상관관계를 보였다. 즉, 이 구간에서 오래 운동할수록 오히려 체지방이 덜 빠졌다는 뜻이다.

 

4. 선형회귀 적합 후 회귀계수 확인

다음으로는 선형회귀를 이용해서 회귀계수를 통해 어느 심박구간이 체지방 감소율에 가장 큰 영향을 주는지 확인해 봤다.

 

상관계수와 마찬가지로 111-128bpm의 심박구간이 체지방 감소율에 가장 큰 영향을 미쳤고, 166-184bpm의 심박구간에 오래 머물수록 오히려 체지방이 덜 빠진다는 것을 알 수 있었다.

 

체지방을 가장 잘 태우는 심박구간은 111-128bpm 구간이다.
166-184bpm 구간으로 운동하는 건 체지방 감소에 효율적이지 않다.

쿠키

그렇다면 왜 이런결과가 나온 것일까? 답은 운동 강도에 있다. 우리 몸은 운동 강도에 따라 사용하는 에너지원이 다르다.

 

우리 몸은 저강도에서 중강도 정도로 운동할 때 지방을 주 에너지원으로 사용한다. 그렇기 때문에 저강도에서 중강도로 운동할 때 체지방 감소율이 높게 나타나는 것이다.

 

반대로, 고강도로 운동할 때는 폭발적인 에너지가 필요하기 때문에 지방 사용률이 급감하고, 탄수화물을 주 에너지원으로 사용하게 되기 때문에 체지방 감소율이 적게 나타난다. 그러나 고강도로 운동할 때는 기초대사량이 순간적으로 증가하기 때문에 칼로리 소모량은 높게 나타난다. 확인해 보니 실제로도 고강도 운동 시간이 많았던 날 칼로리 소모량이 높았던 것을 확인할 수 있었다.


마무리

실제로 내가 필요한 데이터를 직접 수집해서 분석해본 좋은 경험이었다. 말 그대로 내가 직접 발로 뛰어가며 만든 데이터... 논문 같은 것도 이런 과정이 반복되면서 만들어지는 것이 아닐까 하는 생각이 들었다. 그 과정에서 변인통제를 하는게 엄청 어려울 것 같다는 생각이 들었다. 특히 나는 이번 프로젝트에서 매일매일 연속적으로 운동한것도 아니고, 식단을 고정한것도 아니기 때문에 이런 것까지 통제해가면서 실험하는 사람들이 대단하다고 느껴졌다.

 

나에게 딱 맞는 운동방법을 이제 알았으니 그대로 따라하기만 하면 된다. 다른 사람들에게도 이러한 방식으로 본인에게 딱 맞는 운동방법을 추천해주는 시스템을 구축하는 것도 좋을 것 같다. 특히 이번에 운동하면서 느낀건데 zone2를 지속적으로 유지할 수 있는 알람시스템 같은게 있으면 좋을 것 같다. 심박수가 zone2 위나 아래로 떨어지는 순간 알람을 울려주는 방식으로...


최종코드

# 시각화 한글 패치

!pip install koreanize_matplotlib
import koreanize_matplotlib
# 라이브러리

import pandas as pd
import numpy as np

import matplotlib.pyplot as plt
import seaborn as sns

from sklearn.linear_model import LinearRegression
from sklearn.ensemble import RandomForestRegressor
# 체지방 감소율 계산

data['체지방감소율'] = round((data['운동전체지방률'] - data['운동후체지방률']) / data['운동전체지방률'] * 100, 2)
# 시간변환

def convert_to_minutes(raw_time):
    minutes = int(raw_time)
    seconds = (raw_time - minutes) * 100
    return round(minutes + seconds / 60, 2)

# 심박구간 열
zones = ['92-110', '111-128', '129-147', '148-165', '166-184']

# 시간 변환 적용
for zone in zones:
    data[zone] = data[zone].apply(convert_to_minutes)
# 상관계수 확인

# 상관계수 계산
correlations = data[zones].corrwith(data['체지방감소율'])

# 시각화
plt.figure(figsize = (8, 5))
sns.barplot(x=correlations.index, y=correlations.values, palette='viridis')
plt.title('심박 구간별 체지방 감소율 상관계수')
plt.xlabel('심박 구간')
plt.ylabel('상관계수')
plt.show()
# 선형 휘귀

# 독립, 종속 분리
x = data[zones]
y = data['체지방감소율']

# 회귀 모형 적합
model = LinearRegression()
model.fit(x, y)

# 회귀 계수 시각화
coef_df = pd.DataFrame({'구간': zones, '계수': model.coef_})

plt.figure(figsize=(8, 5))
sns.barplot(x='구간', y='계수', data=coef_df, palette='viridis')
plt.title('심박구간별 선형 회귀 계수')
plt.axhline(0, color='gray', linestyle='--')
plt.ylabel('회귀 계수')
plt.xlabel('심박 구간')
plt.tight_layout()
plt.show()