본문 바로가기
DataAnalysis with Crossfit

[DataAnalysis with Crossfit] Ep.1-3 연관규칙분석

by Pymoon 2023. 4. 26.

 

분석 기간 : 2023.04.17 ~

 

 

이전 글에서는 데이터를 활용해서 유의미한 시각화 자료와 탐색적 데이터 분석 진행을 다뤄보았다.

 

[DataAnalysis with Crossfit] Ep.1-2 시각화 및 EDA 2

분석 기간 : 2023.04.17 ~ 이전 글에서는 데이터를 활용해서 유의미한 시각화 자료와 탐색적 데이터 분석 1을 진행해 보았다. [DataAnalysis with Crossfit] Ep.1-2 시각화 및 EDA 1 분석 기간 : 2023.04.17 ~ 이전 글

py-moon.tistory.com

 

 

 

이번 글에서는 와드 중에서 나온 동작들 간의 규칙을 분석해 보는 연관규칙분석을 진행해 보겠다.

 

 

 

 

 

특정 요일을 집중적으로 파헤치기 위해 나는 수요일 와드를 가지고 연관규칙분석을 진행하고자 한다.

 

1
train_2 = train_2[['First''Second''Third']]
cs

 

> 다른 칼럼은 제외하고 동작만으로 이루어진 First, Second, Third칼럼만을 추출한다.

 

 

 

> 위 사진은 train_2 데이터셋을 예시로 조회해 본 것이다.

 

 

 

 

1
train_2 = train_2.fillna('None')
cs

 

> 칼럼인 Third까지 있다 보니, 두 가지 동작만으로 이루어진 날에는 Third칼럼이 결측값으로 이루어져 있다.

 

> 분석 진행 시 이런 결측값은 치명적이기에 대체를 해주는 것이 좋다.

 

> 나는 'None'이라는 텍스트로 채워 넣었다. 이는 결측값과는 다른 의미를 뜻한다.

 

 

 

 

