# 연관분석 - Run-test
# 연속적인 관측값들이 임의적으로 나타난 것인지 검정

# 귀무가설 : 연속적인 관측값이 임의적이다
# 대립가설 : 연속적인 관측값이 임의적이 아니다(즉, 연관이 있다)

# 22회 기출
import pandas as pd
data = # 배열 형태로 주어짐

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
from statsmodels.sandbox.stats.runs import runstest_1samp
runstest_1samp(test_df['product']) # 시리즈 형태로 들어감

# 유의 수준 0.05 보다 p-value 값이 크므로, 귀무가설 기각하지 못함
# 상품 a와 b의 구매에 연관선이 없다고 결론
# 연관분석(Association analysis)
# If-then인 조건과 반응 형태로 이루어져 있음

# 연관규칙 분석에 사용되는 척도
# 지지도 : 전체 거래 중 항목 A와 항목 B를 동시에 포함하는 거래의 비율
# 신뢰도 : 항목 A를 포함한 거래 중에서 항목 A와 항목 B가 같이 포함될 확률로 연관성의 정도 파악
# 향상도 : A가 구매되지 않았을 때 품목 B의 구매확률에 비해 A가 구매되었을 때 품목 B의 구매확률 증가비
# 서로 관련 없는 경우에는 향상도 값이 1임

# Apriori 알고리즘
# 최소지지도보다 큰 지지도 값을 갖는 품목의 집합을 빈발항목집단이라고 함
# 모든 품목 집합에 대한 지지도를 전부 계산하는 것이 아니라, 최소 지지도 이상의 빈발항목집단을 찾은 후
# 그것들에 대해서만 계산
# apriori 함수에 틀어갈 트랜잭션 데이터를 만드는 함수
# from mlxtend.preprocessing import TransactionEncoder
te = TransactionEncoder()
te_result = te.fit(dataset).transform(dataset)
# 연관규칙분석
df = pd.read_csv('../data/groceries.csv')

# 컬럼이 없어서, 마지막 행에 값 추가
df.loc[9834, 'citrus fuit, semi-finished bread, margarine, ready soups'] = df.columns.values[0]

df_split = df.iloc[:, 0].str.split(',', expand = True)
df_split.values
df_split_ary = df_split.values
list(filter(None, df_split_ary[0]))

groceries = []
for i in range(len(df_split_ary)):
	temp = list(filter(None, df_split_ary[i]))
    groceries.append(temp)
from mlxtend.preprocessing import TransactionEncoder
import pandas as pd

te = TransactionEncoder()
groceries_tr = te.fit(groceries).transform(groceries)
groceries_tr = pd.DataFrame(groceries_tr, columns = te.columns_)

from mlxtend.frequent_patterns import apriori

# 지지도가 5% 이상인 빈번 항목 집합 탐색
groceries_ap = apriori(groceries_tr, min_support = 0.05, use_colnames = True)

from mlxtend.frequent_patterns import association_rules

# 신뢰도가 0.3% 이상인 빈번 항목 집합 탐색
association_rules(groceries_ap, metric = 'confidence', min_threshold = 0.3)
# 여러 기준 충족하는 빈번 항목 집합 탐색
rules = association_rules(groceries_ap, metric = 'lift', min_threshold = 3)
rules['antecedent_len'] = rules['antecedents'].apply(lambda x : len(x))

rules[(rules['antecednet_len'] >= 1) & (rules['confidence'] > 0.4) & (rules['lift'] > 1)]

'ADP > 실기' 카테고리의 다른 글

정상성 검정 및 확인  (1) 2024.01.28
시계열 분해, ARIMA 모델  (1) 2024.01.28
자기조직화지도(Self-Organizing Map, SOM)  (1) 2024.01.28
혼합 분포 군집  (0) 2024.01.28
비계층적 군집분석  (0) 2024.01.28

+ Recent posts