๐Ÿšจ ์ด์ƒ์น˜ ์ฒ˜๋ฆฌ ๊ธฐ๋ฒ• ์™„์ „ ์ •๋ฆฌ (with ์‹ค์Šต & ์ˆ˜์‹)

ํ—ˆํ—ˆ๋งจยท2025๋…„ 5์›” 13์ผ
0

๋จธ์‹ ๋Ÿฌ๋‹

๋ชฉ๋ก ๋ณด๊ธฐ
7/23
post-thumbnail

๐Ÿšจ ์ด์ƒ์น˜ ์ฒ˜๋ฆฌ ๊ธฐ๋ฒ• ์™„์ „ ์ •๋ฆฌ (with ์‹ค์Šต & ์ˆ˜์‹)

๋ชจ๋ธ๋ง ์ „์— ๋ฐ˜๋“œ์‹œ ํ™•์ธํ•ด์•ผ ํ•  ๊ฒƒ ์ค‘ ํ•˜๋‚˜๋Š” ์ด์ƒ์น˜(Outliers)์ž…๋‹ˆ๋‹ค.
์ด์ƒ์น˜๋ฅผ ๋ฐฉ์น˜ํ•˜๋ฉด ํ‰๊ท , ํ‘œ์ค€ํŽธ์ฐจ, ํšŒ๊ท€๊ณ„์ˆ˜, ๋ชจ๋ธ ์„ฑ๋Šฅ ๋“ฑ ๋ชจ๋“  ๋ถ„์„ ๊ฒฐ๊ณผ๊ฐ€ ์™œ๊ณก๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


โœ… ์ด์ƒ์น˜๋ž€?

์ด์ƒ์น˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์ •์ƒ ๋ฒ”์œ„์—์„œ ๋ฒ—์–ด๋‚œ ๊ทน๋‹จ๊ฐ’์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
์‹œ๊ฐ์ ์œผ๋กœ๋Š” ์ƒ์ž๊ทธ๋ฆผ(Boxplot)์—์„œ ์ˆ˜์—ผ(whisker) ๋ฐ–์— ์œ„์น˜ํ•œ ๊ฐ’๋“ค์ด๋ฉฐ,

์ˆ˜์น˜์ ์œผ๋กœ๋Š” Z-score๊ฐ€ ํŠน์ • ๊ธฐ์ค€์„ ์ดˆ๊ณผํ•˜๋Š” ๊ฐ’์ž…๋‹ˆ๋‹ค.


๐Ÿงช ์˜ˆ์‹œ: ๊ฒฐ์„ ํšŸ์ˆ˜๊ฐ€ 50ํšŒ ์ด์ƒ์ด๋ผ๋ฉด?

  • ์ผ๋ฐ˜์ ์œผ๋กœ 0~20ํšŒ์ธ ํ•™์ƒ๋“ค์ด ๋งŽ์ง€๋งŒ,
  • ์–ด๋–ค ํ•™์ƒ์ด absences = 60์ด๋ผ๋ฉด ์ด๋Š” ๋ฐ์ดํ„ฐ ๋ถ„ํฌ์—์„œ ๋ฉ€๋ฆฌ ๋–จ์–ด์ง„ ๊ฐ’

๐Ÿ“Œ ์ด์ƒ์น˜ ํŒ๋‹จ์€ ๋ถ„์„ ๋ชฉ์ ๊ณผ ๋„๋ฉ”์ธ ์ง€์‹์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์ง€๋งŒ,
์ •๋Ÿ‰์ ์œผ๋กœ ํŒ๋‹จํ•˜๋Š” ๋Œ€ํ‘œ์  ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.


1๏ธโƒฃ Boxplot์„ ์ด์šฉํ•œ ์ด์ƒ์น˜ ํƒ์ง€

์‚ฌ๋ถ„์œ„์ˆ˜ ๊ธฐ๋ฐ˜์˜ IQR ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ๋ฐ์ดํ„ฐ๋ฅผ ์ด์ƒ์น˜๋กœ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ“ ์ˆ˜์‹

