[์ฑ๋ฆฐ์ง]๋จธ์ ๋ฌ๋ ์คํฌ์ - ์์์ฌ ํํฐ
๐์ฑ๋ฆฐ์ง 3ํ์ฐจ
[์์ ๋ชฉํ]
- ์ค๋งํธ ํฉํ ๋ฆฌ ๋ฐ์ดํฐ(์ผ์ฑ ์ค๋งํธํฉํ ๋ฆฌ)๋ฅผ ํ์ฉํ ๋ฐ์ดํฐ ๋ถ์
01. ๋ฐ์ดํฐ ์ค๋ช
์ค๋งํธํฉํ ๋ฆฌ ๋ฐ๋์ฒด ๊ณต์ ์ต์ ํ
1. ๋ฐ์ดํฐ ๊ฐ์ ๋ฐ ๋ชฉ์
- ์ฃผ์ : ๋ถ๋ฅ ์๊ณ ๋ฆฌ์ฆ์ ํตํ ๊ณ ์ฅ ๊ฐ์ง ๋ฐ ์์ธก
- ๋ชฉ์ : ๋ฐ๋์ฒด ๊ณต์ ๊ณผ์ ์์ ๊ด์ธกํ ์ผ์ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ถ๋ํ์ ๋ถ๋ฅํ๊ณ ์์ธกํ์ฌ ์์ฐ ๊ณต์ ๋ฐ ์ค๋งํธ ํฉํ ๋ฆฌ ์ด์์ ํจ์จ์ฑ ์ฆ๋
(1) ์๊ฐํ ๋ฐ EDA๋ถ์
(2) ๊ฒฐ์ธก์น ์ฒ๋ฆฌ ๋ฐ ์ด์์น ๋ถ์
(3) ๋จธ์ ๋ฌ๋ ๋ถ๋ฅ ๋ชจ๋ธ ์ฌ์ฉ
- ๋ก์ง์คํฑ ํ๊ท
- ๋๋คํฌ๋ ์คํธ
- XGBoost
(4) ํผ์ฒ ์ค์๋
- ๊ณต์ ํ์ง ์ ํ๋ฅผ ์ ๋ฐํ๋ ๋ณ์์ ๋ถํฌ์ ๋ฐ๋ผ ๊ณต์ ํ์ง ์ ํ๋ฅผ ์กฐ๊ธฐ๊ฐ์งํ๊ณ ์ด์ ๋ฐ๋ผ ๋์ํ ์ ์๋ ํด๊ฒฐ์ฑ ์ ์ ์ํ ์ ์๋ค
- ์๊ฐํ ๋ถ์์ ๊ฒฐ๊ณผ์ ๋จธ์ ๋ฌ๋๋ชจ๋ธ์ ํ๊ฐ์งํ, ํผ์ฒ ์ค์๋์ ๋ฐ๋ผ ๊ณต์ ํ์ง์ ๋์ด๊ณ ๋ถ๋๋ฅ ์ ๋ฎ์ถ๋ ๋ฑ์ ํตํด ๊ฒฐ๊ณผ๊ฐ์ ๋์ถํ๋ค.
2. ๋ฐ์ดํฐ ์ค๋ช
์์ฐํ์ ๊ฒฝ์ฐ ์ด 5๋ฒ์ ๊ณต์ ์ ํตํด ๊ฒ์ฌ
๊ณต์ ๋จ๊ณ์ ํผ์ฒ์ด๋ฆ์ ์กฐํฉ์ผ๋ก ์ด๋ฆ ๋ถ์ฌ์ง ์ด 40๊ฐ์ ์ปฌ๋ผ๊ณผ ์ค๋ถ๋์ ํ๋จํ๋ Label ์ปฌ๋ผ
41๊ฐ์ column(s)๊ณผ 16,998๊ฐ์ Row(s)
features_train
์ผ์๋ฅผ ํตํด ์จ๋,์ต๋๋ฅผ ํฌํจํ 8๊ฐ์ง์ ํผ์ฒ๋ฅผ ์ธก์
labels_train
5๋ฒ์ ๊ณต์ ์ด ํ ์ ํ์ด ์ ์์ธ์ง ๋ถ๋ํ์ธ์ง์ ๋ํ ๋ผ๋ฒจ๋ง ๋ถ์ฌ
์ ์์ 0, ๋ถ๋์ 1
02. ๋ฐ์ดํฐ ์๊ฐํ
Boxplot(์ ๋ง ์ค์ํ๊ณ ์ ๋ง ๋ง์ด ์)
โ ์ค๋ช :
- ๋ฐ์ดํฐ์ ์ค์๊ฐ, ์ฌ๋ถ์์, ์ด์์น๋ฅผ ์๊ฐํํ๋ ๋ฐ ์ฌ์ฉ.
์ฌ๋ถ์์ ์ด๋ฆ ์ค๋ช
Q1 | ์ 1์ฌ๋ถ์์ | ํ์ 25% ์ง์ ์ ๊ฐ (25๋ฒ์งธ ๋ฐฑ๋ถ์์) |
Q2 | ์ 2์ฌ๋ถ์์ | ์ค์๊ฐ(Median), ์ ์ฒด์ 50% ์ง์ |
Q3 | ์ 3์ฌ๋ถ์์ | ์์ 25% ์ง์ ์ ๊ฐ (75๋ฒ์งธ ๋ฐฑ๋ถ์์) |
IQR | ์ฌ๋ถ์ ๋ฒ์ | Q3 - Q1 (์ค๊ฐ 50% ๋ฒ์) |
- ๋ฐ์ค: 1์ฌ๋ถ์์(Q1)์ 3์ฌ๋ถ์์(Q3) ์ฌ์ด์ ๋ฒ์๋ฅผ ๋ํ๋.
- ๊ฐ๋ก์ : ์ค์๊ฐ(2์ฌ๋ถ์์, Q2)์ ํ์.
- ์์ผ(whisker): Q1 - 1.5IQR , Q3 + 1.5IQR ๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ํฌํจ.
- ์ : ์ด์์น(outlier)๋ฅผ ๋ํ๋.
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
# ์ํ ๋ฐ์ดํฐ ์์ฑ
np.random.seed(42)
df = pd.DataFrame({
'Metric_A': np.random.normal(0, 1, 100),
'Metric_B': np.random.normal(1, 1.5, 100),
'label': np.random.choice([0, 1], 100)
})
plt.figure(figsize=(10, 6))
sns.boxplot(x='label', y='Metric_A', data=df)
plt.title('Boxplot of Metric_A by Label')
plt.xlabel('Label')
plt.ylabel('Metric_A')
plt.show()
๐ก ํด์:
- ๊ฐ label(0,1) ๋ณ๋ก ์ค์๊ฐ, ๋ถํฌ ๋ฒ์, ์ด์์น๋ฅผ ์ง๊ด์ ์ผ๋ก ํ์ธํ ์ ์์.
- ๋ถํฌ์ ์๋๋ ์ด์์น ์ ๋ฌด ํ์ ์ ์ฉ์ด.
Violint Plot
โ ์ค๋ช :
- Boxplot + KDE(์ปค๋ ๋ฐ๋ ์ถ์ )๊ฐ ๊ฒฐํฉ๋ ํํ.
- ์ค์์ ํฐ ์ ์ ์ค์๊ฐ, ๋๊บผ์ด ๋ง๋๋ IQR, ์์ชฝ์ ๋ชจ์์ ๋ฐ์ดํฐ์ ๋ฐ๋ ๋ถํฌ๋ฅผ ๋ํ๋.
- Boxplot๋ณด๋ค ๋ฐ์ดํฐ์ ๋ฐ๋ ๋ถํฌ๋ฅผ ๋ ๋ช ํํ๊ฒ ์๊ฐํ ๊ฐ๋ฅ.
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
# ์ํ ๋ฐ์ดํฐ ์์ฑ
np.random.seed(42)
df = pd.DataFrame({
'Metric_A': np.random.normal(0, 1, 100),
'Metric_B': np.random.normal(1, 1.5, 100),
'label': np.random.choice([0, 1], 100)
})
plt.figure(figsize=(10, 6))
sns.violinplot(x='label', y='Metric_A', data=df, inner='quartile', palette='Set2')
plt.title('Violin Plot of Metric_A by Label')
plt.xlabel('Label')
plt.ylabel('Metric_A')
plt.show()
๐ก ํด์:
- ์์์ "๋ฐ์ด์ฌ๋ฆฐ" ๋ชจ์์ ๋ฐ์ดํฐ๊ฐ ๋ง์ด ๋ถํฌ๋ ๊ตฌ๊ฐ์ด ๋๊ฒ ํ์๋จ.
- inner='quartile' ์ต์ ์ผ๋ก ์ค์๊ฐ๊ณผ IQR ํ์.
- ๋ฐ์ดํฐ์ ๋ฐ๋ ์ฐจ์ด๊น์ง ํ๋์ ํ์ธ ๊ฐ๋ฅ.
- ๋จ์ ์ด ์์ด. ๋ฐ์ดํฐ์ ํต์ฌ์ ์ด์์น๋ ๊ฒฐ์ธก๊ฐ์ด์ผ. ๋ฐ๋ผ์ ์ด์์น๊ฐ ์๋ค๋ฉด ๋ฐ์คํ๋กฏ์ด ๋ ๋์์๋ ์์ด!
KDE Plot
โ ์ค๋ช :
- ๋ฐ์ดํฐ์ ๋ถํฌ๋ฅผ ๋ถ๋๋ฝ๊ฒ ์ถ์ ํ ํ๋ฅ ๋ฐ๋ ํจ์(PDF)๋ฅผ ์๊ฐํ.
- ํ์คํ ๊ทธ๋จ๋ณด๋ค ๋ถ๋๋ฝ๊ณ ์ง๊ด์ ์ผ๋ก ๋ถํฌ๋ฅผ ๋ณด์ฌ์ค.
- ๋ ๊ฐ ์ด์์ ๋ถํฌ๋ฅผ ๋น๊ตํ ๋ ํจ๊ณผ์ .
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
# ์ํ ๋ฐ์ดํฐ ์์ฑ
np.random.seed(42)
df = pd.DataFrame({
'Metric_A': np.random.normal(0, 1, 100),
'Metric_B': np.random.normal(1, 1.5, 100),
'label': np.random.choice([0, 1], 100)
})
plt.figure(figsize=(10, 6))
sns.kdeplot(df[df['label'] == 0]['Metric_A'], label='Label 0', fill=True, alpha=0.5)
sns.kdeplot(df[df['label'] == 1]['Metric_A'], label='Label 1', fill=True, alpha=0.5)
plt.title('KDE Plot of Metric_A by Label')
plt.xlabel('Metric_A')
plt.ylabel('Density')
plt.legend()
plt.show()
๐ก ํด์:
- Label 0๊ณผ Label 1์ ๋ถํฌ๋ฅผ ๋ถ๋๋ฝ๊ฒ ๋น๊ต ๊ฐ๋ฅ.
- ๊ฒน์น๋ ๋ถ๋ถ์ ์์ด ์งํด์ง๋ฏ๋ก ๋ถํฌ์ ์ ์ฌ์ฑ์ ์ง๊ด์ ์ผ๋ก ํ์ ๊ฐ๋ฅ.
- fill=True๋ก ๋ฉด์ ์ ์ฑ์ ๊ฐ๋ ์ฑ ํฅ์.
ECDF Plot
โ ์ค๋ช :
- ๋์ ๋ถํฌ๋ฅผ ์๊ฐํ.
- ๋ฐ์ดํฐ๊ฐ ํน์ ๊ฐ ์ดํ์ผ ํ๋ฅ ์ ๋์ ํด์ ํ์.
- ๋ถํฌ์ ์ฐจ์ด๋ฅผ ๋์ ํ๋ฅ ๊ด์ ์์ ๋น๊ต ๊ฐ๋ฅ.
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
# ์ํ ๋ฐ์ดํฐ ์์ฑ
np.random.seed(42)
df = pd.DataFrame({
'Metric_A': np.random.normal(0, 1, 100),
'Metric_B': np.random.normal(1, 1.5, 100),
'label': np.random.choice([0, 1], 100)
})
plt.figure(figsize=(10, 6))
sns.ecdfplot(df[df['label'] == 0]['Metric_A'], label='Label 0')
sns.ecdfplot(df[df['label'] == 1]['Metric_A'], label='Label 1')
plt.title('CDF Plot of Metric_A by Label')
plt.xlabel('Metric_A')
plt.ylabel('Cumulative Probability')
plt.legend()
plt.show()
์ด ์ธ์๋..
https://matplotlib.org/stable/
Matplotlib documentation — Matplotlib 3.10.0 documentation
matplotlib.org
seaborn: statistical data visualization — seaborn 0.13.2 documentation
seaborn: statistical data visualization
seaborn.pydata.org
๐ ์ค๋์ ์์ฝ
- ์๊ฐํ plot
Boxplot | ์ค์๊ฐ, IQR, ์ด์์น ์๊ฐํ | ๊ฐ๋จํ ๋ถํฌ ๋น๊ต, ์ด์์น ํ์ธ |
Violin Plot | Boxplot + ๋ถํฌ ๋ฐ๋ ํ์ธ | ๋ฐ์ดํฐ ๋ถํฌ์ ๋ฐ๋๊น์ง ๋ณด๊ณ ์ถ์ ๋ |
KDE Plot | ๋ถ๋๋ฌ์ด ํ๋ฅ ๋ฐ๋ ํจ์ ํ์ | ๋ถํฌ์ ํํ ๋น๊ต, ๋ฐ๋ ์ฐจ์ด ๋ถ์ |
CDF Plot | ๋์ ๋ถํฌ ๋น๊ต, ๋ถ์ฐ ๋ฐ ์ค์๊ฐ ์ฐจ์ด ํ์ธ | ๋์ ํ๋ฅ ๋ถ์, ๋ถํฌ ๊ฐ ๊ฒฉ์ฐจ ํ์ |
concat์ฝ๋๋ฅผ ์ผ์ ๋, ์๋์ ๊ฐ์ด ๊ทธ๋ํ๊ฐ ๋์๋ค๋ฉด~