[PYTHON] 연관규칙을 활용한 titanic 생존자 예측

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를 만든다.