2023. 10. 5. 19:40ㆍ카테고리 없음
from apyori import apriori
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
apriori를 활용한 연관규칙을 위해 apyori를, titanic dataset을 활용하기 위해 seborn을 불러온다.
dataset = [['사과','치즈','생수'],
['생수', '호두','고등어'],
['수박', '사과', '치즈'],
['생수', '호두', '치즈','옥수수','사과']]
해당 데이터를 연관규칙 분석하는 실습을 해보자.
association_rules = apriori(dataset, min_support = 0.5, min_confidence = 0.8)
association_rules = list(association_rules)
for association_rule in association_rules:
print(association_rule)
print('---------------')
해당 코드대로 apriori 연관 규칙을 사용하고 결과를 출력하면
이렇게 된다. 여기서 각 association_rules에는 RelationRecord 객체가 있다. RelationRecord 객체에는 items, support, ordered_statistics가 저장되어 있다. items는 해당 규칙에 포함된 항목들, support는 지지도를 뜻한다. 마지막 데이터인 ordered_statistics에는 해당 규칙에 대한 confidence와 lift가 저장되어 있다.
rules = []
for results in association_results:
supp = results.support
for orders in results.ordered_statistics:
conf = orders.confidence
lift = orders.lift
hypo = orders.items_base
conc = orders.items_add
rules.append([hypo, conc, supp, conf, lift])
for rule in rules:
print(rule[0], '->', rule[1])
print('supprot = ' + str(rule[2]))
print('confidence = ' +str(rule[3]))
print('lift = ' + str(rule[4]))
print()
조금 더 직관적으로 확인하기 위해 각 객체들을 활용해 쉽게 볼 수 있도록 출력한다.
이를 활용해 타이타닉 데이터를 불러와 연관규칙을 적용하고 그 내용을 scatter를 활용해 시각화해 보자.
연관규칙을 적용한 타이타닉 생존자 예측
df = sns.load_dataset('titanic')
df
seborn 라이브러리를 활용해 타이타닉 데이터셋을 불러온다.
df = df[['class', 'sex', 'age', 'alive']]
df=df.dropna(axis=0)
df
사용할 컬럼들만 가져오고 결측치 또한 제거해 준다.
child_idx = df.age < 20
adult_idx = (df.age >= 20) & (df.age < 60)
old_idx = df.age >= 60
df = df.astype({'age':'str'})
df.loc[child_idx, 'age'] = 'child'
df.loc[adult_idx, 'age'] = 'adult'
df.loc[old_idx, 'age'] = 'old'
df
분석을 위해 alive데이터를 범주형 데이터로 만들어 준다.
records = []
for i in range(len(df)):
records.append([str(df.values[i,j]) for j in range(len(df.columns))])
records
장바구니 분석을 위해선 처음에 했던 예제처럼 리스트 형태로 정리가 되어 있어야 하기에 데이터프레임의 데이터들을 리스트 형태로 만들어준다.
association_rules = apriori(records, min_support = 0.005, min_confidence = 0.8)
association_results = list(association_rules)
association_results
최소 신뢰도 0.8, 최소 지지도 0.005로 적용한 연관규칙들을 생성한다.
for results in association_results:
supp = results.support
for orders in results.ordered_statistics:
if(orders.items_add in [{'yes'},{'no'}]):
conf = orders.confidence
lift = orders.lift
hypo = orders.items_base
conc = orders.items_add
rules.append([hypo, conc, supp, conf, lift])
for rule in rules:
print(rule[0], '->', rule[1])
print('supprot = ' + str(rule[2]))
print('confidence = ' +str(rule[3]))
print('lift = ' + str(rule[4]))
print()
다시 보기좋게 출력해서 확인해 보자.
labels = ['hypothesis', 'conclusion', 'support', 'confidence', 'lift']
rules_df = pd.DataFrame.from_records(rules, columns = labels)
rules_df_sort = rules_df.sort_values(['lift'], ascending = False)
rules_df_sort = rules_df_sort.reset_index(drop=True)
print(rules_df_sort)
만들어 낸 규칙들을 분석 및 시각화의 편의를 위해 다시 데이터프레임 형태로 만들어 준다.
fig, ax = plt.subplots(figsize=(7,4))
scatter = ax.scatter(rules_df_sort['support'], rules_df_sort['confidence'],
s=50, c=rules_df_sort['lift'], cmap='rainbow')
ax.set_xlabel('support')
ax.set_ylabel('confidence')
plt.colorbar(scatter)
plt.show()
pyplot을 활용해 지지도를 x축, 신뢰도를 y축, lift를 색으로 표현하는 scatter를 만든다.