본문 바로가기
빅데이터

[빅데이터분석, Python] 연관 분석 (Assocination Analysis)

by CuckooBird 2024. 4. 21.

연관분석 실습 목적

  • 목적: 트랜잭션 데이터에서 상품 간의 관계를 찾아낸다.
  • 알고리즘: 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): 데이터를 리스트 형태로 바꿔준다.
# 주문 데이터를 거래 형태로 변환
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)