본문 바로가기
DataAnalysis with Crossfit

[DataAnalysis with Crossfit] Ep.1-1 데이터 수집 및 전처리

by Pymoon 2023. 4. 26.

 

분석 기간 : 2023.04.17 ~

 

 

이전 글에서 이번 분석과제의 목적과 의도를 설명해 보았다.

 

[DataAnalysis with Crossfit] Ep.1-0 목적과 의도

분석 기간 : 2023.04.17 ~ Crossfit은 여러 종류의 운동을 섞어 단시간, 고강도로 수행하는 운동이다. 여기서 여러 종류의 운동이라 함은 리프팅, 역도, 체조, 유산소를 비롯한 줄넘기, 메디신볼, 덤벨,

py-moon.tistory.com

 

 

 

이번 글에서는 데이터를 수집한 과정과 정제과정을 진행하고 전처리까지 진행한 기록을 적어보고자 한다.

 

 

 

위 사진은 와드를 일일이 엑셀시트에 작성한 형태이다.

 

 

Date칼럼은 날짜를 나타내고, Strength칼럼은 해당 날짜에 진행한 Strength 동작을 나타낸다.

First, Second, Third, Forth칼럼은 해당 날짜에 구성되었던 운동동작을 나타낸다.

 

4번째까지 밖에 없는 이유는 대부분의 운동동작 개수가 2개에서 3개였고 많은 날엔 4개였기 때문이다.

간혹, 동작이 5개인 날이 있었지만 하루, 이틀 정도였기에 제거하였다.

 

 

또한, 한 와드에 동일한 동작이 중복되어 나온 경우에는 한 번 나온 것으로 기준을 정했다.

엑셀시트를 기준으로 가로로 중복되어 있는 동작은 중복을 제거했다는 의미이다.

 

 

 

위 사진에서 볼 수 있듯이 역도 동작은 크게 Snatch와 Clean&Jerk로 나뉜다.

 

세분화하면 Snatch의 경우에는 Snatch, Power Snatch, Hang Power Snatch, Muscle Snatch, DB Snatch, DB Hang Snatch 정도로 나눌 수 있다.

 

Clean&Jerk의 경우에도 Clean&Jerk, Clean, Power Clean, Hang Power Clean, Power Clean&Jerk, DB Clean&Jerk, DB Hang Clean, DB Hang Clean&Jerk 등등 수도 없이 뻗어나간다.

 

 

 

물론, 전부 다른 동작임은 운동해 본 입장에선 틀림없는 사실이다.

 

하지만, 과도한 세분화는 데이터의 분포에 큰 영향을 끼칠 뿐 아니라 분석을 통해 카테고리컬하게 큰 분류로 나누어 예측하고자 하기에 목적에 맞게 진행하고자 한다.

 

 

 

따라서 Snatch는 전부 Snatch로 정의했고, Clean&Jerk는 Clean&Jerk, Clean과 PushJerk만으로 구분하기로 한다.

 

비슷한 개념으로 Burpee도 여러 종류가 있다. Bar Burpee, Burpee over Row, Burpee over DB 등등 분석의 기준에서 애매한 녀석들이 존재한다. 이를 Burpee라는 이름으로 통합하였다.

 

 

 

그리고, 내가 다니는 Crossfit Do it에는 Dietfit, Crossfit 두 가지 수업으로 구성되어 있다.

주로 나는 Crossfit수업을 듣는다. Crossfit수업은 월, 화, 수, 금, 토요일에 있다.

 

하지만 토요일에는 잘 가지 않는다는 이유로 분석을 진행할 때 제외했고, 목요일 또한 Crossfit수업이 없는 날이라 제외했다. 즉, 내가 다룰 데이터의 요일로는 월요일, 화요일, 수요일, 금요일이 되겠다.

 

 

 

2023.04.24을 기준으로 수집한 데이터가 193개이다. 부족한 규모이지만 나의 호기심을 채우기엔 나쁘지 않다.

 

 


데이터 수집이 끝났으니 분석을 진행해 보자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import pandas as pd
import numpy as np
import seaborn as sns
from matplotlib import pyplot as plt
 
# 한글 폰트 사용을 위해서 세팅
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)
 
# 경고 메시지 무시를 위해 세팅
import warnings
warnings.filterwarnings('ignore')
 
