๐ซ์ฌํ๊ด์งํ ๋ถ์ 06-ํจํด๋ถ์1
๐จ ์ ๋ฒ ๊ธ์์๋ ์๊ด๊ด๊ณ ๋ถ์์ ํตํด ๊ฐ attribute๋ค ์ฌ์ด์ ๊ด๊ณ๋ฅผ ์ฐพ์๋ณด์๋ค. ํ์ง๋ง ์๊ด๊ด๊ณ ๋ถ์์ด ์์นํ ๋ณ์์ ์์นํ ๋ณ์ ๊ฐ์ ๊ด๊ณ๋ง์ ์์๋ณด๋ ๋ฐ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ๋ชฐ๋ผ์ ์ฝ๊ฐ ์๋ชป๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค๋ ๊ฒ์ด ๋๋ฌด ์์ฝ๋ค๐ฅ.
๐จ ์ด๋ฒ ๊ธ๋ถํฐ ๋ค์ ๋ช๊ฐ์ง ๊ธ๊น์ง๋ ํจํด๋ถ์์ ํตํด attribute ์ฌ์ด์ ๊ด๊ณ๋ฅผ ์์๋ณผ ์์ ์ด๋ค.
๐ซ 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 ์ด์์ธ ๊ฒฝ์ฐ๋ง ๋ฐํ
- ๐จ ์ฐ๋ฆฌ๊ฐ ์ฐพ๊ณ ์ ํ๋ ๊ฒ์ 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
# 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
๐ ์์ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์น๋ฉด ์ฐ๋ฆฌ๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ฐ์ดํฐ๊ฐ ๋ชจ๋ ๋ฒ์ฃผํ์ผ๋ก ๋ณํ๊ฒ ๋๋ค. ์ด์ ๋ ์ด ๋ฒ์ฃผํ ๋ฐ์ดํฐ๋ฅผ ํธ๋์ญ์
๋ฐ์ดํฐ๋ก ๋ง๋ค์ด์ฃผ๋ฉด ๋๋ค.
# 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