연관규칙 알고리즘의 이해
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이상인 값만 보여준다.
해당 결과를 바탕으로 연관규칙을 해석하여, 추천시스템을 개발하거나 마케팅 전략을 수립할 수 있다.
'Data Science & AI > Data Analysis' 카테고리의 다른 글
A/B test , Uplift Modeling_1 (0) | 2024.12.01 |
---|---|
ANOVA(Analysis of Variance , 분산 분석) (0) | 2024.06.01 |
Box-Cox , Yeo-johnson Transformation (0) | 2024.03.17 |
데이터 비닝과 WOE(Weight of Evidence), IV(Information Value) (0) | 2024.02.29 |
[텍스트 분석] konlpy 한글 형태소 분석 (0) | 2024.02.22 |