문득 타이핑이 얼마나 많은 칼로리를 소모하는지 궁금해졌습니다. 하루 종일 키보드를 두드리면 꽤 많은 운동이 되지 않을까 하는 생각이 들었고 찾아보니 이미 계산해본 사람이 있었습니다.[^1] 이 글은 사실상 원저자의 글을 번역하고 추가로 코드 작성을 한 것입니다. 타이핑으로 소모되는 칼로리를 알아보기 위해 다음과 같은 단계로 계산해 보았습니다.
1분 타이핑에 소모되는 칼로리 계산
하루 동안의 타이핑 횟수 측정
하루 총 소모 칼로리 계산
이 글은 비전문적임으로 재미로만 읽어 주시면 좋겠습니다.
1 1분 타이핑 칼로리 소모량 계산
타이핑 횟수를 측정하기 위해 아래와 같이 파이썬으로 간단한 GUI 프로그램을 만들었습니다. 혹시 나중에 개선할 지도 몰라서 깃헙저장소에 올려두었습니다.
CSV 파일 (‘typing_count.csv’)은 스크립트가 있는 폴더에 생성되며, 이미 파일이 존재하면 새로운 데이터를 추가합니다. 파일이 없으면 새로 생성하고 헤더를 추가합니다.이 프로그램은 사용자가 시작 버튼을 누를 때부터 타이핑 횟수를 세기 시작하고, 종료 버튼을 누르면 카운팅을 중지합니다. 저장 버튼을 누르면 현재 날짜와 카운트를 CSV 파일에 저장합니다.
1.2 심박수 기반의 칼로리 소모량 측정 공식
타이핑 중 소모되는 칼로리를 측정하기 위해 심박수를 기준으로 삼았습니다. 일반적으로 사용되는 공식은 다음과 같습니다:
AB: 약 1분 동안의 차이는 \[
3.9778 - 3.6087 \approx 0.3691 \text{ Kcal}
\]
한 번의 타이핑으로 소모되는 칼로리는 \[
\frac{0.3691}{222} \approx 0.0016 \text{ Kcal}
\]
결과적으로 한 번의 타이핑으로 약 0.0016 Kcal를 소비하는 것으로 나타났습니다.
2 하루 평균 얼마나 타이핑 하는지 측정
앞서 만든 프로그램으로 연말 기간동안 하루의 타이핑량을 측정해서 CSV 파일로 저장했습니다. 아래는 그 결과를 불러와서 시각화하는 코드입니다.
import matplotlib.pyplot as pltimport pandas as pdimport seaborn as snsdf = pd.read_csv("../typing_count.csv")# 날짜 열을 datetime 형식으로 변환df['Date'] = pd.to_datetime(df['Date'])df.head()
Date
Count
0
2024-12-12
14246
1
2024-12-13
19144
2
2024-12-14
18096
3
2024-12-15
24999
4
2024-12-16
23141
2.1 평균 타이핑 시각화
# 전체 평균값 계산overall_mean = df['Count'].mean()# 서브플롯 생성 (비율 조정)fig = plt.figure(figsize=(8, 3))gs = fig.add_gridspec(1, 5) # 4:1 비율로 그리드 설정# 첫 번째 플롯: 선 그래프 (4칸 차지)ax1 = fig.add_subplot(gs[0, :4])ax1.plot(df['Date'], df['Count'], marker='o')ax1.spines['top'].set_visible(False)ax1.spines['right'].set_visible(False)ax1.set_xlabel('', fontsize=12)ax1.set_ylabel('Count', fontsize=12)ax1.grid(True, linestyle='--', alpha=0.7)fig.autofmt_xdate()ax1.set_ylim(bottom=0)for i, count inenumerate(df['Count']): ax1.annotate(str(count), (df['Date'][i], count), textcoords="offset points", xytext=(0, 7), ha='center')# 두 번째 플롯: 스웜 플롯 (1칸 차지)ax2 = fig.add_subplot(gs[0, 4])sns.swarmplot(x=['All Dates'] *len(df), y='Count', data=df, ax=ax2)ax2.spines['top'].set_visible(False)ax2.spines['right'].set_visible(False)ax2.axhline(y=overall_mean, color='red', linestyle='--', label=f'Mean: {overall_mean:.2f}')ax2.set_xlabel('')ax2.set_ylabel('Count', fontsize=12)ax2.grid(True, linestyle='--', alpha=0.7)# 레이아웃 조정 및 출력plt.tight_layout()plt.show()# 평균값 출력print(f"Overall Mean: {overall_mean:.2f}")