*Run-Test
- 귀무가설: 연속적인 관측값이 임의적이다
- 대립가설: 연속적인 과측값이 임의적이 아니다(즉, 연관이 있다)
import pandas as pd
from statsmodels.sandbox.stats.runs import runstest_1samp
data=['a','a','b','b','a','a','a','a','b','b','b','b','b','a','a','b','b','a','b','b']
test_df = pd.DataFrame(data, columns=['product'])
test_df.loc[test_df['product']=='a', 'product'] = 1
test_df.loc[test_df['product']=='b', 'product'] = 0
print(runstest_1samp(test_df['product'], cutoff=0.5, correction=True))

→ p-value가 0.05보다 크므로 귀무가설을 기각
→ 즉, 상품 a, b 구매에는 연관이 없다!
*이표본 Run 검정 (p.195)
→ 귀무가설: 두 데이터는 같은 분포에서 왔다
*연관규칙분석
→ 효율적인 상품의 진열이나 패키지 상품개발, 교차판매 전략, 기획상품의 결정 등 실제 고객 데이터를 분석하는데 많이 사용되고 있는 알고리즘
- 장바구니분석: 장바구니에 무엇이 같이 들어갈 것인지를 분석
- 서열분석: A를 산 다음에 B를 살 것이다
- 지지도: 전체 거래 중 항목 A와 B를 동시에 포함하는 거래의 비율
→ A, B가 동시에 포함된 거래 수 / 전체 거래 수 - 신뢰도: 항목 A를 포함한 거래 중에서 항목 A와 항목 B가 같이 포함될 확률
→ A, B가 동시에 포함된 거래 수 / A를 포함하는 거래 수 - 향상도: A가 구매되지 않았을 때, B의 구매확률에 비해 A가 구매되었을 때 B의 구매 확률의 증가비
→ A, B가 동시에 포함된 거래 수 / A를 포함하는 거래 수 * B를 포함하는 거래수
*Apriori 알고리즘
– 최소 지지도 이상 빈발항목집합을 찾은 후 그것들에 대해서만 연관규칙 계산
import pandas as pd
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori
dataset = [['Apple', 'Beer', 'Rice', 'Chicken'], ['Apple', 'Beer', 'Rice'], ['Apple', 'Beer'], ['Apple', 'Bananas'], \
['Milk', 'Beer', 'Rice', 'Chicken'], ['Milk', 'Beer', 'Rice'], ['Milk', 'Beer'],['Milk', 'Bananas']]
te = TransactionEncoder()
te_ary = te.fit_transform(dataset)
print(te.columns_)
print(te_ary)

df = pd.DataFrame(te_ary, columns=te.columns_)
print(apriori(df, min_support=0.6, use_colnames=True))
frequent_itemsets = apriori(df, min_support=0.3, use_colnames=True)
frequent_itemsets['length'] = frequent_itemsets['itemsets'].apply(lambda x: len(x))
print(frequent_itemsets)

*groceries 문자열 데이터를 트랜잭션 형태로 만들어서 연관분석 수행
import pandas as pd
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules
pd.set_option('display.max_columns', None)
df = pd.read_csv('data/groceries.csv')
print(df)
df_split = df.iloc[:,0].str.split(',', expand=True)
df_split.values
df_split_ary = df_split.values
groceries = []
for i in range(len(df_split_ary)):
temp = list(filter(None, df_split_ary[i])) # None 값을 지우고, 트랜잭션 형태로 변환
groceries.append(temp)
te = TransactionEncoder()
groceries_tr = te.fit(groceries).transform(groceries)
groceries_tr = pd.DataFrame(groceries_tr, columns=te.columns_)
print(groceries_tr)
groceries_ap = apriori(groceries_tr, min_support=0.05, use_colnames=True)
print(groceries_ap)
print(association_rules(groceries_ap, metric='confidence', min_threshold=0.3)) # 신뢰도가 0.3 이상 빈번항목집합
rules = association_rules(groceries_ap, metric='lift', min_threshold=1)
# 규칙 길이 2 이상, 신뢰도 0.4 이상, 향상도 3 이상인 규칙만 추출하기
rules['antecedent_len'] = rules['antecedents'].apply(lambda x: len(x))
print(rules[(rules['antecedent_len'] >= 2) & (rules['confidence'] >= 0.4) & (rules['lift'] >= 3)])

