[cafe] 장바구니 분석

연관분석을 통해 최강의 메뉴조합을 찾아보자
Jun 22, 2023
[cafe] 장바구니 분석

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 알고리즘


  • 최소 지지도 기준을 입력함
  • 이 지지도 기준보다 빈번하게 발생하지 않는 항목 집합의 경우, 이후 노드에서 탐색을 추가로 진행하지 않음
https://pub.towardsai.net/association-discovery-the-apriori-algorithm-28c1e71e0f04
 

4. 연관성 분석해보기


데이터 전처리
  • 방문 ID 만들기 (고객 ID와 방문일자 조합)
  • 메뉴명 전처리 (ice/hot 통일, 세부 메뉴 합치기)
  • 방문일자와 상품을 행으로 갖는 데이터프레임 제작
notion image
인코딩
  • 메뉴명을 원핫인코딩해주고, 방문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

hollyisyoon