train = pd.read_excel('C:/Users/k1560/Desktop/CrossfitDoit.xlsx')
train['Dayofweek'= train['Date'].dt.dayofweek
cs

 

> 분석에 필요한 기본적인 라이브러리와, 시각화에 필요한 폰트 세팅, 경고 메시지 무시 세팅을 해준다.

 

> 그리곤 엑셀파일을 불러오고 요일을 숫자로 표시해 주는 dayofweek를 사용해 준다.

 

 

 

> Dayofweek변수에서 0 -> 월요일, 1 -> 회요일, 2 -> 수요일, 4 -> 금요일을 의미한다.

 

> 아래의 데이터를 보면 이해가 빠를 것이다. 실제로 해당 날짜로 거슬러 올라가면 해당 요일이 맞다.

 

train.head(5)

 

 

 

 

1
2
3
4
train_0 = train[train['Dayofweek']==0]
train_1 = train[train['Dayofweek']==1]
train_2 = train[train['Dayofweek']==2]
train_4 = train[train['Dayofweek']==4]
cs

 

> 위 코드를 해석하면, train_0은 train데이터셋에서 Dayofweek이 0인 데이터만을 추출한 데이터셋이다.

 

> 즉, 월요일에 해당하는 와드만을 추출한 데이터라는 말과 동일함을 알 수 있다.

 

> 이하 train_1, train_2, train_4도 동일하게 화요일, 수요일, 금요일에 해당하는 와드만을 가진 데이터셋이다.

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
tr = pd.concat([train['First'], train['Second'], train['Third']], axis=0, ignore_index=True)
tr = tr.dropna(axis=0)
 
tr_0 = pd.concat([train_0['First'], train_0['Second'], train_0['Third']], axis=0, ignore_index=True)
tr_0 = tr_0.dropna(axis=0)
 
tr_1 = pd.concat([train_1['First'], train_1['Second'], train_1['Third']], axis=0, ignore_index=True)
tr_1 = tr_1.dropna(axis=0)
 
tr_2 = pd.concat([train_2['First'], train_2['Second'], train_2['Third']], axis=0, ignore_index=True)
tr_2 = tr_2.dropna(axis=0)
 
tr_4 = pd.concat([train_4['First'], train_4['Second'], train_4['Third']], axis=0, ignore_index=True)
tr_4 = tr_4.dropna(axis=0)
cs

 

> 위 코드는 First, Second, Third 세 변수를 분석에 용이하게 한 줄로 나열시킨 코드이다.

 

> 또한, 중간에 끼여있는 결측값을 제거해 주는 dropna를 활용해서 동작들만으로 이루어진 데이터를 확보할 수 있었다.

 

 

> 위 사진과 같은 형태로 나머지 데이터셋도 변환되었다.

 

 

 

 

1
2
3
print(tr.shape, tr_0.shape, tr_1.shape, tr_2.shape, tr_4.shape)
 
(499,) (116,) (133,) (127,) (113,)
cs

 

> 각각의 데이터셋의 개수를 살펴보니 화요일과 수요일 데이터가 조금 더 많고 월요일과 금요일 데이터가 상대적으로 좀 적은 것을 알 수 있다.

 

> 지금은 사소한 문제로 보일 수 있으나 집계하거나 분석을 진행할 때 유의미한 차이가 있을 수 있다.

 

 

 


 

OUTTRO.

 

 

이 글을 읽게 되는 독자들은 Crossfit에 대한 도메인 지식이 없다는 가정하에 소개와 그 과정을 적고 있다.

 

Crossfit이라는 운동에 대한 지식이 있으면 분석 의도, 과정과 결과를 이해하는 폭이 넓어질 것이다.

 

 

코딩을 통해서 이번 데이터를 다루다 보니 전부 object형의 범주형 데이터인 것이 좀 아쉬운 부분이었다.

게다가 동작의 종류가 많아 고윳값의 개수도 많기 때문에 Encoding작업은 무의미하게 느껴진다.

 

가끔은 수치형으로 된 데이터를 바라보면 통계적으로 검증하고 싶은 가설이 여럿 떠오르는데 이번 분석에서는 적용하기가 어려워 보인다.

 

 

다음 글에서는 이쁘게 변환한 데이터를 가지고 시각화를 포함한 탐색적 데이터 분석(EDA)을 진행해 보겠다.