1. 연관 분석
- ‘무엇이 무엇과 잘 어울리는지’를 밝혀내는 것
- 서로 다른 아이템의 구매 간 의존성을 결정하기 위해 고객의 거래 데이터베이스를 분석하는데서 비롯됨(=장바구니 분석)
- 어떤 두 아이템 집합이 빈번히 발생하는가의 규칙을 찾아서 데이터에 숨어있는 사건 또는 항목 간의 규칙을 찾아내는 방법론
- 단점 :
- 생성되는 규칙이 너무 많음 → 유용하고 강한 규칙으로 이루어진 작은 집합으로 줄이는 방법 필요
- 드문 조합은 최소 지지도 조건을 만족시키지 못해 무시되는 경향
2. 주요 지표
: 한 슈퍼마켓의 DB에 10만개의 매장 거래 기록이 있고,
오렌지 주스+감기약
거래가 2,000개, +수프
의 거래가 800개라면 ‘IF 오렌지 주스와 감기약이 판매되면 THEN 같은 거래에서 수프도 판매된다’는 연관규칙의 지지도는 0.8%(800/100,000), 신뢰도는 40%(800/2,000)이다.- 지지도(support)
- 신뢰도
- 향상도 : 연관규칙의 강도를 가늠하기 위해 사용하며, 향상비가 1보다 크면 이 규칙에 유용성이 있다.
- 교차 지지도 : 지지도와 향상도를 곱한 후 제곱근을 취한 값. 향상도와 지지도가 모두 높을수록 교차 지지도는 높아진다
향상도 해석 | ㅤ | 교차 지지도 해석 | ㅤ |
Lift < 1 | Lift가 1보다 작을수록, X-Y는 음의 관계를 가진다 | Lift는 작은데 Support 클 때 | 증분은 작지만 도달 범위가 넓어서 임팩트를 낼 수 있다 |
Lift = 1 | X-Y는 관계가 없다 | Lift는 큰데 Support 작을 때 | ㅤ |
Lift > 1 | Lift가 1보다 클수록, X-Y는 양의 관계를 가진다 | Lift는 작은데 Support 클 때 | ㅤ |
ㅤ | ㅤ | Lift는 큰데 Support 클 때 | 증분도 크고 도달범위도 넓어서 가장 임팩트를 내기 좋다 |
3. Apriori 알고리즘
- 최소 지지도 기준을 입력함
- 이 지지도 기준보다 빈번하게 발생하지 않는 항목 집합의 경우, 이후 노드에서 탐색을 추가로 진행하지 않음
4. 연관성 분석해보기
데이터 전처리
- 방문 ID 만들기 (고객 ID와 방문일자 조합)
- 메뉴명 전처리 (ice/hot 통일, 세부 메뉴 합치기)
- 방문일자와 상품을 행으로 갖는 데이터프레임 제작
인코딩
- 메뉴명을 원핫인코딩해주고, 방문ID drop
te = TransactionEncoder() te_ary = te.fit_transform(df['상품_리스트']) df_encoded = pd.DataFrame(te_ary, columns=te.columns_)
Apriori 알고리즘 사용
- 최소 지지도 설정
- 조합 수 설정
- 향상도 순 정렬
def go_apriori(data, min_지지도=0.01, min_향상도=0.1, n=20, keyword='아메리카노'): df = data.copy() df = df.groupby('방문ID')['N_상품명'].apply(list).reset_index(name='상품_리스트') te = TransactionEncoder() te_ary = te.fit_transform(df['상품_리스트']) df_encoded = pd.DataFrame(te_ary, columns=te.columns_) # 부분집합들을 생성 - Apriori 함수를 통해 최소 지지도(min_support)를 입력하고 itemsets 의 최대 원소 개수(max_len)를 입력하여 필요한 부분 집합들을 생성 frequent_featuresets = apriori(df_encoded, min_support = min_지지도, use_colnames = True, max_len = 3) # min 향상도 지정 rules = association_rules(frequent_featuresets, metric = 'lift', min_threshold = min_향상도) # 교차지지도 지정 rules['interest_support'] = rules['lift']*rules['support'].apply(lambda x: math.sqrt(x)) if keyword is None: result = rules.sort_values(by='interest_support', ascending=False) else: result = rules[rules['consequents'].str.contains(keyword, regex=False, na=False)].sort_values(by='interest_support', ascending=False) return result.head(n)
1. 전체 방문
- 아메리카노 조합(바닐라 라떼 or 휘낭시에 or 브라운치즈크로플)이 가장 지지도가 높았다. 전반적으로 아메리카노 주문량이 높은 것에 기인하는 것으로 보인다.
- 시그니처 메뉴인 코클슈페너와 조합(초코크림라떼 or 휘낭시에 or 브라운치즈크로플)이 향상도가 높았다.
2. 첫 방문
- 에스프레소 종류가 향상도가 높은 편이었다. (주로 같이 시킨다)
- 아메리카노를 포함해 시그니처 메뉴가 지지도가 높았다.
3. 재 방문
- 첫방문 대비 눈에 띄게 향상도가 낮아졌다. (같이 시키는 메뉴가 분산되었다. 바닐라 라떼와의 조합이 많다)
Share article