어떤 운동이 가장 칼로리 소모가 많은가에 대해 데이터 분석을 해보려한다.¶
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_csv("./exercise_dataset.csv")#Read Datasets
먼저 데이터가 어떻게 되어있는지 살펴보자.
이러한 과정을 EDA라고 한다.
EDA는 Exploratory Data Analysis로, 탐색적 데이터 분석으로 불린다.
이에 대한 내용은 나중에 다뤄보도록 하겠다.
df.head()#head 함수는 data의 앞부분을 가져온다.
Activity, Exercise or Sport (1 hour) | 130 lb | 155 lb | 180 lb | 205 lb | Calories per kg | |
---|---|---|---|---|---|---|
0 | Cycling, mountain bike, bmx | 502 | 598 | 695 | 791 | 1.750730 |
1 | Cycling, <10 mph, leisure bicycling | 236 | 281 | 327 | 372 | 0.823236 |
2 | Cycling, >20 mph, racing | 944 | 1126 | 1308 | 1489 | 3.294974 |
3 | Cycling, 10-11.9 mph, light | 354 | 422 | 490 | 558 | 1.234853 |
4 | Cycling, 12-13.9 mph, moderate | 472 | 563 | 654 | 745 | 1.647825 |
먼저 첫번재 열 Activity, Exercise or Sport (1hour)은 어떤활동을 했는지에 대한 대략적인 내용을 의미한다.
Sport = df["Activity, Exercise or Sport (1 hour)"]
Sport.unique()[:20]#앞에서부터 20개의 내용을 보면
#먼저 대주제인 Cycling과 같은 운동명이 보여지고, 그 이후로는 부가적인 설명들,
#속도 범위나, light, moderate, viogorous와 같은 운동강도, mountainbike와 같은 기구 등 다양하게 분포했다.
array(['Cycling, mountain bike, bmx', 'Cycling, <10 mph, leisure bicycling', 'Cycling, >20 mph, racing', 'Cycling, 10-11.9 mph, light', 'Cycling, 12-13.9 mph, moderate', 'Cycling, 14-15.9 mph, vigorous', 'Cycling, 16-19 mph, very fast, racing', 'Unicycling', 'Stationary cycling, very light', 'Stationary cycling, light', 'Stationary cycling, moderate', 'Stationary cycling, vigorous', 'Stationary cycling, very vigorous', 'Calisthenics, vigorous, pushups, situps…', 'Calisthenics, light', 'Circuit training, minimal rest', 'Weight lifting, body building, vigorous', 'Weight lifting, light workout', 'Health club exercise', 'Stair machine'], dtype=object)
df["130 lb"]#130 lb의 행에대한 설명은 kaggle에서 보면 몸무게가 130lb인 사람이 1시간동안 운동하여 소모한 칼로리를 의미했다.
#뒤따라오는 155lb, 180lb, 205lb도 마찬가지였다.
0 502 1 236 2 944 3 354 4 472 ... 243 207 244 148 245 177 246 236 247 236 Name: 130 lb, Length: 248, dtype: int64
df['Calories per kg']#이건 말 그대로 kg에 따른 calories 소모량이다.
0 1.750730 1 0.823236 2 3.294974 3 1.234853 4 1.647825 ... 243 0.721008 244 0.515199 245 0.617427 246 0.823236 247 0.823236 Name: Calories per kg, Length: 248, dtype: float64
먼저 기존의 목표이자 궁금증을 해소하기 위해 어떤 운동이 가장 kg당 칼로리 소모가 많은지 알아보자
df.sort_values('Calories per kg', ascending = False).head(10)
Activity, Exercise or Sport (1 hour) | 130 lb | 155 lb | 180 lb | 205 lb | Calories per kg | |
---|---|---|---|---|---|---|
47 | Running, 10.9 mph (5.5 min mile) | 1062 | 1267 | 1471 | 1675 | 3.706591 |
217 | Cross country skiing, uphill | 974 | 1161 | 1348 | 1536 | 3.397878 |
46 | Running, 10 mph (6 min mile) | 944 | 1126 | 1308 | 1489 | 3.294974 |
2 | Cycling, >20 mph, racing | 944 | 1126 | 1308 | 1489 | 3.294974 |
188 | Skin diving, fast | 944 | 1126 | 1308 | 1489 | 3.294974 |
45 | Running, 9 mph (6.5 min mile) | 885 | 1056 | 1226 | 1396 | 3.089165 |
51 | Running, stairs, up | 885 | 1056 | 1226 | 1396 | 3.089165 |
212 | Speed skating, ice, competitive | 885 | 1056 | 1226 | 1396 | 3.089165 |
216 | Cross country skiing, racing | 826 | 985 | 1144 | 1303 | 2.882679 |
44 | Running, 8.6 mph (7 min mile) | 826 | 985 | 1144 | 1303 | 2.882679 |
가장 칼로리 소모가 높은 운동은 Running, 10.9 mph (5.5 min mile) 으로 되어있으나,
필자는 한국인이어서 그런지 mph나 5.5min mile등의 내용이 이해하기 어려웠다.
먼저 첫번째 열 Activity, Exercise or Sport(1 hour)에 있는 mph란 놈들 부터 알기 쉽게 바꿔 봐야겠다.
구글링을 해보니, mph는 시간당 마일로, 1mph = 0.621371km/h라고 한다.
#먼저 mph의 숫자를 받으면 이를 km/h(killometers per hour, kph)로 바꾸는 함수를 만들자
def mph_to_kph (mph):
return round(mph*1.609, 2)#소숫점 둘째자리까지 반올림
mph_to_kph (9)
14.48
def find_mph(string):
mph_lst = []
str_lst = string.split(',')
for values in str_lst:
if 'mph' in values:
mph_lst.append(values)
mph가 어떻게 들어가있는지 보자
mph_lst = []
index = 0
for i in df["Activity, Exercise or Sport (1 hour)"]:
str_lst = i.split(',')
for values in str_lst:
if 'mph' in values:
mph_lst.append([index, values])
index += 1
mph_lst
[[1, ' <10 mph'], [2, ' >20 mph'], [3, ' 10-11.9 mph'], [4, ' 12-13.9 mph'], [5, ' 14-15.9 mph'], [6, ' 16-19 mph'], [37, ' 5 mph (12 minute mile)'], [38, ' 5.2 mph (11.5 minute mile)'], [39, ' 6 mph (10 min mile)'], [40, ' 6.7 mph (9 min mile)'], [41, ' 7 mph (8.5 min mile)'], [42, ' 7.5mph (8 min mile)'], [43, ' 8 mph (7.5 min mile)'], [44, ' 8.6 mph (7 min mile)'], [45, ' 9 mph (6.5 min mile)'], [46, ' 10 mph (6 min mile)'], [47, ' 10.9 mph (5.5 min mile)'], [166, ' under 2.0 mph'], [167, 'Walking 2.0 mph'], [168, 'Walking 2.5 mph'], [169, 'Walking 3.0 mph'], [170, 'Walking 3.5 mph'], [171, 'Walking 3.5 mph'], [172, 'Walking 4.0 mph'], [173, 'Walking 4.5 mph'], [174, 'Walking 5.0 mph'], [209, ' < 9 mph']]
나머지는 괜찮아 보이는데, 저놈의 10-11.9 같은 놈들은 한번에 바꾸기가 어려워보인다. 쟤네만 미리 바꾸고 돌려버리자.
numList = [10, 11.9, 12, 13.9, 14, 15.9, 16, 19]
for index, i in enumerate(numList):
numList[index] = mph_to_kph(i)
numList
[16.09, 19.15, 19.31, 22.37, 22.53, 25.58, 25.74, 30.57]
print(df["Activity, Exercise or Sport (1 hour)"][3] ,
df["Activity, Exercise or Sport (1 hour)"][4] ,
df["Activity, Exercise or Sport (1 hour)"][5] ,
df["Activity, Exercise or Sport (1 hour)"][6])
Cycling, 10-11.9 mph, light Cycling, 12-13.9 mph, moderate Cycling, 14-15.9 mph, vigorous Cycling, 16-19 mph, very fast, racing
df["Activity, Exercise or Sport (1 hour)"][3] = "Cycling, 16.09-19.15 km/h, light"
df["Activity, Exercise or Sport (1 hour)"][4] = "Cycling, 19.31-22.37 km/h, moderate"
df["Activity, Exercise or Sport (1 hour)"][5] = "Cycling, 22.53-25.58km/h, vigorous"
df["Activity, Exercise or Sport (1 hour)"][6] = "Cycling, 25.74-30.57 km/h, very fast, racing"
C:\Users\Public\Documents\ESTsoft\CreatorTemp/ipykernel_5752/3613219325.py:1: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy df["Activity, Exercise or Sport (1 hour)"][3] = "Cycling, 16.09-19.15 km/h, light" C:\Users\Public\Documents\ESTsoft\CreatorTemp/ipykernel_5752/3613219325.py:2: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy df["Activity, Exercise or Sport (1 hour)"][4] = "Cycling, 19.31-22.37 km/h, moderate" C:\Users\Public\Documents\ESTsoft\CreatorTemp/ipykernel_5752/3613219325.py:3: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy df["Activity, Exercise or Sport (1 hour)"][5] = "Cycling, 22.53-25.58km/h, vigorous" C:\Users\Public\Documents\ESTsoft\CreatorTemp/ipykernel_5752/3613219325.py:4: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy df["Activity, Exercise or Sport (1 hour)"][6] = "Cycling, 25.74-30.57 km/h, very fast, racing"
print(df["Activity, Exercise or Sport (1 hour)"][3])
print(df["Activity, Exercise or Sport (1 hour)"][4])
print(df["Activity, Exercise or Sport (1 hour)"][5])
print(df["Activity, Exercise or Sport (1 hour)"][6])
Cycling, 16.09-19.15 km/h, light Cycling, 19.31-22.37 km/h, moderate Cycling, 22.53-25.58km/h, vigorous Cycling, 25.74-30.57 km/h, very fast, racing
개같은 데이터는 모두 바꿨다. 나머지도 바꿔보자
def replace_mph (string):
str_list = string.split(',')
for contents in str_list:
if 'mph' in contents:
print(contents)
num = str_list.index(contents)
if '<' in contents:
contents = contents.replace(contents[2:contents.index('mph')+3], str(mph_to_kph(float(contents[2:contents.index('mph')-1]))) + ' km/h')
elif '>' in contents:
contents = contents.replace(contents[2:contents.index('mph')+3], str(mph_to_kph(float(contents[2:contents.index('mph')-1]))) + ' km/h')
elif 'under' in contents:
contents = contents.replace(contents[contents.index('r')+2:contents.index('mph')+3],str(mph_to_kph(float(contents[contents.index('r')+2:contents.index('mph')-1]))) + ' km/h')
elif 'Walking' in contents:
contents = contents.replace(contents[contents.index('ng')+3:contents.index('mph')+3],str(mph_to_kph(float(contents[contents.index('ng')+3:contents.index('mph')-1]))) + ' km/h')
else:
contents = contents.replace(contents[1:contents.index('mph')+3], str(mph_to_kph(float(contents[1:contents.index('mph')-1]))) + ' km/h')
str_list[num] = contents
return ",".join(str_list)
string = df['Activity, Exercise or Sport (1 hour)'][2]
string
'Cycling, >20 mph, racing'
replace_mph(df["Activity, Exercise or Sport (1 hour)"][2])
>20 mph
'Cycling, >32.18 km/h, racing'
df["Activity, Exercise or Sport (1 hour)"][43]
'Running, 8 mph (7.5 min mile)'
replace_mph(df["Activity, Exercise or Sport (1 hour)"][43])
8 mph (7.5 min mile)
'Running, 12.87 km/h (7.5 min mile)'
만든 함수를 이용해서 모두 바꿔보자
df["Activity, Exercise or Sport (1 hour)"] = df["Activity, Exercise or Sport (1 hour)"].apply(lambda x: replace_mph(x))
<10 mph >20 mph 5 mph (12 minute mile) 5.2 mph (11.5 minute mile) 6 mph (10 min mile) 6.7 mph (9 min mile) 7 mph (8.5 min mile) 7.5mph (8 min mile) 8 mph (7.5 min mile) 8.6 mph (7 min mile) 9 mph (6.5 min mile) 10 mph (6 min mile) 10.9 mph (5.5 min mile) under 2.0 mph Walking 2.0 mph Walking 2.5 mph Walking 3.0 mph Walking 3.5 mph Walking 3.5 mph Walking 4.0 mph Walking 4.5 mph Walking 5.0 mph < 9 mph
mph_lst = []
index = 0
for i in df["Activity, Exercise or Sport (1 hour)"]:
str_lst = i.split(',')
for values in str_lst:
if 'mph' in values:
mph_lst.append([index, values])
index += 1
mph_lst
[]
mph_lst = []
index = 0
for i in df["Activity, Exercise or Sport (1 hour)"]:
str_lst = i.split(',')
for values in str_lst:
if 'km/h' in values:
mph_lst.append([index, values])
index += 1
mph_lst
[[1, ' <16.09 km/h'], [2, ' >32.18 km/h'], [3, ' 16.09-19.15 km/h'], [4, ' 19.31-22.37 km/h'], [5, ' 22.53-25.58km/h'], [6, ' 25.74-30.57 km/h'], [37, ' 8.04 km/h (12 minute mile)'], [38, ' 8.37 km/h (11.5 minute mile)'], [39, ' 9.65 km/h (10 min mile)'], [40, ' 10.78 km/h (9 min mile)'], [41, ' 11.26 km/h (8.5 min mile)'], [42, ' 11.26 km/h (8 min mile)'], [43, ' 12.87 km/h (7.5 min mile)'], [44, ' 13.84 km/h (7 min mile)'], [45, ' 14.48 km/h (6.5 min mile)'], [46, ' 16.09 km/h (6 min mile)'], [47, ' 17.54 km/h (5.5 min mile)'], [166, ' under 3.22 km/h'], [167, 'Walking 3.22 km/h'], [168, 'Walking 4.02 km/h'], [169, 'Walking 4.83 km/h'], [170, 'Walking 5.63 km/h'], [171, 'Walking 5.63 km/h'], [172, 'Walking 6.44 km/h'], [173, 'Walking 7.24 km/h'], [174, 'Walking 8.04 km/h'], [209, ' <14.48 km/h']]
df.sort_values('Calories per kg', ascending = False).head(10)
Activity, Exercise or Sport (1 hour) | 130 lb | 155 lb | 180 lb | 205 lb | Calories per kg | |
---|---|---|---|---|---|---|
47 | Running, 17.54 km/h (5.5 min mile) | 1062 | 1267 | 1471 | 1675 | 3.706591 |
217 | Cross country skiing, uphill | 974 | 1161 | 1348 | 1536 | 3.397878 |
46 | Running, 16.09 km/h (6 min mile) | 944 | 1126 | 1308 | 1489 | 3.294974 |
2 | Cycling, >32.18 km/h, racing | 944 | 1126 | 1308 | 1489 | 3.294974 |
188 | Skin diving, fast | 944 | 1126 | 1308 | 1489 | 3.294974 |
45 | Running, 14.48 km/h (6.5 min mile) | 885 | 1056 | 1226 | 1396 | 3.089165 |
51 | Running, stairs, up | 885 | 1056 | 1226 | 1396 | 3.089165 |
212 | Speed skating, ice, competitive | 885 | 1056 | 1226 | 1396 | 3.089165 |
216 | Cross country skiing, racing | 826 | 985 | 1144 | 1303 | 2.882679 |
44 | Running, 13.84 km/h (7 min mile) | 826 | 985 | 1144 | 1303 | 2.882679 |
#이제 lb들을 죄다 kg으로 바꿔보자
def lb_to_kg (lb):
kg = round(lb/2.205)
return kg
for i in range(1,5):
print(lb_to_kg(int(df.columns[i][:3])))
59 70 82 93
df.rename(columns={"130 lb": "59 kg", "155 lb" : "70 kg", "180 lb" : "82 kg", "205 lb" : "93 kg"}, inplace=True)
df.head()
Activity, Exercise or Sport (1 hour) | 59 kg | 70 kg | 82 kg | 93 kg | Calories per kg | |
---|---|---|---|---|---|---|
0 | Cycling, mountain bike, bmx | 502 | 598 | 695 | 791 | 1.750730 |
1 | Cycling, <16.09 km/h, leisure bicycling | 236 | 281 | 327 | 372 | 0.823236 |
2 | Cycling, >32.18 km/h, racing | 944 | 1126 | 1308 | 1489 | 3.294974 |
3 | Cycling, 16.09-19.15 km/h, light | 354 | 422 | 490 | 558 | 1.234853 |
4 | Cycling, 19.31-22.37 km/h, moderate | 472 | 563 | 654 | 745 | 1.647825 |
이제 좀 보기 편해졌다.
다시 어떤 운동이 가장 효과가 좋은지 알아보자
df2 = df.sort_values("Calories per kg", ascending=False).head(20)
df2
Activity, Exercise or Sport (1 hour) | 59 kg | 70 kg | 82 kg | 93 kg | Calories per kg | |
---|---|---|---|---|---|---|
47 | Running, 17.54 km/h (5.5 min mile) | 1062 | 1267 | 1471 | 1675 | 3.706591 |
217 | Cross country skiing, uphill | 974 | 1161 | 1348 | 1536 | 3.397878 |
46 | Running, 16.09 km/h (6 min mile) | 944 | 1126 | 1308 | 1489 | 3.294974 |
2 | Cycling, >32.18 km/h, racing | 944 | 1126 | 1308 | 1489 | 3.294974 |
188 | Skin diving, fast | 944 | 1126 | 1308 | 1489 | 3.294974 |
45 | Running, 14.48 km/h (6.5 min mile) | 885 | 1056 | 1226 | 1396 | 3.089165 |
51 | Running, stairs, up | 885 | 1056 | 1226 | 1396 | 3.089165 |
212 | Speed skating, ice, competitive | 885 | 1056 | 1226 | 1396 | 3.089165 |
216 | Cross country skiing, racing | 826 | 985 | 1144 | 1303 | 2.882679 |
44 | Running, 13.84 km/h (7 min mile) | 826 | 985 | 1144 | 1303 | 2.882679 |
43 | Running, 12.87 km/h (7.5 min mile) | 797 | 950 | 1103 | 1256 | 2.779774 |
42 | Running, 11.26 km/h (8 min mile) | 738 | 880 | 1022 | 1163 | 2.574642 |
189 | Skin diving, moderate | 738 | 880 | 1022 | 1163 | 2.574642 |
12 | Stationary cycling, very vigorous | 738 | 880 | 1022 | 1163 | 2.574642 |
6 | Cycling, 25.74-30.57 km/h, very fast, racing | 708 | 844 | 981 | 1117 | 2.471061 |
115 | Jumping rope, fast | 708 | 844 | 981 | 1117 | 2.471061 |
65 | Boxing, in ring | 708 | 844 | 981 | 1117 | 2.471061 |
122 | Roller blading, in-line skating | 708 | 844 | 981 | 1117 | 2.471061 |
129 | Squash | 708 | 844 | 981 | 1117 | 2.471061 |
23 | Rowing machine, very vigorous | 708 | 844 | 981 | 1117 | 2.471061 |
from matplotlib import font_manager, rc
font_path = "C:/Windows/Fonts/NGULIM.TTF"
font = font_manager.FontProperties(fname=font_path).get_name()
rc('font', family=font)
plt.title("가장 효과 좋은 운동은?")
plt.bar( df2["Calories per kg"], df2["Activity, Exercise or Sport (1 hour)"] , color='pink')
plt.ylabel("운동명")
plt.xlabel("몸무게kg당 칼로리 소모")
plt.show()
#82kg기준으로 보기로 했다.
df3 = df.sort_values("82 kg", ascending = False).head(20)
df3 = df3.sort_values("82 kg", ascending = True)
df3
Activity, Exercise or Sport (1 hour) | 59 kg | 70 kg | 82 kg | 93 kg | Calories per kg | |
---|---|---|---|---|---|---|
23 | Rowing machine, very vigorous | 708 | 844 | 981 | 1117 | 2.471061 |
122 | Roller blading, in-line skating | 708 | 844 | 981 | 1117 | 2.471061 |
65 | Boxing, in ring | 708 | 844 | 981 | 1117 | 2.471061 |
115 | Jumping rope, fast | 708 | 844 | 981 | 1117 | 2.471061 |
6 | Cycling, 25.74-30.57 km/h, very fast, racing | 708 | 844 | 981 | 1117 | 2.471061 |
129 | Squash | 708 | 844 | 981 | 1117 | 2.471061 |
12 | Stationary cycling, very vigorous | 738 | 880 | 1022 | 1163 | 2.574642 |
189 | Skin diving, moderate | 738 | 880 | 1022 | 1163 | 2.574642 |
42 | Running, 11.26 km/h (8 min mile) | 738 | 880 | 1022 | 1163 | 2.574642 |
43 | Running, 12.87 km/h (7.5 min mile) | 797 | 950 | 1103 | 1256 | 2.779774 |
44 | Running, 13.84 km/h (7 min mile) | 826 | 985 | 1144 | 1303 | 2.882679 |
216 | Cross country skiing, racing | 826 | 985 | 1144 | 1303 | 2.882679 |
212 | Speed skating, ice, competitive | 885 | 1056 | 1226 | 1396 | 3.089165 |
51 | Running, stairs, up | 885 | 1056 | 1226 | 1396 | 3.089165 |
45 | Running, 14.48 km/h (6.5 min mile) | 885 | 1056 | 1226 | 1396 | 3.089165 |
188 | Skin diving, fast | 944 | 1126 | 1308 | 1489 | 3.294974 |
2 | Cycling, >32.18 km/h, racing | 944 | 1126 | 1308 | 1489 | 3.294974 |
46 | Running, 16.09 km/h (6 min mile) | 944 | 1126 | 1308 | 1489 | 3.294974 |
217 | Cross country skiing, uphill | 974 | 1161 | 1348 | 1536 | 3.397878 |
47 | Running, 17.54 km/h (5.5 min mile) | 1062 | 1267 | 1471 | 1675 | 3.706591 |
plt.title("몸무게 82kg 일때, 칼로리 소모 확인")
plt.bar(x= df3['Activity, Exercise or Sport (1 hour)'], height=df3["82 kg"], color = 'pink')
plt.xticks(rotation = 90)
plt.show()
그런데 이게 보다보니까 도저히 내가 할 수 있는게 아니다.
1시간 동안 시속 17.54km로 달리기,
1시간 동안 크로스컨트리 스키,
1시간 동안 시속 16.09km 달리기,
1시간 동안 시속 32.18km 이상으로 사이클링,
1시간 동안 스킨다이빙(맨몸 잠수),
1시간 동안 계단 달려서 올라가기,
1시간 동안스피드 스케이팅 경쟁...
top 10까지는 거의 불가능에 가까워 보이고,top 10 이후에는 스쿼시가 그나마 가능해 보인다.
아니면, 조깅으로 시작해서 달리기 속도를 점점 늘려가는 것도 효과적일 것 같다.
무슨 운동이든 열심히 하면 다이어트만이 아니라 많은 도움이 될 것이다. 화이팅!
'데이터 시각화 분석' 카테고리의 다른 글
취미로 하는 데이터 분석 시리즈09(소행성의 어떤 특징이 지구에 더 큰 위험을 가져올까?) (0) | 2022.06.27 |
---|---|
취미로 하는 데이터 분석 시리즈07(Python Selenium으로 다음 인기 검색어 가져오기, 다음 로그인) (0) | 2022.03.05 |
취미로 하는 데이터 분석 시리즈06(웹사이트 크롤링 어플리케이션) (0) | 2022.03.05 |
취미로 하는 데이터 분석 시리즈05(이미지 분류/Dacon 공모전 CNN 클론 코딩) (0) | 2022.03.04 |
취미로 하는 데이터 분석 시리즈04-2(기원후 1000년에 와인을 만들었다면 그 가격은 얼마일까?) (0) | 2022.03.01 |