1
2
train_2['wod'= train_2['First'+ ',' + train_2['Second'+ ',' + train_2['Third']
train_2 = train_2.reset_index().drop(['index'], axis=1)
cs

 

> 데이터셋에 wod라는 칼럼을 생성해서 그 안에 와드 동작들을 콤마(,)로 구분하여 넣어준다.

 

> 그리고, 뒤죽박죽으로 되어있는 index를 reset 하고, 기존의 index를 제거함으로써 순서를 정갈하게 한다.

 

 

 

> 위 코드에 대한 결과는 아래와 같다.

 

> wod라는 이름으로 그 안에 동작들이 들어가 있는 모습을 볼 수 있다.

 

> 이 과정은 연관규칙분석을 진행하기 전 선행과정으로 볼 수 있다.

 

 

 

 

1
2
3
4
wod_lst = []
for i in train_2['wod']:
    lst = i.split(',')
    wod_lst.append(lst)
cs

 

> 위 코드는 wod칼럼을 콤마(,)를 기준으로 다시 분리하는 과정을 담은 알고리즘이다.

 

> 기껏 붙여놓고 왜 다시 떨어뜨리냐는 생각을 할 수 있다. 연관규칙분석을 위해서, 내가 원하는 형태를 만들기 위함이었다고 말해본다.

 

 

 

> 아래의 사진은 위 코드를 적용한 결과이다.

 

> 2차원의 형태로 각각의 동작이 따옴표로 묶여있는 것을 원했다. 그러다 보니 과정상 비효율을 초래했다고 생각한다.

 

> 다른 방법으로 동일한 결과를 연구해 보았지만, 아직은 찾지 못했다.

 

 

 

 

1
2
3
from mlxtend.preprocessing import TransactionEncoder
te = TransactionEncoder()
te_ary = te.fit_transform(wod_lst)
cs

 

> 연관규칙분석을 위해 인코딩 작업을 진행해야 한다.

 

> 동작별로 칼럼을 구성하여 와드에 나왔다면 True, 나오지 않았다면 False를 나타내게끔 말이다.

 

 

 

 

1
2
df = pd.DataFrame(te_ary, columns = te.columns_)
df = df.drop(['None'], axis=1)
cs

 

> 인코딩을 진행한 데이터를 가지고 데이터프레임으로 형태를 구성한다.

 

> 그리고, 전에 만들어줬던 'None'이라는 데이터를 지워준다.

 

 

 

> 이에 대한 결과는 아래와 같다.

 

> 수요일 와드이다 보니 Deadlift동작은 거의 True임을 알 수 있다.

 

> 이제, 이를 가지고 동작들 간에 규칙을 알아보자.

 

 

 

본격적으로 연관규칙분석을 들어가기 전에 관련 용어와 의미에 대해서 짚고 넘어가 보자.

 

지지도(Support) : x와 y가 함께 발생할 확률을 나타낸다.
신뢰도(Confidence) : x가 나왔을 때 y가 나올 확률을 나타낸다.
향상도(Lift) : x가 주어지지 않을 때의 y의 확률에 비해 x가 주어졌을 때 y의 증가 비율을 나타낸다. 쉽게 해석하면 아래와 같다.

  • 향상도가 1이면 두 품목은 독립관계
  • 향상도가 1보다 크면 양의 상관관계(우연적 기회보다 높은 확률)
  • 향상도가1보다 작으면 음의 상관관계(우연적 기회보다 낮은 확률)

 

 

 

이와 같은 사전지식으로 아래와 같이 도출된 결과를 해석해 보자.

 

> 해당 결과는 지지도가 0.1 이상인 것들 중에서 동작이 2개 이상인 것들로 구성된 결과이다.

> 먼저, 6행의 결과를 해석해 보자.

  • support가 0.387755라는 것은 Row동작과 Deadlift동작이 함께 나올 확률이 38.77%에 해당한다는 말과 동일하다.

> 그럼 7행은 ToestoBar동작과 Deadlift동작 함께 나올 확률이 28.57%라는 말임을 알 수 있다. 이하 동일하게 해석이 가능하다.

 

 

 

이번에는 조건을 더 붙여서 보다 다양한 결과를 도출해 보자.

 

> 위 결과는 신뢰도가 0.1 이상이고, 향상도가 1 이상인(양의 상관관계를 가지는) 결과를 조회한 것이다.

 

> 결과를 보니 0번과 1번, 2번과 3번, 4번과 5번, 6번과 7번, 8번과 13번, 9번 ~ 12번을 묶어서 해석할 수 있겠다.

 

> 이 중에서 랜덤 하게 4번과 5번에 해당하는 결과를 가지고 해석해 보자.

  • 동작은 Burpee, Deadlift
  • 지지도는 약 0.1428이므로 두 동작이 같이 나올 확률은 약 14.3%가 되겠다.
  • 4번 행의 신뢰도를 살펴보면 0.1521이므로 Deadlift가 나오고 Burpee가 나올 확률이 약 15.2%라고 해석할 수 있다.
  • 5번 행의 신뢰도는 1로 도출이 되었는데 이를 직역하게 되면 버피가 나오고 데드가 나올 확률이 100%라는 말이다. 이는 아무래도 수요일 와드에 Deadlift가 빠지는 날이 없다 보니 수요일에 Burpee가 먼저 나왔다면 Deadlift는 무조건 나온다는 뜻으로 해석할 수 있다.
  • 향상도는 두 행 모두 1.065로 동일하다. 이는 두 동작은 서로 독립관계가 아닌 상관관계를 가진다는 뜻으로 해석할 수 있다.
  • 이러한 결과해석은 이 외의 행에서도 동일하게 적용할 수 있다.

 

 


 

OUTTRO.

 

예시로 수요일 와드만 가지고 연관규칙분석을 진행해 보았는데 그 과정이 생각보다 더 흥미롭고 재미를 느낄 수 있었다.

매일 우리 대표님으로 인해 받아서 진행했던 와드였는데 내가 분석을 통해서 패턴을 찾아가는 것 같아 그렇게 느낀 것 같다.

 

다른 요일로도 동일하게 진행해 볼 예정이다. 하지만 알고리즘은 비슷하니 포스팅은 고민의 여지가 있다.

 

사실, 처음 주제선정을 하고 기획을 했던 부분은 예측프로그램이다.

 

와드를 학습시키고 요일에 따른 와드를 예측하는 것이 하고 싶었다. 하지만 아직까지 구상 중이고, 구축이 된다면 무조건 포스팅할 것이다.

 

와드 예측을 구상하는 과정에서 연관규칙분석도 적용할 수 있겠다고 생각해서 진행해 본 것이었고 의외로 나에게 유의미한 인사이트를 도출할 수 있었다.

 

이 것이 데이터분석의 매력이지 않을까 싶다.