\begin{align*} \text{IQR} &= Q_3 - Q_1 \\ \text{์ƒํ•œ(Upper)} &= Q_3 + 1.5 \times \text{IQR} \\ \text{ํ•˜ํ•œ(Lower)} &= Q_1 - 1.5 \times \text{IQR} \end{align*}
  • $Q_1$ : ์ œ1์‚ฌ๋ถ„์œ„์ˆ˜ (25%)
  • $Q_3$ : ์ œ3์‚ฌ๋ถ„์œ„์ˆ˜ (75%)
  • IQR : ์ค‘๊ฐ„ 50% ๋ฒ”์œ„
  • ์ด ๋ฒ”์œ„ ๋ฐ–์˜ ๊ฐ’์€ ์ด์ƒ์น˜๋กœ ๊ฐ„์ฃผ

๐Ÿ’ป ์‹ค์Šต: Boxplot + ์ด์ƒ์น˜ ์ œ๊ฑฐ

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

warpbreaks = pd.read_csv('https://raw.githubusercontent.com/YoungjinBD/data/main/warpbreaks.csv')

# ์‹œ๊ฐํ™”
warpbreaks.boxplot(column=['breaks'])
plt.title("๐Ÿ“ฆ Boxplot of breaks")
plt.show()

# ์ด์ƒ์น˜ ๊ธฐ์ค€ ๊ณ„์‚ฐ
Q1 = np.quantile(warpbreaks['breaks'], 0.25)
Q3 = np.quantile(warpbreaks['breaks'], 0.75)
IQR = Q3 - Q1
UC = Q3 + 1.5 * IQR
LC = Q1 - 1.5 * IQR

# ์ด์ƒ์น˜ ํ™•์ธ
outliers = warpbreaks.loc[(warpbreaks.breaks > UC) | (warpbreaks.breaks < LC)]
print(outliers)

๐Ÿ“ค ์ถœ๋ ฅ:

   breaks wool tension
4      70    A       L
8      67    A       L
22     10    A       H

๐Ÿงน ์ด์ƒ์น˜ ์ œ๊ฑฐ

filtered = warpbreaks.loc[(warpbreaks.breaks <= UC) & (warpbreaks.breaks >= LC)]

โœ… ๋ถ„์„ ๋ชฉ์ ์— ๋”ฐ๋ผ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ๋ณ„๋„ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ


2๏ธโƒฃ Z-score๋ฅผ ์ด์šฉํ•œ ์ด์ƒ์น˜ ํƒ์ง€

Z-score๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ํ‰๊ท ์—์„œ ํ‘œ์ค€ํŽธ์ฐจ ๋‹จ์œ„๋กœ ์–ผ๋งˆ๋‚˜ ๋–จ์–ด์ ธ ์žˆ๋Š”์ง€๋ฅผ ์ธก์ •ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ“ ์ˆ˜์‹

Z=xโˆ’ฮผฯƒZ = \dfrac{x - \mu}{\sigma}
  • $\mu$ : ํ‰๊ท 
  • $\sigma$ : ํ‘œ์ค€ํŽธ์ฐจ

๐Ÿ“Œ ์ผ๋ฐ˜์ ์œผ๋กœ |Z| > 3์ธ ๊ฒฝ์šฐ ์ด์ƒ์น˜๋กœ ๊ฐ„์ฃผ


๐Ÿ’ป ์‹ค์Šต: Z-score ์ด์ƒ์น˜ ํƒ์ง€

mean = warpbreaks['breaks'].mean()
std = warpbreaks['breaks'].std()
upper = mean + 3 * std
lower = mean - 3 * std

z_outliers = warpbreaks.loc[(warpbreaks['breaks'] > upper) | (warpbreaks['breaks'] < lower)]
print(z_outliers)

๐Ÿ“ค ์ถœ๋ ฅ:

   breaks wool tension
4      70    A       L

โœ… Z-score๋Š” ํ‰๊ท  ์ค‘์‹ฌ์œผ๋กœ ๋ถ„ํฌ๊ฐ€ ์ •๊ทœ๋ถ„ํฌ์ผ ๋•Œ ๋” ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿง  Boxplot vs Z-score ๋น„๊ต

