본문 바로가기
Data Science & AI/Data Analysis

Apriori 연관 규칙 알고리즘 - 개념, 전처리 방법, 모델 적용

by skwkiix 2024. 3. 24.
728x90

연관규칙 알고리즘의 이해 

Apriori 알고리즘연관 규칙 학습 알고리즘 중 하나로, 데이터셋에서 특정 항목들 간의 연관성을 찾아내는 데 사용된다

예를 들어, 고객의 구매 기록을 분석하여 '우유를 산 고객들은 계란도 산다' 등과 같은 연관성을 찾아낼 수 있다.

 

"Apriori 원칙"  "특정 항목 집합이 자주 발생한다면, 그 항목들의 부분 집합들도 자주 발생한다" 는 것을 기반으로 한다,

즉, 자주 발생하는 항목 집합의 하위 집합들은 더 자주 발생할 가능성이 높다는 것을 의미한다.

 

 

더 쉽게 설명하면, 다음과 같은 상황이 발생했다고 가정해보자. 

 

A 고객은 마트에서 '파, 양파, 두부' 를 한번에 구매했다. 

B 고객은 마트에서 '양파, 두부'를 한번에 구매했다.

C 고객은 마트에서 '두부, 파'를 한번에 구매했다.

D 고객은 마트에서 '파,양파'를 한번에 구매했다.

 

Apriori 원칙은 빈도수에 주목한다. '파','양파',두부'를 한번에 구매한 경우가 많이 발생했다면, 그것의 부분집합인

[파, 양파] , [두부, 파] 등의 부분집합도 함께 구매할 확률이 높다는 것이다.

 

따라서, 자주 발생하는 집합을 찾고, 그 속에서 연관규칙을 발견하는 것이 Apriori의 알고리즘이다.


연관된 항목 집합을 찾는 방법 - 지지도(Support), 신뢰도(Confidence), 향상도(Lift)

Apriori 알고리즘에서는 지지도와 신뢰도를 사용하여 연관된 항목 집합을 찾는다.

 

지지도 (Support): 고객이 A와 B를 동시에 거래한 것에 발생할 확률 > 특정 항목 집합이 전체 데이터에서 등장하는 빈도

신뢰도 (Confidence):  A 구매한 주문에 B가 포함될 확률 > 조건절이 발생했을 때 결과절이 발생할 조건부 확률

향상도(Lift) : A, B가 독립적으로 판매되는 것 대비 함께 판매되는 비율 >  항목 간의 상관 관계가 우연히 일어날 확률에 비해 얼마나 높은지를 측정(향상도 > 1 : 양의 상관관계, 향상도 < 1 : 음의 상관관계, 향상도 = 0 : 독립)

 

 

위 예시로 지지도, 신뢰도, 향상도를 구해보자.

 

[파, 양파] 지지도 : 파, 양파가 함께 구매된 건수 / 전체 건수

즉, 2 / 4 = 50%이다.

 

"'파'를 구매하면 '양파' 구매한다" 신뢰도 : 파와 양파를 구매한 횟수 / 파를 함께 구매한 횟수

- 파를 구매한 횟수 : 3

- 파와 양파를 구매한 횟수 : 2

즉, 2/3 이다.

 

[파, 양파] 향상도 :  지지도(파와 양파) / 지지도(파)*지지도(양파)

- 파를 구매한 횟수 : 3  > 지지도 = 3/4

- 양파를 구매한 횟수 :3 > 지지도 = 3/4

- 파와 양파를 구매한 횟수 : 2 > 지지도 = 1/2

- 전체 건수 : 4

 

≈ 0.89  > 약한 양의 상관관계

 


Apriori 알고리즘 사용을 위한 전처리 방법

예시 데이터 : market_basket

 

데이터셋을 보면 구매가 발생한 각각 상품이 행마다 나뉘어져있는 것을 볼 수 있다.

cols : 고객 코드(cust_cd), 거래 일자(std_dt), 제품 코드(prdct_cd), 제품 이름(prdct_nm)

Rows : 각 행은 고객이 특정 일자에 구매한 제품에 대한 정보이다.

  • cust_cd: 고객 코드 
  • std_dt: 거래가 발생한 날짜
  • prdct_cd: 제품 코드
  • prdct_nm: 제품 이름

👉 특정 일자에 고객별 구매한 상품을 묶어서 보여줘야 한다.

     따라서 고객코드(cust_cd)와 거래가 발생한 날짜(std_dt)를 기준으로 그룹바이 하고 제품이름(prdct_nm)을 list 형태로 묶어준다.

# 학습하기 위한 데이터셋 만들기
item_set = df.drop_duplicates(['cust_cd','std_dt','prdct_nm']).groupby(['cust_cd','std_dt'])['prdct_nm'].apply(list)
item_set

 

어떤 고객이 해당 날짜에 구매한 제품이 2개 이상인 경우가 있을 수 있으므로, 중복제거를 해준뒤 그룹바이 연산을 수행한다.

 

👉 prdct_nm 만 추출해서 item_set_df를 만들어준다.

item_set_df = pd.DataFrame(item_set).reset_index().drop(['cust_cd','std_dt'],axis = 'columns')

 

👉 Series 객체로 반환

it_set = item_set_df.squeeze()

 


모델 학습을 위한 축전환

# 연관규칙 실습용 필요한 패키지 설치
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules

 

👉 apriori 모델을 학습시키기 이해서 축 전환을 해야한다.

encoder = TransactionEncoder()
encoder_T = encoder.fit(it_set).transform(it_set)
pd.DataFrame(encoder_T, columns = encoder.columns_)

 

👉 수치형 데이터로 변환(0,1) - *1 하면 True : 1, False : 0 으로 변환됨

it_matrix = pd.DataFrame(encoder_T, columns = encoder.columns_)*1
it_matrix # 끝

 

 

Apriori 적용

it_apr = apriori(it_matrix, min_support = 0.05, use_colnames = True) # 최소지지도
it_apr

 

 

👉 연관규칙 생성

association_rules(it_apr, metric = 'lift', min_threshold = 3) # lift는 1을 넘어야 함

 

 

연관 규칙의 평가 지표(metric)로서 'lift'를 사용하고, min_threshold를 지정해줘서 lift가 3이상인 값만 보여준다.

 

 

해당 결과를 바탕으로 연관규칙을 해석하여, 추천시스템을 개발하거나 마케팅 전략을 수립할 수 있다.

728x90