코드잇 스프린트/통계

연관 분석(장바구니 분석)

JOHAWK 2024. 9. 27. 17:24

이번에는 장바구니 분석이라고도 불리는 연관 분석에 대해 알아보겠습니다.

 

연관 분석

목차

1. 연관 분석

1) 개념

2) 주요 지표

3) 활용 사례

4) 파이썬 라이브러리

 

1. 연관 분석

1) 개념

연관 분석은 대량의 데이터에 숨겨진 항목 간의 연관규칙을 찾아내는 기법입니다.

데이터 간의 관계에서 조건과 결과(if ~ then)를 찾는 것이죠.

예를 들어 홈플러스에서 당당치킨을 사면 콜라도 같이 사는지 여부를 분석하는 것이 연관 분석입니다.

연관 분석은 인과관계를 분석하는 것과 다릅니다. 연관과 인과 모두 "A 이후 B가 발생한다." 라는 선후 관계가 있습니다.

하지만, 인과관계는 'A 때문에 B가 발생한다.'라는 선행 조건이 결과를 이끌어 낸다는 것을 전제하지만 연관관계는 A가 발생했을 때 B가 발생할 확률을 구하는 일종의 조건부 확률입니다. A로 인해 B가 나타났다고 명시하지 않습니다.

 


2) 주요 지표

연관 분석을 하기 위해 사용하는 주요 지표는 지지도(support), 신뢰도(confidence), 향상도(lift)가 있습니다.

지표 설명
지지도(support) 규칙의 일반성을 평가합니다. 주어진 데이터 안에서 그 규칙이 얼마나 자주 등장하는지 빈도를 측정합니다.
신뢰도(confidence) 규칙의 신뢰성을 평가합니다. 조건 품목을 샀을 때 결과 품목을 함께 살 확률을 계산합니다.
향상도(lift) 규칙의 우연성을 평가합니다. A와 B가 우연이 아닌 상관관계가 있는지 판단합니다.

향상도는 1을 기준으로 평가할 수 있습니다.
(향상도 > 1: 양의 관계 [치킨과 콜라], 향상도 = 1: 독립[물과 콜라], 향상도 < 1: 음의 관계[텀블러와 머그컵])

 

해당 지표들을 이해하기 위해 대형 문방구에서 한 달간 판매한 품목들로 예시를 들어보겠습니다.

문방구 사장님은 다이어리와 볼펜을 세트로 판매하는 것이 효과적일 지 고민하고 있습니다. 이 고민을 통계적으로 해결해보기 위해 데이터를 출력해봤습니다.

거래 품목 구매 수
다이어리 200
볼펜 300
키링 100
다이어리, 볼펜 200
다이어리, 키링 50
볼펜, 키링 50
다이어리, 볼펜, 키링 100
총합 1,000

 

여기서 다이어리 & 볼펜의 지지도를 계산하면 200/1,000으로 0.2입니다.

다음으로, 다이어리(선행) -> 볼펜(결과)의 지지도를 계산하면 200/(200+200+50+100)으로 약 0.36입니다. 다이어리를 구매할 때 볼펜도 같이 구매할 확률은 36%인 것이죠.

반대로 볼펜(선행) -> 다이어리(결과)의 지지도는 300/(300+200+50+100) = 약 0.46입니다. 연필을 구매할 때 다이어리를 같이 구매할 확률은 46%입니다.

마지막으로 다이어리와 볼펜을 같이 구매하는 것이 우연인지 확인하기 위해 향상도를 구하면 (200 * 1,000) / (550 * 650) = 약 0.56입니다. 1보다 작기 때문에 음의 상관관계를 보입니다. 즉, 다이어리와 볼펜 중 하나를 사면 다른 하나까지 포함해서 구매할 확률이 감소하는 것이죠. 아마 볼펜이 다른 상품의 구매와 관련없이 항상 잘 팔리는 제품이라 낮게 나타났을 가능성이 있습니다.

 

이 결과를 바탕으로 사장님은 다이어리와 볼펜을 세트로 구성하지 않기로 결정했습니다.

 


3) 활용 사례

연관 분석은 다양한 곳에서 사용할 수 있습니다. 가장 많이 언급되는 것이 월마트의 '맥주와 기저귀'입니다.

월마트에서 영수증 데이터를 가지고 연관 분석을 했을 때 잘 매칭이 되지 않는 맥주와 기저귀의 연관 규칙이 나타났습니다. 그 원인을 따로 탐색한 결과, 아빠들이 아이의 기저귀를 사러 갔다가 자신이 먹을 맥주도 같이 구매하는 것이었죠.

 

