๐งฉ ๋ฐ์ดํฐ๋ง์ด๋(28) ํจํด๋ถ์_8 : Null Invariant Measure(1)
๐ ํ์คํ ํ๊ธฐ๊ฐ ์งํ ์ค์ ์์ผ๋ ๋ธ๋ก๊ทธ์ ์ ๊ฒฝ ์ธ ์๊ฐ์ด ์ ์ ์ ์ด์ง๋ ๊ฒ ๊ฐ๋ค. ๋ณธ์ ๊ณต๊ณผ ๋ถ์ ๊ณต, ๊ต์ ๊ณผ๋ชฉ๋ค์ ๋ฃ๊ณ ๋ฐ์ดํฐ ๋ถ์์ ์ํ SQL ๊ณต๋ถ๋ ๋ณํํ๊ณ ์์ด์ ๋ฐ์ดํฐ๋ง์ด๋ ๋ด์ฉ์ ๋ํด ์ ๋ฆฌํ ์ฌ์ ๊ฐ ์๋คโฆ๐ฅ๐ฅ. ํ์ง๋ง ์ ๊ณต ์์
์์ ๋ฆฌ๋
์ค๋ ๋ค๋ฃจ๊ณ ์๊ธฐ ๋๋ฌธ์ ์์
๋ด์ฉ์ ์ฐจ๊ทผ์ฐจ๊ทผ ์ ๋ฆฌํ๋ฉด์ ๋ธ๋ก๊ทธ๋ฅผ ์ข ๋ ์์ฐจ๊ฒ ๋ง๋ค์ด๋ด์ผ๊ฒ ๋ค.
๐ ์ ๋ฒ ๊ธ์์๋ support, confidence, lift๋ฅผ ๊ฐ์ง๊ณ ๊ฐ attribute ๊ฐ์ ํจํด์ ์์๋ณด์๋ค. ์ด๋ฒ ๊ธ์์๋ ์ด ์์น๋ค์ด ๊ฐ์ง ์ ์๋ ๋ฌธ์ ๋ค์ ํด๊ฒฐํ๊ธฐ ์ํ Null-Invariant Measures๋ฅผ ์ฌ์ฉํ์ฌ ํจํด์ ๋ถ์ํ ๊ฒ์ด๋ค.
๐ ์ฝ๋ ์งํ์ ์ดํด๋ฅผ ์ํด ์ด๋ฒ ๊ธ์์ ์ฌ์ฉํ ๋ฐ์ดํฐํ๋ ์์ ๋จผ์ ๋ณด๋๋ก ํ์.
๐ 1. pre_tran : ์์นํ/๋ฒ์ฃผํ attribute๊ฐ ์์ฌ์๋ ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ฒ์ฃผํ ๋ฐ์ดํฐ๋ก ๋ง๋ ๊ฒ
๐ 2. transaction : pre_tran์ ์ฌ์ฉํ์ฌ ๋ง๋ ์ต์ข ํธ๋์ญ์ ๋ฐ์ดํฐ - Boolean ํํํ
1. Null-Invariant Measures ๊ฐ๋
๐ transaction dataframe์์ Null data์ ๊ฐ์๊ฐ ๋ง์ ๊ฒฝ์ฐ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด์ Null Invariantํ metric ์ฌ์ฉ
๐ Jaccard, kulczynski, IR, chi-square, p-value ์ฌ์ฉ
- Jaccard : ๊ต์งํฉ/ํฉ์งํฉ. ๋ ์งํฉ์ด ๋์ผํ๋ฉด 1, ๊ณตํต์ ์์๊ฐ ํ๋๋ ์์ผ๋ฉด 0
- kulczynski : (0.5) * ((๊ต์งํฉ/X) + (๊ต์งํฉ/Y)). ๋ ์งํฉ์ด ๋์ผํ๋ฉด 1, ๊ณตํต์ ์์๊ฐ ํ๋๋ ์์ผ๋ฉด 0
- 0.5๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ ์งํฉ์ ๊ด๊ณ๊ฐ negative์ธ์ง positive ์ธ์ง ์ ์ ์์.
- IR : |X-Y| / ํฉ์งํฉ. ๋ฐ์ดํฐ์ ๋ถํฌ ํํ๋ฅผ ํ์ ํ๋ ๋ฐ ์ฌ์ฉ.
- chi-square : ๋ฐ์ดํฐ์ ์ฐ๊ด๊ด๊ณ ๋ถ์. ํด์๋ก ์ฐ๊ด์ฑ์ด ๊น์ ์งํฉ์.
- p-value : ์ ์ํ๋ฅ ์ ์ ๊ณตํด์ ๋๋ฆฝ๊ฐ์ค์ ์ฑํํ ์ ์๋์ง ํ๋จ๊ฐ๋ฅ.
๐ ์ผ๋ฐ์ ์ผ๋ก chi-square๊ฐ ํฌ๊ณ , kulczynski๊ฐ ์์ผ๋ฉด negativeํ๋ค๊ณ ๋งํ ์ ์์.
๐ ์๋ฅผ ๋ค์ด, kulczynski๊ฐ 0.1 ์ด๊ณ IR์ด 0.98, chi-square๊ฐ 111 ์ ๋๋ก ๋ํ๋๋ฉด ๋ ์งํฉ์ ๊ด๊ณ๋ negativeํ๋ฉฐ, ๋ฐ์ดํฐ์ ๋ถํฌ๊ฐ ๋ถ๊ท ํ์ ์ด๋ผ๋ ๊ฒ์ ์๋ฏธํจ.
2. chi-square ๊ณ์ฐ
# chi-square ๊ณ์ฐ(original cardio dataframe์ attribute ๊ธฐ์ค)
# scipy.stats์ chi2_contingency๋ฅผ ํตํด์ contingency table ์์ฑ.
# contingency table์ ๋ฐํ์ผ๋ก chi-square์ p-value ๊ณ์ฐ.
pre_tran_2 = pre_tran.drop('cardio', axis = 1)
chi_list_origin = pd.DataFrame()
from scipy.stats import chi2_contingency
for i in range(len(pre_tran_2.columns)):
f=pre_tran_2.columns[i]
contigency = pd.crosstab(pre_tran_2[f],pre_tran['cardio'])
chi, p, dof, expected = chi2_contingency(contigency)
chi_list_origin = chi_list_origin.append((pd.DataFrame({'chi' :chi, 'p-value':p}, index = [pre_tran_2.columns[i]+" & cardio"])))
chi_list_origin = chi_list_origin.sort_values('chi', ascending = False)
chi_list_origin
๐ ์์ ๋ฐ์ดํฐํ๋ ์์ฒ๋ผ ๊ฐ original dataframe์ attribute์ cardio ๊ฐ์ chi-square ๊ฐ๊ณผ p-value ๊ฐ์ด ๊ตฌํด์ง๋ค. ์ด๋ ๊ฒ ์์น๋ง์ผ๋ก ๋น๊ตํ๋ฉด ๋ฒ๊ฑฐ๋ก์ฐ๋๊น ํ๋ฒ ์๊ฐํํด์ ์ดํด๋ณด๋๋ก ํ์.
# Category Data ๊ธฐ์ค Attribute์ Cardio์์ chi-square ์ฐ์ฐ ๊ฒฐ๊ณผ ์๊ฐํ
fig = go.Figure()
fig.add_trace(
go.Scatter(
x = chi_list_origin.index, y = chi_list_origin['chi'], mode = 'markers+lines+text',
text = chi_list_origin['chi'].round(3), textposition = 'top right', textfont_size = 15))
fig.update_layout(
{
'title' : {'text':'Attribute-Cardio ๋ณ Chi-Square ๊ฐ', 'font':{'size' : 25}},
'xaxis' : {'showticklabels':True, 'tickfont' : {'size' : 15}},
'template' : 'plotly_white'
})
fig.show()
๐ ์ด๋ ๊ฒ ํด์ ๋ณ๋ก ๊ธธ์ง ์์ ์ฝ๋ฉ์ ํตํด ๊ฐ๋จํ๊ฒ chi-square ๊ฐ๊ณผ p-value๋ฅผ ๊ตฌํ ์ ์์๋ค. ํ์ง๋ง ์์ 1์ ์์ ๊ฐ๋
์ ์ดํด๋ณผ ๋ ๋ณด์๋ฏ์ด chi-square ๊ฐ๋ง ๊ฐ์ง๊ณ ์ด๋ค๊ฐ์ ๊ด๊ณ๋ฅผ ๋จ์ ์ง์ ์๋ ์๋ค. ๋ฐ๋ผ์ ์ด ๊ฐ๋ค ๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ Null-invariant measure๋ค๊น์ง ์ฌ์ฉํด์ ๋ณตํฉ์ ์ผ๋ก ๋ถ์ํ ๊ฒ์ด๋ค.
๐ ๋ค์ ๊ธ์์๋ ์ด๋ฌํ measure ๋ก๋ถํฐ ๊ตฌํด์ง ๊ฐ๋ค์ ๊ฐ์ง๊ณ ์ค์ ๋ฐ์ดํฐํ๋ ์์ ๋ง๋ค์ด๋ณด๊ณ ์๊ฐํ ํ ํ ๋ถ์๊น์ง ์งํํ ๊ฒ์ด๋ค๐๐.
Leave a comment