๋‚ด์ผ๋ฐฐ์›€์บ ํ”„/๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ปTIL:Today I Learn

[์ฑŒ๋ฆฐ์ง€]๋จธ์‹ ๋Ÿฌ๋‹ ์Šคํ‚ฌ์—… - ์ž„์˜์žฌ ํŠœํ„ฐ

๊ธฐํš ์—ด์ •์˜ ํ•ญํ•ด! 2025. 2. 3. 14:32

๐Ÿ”์ฑŒ๋ฆฐ์ง€ 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

 

https://seaborn.pydata.org/

 

seaborn: statistical data visualization — seaborn 0.13.2 documentation

seaborn: statistical data visualization

seaborn.pydata.org

 

๐Ÿ” ์˜ค๋Š˜์˜ ์š”์•ฝ

  1. ์‹œ๊ฐํ™” plot
Boxplot ์ค‘์•™๊ฐ’, IQR, ์ด์ƒ์น˜ ์‹œ๊ฐํ™” ๊ฐ„๋‹จํ•œ ๋ถ„ํฌ ๋น„๊ต, ์ด์ƒ์น˜ ํ™•์ธ
Violin Plot Boxplot + ๋ถ„ํฌ ๋ฐ€๋„ ํ™•์ธ ๋ฐ์ดํ„ฐ ๋ถ„ํฌ์˜ ๋ฐ€๋„๊นŒ์ง€ ๋ณด๊ณ  ์‹ถ์„ ๋•Œ
KDE Plot ๋ถ€๋“œ๋Ÿฌ์šด ํ™•๋ฅ  ๋ฐ€๋„ ํ•จ์ˆ˜ ํ‘œ์‹œ ๋ถ„ํฌ์˜ ํ˜•ํƒœ ๋น„๊ต, ๋ฐ€๋„ ์ฐจ์ด ๋ถ„์„
CDF Plot ๋ˆ„์  ๋ถ„ํฌ ๋น„๊ต, ๋ถ„์‚ฐ ๋ฐ ์ค‘์•™๊ฐ’ ์ฐจ์ด ํ™•์ธ ๋ˆ„์  ํ™•๋ฅ  ๋ถ„์„, ๋ถ„ํฌ ๊ฐ„ ๊ฒฉ์ฐจ ํŒŒ์•…

 


import seaborn as sns
import matplotlib.pyplot as plt

columns = df_concat.columns

corr_matrix = df_concat[columns].corr()

plt.figure(figsize=(28, 26))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', fmt='.2f', linewidths=0.5, square=True)

plt.title('Correlation Matrix of Flow Deviation')

plt.show()

concat์ฝ”๋“œ๋ฅผ ์ผ์„ ๋•Œ, ์•„๋ž˜์™€ ๊ฐ™์ด ๊ทธ๋ž˜ํ”„๊ฐ€ ๋‚˜์™”๋‹ค๋ฉด~

1) ๋งจ ์•„๋ž˜์•  ํšŒ์ƒ‰์œผ๋กœ ๋ณด์ด๋Š” ๊ฐ’๋“ค์ด ์žˆ๋„ค. ๋ญ”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์˜๋ฏธ์žˆ๋Š” ๊ฐ’์ธ ๊ฒƒ ๊ฐ™๊ตฐ.
2) ๋Œ€๊ฐ์„ ๋งŒ 1์ด ๋‚˜์™€์•ผํ•˜๋Š”๋ฐ, ์ค‘๊ฐ„์ค‘๊ฐ„ 1์ด ๋ณด์ธ๋‹ค. ์•„.. ๋‹ค์ค‘๊ณต์‚ฐ์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ณด์ด๋Š” ๋ฐ์ดํ„ฐ๋„ ๋ณด์ธ๋‹ค!!!!!