๐งฉ ๋ฐ์ดํฐ๋ง์ด๋(26) ํจํด๋ถ์_6 : Support/Confidence/Lift(1)
๐งฉ ์ ๋ฒ ํฌ์คํ
์ดํ ๊ฑฐ์ 20์ผ ๋ง์ ํฌ์คํ
์ด๋ค. ์ด๋ ๊ฒ ๊ณต๋ฐฑ์ด ๊ธธ์๋ ์ด์ ์๋ ๋ญ ์ถ์ ์ฐํด๋ค ๊ฐ๊ฐ ์์ฆ์ด๋ค ์๋ฐ ์ด์ ๊ฐ ์์ง๋ง, ๊ฐ์ฅ ํฐ ์ด์ ๋ ๋ด๊ฐ ์ ๋ง ํ๊ณ ์ถ์ ๊ฒ ๋ฌด์์ผ์ง ์๊ฐํ๋ ์๊ฐ์ ๊ฐ์ ธ๋ณด์๊ธฐ ๋๋ฌธ์ด๋ค๐ฅ. ์ง๋ ํ๊ธฐ์ ๋ฐ์ด์ค๋ฉ๋์ปฌ์ ๊ด๋ จ๋ ์ธ๊ณต์ง๋ฅ ์์
๊ณผ ๋ฐ์ดํฐ๋ง์ด๋ ์์
์ ๋ค์ผ๋ฉด์ ์ ๊ณต์ ์ด๋ฆฌ๋ ค๋ฉด ๋ํ์์ ๊ผญ ๊ฐ์ผ๊ฒ ๊ตฌ๋ ์๊ฐํ๋ฉฐ ์ฌ๋ฆ ๋ฐฉํ์ ๋ง์๊ณ , ์ด๋ฒ ํ๊ธฐ ์ด๋ง ํด๋ ๋ญ๋๊น, ๋ํ์์ ํ์๋ค ํ๋ ์๊ฐ๋ง์ ๊ฐ์ง๊ณ ์์๋ค. ๋ง์นจ 3ํ๋
2ํ๊ธฐ์ด๊ณ , ๋๋ถ๋ถ์ ๋๊ธฐ๋ค์ด ์ด๋ง๋์ฏค ์์ ์ด ๊ฐ๊ณ ์ถ์ ๋ํ์ ์ฐ๊ตฌ์ค์ ์ฐพ์ผ๋ฉด ์ข๋ค๋ ์กฐ์ธ์ ํด์ฃผ์๊ธฐ์ ๋๋ ์์ฐ์ค๋ฝ๊ฒ ์ด๋ฐ์ ๋ฐ ๊ณณ์ ์ฐพ์๋ณด๊ณ ์์๋ ๊ฒ ๊ฐ๋ค. ๊ทธ๋ฐ๋ฐ ๋ญ๋๊น, ๋ด๊ฐ ํ๊ณ ์ถ์ ๊ฒ์ ์๋ฃ ๋ฐ์ดํฐ์์ ์ด๋ ํ ์ธ์ฌ์ดํธ๋ฅผ ๋ฝ์์ ํ์ ํน์ ๋์ผ ์ง๋ณ ๋ณด์ ์๋ค์๊ฒ ์ ์ฉํ๋ ๊ฒ์ด์๋๋ฐ ์ ์ด์ ๊ทธ์ ๊ด๋ จ๋ ์ฐ๊ตฌ์ค์ด ์ ๊ธฐ๋ ํ๊ณ ๊ทธ ์ฃผ์ ๋ฅผ ์ฃผ๋ก ์ก๊ณ ์ฐ๊ตฌ๋ฅผ ์ํํ๋ ๊ฒฝ์ฐ๊ฐ ๋๋ฌผ์๋ ๊ฒ ๊ฐ๋ค.
๐งฉ ์์ ์ธ๊ธํ๋๋ก ๋ด๊ฐ ํ๊ณ ์ถ์ ๊ฒ์ ๋ฐ์ดํฐ ๋ถ์๊ณผ ์๊ฐํ๋ฅผ ํตํ ์ธ์ฌ์ดํธ ๋์ถ์ด์๊ธฐ ๋๋ฌธ์, ๊ทธ๋ฅ ๋จ์ํ ๊ตฌ๊ธ์ ๋ฐ์ดํฐ ๋ถ์ ์ด๋ผ๊ณ ๊ฒ์ํ๋ ๊ฒ ๊ฐ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๊ฒ์ ๊ฒฐ๊ณผ๊ฐ ๋๋ฆ ์์ผ๋ก์ ๋์ ์ง๋ก๋ฅผ ์ ํด์ค ๊ฒ์์ด ๋์๋ค. ๊ทธ ๊ฒ์์ผ๋ก๋ถํฐ ๋๋ DA(Data Analyst) ์ BA(Business Analyst) ๋ผ๋ ์ง๋ฌด๋ฅผ ์ ์ ์์๊ณ , ์์ธ๋ก ๋ด๊ฐ ํ๋ถ์์ ๋ฐฐ์ด ํ์ด์ฌ, R, ํต๊ณํ, ๋ฐ์ดํฐ๋ง์ด๋ ๋ฑ์ด ๋ง์ ๋ถ๋ถ์ ์ปค๋ฒํ๋ ๋๋ฉ์ธ์์ ์ ์ ์์๋ค. ๋ฌผ๋ก SQL๊ณผ ์ถ๊ฐ์ ์ธ BI ํด์ ๋ค๋ฃฐ ์ค์ ์์์ผ๊ฒ ์ง๋ง, ์ด์ฉ๋ฉด ์ง๊ธ์ ๋์๊ฒ๋ ๋๋ ์์ด ํฅ๋ฏธ๋ก์ด ์ง๋ฌด๋ผ๊ณ ์๊ฐํ๋ค. ๊ทธ๋์ ์ด๋ ๊ฒ ์ง๋ก๋ฅผ ์ ํ ์ดํ ๋ฉฐ์น ๊ฐ ์ธํฐ๋ท์ ๋ค์ง๋ฉฐ ๋ฐ์ดํฐ ๋ถ์๊ฐ๊ฐ ๋๊ธฐ ์ํ ์ค๋น์ฌํญ์ ์ฐพ์๋ค๋๋๋ผ ๋ฐ๋นด๋ค๐๐.
๐งฉ ์๋ฐ ์ด์ ๋ก ํฌ์คํ
๊ณต๋ฐฑ๊ธฐ๊ฐ ์๋นํ ๋ฆ์ด์ก๋ค. ์์ผ๋ก์ ํฌ์คํ
์ ๋ฐ์ด์ค์ ๊ด๋ จ๋ ๋ถ์ผ๋ณด๋ค๋ SQL์ด๋ ์์ ๋ฐ์ดํฐ ๋ถ์๐์ ๋ํ ๋ด์ฉ์ด ๋ง์์ง ์์ ์ด๊ธฐ ๋๋ฌธ์, ์๋ง๋ ์กฐ๊ธ์ ์ค๋น์๊ฐ์ ๊ฑฐ์น ์ดํ์ ์๋ค๋ค๋ฅ ๐โโ๏ธ๐โโ๏ธ๐โโ๏ธ ํฌ์คํ
ํ ๊ฒ ๊ฐ๋ค. ๊ทธ๋๋ ๊ณต๋ถํ๋ฉด์ ํํ์ด ๋ฐ์ดํฐ๋ง์ด๋ ๊ด๋ จ ๊ธ์ ์กฐ๊ธ์ ์ฌ๋ฆด ์๊ฐ์ด๋ค๐.
๐งฉ ๋ป๊ธ์ด ๊ธธ์ด์ก๋ค!! ์ด๋ฒ ํฌ์คํ
์์๋ ์ ๋ฒ ํ๊ธฐ์ ์ํํ ํ๋ก์ ํธ์์ support, confidence, lift๋ฅผ ํตํด ํจํด์ ๋ถ์ํ๋ ์ฒซ๋ฒ์งธ ์๊ฐ์ ๊ฐ์ง ๊ฒ์ด๋ค. ๋จผ์ , ์๋ ์๋ ์๋ณธ ๋ฐ์ดํฐ๋ก๋ถํฐ ๋ฒ์ฃผํ ๋ฐ์ดํฐ์ ํธ๋์ญ์
๋ฐ์ดํฐ๋ฅผ ๋ง๋๋ ๊ณผ์ ์ ์ดํด๋ณด์.
1. support / confidence / lift ์ด๋ก ์ ๋ฐฐ๊ฒฝ
- ๐ Support
- ์ง์ง๋
- x์ y๋ฅผ ๋์์ ํฌํจํ๋ ๋น์จ
- ์ ๋ขฐ๋(Confidence)๋ฅผ ์ง์งํ๋ ์ฒ๋
- confidence์ ์ํ ๊ท์น์ด ์ง์ง๋ฐ๊ธฐ ์ํด์๋ support ๊ฐ์ด ๋์์ผ ํจ.
- ๐ Confidence
- ์ ๋ขฐ๋
- x๋ฅผ ํฌํจํ๋ ๊ฑฐ๋ ๋ด์ญ ์ค, y๊ฐ ํฌํจ๋ ๋น์จ
- ๊ท์น์ ์ ๋ขฐ๋์ ๋ํ ์ฒ๋
- P(Y|X)
- ๐ Lift
- ์ ๋ขฐ๋์ ๊ฒฐ๊ณผ๊ฐ 0.9๋ผ๊ณ ๊ฐ์ ํ์์ ๋ p(Y)๊ฐ 0.9๋ฉด x,y๊ฐ ์๋ก ๋ ๋ฆฝ์ด ๋๊ธฐ ๋๋ฌธ์ x๋ y๋ฅผ ์ค๋ช ํ๋ ๋ฐ์ ์๋ฌด๋ฐ ๋์์ ์ค์ ์์
- ๊ท์น์ด ์ง์ง ์๋ฏธ๊ฐ ์๋์ง ํ์ธํ๊ธฐ ์ํ ์ฒ๋
- P(Y|X) / P(Y)
- Lift = 1 : x์ y๋ ์๋ฌด ๊ด๊ณ๊ฐ ์์. ๋ ๋ฆฝ.
- Lift > 1 : x๊ฐ y์ ๋ฐ์ ์ฆ๊ฐ๋ฅผ ์์ธกํ๋ ๋ฐ์ ๋์์ด ๋จ. (์์ ์๊ด๊ด๊ณ).
- Lift < 1 : x๊ฐ y์ ๋ฐ์ ๊ฐ์๋ฅผ ์์ธกํ๋ ๋ฐ์ ๋์์ด ๋จ. (์์ ์๊ด๊ด๊ณ).
2. Preprocessing
๐ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ฐ์ดํฐ๋ ๋ฒ์ฃผํ ์๋ฃ์ ์์นํ ์๋ฃ๊ฐ ์ด๊ฒ์ ๊ฒ ์์ฌ์๋ค. ํจํด ๋ถ์์ ํตํด ๊ท์น์ ์ฐพ๊ธฐ ์ํด์๋ ๋ฐ์ดํฐ๊ฐ ํธ๋์ญ์
๋ฐ์ดํฐ, ์ฆ Boolean ํํ๋ก ๊ตฌ์ฑ๋ ๋ฐ์ดํฐ์ฌ๋ง ํ๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ๊ฐ attribute๋ค์ ์ผ์ ํ ๊ธฐ์ค์ ๊ฐ์ง๊ณ ๋ชจ๋ ๋ฒ์ฃผํ ํ ๋ค, ์ต์ข
์ ์ผ๋ก ์ด๋ ๊ฒ ๋ฒ์ฃผํ๋ ๋ฐ์ดํฐ๋ฅผ Boolean ํํํ์ผ๋ก ๋ฐ๊ฟ ํธ๋์ญ์
๋ฐ์ดํฐ๋ฅผ ๊ตฌํ ๊ฒ์ด๋ค.
- ๐ Support, Confidence ๊ณ์ฐ์ ์ํด ๋ฐ์ดํฐ๋ฅผ transaction table ํํ๋ก ๋ณ๊ฒฝ
- pre_tran : ๊ฐ attribute์ binary ๊ฐ์ category ํํ๋ก ๋ฐ๊พผ dataframe ์์ฑ
- transaction : mlxtend ๋ฉ์๋์ transform ํจ์๋ฅผ ์ฌ์ฉํ์ฌ boolean dataframe ์์ฑ
- ๐ Support, Confidence ๊ณ์ฐ
- mlxtend.frequent_patterns ๋ชจ๋์ apriori, association_rules ํจ์
- apriori() : itemsets ๊ฐ์ Support๋ฅผ ๊ณ์ฐํ์ฌ dataframe์ผ๋ก ๋ฐํ
- ์ค์ ํ min_support๋ฅผ ๋ง์กฑํ๋ ๊ฒฝ์ฐ๋ง ๋ฐํ
- association_rules() ํจ์์ metric, min_threshold ์ต์
- ์ค์ ํ metric์ด min_threshold ์ด์์ธ ๊ฒฝ์ฐ๋ง ๋ฐํ
- ์ค์ ํ metric์ด min_threshold ์ด์์ธ ๊ฒฝ์ฐ๋ง ๋ฐํ
- ๐ ์ฐ๋ฆฌ๊ฐ ์ฐพ๊ณ ์ ํ๋ ๊ฒ์ cardio์ ์ํฅ์ ๋ฏธ์น๋ attribute ๊ฐ์ ์ธ๊ณผ๊ด๊ณ์ด๊ธฐ ๋๋ฌธ์ cardio๋ฅผ consequents๋ก ํ๋ ๊ฒฝ์ฐ๋ฅผ ์ฃผ๋ก ์ดํด๋ณผ ์์ ์
- confidence, Lift, support ์์๋ก ์ฐ์ ์์๋ฅผ ์ค์
- min_confidence = 0.6 / Lift > 1 / min_support = 0.01
- support๋ฅผ ๋ฎ๊ฒ ์ค์ ํ ์ด์ ๋ confidence์ Lift๋ฅผ ๋ง์กฑํ๋ ๊ฒฝ์ฐ์ antecedents์ support๊ฐ ๋๋ฌด ์์ ์ ์ฒด์ ์ธ support๊ฐ ๋ฎ๊ฒ ๋์ค๋ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํ ๊ฒ์ด๋ค.
3. Code
๐ฉ 3.1. Categorical Data Code
# BMI attribute๋ฅผ ์ํ categorize ํจ์ ์์ฑ
# BMI < 18.5 : ์ ์ฒด์ค
# 18.5 =< BMI < 25 : ์ ์
# 25 =< BMI < 30 : ๊ณผ์ฒด์ค
# 30 =< BMI < 39.9 : ๋น๋ง
# 39.9 =< BMI : ๊ณ ๋๋น๋งS
def bmi(x):
if x < 18.5:
x = 'LOW'
elif (x >= 18.5) & (x<25):
x = 'NORMAL'
elif (x >= 25) & (x < 30):
x = 'OVER'
elif (x >= 30) & (x < 39.9):
x = 'OBESITY'
else:
x = 'HIGH_OBESITY'
return x
# cardio ๋ฐ์ดํฐ ๋ฒ์ฃผํ
pre_tran = cardio.copy()
# gender : 1 2
pre_tran = pre_tran.replace({'gender':1},'Women')
pre_tran = pre_tran.replace({'gender':2},'Men')
# cholesterol : 1 2 3
pre_tran = pre_tran.replace({'cholesterol':1},'Normal_cho')
pre_tran = pre_tran.replace({'cholesterol':2},'Above_Normal_cho')
pre_tran = pre_tran.replace({'cholesterol':3},'Well_Above_Normal_cho')
# gluc : 1 2 3
pre_tran = pre_tran.replace({'gluc':1},'Normal_gluc')
pre_tran = pre_tran.replace({'gluc':2},'Above_Normal_gluc')
pre_tran = pre_tran.replace({'gluc':3},'Well_Above_Normal_gluc')
# smoke : 0 1
pre_tran = pre_tran.replace({'smoke':0},'No_Smoke')
pre_tran = pre_tran.replace({'smoke':1},'Smoke')
# alco : 0 1
pre_tran = pre_tran.replace({'alco':0},'No_Alcohol')
pre_tran = pre_tran.replace({'alco':1},'Alcohol')
# active : 0 1
pre_tran = pre_tran.replace({'active':0},'No_Active')
pre_tran = pre_tran.replace({'active':1},'Active')
# cardio : 0 1, target
pre_tran = pre_tran.replace({'cardio':0},'No_cardio')
pre_tran = pre_tran.replace({'cardio':1},'Cardio')
# ap_hi๊ฐ 140์ด์์ด๋ฉด HBP_SYS(๊ณ ํ์), ๊ทธ ์ธ์๋ NBP_SYS(์ ์)
# ap_lork 90 ์ด์์ด๋ฉด HBP_DIAS(๊ณ ํ์), ๊ทธ ์ธ์๋ NBP_DIAS(์ ์)
pre_tran["ap_hi"] = np.where(pre_tran["ap_hi"] >=140, 'HBP_SYS', 'NBP_SYS')
pre_tran["ap_lo"] = np.where(pre_tran["ap_lo"] >=90, 'HBP_DIAS', 'NBP_DIAS')
# age : ์ฐ๋ น๋๋ก ๋ถ๋ฅ
pre_tran.loc[pre_tran['age'] // 10 == 3, 'age'] = 30
pre_tran.loc[pre_tran['age'] // 10 == 4, 'age'] = 40
pre_tran.loc[pre_tran['age'] // 10 == 5, 'age'] = 50
pre_tran.loc[pre_tran['age'] // 10 == 6, 'age'] = 60
# BMI : ์์ ์์ฑํ BMI ํจ์ ์ฌ์ฉ
pre_tran['BMI'] = pre_tran['BMI'].apply(bmi)
print('row : ', len(pre_tran))
print('columns : ', len(pre_tran.columns))
pre_tran.head()
>>
row : 64500
columns : 11
๐ ์์ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์น๋ฉด ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ฐ์ดํฐ๊ฐ ๋ชจ๋ ๋ฒ์ฃผํ์ผ๋ก ๋ณํ๊ฒ ๋๋ค. ์ด์ ๋ ์ด ๋ฒ์ฃผํ ๋ฐ์ดํฐ๋ฅผ ํธ๋์ญ์
๋ฐ์ดํฐ๋ก ๋ง๋ค์ด์ฃผ๋ฉด ๋๋ค.
๐ฉ 3.2. Transaction Data Code
# transaction table ์์ฑ
# mlxtend.preprocessing ๋ชจ๋์ TransactionEncoder ์ํฌํธ
from mlxtend.preprocessing import TransactionEncoder
# transaction ๋ฐ์ดํฐ ์์ฑ
# ๋ฒ์ฃผํ ๋ฐ์ดํฐ๋ฅผ mlxtend ๋ฉ์๋์ transform ํจ์์ ๋ฃ๊ธฐ ์ํด listํํ๋ก ๋ณํ : trans_data
trans_data = np.array(pre_tran)
trans_data = np.array(trans_data.tolist())
# transform() ํจ์๋ก trans_data๊ฐ one-hot encoding ๋ ํํ์ boolean list๋ฅผ te_ary๋ก ๋ฐ์
# te_ary๋ฅผ ๋ฐ์ดํฐํ๋ ์ ํํ๋ก ๋ณํํ์ฌ transaction data ์์ฑ
# transaction : attribute์ ๊ฐ category์ ๋ํ value๋ฅผ column์ผ๋ก ๋ฐ์
te = TransactionEncoder()
te_ary = te.fit(trans_data).transform(trans_data)
transaction = pd.DataFrame(te_ary, columns=te.columns_)
transaction
๐ฅ ์ด์ ์ฌ์ง์ด ์ ์๋ณด์ธ๋ค,,, ํ๋ฒ์ ์ต๋ํ ๋ง์ attribute๋ฅผ ๋ณด์ฌ์ฃผ๊ณ ์ถ์ด์ ์บก์ฒ๋ฅผ ์ ๋ ๊ฒ ๋ด๋๋ฐ ์์ฝ๋ค. ํน์ ๋ ์์ธํ ๋ณด๊ณ ์ถ์ผ์ ๋ถ๋ค์ ์ฌ์ง์ ํ๋ฒ๋ง ๋ ํด๋ฆญํด์ฃผ์๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค!!
๐ ๋๋์ด ์ํ๋ ํํ์ ํธ๋์ญ์
๋ฐ์ดํฐ๋ฅผ ๋ง๋ค์๋ค. ์ด์ ๋ถํฐ๋ ์ด๋ ๊ฒ ๋ง๋ค์ด์ง ๋ฐ์ดํฐํ๋ ์์ ๋ํ ํจํด์ ๋ถ์ํด์ ๊ฐ์ด ๋์ค๋ ์น๊ตฌ๋ค์ด ๋ฌด์์ด ์๋์ง, ๊ทธ ์์น๋ ์ด๋ ํ์ง์ ๋ํด์ ๋ถ์ํ๋ฉด ๋๋ค.
๐ ๋ฐ์ดํฐ์์ ๊ทธ ์๊ด๊ด๊ณ๋ฅผ ๋ฝ์๋ด์ ์ฌ์ฉํ๋ ๊ฒ ์ญ์ ์ค์ํ์ง๋ง, ์ด๋ฅผ ์ํด์ ์ ์ฒ๋ฆฌ ๋จ๊ณ๋ฅผ ์งํํ๋ฉด์ ๋ฐ์ดํฐ ๋ถ์์ ๋ํ ์ข ๋ ๋์ ์์ผ๋ฅผ ๊ฐ์ง๊ฒ ๋์๋ ๊ฒ ๊ฐ๋ค. ์์
์๊ฐ์ ๋ฐฐ์ด ์ด๋ก ๋ง์ ๋ฐํ์ผ๋ก ์ ๋ง ๋ง์ ์ฝ์ง์ ํ๋ฉด์ ๋ฐฐ์ด ๋ฐฉ๋ฒ๋ค์ด๊ธฐ ๋๋ฌธ์, ์๋ง ๋๊ณ ๋๊ณ ์๊ฐ๋์ง ์์๊น ์ถ๋ค๐๐.
๐ ๋ค์ ๊ธ์์๋ ํธ๋์ญ์
๋ฐ์ดํฐ์์ support, confidence, lift๋ฅผ ๊ตฌํ๊ณ ์๊ฐํํ๋ ๋ถ๋ถ์ ๋ค๋ฃฐ ๊ฒ์ด๋ค.
Leave a comment