장바구니에 담긴 손님의 마음을 읽는 방법, Apriori 알고리즘
마트 진열대를 걷다 보면 맥주 옆에 기저귀가, 빵 옆에 잼이 놓여 있는 걸 본 적 있으신가요? 우연이 아닙니다. 수많은 거래 데이터를 들여다보면 "이 상품을 산 사람은 저 상품도 같이 산다"는 패턴이 뚜렷하게 드러나거든요. 이런 패턴을 숫자로 잡아내는 대표적인 방법이 바로 Apriori 알고리즘입니다.
데이터 분석을 막 시작한 분이라면 "연관 규칙", "지지도", "신뢰도" 같은 용어를 듣는 순간 머리가 복잡해질 수 있습니다. 하지만 걱정하지 않으셔도 됩니다. 이 글에서는 수식보다 직관을, 이론보다 예시를 앞세워서 Apriori 알고리즘의 핵심을 차근차근 풀어보겠습니다.
왜 거래 데이터를 분석해야 할까
편의점이든 온라인 쇼핑몰이든, 매일 쌓이는 영수증 데이터에는 손님들의 구매 습관이 숨어 있습니다. 어떤 상품을 함께 사는지 알면 진열 위치를 바꾸거나, 묶음 상품을 기획하거나, 추천 상품을 보여줄 때 훨씬 똑똑한 결정을 내릴 수 있습니다.
문제는 상품 종류가 수백, 수천 개로 늘어나면 가능한 조합의 수가 폭발적으로 많아진다는 점입니다. 사람이 일일이 들여다볼 수 없는 규모죠. 이때 필요한 것이 바로 장바구니 분석(Market Basket Analysis)이고, 그 출발점에 Apriori 알고리즘이 있습니다.
Apriori 알고리즘을 이루는 세 가지 척도
Apriori 알고리즘은 두 상품(또는 그 이상) 사이의 관계를 세 가지 지표로 측정합니다. 계산 순서도 정해져 있는데, 지지도 → 신뢰도 → 향상도 순으로 단계를 밟아 나갑니다. 하나씩 풀어보겠습니다.
1. 지지도(Support) — 얼마나 자주 같이 팔렸나
지지도는 전체 거래 중에서 두 아이템이 동시에 포함된 거래가 차지하는 비율입니다.
지지도 = (A와 B를 모두 포함한 거래 수) ÷ (전체 거래 수)
지지도가 높을수록 두 상품이 같이 등장하는 경우가 많다는 뜻입니다. 다만 지지도만 보면 함정이 있습니다. 라면처럼 워낙 잘 팔리는 상품은 어떤 상품과 묶어도 지지도가 높게 나올 수 있거든요. 그래서 다음 지표가 필요합니다.
2. 신뢰도(Confidence) — A를 사면 B도 살 확률
신뢰도는 한 아이템을 산 사람이 다른 아이템도 같이 살 확률을 나타냅니다.
신뢰도(A→B) = (A와 B를 모두 포함한 거래 수) ÷ (A를 포함한 거래 수)
여기서 중요한 점은 방향성입니다. "A를 사면 B도 산다"는 신뢰도와 "B를 사면 A도 산다"는 신뢰도는 분모가 다르기 때문에 값이 서로 다를 수 있습니다. A가 워낙 인기 상품이라 분모가 크면, A→B의 신뢰도는 낮게 나올 수 있는 것이죠.
3. 향상도(Lift) — 이 관계가 우연이 아닐 확률
신뢰도까지 보면 충분할 것 같지만, 한 가지가 빠져 있습니다. B라는 상품이 원래 워낙 잘 팔리는 상품이라면, A를 사든 안 사든 B를 살 확률 자체가 높을 수 있습니다. 그렇다면 A와 B 사이에 진짜 연관이 있는 걸까요, 아니면 그냥 B가 인기 상품이라서 그런 걸까요? 이 질문에 답해주는 지표가 향상도입니다.
향상도(A→B) = 신뢰도(A→B) ÷ (B만 포함한 거래 수 ÷ 전체 거래 수)
쉽게 말하면, "A를 산 사람이 B를 살 확률"을 "그냥 아무나 B를 살 확률"로 나눈 값입니다. 이 비교를 통해 두 상품의 관계가 우연인지 아닌지를 판단할 수 있습니다.
- 향상도 > 1 : 양의 상관관계. A를 사면 B를 살 가능성이 평소보다 높아집니다.
- 향상도 = 1 : 두 아이템은 서로 독립적입니다. A를 사든 안 사든 B를 살 확률은 그대로입니다.
- 향상도 < 1 : 음의 상관관계. A를 사면 오히려 B를 살 가능성이 줄어듭니다.
결국 지지도와 신뢰도로 "함께 팔리는 패턴"을 찾고, 향상도로 "이게 진짜 의미 있는 관계인지"를 확인하는 흐름입니다.
숫자로 직접 계산해보기
이해를 돕기 위해 간단한 예제를 들어보겠습니다. 어느 편의점에서 하루 동안 발생한 거래가 100건이라고 가정해봅니다.
- 전체 거래: 100건
- 빵을 포함한 거래: 40건
- 잼을 포함한 거래: 25건
- 빵과 잼을 모두 포함한 거래: 15건
지지도 계산은 이렇게 됩니다.
지지도(빵, 잼) = 15 ÷ 100 = 0.15 (15%)
전체 거래 중 15%에서 빵과 잼이 함께 팔렸다는 의미입니다.
신뢰도는 방향에 따라 두 가지로 계산됩니다.
신뢰도(빵→잼) = 15 ÷ 40 = 0.375 (37.5%)
신뢰도(잼→빵) = 15 ÷ 25 = 0.6 (60%)
빵을 산 사람 중 37.5%가 잼도 샀고, 반대로 잼을 산 사람 중에서는 60%가 빵도 샀다는 뜻입니다. 같은 두 상품이라도 어느 쪽을 기준으로 보느냐에 따라 수치가 달라지는 걸 확인할 수 있습니다.
향상도를 계산하려면 잼만 봤을 때의 비율이 먼저 필요합니다.
잼 구매 비율 = 25 ÷ 100 = 0.25
향상도(빵→잼) = 0.375 ÷ 0.25 = 1.5
향상도가 1.5로 1보다 크기 때문에, 빵과 잼은 단순한 우연이 아니라 실제로 함께 구매되는 경향이 있는 양의 상관관계임을 알 수 있습니다.
계산 결과를 어떻게 해석할까
위 예제에서 빵과 잼의 향상도는 1.5였습니다. 이 숫자가 의미하는 바를 풀어보면, 잼을 살 확률이 평소보다 1.5배 높아진다는 뜻입니다. 빵을 산 사람에게 잼을 추천하거나, 두 상품을 가까운 진열대에 배치하는 전략이 데이터로 뒷받침되는 셉니다.
반대로 어떤 두 상품의 향상도가 1에 가깝거나 그 이하로 나온다면, 굳이 같이 진열하거나 묶음 상품으로 만들 이유가 약하다고 판단할 수 있습니다. 우연히 같은 날 팔렸을 뿐, 실제 구매 행동에 별다른 연결고리가 없다는 신호니까요.
다만 지지도가 지나치게 낮은 조합은 향상도가 높게 나와도 신뢰하기 어렵습니다. 예를 들어 100건 중 단 2건에서만 같이 팔린 상품이라면, 우연히 그런 결과가 나왔을 가능성도 무시할 수 없습니다. 그래서 실무에서는 최소 지지도 기준(예: 1% 이상)을 먼저 정해두고, 그 기준을 넘는 조합들만 신뢰도와 향상도로 추가 검증하는 방식을 사용합니다.
실전에서 활용할 때 알아두면 좋은 팁
실제 데이터에 Apriori 알고리즘을 적용할 때 참고할 만한 점들을 정리해봤습니다.
- 최소 지지도와 최소 신뢰도를 먼저 설정하세요. 모든 조합을 다 살펴보면 계산량이 기하급수적으로 늘어납니다. 의미 있는 조합만 걸러내는 기준선을 먼저 정하는 것이 효율적입니다.
- 향상도가 1을 살짝 넘는 정도라면 추가 검증이 필요합니다. 거래량이 충분히 많은 데이터에서 나온 결과인지 확인해보는 과정이 중요합니다.
- 계절성이나 이벤트 효과를 고려하세요. 특정 시즌(예: 명절)에만 나타나는 일시적인 연관관계일 수도 있으므로, 기간을 나눠서 분석해보는 것도 좋은 방법입니다.
- 세 개 이상의 아이템 조합도 분석 가능합니다. 빵과 잼뿐 아니라 "빵, 잼, 버터"처럼 세 가지 이상의 조합으로 확장할 수 있으며, Apriori는 이런 다중 아이템셋 분석의 기초가 됩니다.
- 파이썬으로 손쉽게 구현할 수 있습니다. mlxtend 라이브러리의 apriori, association_rules 함수를 활용하면 직접 수식을 짜지 않고도 지지도, 신뢰도, 향상도를 한 번에 계산할 수 있습니다.
자주 묻는 질문 (FAQ)
Q1. 지지도, 신뢰도, 향상도 중 가장 중요한 지표는 무엇인가요?
하나만 보고 판단하기보다는 세 지표를 함께 보는 것이 중요합니다. 지지도로 충분한 거래량이 있는지 먼저 확인하고, 신뢰도로 방향성 있는 구매 패턴을 살핀 뒤, 향상도로 그 관계가 우연이 아닌지 최종 확인하는 흐름이 일반적입니다.
Q2. 향상도가 1보다 작으면 그 조합은 아무 의미가 없는 건가요?
꼭 그렇지는 않습니다. 향상도가 1보다 작다는 것은 두 상품이 서로 대체재 관계일 가능성을 시사하기도 합니다. 예를 들어 콜라와 사이다처럼 한쪽을 사면 다른 쪽을 덜 사는 경우, 음의 상관관계가 나타날 수 있습니다.
Q3. Apriori 알고리즘은 어떤 분야에서 주로 쓰이나요?
가장 잘 알려진 활용처는 소매업의 장바구니 분석이지만, 그 외에도 온라인 쇼핑몰의 상품 추천, 웹사이트 페이지 간 이동 패턴 분석, 의료 데이터에서 증상-질병 간 연관성 분석 등 다양한 분야에서 활용되고 있습니다.
Q4. 데이터가 적어도 Apriori 알고리즘을 적용할 수 있나요?
적용 자체는 가능하지만, 거래 건수가 너무 적으면 지지도와 향상도 값이 우연에 의해 크게 흔들릴 수 있습니다. 신뢰할 만한 결과를 얻으려면 어느 정도 규모 있는 거래 데이터가 확보된 상태에서 분석하는 것을 권장합니다.
참고문헌
이 글은 일반적으로 알려진 Apriori 알고리즘과 장바구니 분석(Market Basket Analysis)의 개념을 바탕으로 작성되었으며, 특정 외부 자료를 직접 인용하지 않았습니다. 추가로 학습하고자 하시는 분은 mlxtend 공식 문서(association_rules, apriori 모듈)를 참고하시면 도움이 됩니다.
댓글
댓글 쓰기