온라인 쇼핑몰에서도 연관 분석을 사용할 수 있습니다. 온라인 쇼핑몰에서 고객들을 세그먼트할 때 어떤 버튼을 누른 사람이 장바구니 버튼으로까지 가는지 확인하기 위해 클릭 히트맵 데이터를 가지고 연관 분석을 사용합니다.

출처: Beausable blog

 


4) 파이썬 라이브러리

연관 분석은 사이킷런에서도 할 수 있고, mlxtend 라이브러리를 사용할 수 있습니다.

mlxtend 라이브러리를 기준으로 간단한 사용법을 설명드리겠습니다.

저는 kaggle에서 가져온  빵집의 판매 데이터 중 일부를 활용하겠습니다.

먼저,  일반적인 데이터를 열면 아래 그림처럼 나올 겁니다.  이 상태에서는 한 번에 여러 품목을 구매했다는 것을 컴퓨터가 인식하기 어려워합니다.

import pandas as pd
import numpy as np

rawdata.head()

그래서 TransactionNo를 기준으로 데이터를 통합합니다.

# 연관 분석을 할 수 있는 데이터셋 만들기
transaction = rawdata.groupby('TransactionNo')['Items'].apply(list).reset_index()
transaction.head()

TransactionNo를 기준으로 품목들이 리스트로 결합된 것을 확인할 수 있습니다.

이제 Items 열을 가지고 mlxtend 라이브러리를 사용해 원핫인코딩을 하겠습니다.

from mlxtend.preprocessing import TransactionEncoder

# 원핫인코딩 적용
te = TransactionEncoder()
te_ar = te.fit_transform(transaction['Items'])
df_te = pd.DataFrame(te_ar, columns = te.columns_)
df.head()

본격적으로 apriori 알고리즘으로 연관 분석을 해보겠습니다. 먼저, 자주 나타나는 항목인 빈발항목집단을 만들겠습니다.

from mlxtend.frequent_patterns import apriori

# 빈발항목집단 형성 (최소 지지도 = 0.05로 설정)
frequent_itemsets = apriori(df_te, min_support=0.05, use_colnames=True).sort_values('support', ascending=False)
frequent_itemsets

빈발항목집단에서 12개의 패턴이 발견되었습니다. 여기서 두 개 이상 조합된 것은 coffee와 bread, cake와 coffee, 그리고 tea와 coffee가 있습니다.

다음으로, 연관 규칙을 찾아봅시다.

from mlxtend.frequent_patterns import association_rules

# 연관 규칙 DataFrame 만들기
# metric에서 지표의 종류를 정하고 min_threshold에서 metric에서 정한 지표의 최소값을 지정할 수 있다.
rules = association_rules(frequent_itemsets_s, metric="lift", min_threshold=0)
rules

커피와 빵은 향상도가  0.57로 1보다 작아 음의 상관관계를 가집니다. 즉, 커피나 빵 중 하나를 집으면 다른 하나를 같이 집을 확률이 떨어집니다. 이거 특이하네요.

차와 커피 역시 향상도가 0.74로 하나를 고르면 다른 하나까지 같이 고를 확률이 감소합니다. 이건 납득이 되네요.

그리고 케이크와 커피는 향상도가 1.1로 약하지만 양의 상관관계를 가지고 있습니다. 케이크와 커피는 같이 먹기 좋은 디저트니 이해가 갑니다.

 

위 결과를 바탕으로 구상해 볼 수 있는 전략은 무엇이 있을까요?

지금 당장 떠오르는 건 케이크를 먹으러 온 사람에게 커피를 권장할 수 있도록 케이크 + 커피 세트 메뉴를 구성하는 게 있네요.

사실 무조건 향상도가 높은 것을 고르는 것이 아니라 매장 상황에 따라 적합한 지표를 참고해서 고르는 것이 좋습니다.

 


이번에는 연관성 분석에 대해 간단하게 알아봤습니다. 연관성 분석은 apriori부터 효율적으로 빈발항목집단을 구할 수 있는 fp-growth, 순서까지 고려한 순차 패턴 마이닝 등 다양한 알고리즘이 있습니다. 공부해서 주제에 맞는 연관성 분석을 진행하시면 좋겠습니다!

 

 

참고글

고객이 같이 사는 제품의 이유! 연관성 분석 이해하기 | 뷰저블 (beusable.net)

 

고객이 같이 사는 제품의 이유! 연관성 분석 이해하기 | 뷰저블

고객은 왜 맥주와 기저귀를 함께 살까?

www.beusable.net

 

'코드잇 스프린트 > 통계' 카테고리의 다른 글

히스토그램의 한계점  (1) 2024.09.20
차원 축소와 주성분 분석(Principle Component Analysis, PCA)  (1) 2024.09.19
기술통계와 추론통계  (0) 2024.08.22
사분위수  (0) 2024.08.19
t-test  (0) 2024.08.14