*지지도가 5% 이상인 빈번항목집합

*association_rules 함수를 사용하여 한눈에 많은 규칙 파악


*규칙 길이 2 이상, 신뢰도 0.4 이상, 향상도 3 이상인 규칙만 추출



→ 이 규칙을 통해 효율적인 상품의 진열이나 패키지 상품 개발, 교차판매 전략 등을 세워 판매 증진에 사용
*FP-growth
→ FP-Growth는 Apriori 알고리즘과 비교해, 중간 결과를 생성하지 않고 메모리를 효율적으로 사용한다는 장점
import pandas as pd
from mlxtend.frequent_patterns import fpgrowth
from mlxtend.frequent_patterns import association_rules
dataset = [['Milk', 'Bread', 'Butter'],
['Beer', 'Bread'],
['Milk', 'Diaper', 'Beer', 'Bread'],
['Milk', 'Bread', 'Butter'],
['Bread', 'Butter'],
['Milk', 'Diaper', 'Beer', 'Cola']]
df = pd.DataFrame(dataset)
from mlxtend.preprocessing import TransactionEncoder
te = TransactionEncoder()
te_ary = te.fit_transform(dataset)
df = pd.DataFrame(te_ary, columns=te.columns_)
frequent_itemsets = fpgrowth(df, min_support=0.5, use_colnames=True)
print(frequent_itemsets)
rules = association_rules(frequent_itemsets, metric="lift", min_threshold=1.0)
print(rules)


- antecedents: 규칙의 선행 항목(조건)
- consequents: 규칙의 후행 항목(결과)
- antecedent support: 선행 항목이 나타나는 비율, Butter는 50%의 거래에서 나타남
- consequent support: 후행 항목이 나타나는 비율, Bread는 83.33%의 거래에서 나타남
- support: 규칙 전체가 거래에서 나타난 비율, Butter → Bread 규칙은 50%의 거래에서 나타남
- confidence: 선행 항목이 나타날 때 후행 항목도 나타날 확률
Butter → Bread의 confidence는 1.0으로, Butter가 포함된 모든 거래에서 Bread가 포함되어 있다는 것을 의미 - lift: 항목들이 독립적일 때에 비해 규칙이 얼마나 더 자주 나타나는지를 나타냄
lift가 1보다 크면, 항목들이 서로 연관되어 있음을 의미 - leverage: 항목들이 독립적일 때 발생할 것으로 예상되는 빈도에서 실제 발생 빈도를 뺀 값
- conviction: 규칙이 얼마나 신뢰할 수 있는지 나타내며, 1보다 클수록 더 의미 있는 규칙
- zhang’s metric: 연관 규칙의 강도를 나타내는 지표로, 0~1 사이의 값, 1에 가까울수록 더 강한 연관성을 나타냄
'데이터 분석 > ADP 자격증 공부' 카테고리의 다른 글
| (파이썬 한권으로 끝내기) 모의고사 제1회 소스코드, 샘플 데이터 (0) | 2026.04.06 |
|---|---|
| (파이썬 한권으로 끝내기) 시계열분석 (0) | 2026.04.06 |
| (파이썬 한권으로 끝내기) 군집분석 (0) | 2026.04.05 |
| (파이썬 한권으로 끝내기) 상관계수, 선형 회귀분석, 다중 회귀, 다중공선성, 변수선택법(전진선택법, 후진제거법, 단계선택법) (0) | 2026.04.05 |
| [ADP 필기] 비정형 데이터마이닝 – 텍스트마이닝, 사회연결망 분석 (0) | 2026.04.05 |