연관분석 실습 목적
- 목적: 트랜잭션 데이터에서 상품 간의 관계를 찾아낸다.
- 알고리즘: Apriori 알고리즘
- 데이터셋: Online Retail Dataset은 온라인 소매점에서의 거래 데이터를 가진 데이터셋으로, 각 거래는 고객이 구매한 상품의 목록을 포함하고 있다.
- 사용 예시: 주로 장바구니 분석 (Market Basket Analysis)에 사용되며, 상품 추천 시스템 등
라이브러리 가져오기
import pandas as pd
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules
- pandas: 파이썬 데이터 처리를 위한 라이브러리
주로 DataFrame이라는 2차원 테이블 형태의 데이터 구조를 사용하며, 결측값 처리, 시계열 분석, 통계분석 등 다양한 데이터 처리 기능을 제공한다. - mlxtend: 머신러닝 및 데이터 분석을 위한 유용한 도구 및 기능을 제공하는 라이브러리
연관 규칙 학습, 분류, 회귀, 클러스터링, 차원 축소, 모델 선택, 전처리, 시각화 등 다양한 기능을 제공한다. - Transaction Encoder: mlxtend 라이브러리의 전처리 모듈에 속한 클래스 트랜잭션 데이터를 머신러닝 알고리즘에 적합한 현태로 변환한다.
아이템의 존재 여부를 나타내는 boolean 값으로 변환해 One-hot 인코딩이라고 부르기도 한다.
데이터 불러오기 및 전처리
- 데이터 불러오기, 결측값 제거
- wget: 웹에서 파일을 다운로드하는 데 사용되는 도구
- pd.read_excel: 엑셀파일로 된 데이터를 불러온다.
- dropna: 해당하는 열의 결측값을 제거한다.
- inplace: True로 설정할 경우 데이터셋 자체를 수정한다.
import pandas as pd
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules
# 데이터셋 다운로드
!wget 'https://archive.ics.uci.edu/ml/machine-learning-databases/00352/Online%20Retail.xlsx'
# 데이터 불러오기
df = pd.read_excel('Online Retail.xlsx')
# 결측치 제거
df.dropna(subset=['Description', 'CustomerID'], inplace=True)
데이터 변환 및 인코딩
- 데이터 변환
- groupby: 주어진 데이터를 그룹 별로 구분하여 데이터를 보기 위해 사용되는 함수
InvoiceNo을 통해 그룹화해 사용자별로 구매 내역을 보여준다. - apply(list): 데이터를 리스트 형태로 바꿔준다.
- groupby: 주어진 데이터를 그룹 별로 구분하여 데이터를 보기 위해 사용되는 함수
# 주문 데이터를 거래 형태로 변환
transactions = df.groupby('InvoiceNo')['Description'].apply(list)
- 데이터 인코딩
- TransactionEncoder(): 객체를 생성한다.
- fit(): 데이터셋에 적용한다.
- transform(): 데이터를 boolean 배열로 변환한다.
- pd.DataFrame(): 변환된 데이터를 pandas의 DataFrame으로 변환한다.
# 데이터 인코딩
te = TransactionEncoder()
te_ary = te.fit(transactions).transform(transactions)
df = pd.DataFrame(te_ary, columns = te.columns_)
Apriori 알고리즘 적용
- min_support: 지지도는 특정 항목 집합이 전체 트랜잭션에서 발생한 비율을 말한다.
- apriori(): 데이터셋과 최소 지지도를 사용해 빈발 항목 집합을 찾는다.
- 지지도 (support): 각 항목이 같이 발생할 경우
- 신뢰도(confidence): 항목 X가 주어진 경우, 항목 Y도 발생할 확률
- 향상도(lift): 항목 X와 Y가 독립적일 때 예상되는 지지도에 비해 실제로 함께 발생한 비율
# Apriori 알고리즘 적용
min_support = 0.01 # 최소 지지도 설정
frequent_itemsets = apriori(df, min_support=min_support, use_colnames=True)
관련 지표 계산
- association_rules(): 지지도, 신뢰도 및 향상도 지표를 포함하는 규칙 계산
선행 항목과 후행 항목 간의 관계와 함께 지표 값을 확인할 수 있다.
# 연관 규칙 및 지표 계산
rules = association_rules(frequent_itemsets, metric="lift", min_threshold=1)
# 결과 출력
print(rules[['antecedents', 'consequents', 'support', 'confidence', 'lift']])
상품 추천 시스템
- lambda: 간단한 기능을 수행하는 일회성 함수 생성
- apply(): 데이터프레임의 특정 열의 모든 행에 사용자 지정 함수 적용
- issubset(): 부분집합 여부 확인
- iterrows(): 데이터프레임의 인덱스와 행 데이터를 튜플로 반환
- update(): 새로운 요소 추가
# 추천 함수를 생성합니다.
def recommend_products(rules, products_bought, top_n=10):
"""
rules: 연관 규칙 데이터프레임
products_bought: 사용자가 구매한 상품 목록
top_n: 추천할 상품 개수
"""
# 구매한 상품들을 antecedents에 포함하는 규칙을 추출합니다.
recommendations = rules[rules['antecedents'].apply(lambda x: set(products_bought).issubset(x))]
recommendations = set()
for index, rule in rules.iterrows():
antecedents = rule['antecedents']
if set(products_bought).issubset(antecedents):
recommendations.update(rule['consequents'])
# lift 값이 높은 순서로 상품을 정렬합니다.
recommendations = recommendations.sort_values(by='lift', ascending=False)
# 상위 top_n개의 상품을 추출합니다.
recommended_products = set()
for _, row in recommendations.iterrows():
recommended_products.update(row['consequents'])
if len(recommended_products) >= top_n:
break
return list(recommended_products)[:top_n]
# 예시: 사용자가 구매한 상품 목록을 기반으로 추천 상품을 추출합니다.
products_bought = ['T2 TEAHEART FAIRY CAKE CASES']
recommended = recommend_products(rules, products_bought)
print("추천 상품:", recommended)
'빅데이터' 카테고리의 다른 글
[빅데이터분석] 5장. 분류(1) (0) | 2024.06.08 |
---|---|
[빅데이터분석, R] 연관 분석 (0) | 2024.04.21 |
[빅데이터분석, Python] 전처리(Data-Preprocessing) (0) | 2024.04.21 |
[빅데이터분석] 4강. 연관 분석 (0) | 2024.04.16 |
[빅데이터분석] 3강. 전처리 (0) | 2024.04.15 |