데이터분석/추천시스템

연관규칙을 이용한 상품 추천(Apriori 알고리즘)

상선약수64 2023. 11. 6. 06:07
반응형

연관규칙 분석은 자료에 존재하는 항목(item)들 간의 if-then 형식의 연관규칙을 찾는 방법으로서 비지도 학습법의 일종입니다. 상품의 구매, 서비스 등 일련의 거래 또는 사건들 간의 연관성에 대한 규칙을 발견하기 위해 적용되고, 특히 마케팅에서 고객이 동시에 구매한 장바구니 내의 상품들에 대한 관련성을 분석하는 장바구니 분석에 많이 적용이 됩니다.

 

그림 참조 : https://ablearn.kr/newsletter/?idx=13468198&bmode=view

 

연관규칙 적용 예

 

연관규칙의 적용 예는 다양합니다.

  • 금융 : 금융서비스 내용으로 부터 대출과 같은 특정한 서비스를 받을 가능성이 높은 고객 탐색
  • 병원 : 합병증 발생 예측
  • 보험 : 보험사기 패턴 탐색, 특정 서비스 신청 예측 등
  • 인터넷 쇼핑몰 : 상품 추천
  • 텍스트마이닝 : 웹페이지 간의 링크에 대한 분석

연관규칙의 유형은 유용한 규칙, 자명한 규칙, 설명이 불가능한 규칙으로 나뉘어 질 수 있습니다. 유용한 규칙을 기업의 전략에 수립하여야 합니다. 유형의 예를 들어 보면

  • 유용한 규칙 : 예) 목요일, 아기기저귀->맥주 라는 규칙이 나왔다면 아기가 있는 젊은 부부들이 주말에 맥주를 마시기 위해서 기저귀와 맥주를 구매한다는 것을 알 수 있었습니다. 묶음판매 또는 상품 진열 등을 고려해 볼 수 있습니다.
  • 자명한 규칙 : 예) L 냉장고 구매 => LG 김치 냉장고
  • 설명 불가능한 규칙 : 예) 새로 연 건축 자재점 => 변기 덮개
연관성 규칙의 평가기준

 

아래 표는 고객들의 장바구니 내용이고, 각 장바구니의 상품들에 대한 동시구매표를 표기한 것입니다.

식료품 가게의 거래내역

 

연관 규칙 (A=>B)

  • 지지도(Support) : 관련성이 있다고 판단되는 거래나 사건의 확률

 

  • 신뢰도(Confidence) : 품목 A를 구매했을 경우 품목 B의 구매할 확률

  • 향상도(Lift 또는 Improvement)

       Lift > 1 면 두 품목이 서로 양의 상관관계

       Lift = 1 면 두 품목이 서로 독릭적인 관계

       Lift < 1 면 두 품목이 서로 음의 상관관계 

 

예) 위의 식료품 거래내역에서 오렌지=>사이다 연관규칙을 확인해 봅니다.

지지도 : 2/5

신뢰도 : (2/5)/(4/5) = 2/4

향상도 : (2/4)/(3/5) 

Apriori 알고리즘

 

1. 최소 지지도를 넘는 모든 빈발품목집합(Frequennt item set)을 생성합니다.

2. 빈발품목집합에서 최소 신뢰도를 넘는 모든 규칙을 생성합니다.

 

Apriori 알고리즘 적용 예

 

장바구니 분석

 

  • 데이터 셑을 만듭니다.
#장바구니 분석
dataset = [['오렌지주스','사이다'],
           ['우유', '오렌지주스', '식기세척제'],
           ['오렌지주스', '세제'],
           ['오렌지주스', '식기세척제', '사이다'],
           ['식기세척제', '사이다']]

 

  • 동시구매내역과 apriori 알고리즘 사용을 이해 아래의 모듈을 import합니다.
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori

 

trn = TransactionEncoder()
trn_result = trn.fit(dataset).transform(dataset)
trn_result

 

동시구매내역

  • trn_result array을 데이터 프레임으로 변환합니다.
import pandas as pd
df = pd.DataFrame(trn_result, columns = trn.columns_) #데이터 프레임으로 변환하고, 품목이 출력되도록 columns를 정의
df

 

  • 최소지지도을 0.1로 지정하여 확인합니다. 오렌지 주스를 살 확률은 0.8이고, (오렌지주스와 사이다), (오렌지주스와 식기세척제)를 구매할 확률은 0.4입니다. 
itemset = apriori(df, min_support=0.1,  use_colnames=True)
itemset

 

  • association_rules 모듈을 import하여, confidence가 0.3 이상인 것만 표시합니다.
from mlxtend.frequent_patterns import association_rules
association_rules(itemset, metric="confidence", min_threshold=0.3) #신로도가 0.3 이상만 표시