Miridih Dakerton ①
| "데이터에서 숨은 패턴을 찾다"
Apriori 알고리즘을 활용한 연관분석
데이터분석팀 리드 서유진님
| 들어가기에 앞서
안녕하세요, 미리디 데이터분석팀 리드를 맡고 있는 서유진입니다.
MA팀(Miridih Analytics)은 미리디 전사 분석 조직으로, 각 도메인에서
수집된 데이터를 바탕으로 문제를 정의하고, 제품과 비즈니스의 방향을 함께 만들어가는 팀입니다.
커머스, 구독, 플랫폼 등 서로 다른 스쿼드에 속한 데이터 분석가들이
정기적으로 아이디어를 공유하고, 서로의 인사이트를 교차 학습하는 문화를 갖고 있습니다. 실험과 탐구를 통해 새로운 기회를 발견하고,
다양한 관점에서 제품과 사용자에 대해 깊이 고민합니다.
이러한 문화의 일환으로, MA팀은 매주 한 번 각자의 궁금증을 바탕으로
데이터를 탐색하고 토론하는 '데커톤(Dakerton)'을 진행하고 있습니다.
분석 방식도, 참여도 자율적이지만 단 하나의 기준이 있습니다.
"이 분석이 우리 서비스에 도움이 될 것인가?"
아래는 그 첫 번째 데커톤 이야기입니다.
데커톤 로고(미리캔버스 'AI로고 만들기' 기능으로 제작)
| MA 팀만의 데이터 문화, 데커톤 [Dakerton]
‘데커톤(Dakerton)’이란, 데이터(Data)와 해커톤(Hackathon)을 결합해 만든 MA 팀만의 문화입니다.
미리디의 MA팀은 2025년부터 매주 한 차례 모여 ‘데커톤’을 진행하고 있습니다.
데커톤은 팀원들이 돌아가며 [분석하고 싶은 주제]를 제안하고, 해당 주제에 대해 각자의 방식으로 데이터를 분석한 뒤 이를 공유하며 결론을 도출하는 방식으로 운영됩니다.
단 하나의 원칙은 “우리 프로덕트에 도움이 되는 주제일 것”입니다. 이 원칙만 지킨다면 참석 여부부터 분석 방법론까지 모든 것이 자유롭습니다.
데커톤의 첫 주제는 가장 최근에 입사하신 혜인님께서 제안하신 아이디어로부터 시작되었습니다.
" 저 분석하고 싶은 거 있어요.
우리 서비스에서 여러 상품을 같이 사는 고객들이 얼마나 되는지랑
그 때의 상품 조합이 어떤지 궁금해요. "
거짓말이 아니라, 정말로 제 분석 백로그에 오랫동안 적어두었던 가설 중 하나였습니다.
'시간 나면 한번 해봐야지'라고 가설만 세워뒀던 걸 함께 검증해보고 싶다고 말하는 동료가 있다니... 정말로 럭키비키🍀였습니다!
그렇게 첫 번째 데커톤의 주제는 [우리 서비스 고객의 구매 상품 간의 연관성 분석하기]가 되었습니다.
| 연관분석(Association Analysis)이란 무엇인가?
연관분석은 데이터마이닝 기술 중 하나로, 데이터 내에서 항목 간의 관계를 발견하는 데 사용됩니다.
주로 '연관 규칙'을 알아내어 결과를 도출하는데, 연관분석에서 가장 유명한 활용 분야는 장바구니 분석(Basket Analysis)입니다.
예를 들면, 슈퍼마켓에서 고객들이 함께 자주 구매하는 상품들을 분석하여 고객의 구매 패턴을 파악한 뒤, 마케팅이나 비즈니스 전략에 활용하는 식입니다.
뿐만 아니라, 추천 시스템에서 사용자의 과거 행동을 바탕으로 추천할 상품을 찾는 데에도 활용됩니다.
연관분석을 수행하는 대표적인 방법론에는 Apriori 알고리즘이 있습니다.
Apriori 알고리즘
Apriori 알고리즘은 빈번히 함께 발생하는 항목 집합을 찾는 방법론으로,
데이터에서 '빈발 항목 집합(Frequent Itemsets)'을 발견하고 연관 규칙을 도출하는 데에 목표를 둡니다.
이 알고리즘의 핵심 아이디어는 '상위의 항목 집합은 반드시 하위의 항목 집합을 포함해야 한다'는 것인데요.
즉, 먼저 개별 항목에서 빈발 항목 집합을 찾고, 그 후 이를 결합하여 더 큰 집합을 찾아야 합니다.
이 과정에서 불필요한 후보 항목을 미리 제거함으로써 연산 효율성을 높이는 특징을 가지고 있습니다.
Apriori 알고리즘은 크게 세 가지 주요 단계로 나누어 집니다.
한 온라인 쇼핑몰에서 고객들이 구매한 상품에 대한 데이터가 다음과 같이 존재한다고 할 때를 가정하여
Apriori 알고리즘을 적용해보도록 하겠습니다.
1. 빈발 항목 집합 찾기
우선 개별 상품들에 대해 지지도(support)를 계산하여, 최소 지지도 기준을 만족하는 항목들을 찾습니다.
최소 지지도는 분석가가 서비스에 맞게 설정하는데, 임의로 0.5를 기준으로 두었습니다.
모자를 제외한 티셔츠, 구두, 가방 3개의 상품이 최소 지지도 기준을 만족하는 빈발 항목 집합인 것으로 나타났습니다.
2. 연관 규칙 생성
다음으로 빈발 항목 집합을 바탕으로 신뢰도(confidence)를 계산하여 연관 규칙을 도출합니다.
예를 들어, "티셔츠 -> 구두"라는 규칙을 생성하고 신뢰도를 계산해보면 아래와 같이 도출되는데요.
이처럼 신뢰도가 높은 규칙을 지속적으로 생성하면서 최종적으로 유용한 연관 규칙을 찾아냅니다.
3. 규칙 평가
마지막으로 각 규칙의 향상도(lift)를 계산하여 연관 규칙의 유효성을 평가합니다.
향상도는 두 항목이 독립적일 경우의 구매 확률에 비해 얼마나 높은 확률로 함께 구매되는지에 대한 지표를 말합니다.
즉, 두 상품 간의 관계가 우연에 의한 것이 아닌지를 평가하는 지표입니다.
향상도 값이 1보다 크면 두 항목 간에 긍정적인 관계가 있다고 할 수 있고, 1보다 작으면 부정적인 관계에 있다고 할 수 있습니다.
"티셔츠 → 구두" 규칙의 향상도를 구하면 약 0.94가 나오는데,
이는 티셔츠와 구두가 독립적으로 발생하는 것보다 함께 발생하는 확률이 낮다는 의미입니다.
다시 말하면 두 상품이 함께 구매되는 경향이 상대적으로 적다는 것을 나타냅니다.
Apriori 알고리즘은 다양한 도메인의 서비스에서, 단순하고 직관적으로, 효율적인 후보 집합 생성이 가능하다는 장점을 가지고 있습니다.
하지만 대규모의 데이터셋에서는 후보 항목 집합간의 연산량 증대로 성능이 떨어질 수 있는 우려가 있습니다.
이 문제를 해결하기 위해 FP-growth 알고리즘이 등장하기도 했습니다.
다만, 우리 서비스에서는 이러한 단점이 크게 문제되지 않아서 Apriori 알고리즘을 사용하게 되었습니다.
| Apriori 알고리즘, 실제 서비스에 적용하기
해당 알고리즘을 활용하여 고객의 구매 상품들을 연관분석하기 전 다음과 같은 데이터 전처리 과정을 거쳤습니다.
첫 번째 전처리 작업은 서비스 특성에 맞는 시간적 범위를 설정하여 보다 의미 있는 연관 규칙을 찾기 위해서였고,
두 번째 전처리는 상품의 옵션이 다르다고 해서 완전히 다른 상품으로 처리하면, 이로 인해 고객의 구매 패턴을 오히려 왜곡할 수 있기 때문이었습니다.
즉, 오랜 시간 '우리 서비스의 고객'이 원하는 것을 알아내려고 노력해 온 분석가들의 판단이었습니다.
MLxtend 라이브러리
Apriori 알고리즘을 코드로 구현하기 위해 가장 처음에 사용했던 방식입니다.
MLxtend는 'Machine Learning Extensions'의 줄임말로, 여러 가지 기계 학습 및 데이터 분석 작업에 도움이 되는 함수들을 제공하는 파이썬 라이브러리입니다.
Apriori 알고리즘도 내장 함수로 구현되어 있어서 그대로 가져다 쓸 수 있다는 장점이 있습니다.
이렇게 내장 함수가 알아서 신뢰도와 향상도를 잘 도출해주는 것을 알 수 있습니다.
하드코딩으로 연관분석 함수 작성
MLxtend 라이브러리는 기본적으로 Apriori 알고리즘을 사용할 수 있는 함수를 제공하지만, 특정 조건에 맞는 맞춤형 알고리즘을 구현해야 하는 경우에는 MLxtend의 기본 지원 함수만으로는 해결하기에 충분치 않을 수 있습니다.
이 경우에는 하드코딩으로 각 서비스만의 알고리즘을 구현하는 것이 유연성 측면에서 유리할 수 있습니다.
예를 들어, 연관 규칙을 직접 계산하는 함수를 아래와 같이 구현해볼 수 있습니다.
이처럼 MLxtend 라이브러리의 내장 함수는 빠르고 효율적이며 사용이 간편하지만,
하드코딩된 calculate_rules 함수는 유연성이 뛰어나고, 특정 요구 사항에 맞게 커스터마이징할 수 있다는 장점이 있습니다.
따라서 각 서비스의 상황에 더 적합한 방식대로 진행하는 것이 바람직합니다.
중요한 것은 코드를 어떻게 구현했는지가 아니라 데이터를 분석하는 목적과 이를 통해 얻어낸 인사이트이기 때문입니다.
| 글을 마치며
미리디(Miridih)의 모든 것을 분석(Analytics)하는 MA팀은 전사의 모든 서비스 데이터에 접근하고 탐구하여,
비즈니스 및 프로덕트를 더욱 개선시킬 수 있는 '인사이트'라는 보석을 찾는 것을 즐기는 동료들로 이루어져 있습니다.
혼자 분석할 때는 좁아질 수 있는 시야를, 함께 분석함으로써 정답에 더욱 가까이 다가갑니다.
개인의 성장을 위해 노력하고, 동료의 성장을 위해 피드백하며,
결국엔 조직의 성장까지 이루어내는 팀의 여정에 합류할 동료를 찾고 있습니다!