이번 글은 코드잇 강의를 수강하면서 배운 내용을 주로 하여 정리되어 있습니다. (코드잇 스프린트 데이터 애널리스트 트랙 1기 훈련생)
연관 규칙 마이닝
Apriori 알고리즘
연관 규칙을 찾기 위해 가능한 모든 조합을 시도하는 것은 매우 비효율적입니다. 특히, 상품의 개수가 많아질수록 조합의 수가 기하급수적으로 증가하므로, 이를 다 처리하는 것은 거의 불가능에 가깝습니다. 따라서 가능한 모든 조합을 다 시도하는 무차별 탐색(Brute Force) 방식은 현실적으로 사용하기 어렵습니다.
Apriori 알고리즘의 소개
상위 조합에서부터 차례로 스캔하면서 특정 조합이 자주 발생하지 않는다면 이의 결과물로 탄생한 후속 조합들까지 모두 후보에서 배제하는 방식의 알고리즘입니다.
Apriori 알고리즘을 활용하면 하나의 조합만 검사하고도 이에서 파생된 다른 조합들까지 후보에서 배제할 수 있게 되므로 시간과 연산량을 효과적으로 줄일 수 있습니다.
Apriori 알고리즘은 일반적으로 밑과 같은 방식으로 연관 규칙을 효율적으로 찾으며, 알고리즘에서 주로 판단을 위해 사용되는 기준은 ‘지지도’입니다.
- **빈발 항목 집합(Frequent Itemset)**을 찾습니다. (빈발 항목 집합 : 일정한 최소 지지도를 넘는 항목들의 조합)
- 단계적으로 조합을 생성하고 필터링합니다. 단일 항목부터 시작해, 지지도가 낮은 항목은 다음 단계에서 생성되는 더 큰 조합에서 제외됩니다.
Apriori 알고리즘의 단계별 프로세스
- 1단계: 단일 항목 집합 생성
- 모든 개별 상품에 대해 지지도를 계산합니다.
- 최소 지지도를 넘는 항목들만 다음 단계로 넘어갑니다.
- 2단계: 2개 항목 집합 생성
- 1단계에서 선별된 상품들로 2개 항목의 조합을 만듭니다.
- 이 조합들에 대해 지지도를 계산하고, 최소 지지도를 넘지 않는 조합을 제거합니다.
- 3단계: 더 큰 항목 집합 생성
- 이전 단계에서 남은 조합들을 바탕으로 3개 이상의 항목으로 구성된 집합을 만듭니다.
- 역시 지지도를 계산하고, 최소 지지도를 넘지 않는 집합은 제거합니다.
- 더 이상 조합을 생성할 수 없을 때까지 이 과정을 반복합니다.
- 최종 빈발 항목 집합 선정
- 마지막으로 남은 빈발 항목 집합들을 바탕으로 연관 규칙을 생성합니다.
- 각 규칙에 대해 지지도(Support), 신뢰도(Confidence), 향상도(Lift)를 계산하여 가장 유용한 규칙을 선택합니다.
Apriori 알고리즘을 통해 모든 조합을 시도하지 않고도 중요한 연관 규칙을 효율적으로 발견할 수 있습니다. 이 알고리즘은 계산량을 크게 줄이며, 실질적인 비즈니스 인사이트를 도출하는 데 매우 유용합니다.
파이썬으로 구현하는 Apriori 알고리즘
1. 데이터 준비 및 전처리(Grouping)
먼저, 데이터를 전처리하여 Apriori 알고리즘에 적합한 형식으로 변환합니다.
import pandas as pd
# 온라인 쇼핑몰의 구매 데이터를 불러옵니다.
df = pd.read_csv('data/online_shopping_data.csv')
# 각 주문별로 고객이 구매한 상품 목록을 리스트로 변환합니다.
basket_df = df.groupby('TransactionID')['ProductName'].apply(list).reset_index()
2. 데이터 인코딩(Transcation 변환)
Apriori 알고리즘을 적용하기 위해 데이터를 One-Hot Encoding 형태로 변환합니다.
from mlxtend.preprocessing import TransactionEncoder
# 데이터를 One-Hot Encoding 형태로 변환합니다.
te = TransactionEncoder()
te_result = te.fit_transform(basket_df['ProductName'])
te_df = pd.DataFrame(te_result, columns=te.columns_)
3. Apriori 알고리즘 적용(빈발 집단 생성 및 빈발 항목 집합 추출)
최소 지지도를 설정한 후, Apriori 알고리즘을 사용해 빈발 항목 집합을 추출합니다.
from mlxtend.frequent_patterns import apriori
# 최소 지지도를 설정하여 자주 함께 구매되는 상품 조합을 찾습니다.
frequent_itemsets = apriori(te_df, min_support=0.06, use_colnames=True)
4. 연관 규칙 추출 및 평가
이제, 빈발 항목 집합에서 연관 규칙을 추출하고, 각 규칙에 대해 신뢰도와 향상도를 계산합니다.
from mlxtend.frequent_patterns import association_rules
# 연관 규칙을 추출하고, 신뢰도 0.8 이상의 규칙만 추출합니다.
rules = association_rules(frequent_itemsets, metric="confidence", min_threshold=0.8)
# 향상도를 기준으로 내림차순 정렬하여 상위 규칙을 확인합니다.
top_rules = rules.sort_values(by='lift', ascending=False).head()
5. 결과 해석 및 활용
이 과정에서 도출된 연관 규칙을 해석하고, 비즈니스 상황에 맞게 가장 적합한 규칙을 선택하여 활용합니다. 향상도(Lift)가 높은 규칙이 더 강한 상관관계를 나타내므로, 이를 기준으로 규칙을 선정하면 고객에게 관련 상품을 추천하거나 번들 상품을 제안하는 전략에 유용할 수 있습니다.
추가 사항
- mlxtend의 association_rules() 함수를 적용하는 경우에 Leverage와 Conviction 같은 추가 지표들도 함께 계산되지만, 일반적으로 지지도(Support),신뢰도(Confidence),향상도(Lift)를 주로 사용합니다.
이 과정을 통해, 연관 규칙 마이닝을 활용하여 데이터를 분석하고, 유의미한 규칙을 도출하여 비즈니스 의사 결정에 활용할 수 있게 됩니다.
Fp-Growth 알고리즘
FP-Growth(Frequent Pattern Growth) 알고리즘은 데이터 마이닝에서 빈발 항목 집합(Frequent Itemset)을 효율적으로 찾아내기 위해 고안된 알고리즘입니다. Apriori 알고리즘이 데이터가 커질수록 속도가 느려지는 단점(데이터가 커질수록 각 단계에서 데이터를 다시 스캔해야 함)을 보완하기 위해 개발되었습니다. FP-Growth 알고리즘은 트리 구조를 활용하여 데이터셋을 단 두 번만 스캔해 빈발 항목 집합을 찾아내기 때문에, 방대한 데이터에서도 빠르게 연관 규칙을 도출할 수 있습니다.
FP-Growth 알고리즘의 프로세스
1단계: 빈발 항목 필터링
FP-Growth 알고리즘의 첫 번째 단계에서는 모든 항목의 빈도를 계산한 후, 최소 지지도 이상인 항목만을 남깁니다. 이 과정은 데이터에서 자주 등장하지 않는 항목을 필터링해, 분석의 효율성을 높이는 역할을 합니다.
- 예시 : 특정 제품(예: 스마트폰 케이스, 충전 케이블, 무선 이어폰)들이 많이 판매되었다고 가정하고, 이들 중 최소 지지도 이상인 항목만을 남깁니다.
2단계: 데이터 재정렬
두 번째 단계에서는 남은 항목들을 각 거래별로 빈도순으로 재정렬합니다. 예를 들어, 거래 데이터에서 가장 자주 구매된 항목이 먼저 오도록 재정렬합니다. 이를 통해 더 효율적으로 트리를 구성할 수 있습니다.
- 예시 : 재정렬 후, 특정 거래에서는 무선 이어폰 > 충전 케이블 > 스마트폰 케이스 순으로 기록됩니다.
3단계: FP-트리 생성
재정렬된 데이터를 바탕으로 FP-트리를 생성합니다. 이 트리는 각 거래를 노드로 표현하며, 동일한 항목은 기존 노드에 연결해 빈도를 증가시키고, 새로운 항목은 새로운 노드로 추가합니다.
- 예시 : 예를 들어, 첫 번째 거래에 무선 이어폰과 충전 케이블이 있다면, 루트 노드에서 시작해 무선 이어폰 노드를 만들고, 그 다음 충전 케이블 노드를 연결합니다.
4단계: 빈발 항목 집합 추출
FP-트리를 바탕으로 특정 항목을 기준으로 부분 트리를 만들어 빈발 항목 집합을 추출합니다. 이 부분 트리에서는 기준이 된 항목과 연관된 빈발 항목 집합을 빠르게 도출할 수 있습니다.
- 예시 : 충전 케이블을 기준으로 부분 트리를 생성하여, 충전 케이블과 관련된 다른 제품(예: 무선 이어폰, 스마트폰 케이스)들의 빈발 항목 집합을 찾습니다.
5단계: 연관 규칙 도출
마지막으로, FP-트리에서 도출된 빈발 항목 집합을 바탕으로 연관 규칙을 만듭니다. 각 규칙에 대해 지지도(Support), 신뢰도(Confidence), 향상도(Lift) 등의 지표를 계산해 가장 유용한 규칙을 선택합니다.
- 예시 : 충전 케이블과 무선 이어폰이 자주 함께 구매되는 패턴을 발견하면, 이들 간의 연관 규칙을 도출해 충전 케이블을 구매하는 고객에게 무선 이어폰을 추천하는 마케팅 전략을 수립할 수 있습니다.
FP-Growth 알고리즘의 장점
FP-Growth 알고리즘은 Apriori 알고리즘과 달리 데이터셋을 단 두 번만 스캔하여 빈발 항목 집합을 찾아내므로, 특히 대규모 데이터셋에서 속도가 매우 빠릅니다. Apriori 알고리즘이 조합을 생성할 때마다 데이터셋을 반복적으로 스캔해야 하는 반면, FP-Growth는 트리 구조를 사용해 효율적으로 연관 규칙을 도출할 수 있습니다.
파이썬으로 구현하는 Fp-Growth 알고리즘
1. 데이터 준비 및 전처리
먼저, 필요한 라이브러리와 데이터를 불러오고, 데이터를 전처리합니다. 데이터는 마트에서 여러 결제 건별로 어떤 상품들이 함께 구매되었는지를 나타냅니다.
import pandas as pd
from mlxtend.preprocessing import TransactionEncoder
# 마트의 결제 데이터를 불러옵니다.
df = pd.read_csv('data/mart_sales_data.csv')
# 결제 건별로 상품 목록을 리스트로 묶어줍니다.
basket_df = df.groupby('ReceiptID')['ProductName'].apply(list).reset_index()
# TransactionEncoder를 활용해 데이터를 One-Hot Encoding합니다.
te = TransactionEncoder()
te_result = te.fit_transform(basket_df['ProductName'])
# One-Hot Encoding 결과를 DataFrame으로 변환합니다.
te_df = pd.DataFrame(te_result, columns=te.columns_)
print(te_df.head())
2. FP-Growth 알고리즘 구현
전처리된 데이터를 바탕으로 FP-Growth 알고리즘을 적용하여 빈발 항목 집합을 추출합니다. 여기서 빈발 항목 집합은 마트에서 자주 함께 구매되는 상품 조합을 의미합니다.
from mlxtend.frequent_patterns import fpgrowth
# 최소 지지도를 0.06으로 설정하여 빈발 항목 집합을 찾습니다.
frequent_itemsets = fpgrowth(te_df, min_support=0.06, use_colnames=True)
print(frequent_itemsets)
3. 연관 규칙 추출 및 평가
추출된 빈발 항목 집합을 사용해 연관 규칙을 생성합니다. 예를 들어, 특정 상품을 구매한 고객이 다른 상품을 추가로 구매할 확률을 계산할 수 있습니다.
from mlxtend.frequent_patterns import association_rules
# 연관 규칙을 추출하고, 신뢰도 0.8 이상의 규칙만 추출합니다.
rules = association_rules(frequent_itemsets, metric='confidence', min_threshold=0.8)
print(rules)
4. Apriori 알고리즘 vs. FP-Growth 알고리즘 속도 비교
마지막으로, 두 알고리즘의 처리 속도를 비교합니다. 이를 통해 대규모 데이터에서 FP-Growth 알고리즘이 얼마나 효율적인지 확인할 수 있습니다.
import time
from mlxtend.frequent_patterns import apriori
# Apriori 알고리즘 실행 시간 측정
start = time.time() # 시작 시간 저장
apriori(te_df, min_support=0.01, use_colnames=True)
print("Apriori Algorithm Time:", time.time() - start) # 소요 시간 출력
# FP-Growth 알고리즘 실행 시간 측정
start = time.time() # 시작 시간 저장
fpgrowth(te_df, min_support=0.01, use_colnames=True)
print("FP-Growth Algorithm Time:", time.time() - start) # 소요 시간 출력
5. 결과 해석
- 빈발 항목 집합 및 연관 규칙: FP-Growth 알고리즘을 통해 자주 함께 구매되는 상품 조합을 발견할 수 있습니다. 이 규칙은 마트의 판매 전략을 최적화하는 데 유용할 수 있습니다.
- 처리 속도 비교: 두 알고리즘을 비교해 FP-Growth 알고리즘이 더 빠르게 실행되는지 확인합니다. 이를 통해 대용량 결제 데이터를 처리할 때 FP-Growth 알고리즘이 얼마나 효율적인지 평가할 수 있습니다.
이 글에서는 Apriori와 FP-Growth 알고리즘을 활용한 연관 규칙 마이닝 기법을 다루었습니다. 두 알고리즘 모두 데이터에서 유의미한 패턴을 발견해 비즈니스 인사이트를 도출하는 데 강력한 도구가 될 수 있습니다. 특히, 대규모 데이터셋에서 FP-Growth 알고리즘의 속도와 효율성은 매우 유용하며, 이를 통해 마케팅 전략을 최적화할 수 있습니다. 이러한 알고리즘을 적절히 활용하면 데이터 기반의 의사결정을 더욱 효과적으로 내릴 수 있습니다.
감사합니다.
출처 및 참고자료 : 코드잇 사이트 강의 '장바구니 분석' https://www.codeit.kr/topics/market-basket-analysis
'프로그래밍 > 데이터 분석' 카테고리의 다른 글
[데이터 분석 심화 개념] 웹 자동화 개념 정리 1️⃣ (웹의 기본 요소) (0) | 2024.08.18 |
---|---|
[데이터 분석 심화 개념] 장바구니 분석 개념 정리 3️⃣ (순차 패턴 마이닝, PrefixSpan 알고리즘) (0) | 2024.08.16 |
[데이터 분석 심화 개념] 장바구니 분석 개념 정리 1️⃣ (장바구니 분석의 개념, 연관 규칙 마이닝의 개념과 규칙 평가 지표) (0) | 2024.08.12 |
[데이터 분석 심화 개념] 차원 축소 개념 정리 (0) | 2024.08.04 |
[데이터 분석 심화 개념] 클러스터링 개념 정리 3️⃣ (다양한 클러스터링 모델) (0) | 2024.08.04 |
데이터 분석을 공부하고 카페를 열심히 돌아다니는 이야기
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!