연관규칙 분석(Association Rule Analysis)는 데이터 세트에서 유의미한 연관성을 찾는 기법으로, 주로 대규모 데이터에서 유용한 패턴을 발견하는데 사용된다.(데이터 마이닝)
연관규칙은 데이터 내에서 함께 발생하는 이벤트(또는 항목) 간의 관계를 찾아내는 것입니다.
기본적으로 다음 세 가지 요소를 포함한다 :
- Support(지지도): 전체 거래 중 특정 항목 집합이 포함된 비율
- Confidence(신뢰도): 항목 A가 포함된 거래 중 항목 B도 포함될 확률
- Lift(향상도): A와 B가 우연히 함께 발생하는 것보다 실제로 함께 발생하는 정도를 측정한 값
- Support와 Confidence는 확률과 유사하지만, Lift는 확률이 아니라 비율로, 연관성을 추가로 평가하는 지표
예시 거래 데이터
- 거래 1: {우유, 빵}
- 거래 2: {우유, 기저귀}
- 거래 3: {빵, 기저귀, 맥주}
- 거래 4: {우유, 빵, 기저귀, 맥주}
- 거래 5: {빵, 맥주}
예시 : "우유를 산 사람이 빵도 살 확률"을 분석
- Support(지지도): {우유, 빵} 집합의 지지도.
- Confidence(신뢰도): {우유} → {빵} 규칙의 신뢰도.
- Lift(향상도): {우유} → {빵} 규칙의 향상도
Support(지지도) 계산
- Support는 특정 항목 집합이 거래에서 나타난 비율
범위 : $0 \leq Support \leq 1$ (확률과 동일한 범위)
예: Support = 0.4라면, 전체 거래 중 40%에서 해당 항목 집합이 나타났다는 의미
공식 :
$$Support(X) = \frac{전체에서\,X가\,포함된\,수}{전체\,조합\,수}$$
예를 들어, {우유, 빵}이 포함된 거래를 확인
거래 1: {우유, 빵} 포함됨
거래 4: {우유, 빵} 포함됨
따라서 Support = $\frac{2}{5} $ = 0.452=0.4 (전체 5개의 거래 중 2개 포함)
Confidence(신뢰도) 계산
- Confidence는 X를 포함한 거래 중 Y도 포함된 거래의 비율
범위 : $0 \leq Confidence \leq 1$ (확률과 동일한 범위)
예: Confidence = 0.67이라면, 우유를 구매한 고객 중 67%가 빵도 구매했다는 의미
공식 :
$$Confidence(X→Y) = \frac{Support(X\cup Y)}{Support(X)} = $$
예를 들어, {우유} 가 포함된 거래에서 {빵}도 포함된 거래를 확인
{우유}가 포함된 거래는 3개 (1,2,4)
{우유}와 {빵} 모두 포함된 거래는 2개(1,4)
따라서 Confidence $\approx \frac{2}{3} $ = 0.67
Lift(향상도) 계산
- Lift는 두 항목의 실제 연관정도를 측정하는 지표로, 우연히 함께 발생할 확률에 비해 얼마나 더 자주 발생하는지 보여준다
A와 B가 우연히 발생한 것과 비교해 얼마나 연관성이 높은지를 나타냅니다.
확률의 개념이 아닌, 두 확률의 비율입니다.
범위: $0 \leq Lift $ (이론적으로 제한은 없으나 실무에서는 보통 0에서 3 사이로 나옴)
- Lift = 1 : A와 B는 독립적(연관없음)
- Lift > 1 : A와 B가 양의 연관(함께 나타날 가능성↑)
- Lift < 1 : A와 B가 음의 연관(함께 나타날 가능성↓)
예 : Lift = 0.84라면 우유와 빵의 연관성이 실제 데이터에서 우연히 발생한 것보다 낮다는 의미
공식 :
$$Lift(X→Y) = \frac{Confidence(X→Y)}{Support(Y)} $$
{빵}의 Support는 $\frac{4}{5}=0.8$ (거래 1,3,4,5에 포함됨)
Confidence는 0.67
따라서 $Lift = \frac{0.67}{0.8} \approx$ 0.84
예제
# 지지도,신뢰도,향상도 개념을 확실히 알기 위해 직접 코드로 재현
## set는 집합을 뜻함
### 합집합(|), 교집합(&), 부분집합(<=)
#### 집합연산은 수학연산자와 같지만 다르게 쓰이고 있음
def calculate_support(itemset, transaction):
count = sum(1 for transaction in transaction if itemset <= transaction)
return count / len(transaction)
def calculate_confidence(X, Y, transactions):
support_X = calculate_support(X, transactions)
support_XY = calculate_support(X | Y, transactions)
return support_XY / support_X if support_X > 0 else 0
def calculate_lift(X, Y, transactions):
confidence_XY = calculate_confidence(X, Y, transactions)
support_Y = calculate_support(Y, transactions)
return confidence_XY / support_Y if support_Y > 0 else 0
transactions = [
{"우유", "빵"}, {"기저귀", "맥주"}, {"빵", "콜라"}, {"우유", "기저귀", "맥주"}, {"맥주", "빵"},
{"우유", "계란"}, {"빵", "콜라", "계란"}, {"우유", "기저귀"}, {"우유", "맥주"}, {"콜라", "맥주"},
{"우유", "맥주", "계란"}, {"빵", "계란"}, {"우유", "콜라"}, {"기저귀", "맥주"}, {"빵", "기저귀", "콜라"},
{"우유", "빵", "맥주"}, {"우유", "콜라", "계란"}, {"맥주", "콜라"}, {"빵", "기저귀"},{"우유", "기저귀", "콜라"} ]
X = {"우유"}
Y = {"빵"}
support = calculate_support(X | Y, transactions)
confidence = calculate_confidence(X,Y, transactions)
lift = calculate_lift(X,Y,transactions)
print(f"Support({X | Y}): {support:.2f}")
print(f"Confidence({X} -> {Y}): {confidence:.2f}")
print(f"Lift({X} -> {Y}): {lift:.2f}")
>>
Support({'빵', '우유'}): 0.10
Confidence({'우유'} -> {'빵'}): 0.20
Lift({'우유'} -> {'빵'}): 0.50
지지도
- 전체 20개의 구매 건수 중 빵과 우유를 동시에 산 구매는 0.1 = 2건 발생했다.
신뢰도
- 우유를 구매한 거래 중 20%의 거래에서는 빵도 구매했다.
향상도
- 우유를 사면 빵을 사는 확률은 우연히 빵을 살 확률보다 50% 더 낮다.
'About Analytics > Analytics Method' 카테고리의 다른 글
| [Recommendation] Similarity (0) | 2025.06.11 |
|---|---|
| [Recommendation] Data Sparsity (0) | 2025.06.11 |
| [Retension Analysis] 리텐션 분석 (0) | 2025.02.28 |
| [A/B Test] 기초 개념 잡기(with Kaggle) (0) | 2024.12.17 |
| [A/B Test] 기본 개념 (0) | 2024.12.17 |