ํ•ญ๋ชฉBoxplotZ-score
๊ธฐ์ค€์‚ฌ๋ถ„์œ„์ˆ˜ ๊ธฐ๋ฐ˜ํ‰๊ท ๊ณผ ํ‘œ์ค€ํŽธ์ฐจ
์žฅ์ ๋ถ„ํฌ์— ๋ฌด๊ด€์ˆ˜ํ•™์  ๊ฐ„๊ฒฐํ•จ
๋‹จ์ ๊ทน๋‹จ์  ์ด์ƒ์น˜์— ์ทจ์•ฝ๋น„์ •๊ทœ๋ถ„ํฌ์— ๋ถ€์ •ํ™•

๐ŸŽจ ๋น„์œ ๋กœ ์ดํ•ดํ•˜๋Š” ์ด์ƒ์น˜ ์ฒ˜๋ฆฌ

๊ฐœ๋…๋น„์œ 
Boxplot๋ฐ์ดํ„ฐ๋“ค์„ ์ค„ ์„ธ์›Œ์„œ ๋ฐ”๊นฅ์ชฝ 25%๋ฅผ ๊ฒฝ๊ณ„๋กœ ๋‚˜๋ˆ„๊ณ , ๋” ํŠ€๋ฉด ์ซ“์•„๋ƒ„
Z-score์ „์ฒด ํ‰๊ท ์„ ๊ธฐ์ค€์œผ๋กœ ๋„ˆ๋ฌด ๋ฉ€๋ฆฌ ๋–จ์–ด์ง€๋ฉด "๋„ˆ ์ด์ƒํ•ด" ํ•˜๊ณ  ๊ฒฝ๊ณ 

โœ… ๋งˆ๋ฌด๋ฆฌ ์š”์•ฝ

๋ฐฉ๋ฒ•ํŒ๋‹จ ๊ธฐ์ค€์‚ฌ์šฉ ์˜ˆ์‹œ
BoxplotIQR ๊ธฐ์ค€์‹œ๊ฐ์ ์œผ๋กœ ํŒ๋‹จ, ํ†ต๊ณ„์  ๋ถ„ํฌ๊ฐ€ ํ•„์š” ์—†์„ ๋•Œ
Z-scoreZ > 3์ •๊ทœ๋ถ„ํฌ ๊ธฐ๋ฐ˜ ๋ชจ๋ธ, ์ž๋™ํ™” ๊ธฐ์ค€ ํ•„์š”ํ•  ๋•Œ

๐Ÿ’ก ์‹ค์ „ ํŒ

  • ์ด์ƒ์น˜๋ฅผ ์ œ๊ฑฐํ• ์ง€, ์ˆ˜์ •ํ• ์ง€, ๋ณด์กดํ• ์ง€๋Š” ๋ฌธ์ œ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
  • ์˜ˆ์ธก๋ ฅ ์ค‘์‹ฌ์ด๋ผ๋ฉด ์ œ๊ฑฐ, ์ธ์‚ฌ์ดํŠธ ์ค‘์‹ฌ์ด๋ผ๋ฉด ๋ถ„๋ฆฌ๋ถ„์„!

๐Ÿ“Œ ๋‹ค์Œ ๊ธ€์—์„œ๋Š” ๊ฒฐ์ธก์น˜, ์ด์ƒ์น˜, ๋ฒ”์ฃผํ˜• ์ฒ˜๋ฆฌ, ์ •๊ทœํ™” ๋“ฑ ์ „์ฒ˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ ์ž๋™ํ™”์— ๋Œ€ํ•ด ๋‹ค๋ฃฐ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.
๋ฒจ๋กœ๊ทธ์—์„œ ๊ตฌ๋…ํ•˜๊ณ  ํ•จ๊ป˜ ํ†ต๊ณ„์ƒํ™œ ํ•ด๋ด์š”!


profile
์‚ฌ๋žŒ์€ ๋ง๊ฐ์˜ ๋™๋ฌผ์ž…๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” ๊ธฐ๋ก์œผ๋กœ ๊ณผ๊ฑฐ์˜ ๋‚˜๋ฅผ ๋ฐ๋ ค์˜ต๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€