๐งฉ ๋ฐ์ดํฐ๋ง์ด๋(29) ํจํด๋ถ์_9 : Null Invariant Measure(2)
๐ ์ ๋ฒ ๊ธ์ ์ด์ด ์ฌ๋ฌ ๊ฐ์ง Null invariant measure๋ค์ ํตํด attribute ๊ฐ์ ๊ด๊ณ๋ฅผ ์์๋ณด๋๋ก ํ์.
1. Null Invariant Measure ๋ฐ์ดํฐํ๋ ์ ์์ฑ
๐ chi-square, p-value ๊ณ์ฐ
# chi-square ๊ณ์ฐ(transaction dataframe ๊ธฐ์ค : ๊ฐ attribute์ category)
# scipy.stats์ chi2_contingency๋ฅผ ํตํด์ contingency table ์์ฑ.
# contingency table์ ๋ฐํ์ผ๋ก chi-square์ p-value ๊ณ์ฐ.
chi_list = pd.DataFrame()
from scipy.stats import chi2_contingency
for i in range(len(transaction.columns)):
f=transaction.columns[i]
contigency = pd.crosstab(transaction[f],transaction['Cardio'])
chi, p, dof, expected = chi2_contingency(contigency)
chi_list = chi_list.append((pd.DataFrame({'chi' :chi, 'p-value':p}, index = [transaction.columns[i]+" & cardio"])))
๐ support ๊ณ์ฐ
# support ๊ณ์ฐ ํจ์
# transaction data์ item์ parameter๋ก ๋ฐ์
# item์ด list ํํ๋ฉด ๊ทธ๋๋ก item์ ๋ฐํํ๋ฉฐ, list๊ฐ ์๋๋ฉด list ํํ๋ก ๋ฐ๊ฟ์ items_list๋ก ๋ฐํํจ - sum()์ฐ์ฐ
# transaction data์์ item_list์ attribute๋ฅผ ๋ฐ์ column๊ธฐ์ค sum ์ฐ์ฐ ์ํ.
# ๋ณ์ a : ์์ sum ์ฐ์ฐ๊ฒฐ๊ณผ๊ฐ items_list์ ๊ธธ์ด์ ๊ฐ์ row์ ๊ฐ์, ์ฆ ํด๋นํ๋ items_list์ ์์๋ฅผ ๋ชจ๋ ๊ฐ์ง๊ณ ์๋ row์ ๊ฐ์๋ฅผ sum()
# ์ด๋ฅผ ์ ์ฒด transaction ์(๋ณ์ b)๋ก ๋๋ ์ ํด๋น item ์งํฉ์ด ๋ฐ์ํ ํ๋ฅ ์ ๊ตฌํจ.
def support(transaction, item):
items_list = item if isinstance(item,list) else list(item)
a = np.sum(transaction.loc[:,items_list].sum(axis=1)==len(items_list))
b = transaction.loc[:,items_list].shape[0]
return a/b
๐ Jaccard, Kulczynski, IR ๊ณ์ฐ
# ์์์ ๋ง๋ support ํจ์๋ฅผ ์ฌ์ฉํด์ ์งํฉ X, ์งํฉ Y, ๊ต์งํฉ์ support๋ฅผ ๊ตฌํด์ metric ๊ณต์์ ๋์
.
# ์ป์ ๊ฒฐ๊ณผ๊ฐ์ dataframeํํ๋ก ๋ณํ
Null_inv = pd.DataFrame()
for i in range(len(transaction.columns)):
rslt01 = support(transaction, [transaction.columns[i]])
rslt02 = support(transaction, ['Cardio'])
rslt03 = support(transaction, (transaction.columns[i],'Cardio'))
jacc = rslt03 / (rslt01+rslt02-rslt03)
kulc = (0.5)*((rslt03/rslt01) + (rslt03/rslt02))
ir = abs((rslt01 - rslt02)) / (rslt01+rslt02-rslt03)
Null_inv = Null_inv.append((pd.DataFrame({'Jaccard' :jacc, 'kulczynski' :kulc, 'IR' : ir}, index = [transaction.columns[i]+" & cardio"])))
๐ ๋ฐ์ดํฐํ๋ ์ ์์ฑ
# chi-square์ p-value, jaccard, kulczynski, IR์ ํ๋์ ๋ฐ์ดํฐํ๋ ์์ผ๋ก ํตํฉ - Null_inv
Null_inv = pd.merge(Null_inv, chi_list, how = 'outer', left_index=True, right_index=True)
Null_inv = Null_inv.drop(['Cardio & cardio', 'No_cardio & cardio'], axis = 0)
# kulczynski๋ฅผ ๊ธฐ์ค์ผ๋ก ํฐ ์์๋ถํฐ ๋์ด
Null_inv = Null_inv.sort_values('kulczynski', ascending = False)
Null_inv
๐ ์ด๋ ๊ฒ ํด์ ์ต์ข
๊ฐ๋ค์ ๋ชจ๋ ๊ตฌํ๋๋ฐ, ์ซ์๋ ๋๋ฌด ๋ณต์กํ๊ณ ๊ทธ ํฌ๊ธฐ๋ฅผ ๋น๊ตํ๊ธฐ๋ ํ๋ค๋ค. ๋ฐ๋ผ์ ์ด ์ค์์ ๊ฐ์ฅ ๋ฐ์ดํฐ๋ฅผ ์ ํํํ๊ธฐ๋ก ์๋ ค์ง kulczynski์ IR์ ์๊ฐํํด์ attribute ๊ฐ์ ๊ด๊ณ๋ฅผ ๋ถ์ํ ๊ฒ์ด๋ค.
2. ์๊ฐํ
# ์๊ฐํ๋ฅผ ์ํ plotly library ์ํฌํธ
import plotly.graph_objects as go
import plotly.offline as pyo
pyo.init_notebook_mode()
# Transaction Data์ Attribute-Cardio ๋ณ Kulczynski / IR ๊ฐ ์๊ฐํ
fig = go.Figure()
fig.add_trace(
go.Scatter(
x = Null_inv.index, y = Null_inv['IR'], mode = 'markers+lines+text', name = 'IR'))
fig.add_trace(
go.Scatter(
x = Null_inv.index, y = Null_inv['kulczynski'], mode = 'markers+lines+text', name = 'Kulczynski'))
fig.update_layout(
{
'title' : {'text':'Attribute-Cardio ๋ณ Kulczynski / IR ๊ฐ', 'font':{'size' : 25}},
'template' : 'plotly_white'
})
fig.add_hline(y=0.5, line_dash="dot",
line_color = "#ff0000",
annotation_text="Kulczynski = 0.5",
annotation_position="bottom right",
annotation_font_size=17,
annotation_font_color="black"
)
fig.show()
3. Null-Invariant Measures ๊ฒฐ๊ณผ
- kulczynski, IR, chi-square ๊ฐ์ผ๋ก ๋ช๊ฐ์ง ์ ์ถ๊ฐ ๊ฐ๋ฅํ๋ค.
- (1) 30 & cardio : kulczynski = 0.109444, IR = 0.980692, chi-square = 111.024261 ์ด๋ฏ๋ก ๋์ ๊ด๊ณ๋ negativeํ๋ฉฐ, ๋ ์งํฉ์ ๋ถํฌ๊ฐ imbalanced ํ๋ค.
- (2) HBP_SYS & cardio : kulczynski = 0.640039, IR = 0.431196, chi-square = 10586.494635 ์ด๋ฏ๋ก ๋์ ๊ด๊ณ๋ positiveํ๊ณ , ๋ ์งํฉ์ ๋ถํฌ ์ญ์ ์ด๋์ ๋ ๊ณ ๋ฅด๋ค.
- kulczynski์ ๊ฒฐ๊ณผ๊ฐ 0.5๋ฅผ ๊ธฐ์ค์ผ๋ก ๋๋๊ณ , ๊ทธ์ ๋ฐ๋ฅธ IR๋ก๋ถํฐ ๋ช๊ฐ์ง ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
- ์ด๋ IR์ ๊ฐ์ด ํ๋์ categroy๊ฐ ๊ฐ์ง๋ ๊ฐ์ ๋ํด์ ๋ค์ํ๊ฒ ๋์ค๊ณ ์์ผ๋ฏ๋ก, ์งํฉ๋ค ์ฌ์ด์ ๋ถํฌ๊ฐ ๊ณ ๋ฅด์ง ์์ ๊ฒฝ์ฐ๊ฐ ๋ง์์ ์ ์ ์์.
- ๋ฐ๋ผ์ ์ ์ฒด ๋ฐ์ดํฐ ํฌ๊ธฐ์ ๋ํ ๋ถํฌ์ ์ํฅ(e.x. BMI -> HIGH_OBESITY)์ ๋ฐฐ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ kulczynski์ IR ๊ฐ๋ง์ผ๋ก attribute๋ฅผ ์ ํํ๋ ๊ฒ์ ์ด๋ ค์.
- ๊ทธ๋ผ์๋ ์ผ๋จ kulczynski์ IR ๊ฐ์ผ๋ก ์ ํํ attribute๋ ๋ค์๊ณผ ๊ฐ์.
- [ap_hi, ap_lo, gluc, gender, active, age, cholesterol]
- ์ ์ฒด์ ์ผ๋ก ํฐ chi-square๊ฐ์ ๋ณด์ด๋, ๊ทธ์ ๋นํด ์์ ๊ฒฐ๊ณผ๋ฅผ ๋ํ๋ด๋ attribute๋ฅผ ์ ์ธํ๋ฉด ๋จ์ attribute๋ ์๋์ ๊ฐ์.
- [age, ap_hi, ap_lo, cholesterol, gluc, active, BMI]
- [age, ap_hi, ap_lo, cholesterol, gluc, active, BMI]
๐ ์ด๋ ๊ฒ ํด์ Null-invariant measure๋ฅผ ํตํด ๋ฐ์ดํฐ์ ํจํด์ ํ์
ํด ๋ณด์๋ค. ์ฌ์ค ์ด ๊ฐ๋ค์ ํฌ๊ธฐ๋ฅผ ํตํด ๊ด๊ณ๋ฅผ ํ์
ํ๋ ๋ฐ์๋ ์ ๋์ ์ธ ๊ธฐ์ค์น๊ฐ ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ์ attribute๋ค ์ฌ์ด์ ๊ฐ๋ค๋ง ์๋ํ๊ฐํด์ ํจํด์ ๋ถ์ํ์๋ค.
๐ ์๋ฌด๋๋ ์๋์ ์ธ ๊ฐ๋ค์ ํตํด ๊ทธ ๊ด๊ฒ๋ฅผ ๋น๊ตํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์์ฃผ ์ ํํ ํจํด์ด๋ผ๊ณ ๋งํ๊ธฐ๋ ์ด๋ ต๊ฒ ์ง๋ง, ์ผ๋จ์ ์ด๋ ๊ฒ ๋์จ ๊ฐ๋ค๊ณผ ๊ด๊ณ๋ฅผ ๊ฐ์ง๊ณ ํ๋ก์ ํธ๋ฅผ ์งํํ ๊ฒ์ด๋ค.
๐งฉ ์ด๋ฒ ํฌ์คํ ๊ณผ ์ง๋ ์ธ ๊ฐ์ ํฌ์คํ ์ ํตํด์ ํ๋ก์ ํธ ์งํ์ ์ํด ์ฌ์ฉํ ํจํด ๋ถ์์ ๋ํด์ ์์๋ณด์๋ค. ํน์๋ ๋ ๊ถ๊ธํ์ ๋ถ๋ค์ ์ํด ์๋์ ์ง๋ ๋งํฌ๋ค์ ๋จ๊ฒจ๋์ ํ ๋, ์ฐธ๊ณ ํ์๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค๐๐.
๐Project 1
๐Project 2
๐Project 3
๐งฉ ๋น๋ถ๊ฐ ์ํ๊ธฐ๊ฐ์ด๋ผ์ ๋ธ๋ก๊ทธ ํ๋์ด ์ข ๋ ๋ธํด์ง ๊ฒ ๊ฐ๋คโฆ๐ฅ ๊ทธ๋๋ ๊ธฐ์กด์ ๊ณต๋ถํ๋ ์๋ฃ๋ค์ ์๊ฐ์ด ๋๋ค๋ฉด ํํ์ด ์ฌ๋ฆด ์๊ฐ์ด๋ค. ๋ณด์๊ฒ์๋ ๋ธ๋ก๊ทธ์ด์ง๋ง ์ฝ์ด์ฃผ์๋ ๋ถ๋ค๊ผ ๊ฐ์ฌ์ ๋ง์์ ๋๋ฆฐ๋ค๐โโ๏ธ๐โโ๏ธ.
Leave a comment