inblog logo
|
hollyisyoon
    스터디

    [cafe] 장바구니 분석

    연관분석을 통해 최강의 메뉴조합을 찾아보자
    Jun 22, 2023
    [cafe] 장바구니 분석
    Contents
    1. 연관 분석2. 주요 지표3. Apriori 알고리즘4. 연관성 분석해보기

    1. 연관 분석


    • ‘무엇이 무엇과 잘 어울리는지’를 밝혀내는 것
    • 서로 다른 아이템의 구매 간 의존성을 결정하기 위해 고객의 거래 데이터베이스를 분석하는데서 비롯됨(=장바구니 분석)
    • 어떤 두 아이템 집합이 빈번히 발생하는가의 규칙을 찾아서 데이터에 숨어있는 사건 또는 항목 간의 규칙을 찾아내는 방법론
    • 단점 :
      • 생성되는 규칙이 너무 많음 → 유용하고 강한 규칙으로 이루어진 작은 집합으로 줄이는 방법 필요
      • 드문 조합은 최소 지지도 조건을 만족시키지 못해 무시되는 경향
     

    2. 주요 지표


    : 한 슈퍼마켓의 DB에 10만개의 매장 거래 기록이 있고, 오렌지 주스+감기약 거래가 2,000개, +수프의 거래가 800개라면 ‘IF 오렌지 주스와 감기약이 판매되면 THEN 같은 거래에서 수프도 판매된다’는 연관규칙의 지지도는 0.8%(800/100,000), 신뢰도는 40%(800/2,000)이다.
     
    • 지지도(support)
    P(A∩B)=A와B가동시에포함된거래수전체거래수P(A∩B) = {A와 B가 동시에 포함된 거래수 \over 전체 거래수 }P(A∩B)=전체거래수A와B가동시에포함된거래수​
    • 신뢰도
    P(A∩B)P(A)=A와B가동시에포함된거래수A를포함하는거래수{P(A∩B)\over P(A)} = {A와 B가 동시에 포함된 거래수 \over A를 포함하는 거래수 }P(A)P(A∩B)​=A를포함하는거래수A와B가동시에포함된거래수​
    • 향상도 : 연관규칙의 강도를 가늠하기 위해 사용하며, 향상비가 1보다 크면 이 규칙에 유용성이 있다.
    P(B∣A)P(B)=P(A∩B)P(A)P(B)=A와B가동시에포함된거래수×전체거래수A포함거래수×B포함거래수{P(B|A)\over P(B)}={P(A∩B)\over P(A)P(B)} = {A와 B가 동시에 포함된 거래수 × 전체거래수 \over A 포함거래수 × B포함 거래수}P(B)P(B∣A)​=P(A)P(B)P(A∩B)​=A포함거래수×B포함거래수A와B가동시에포함된거래수×전체거래수​
    • 교차 지지도 : 지지도와 향상도를 곱한 후 제곱근을 취한 값. 향상도와 지지도가 모두 높을수록 교차 지지도는 높아진다
    Support(A,B)×Lift(A→B)\sqrt{Support(A,B)×Lift(A→B)}Support(A,B)×Lift(A→B)​
    향상도 해석
    ㅤ
    교차 지지도 해석
    ㅤ
    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. 재 방문

    • 첫방문 대비 눈에 띄게 향상도가 낮아졌다. (같이 시키는 메뉴가 분산되었다. 바닐라 라떼와의 조합이 많다)
     
    Google Colaboratory
    Google Colaboratory
    https://colab.research.google.com/drive/1gcM-vO4N5WYKPvx4CgiP_wopCf9XOyRE?usp=sharing
    Google Colaboratory
    Share article
    Contents
    1. 연관 분석2. 주요 지표3. Apriori 알고리즘4. 연관성 분석해보기

    hollyisyoon

    RSS·Powered by Inblog