์ด๋ ค์ด ๊ฐ๋ ๋ ๋์๋ค~~
์ ๋ฆฌ ๊ฐ๋ณด์๊ณ ^^,,,
๊ฒฐ์ธก์น์ ์ด์์น
๊ฒฐ์ธก์น(Missing Values)๋,
๋๋ฝ๋ ๊ฐ/ ๋น์ด์๋ ๊ฐ์ ๋งํ๋ค
์ผ๋ฐ์ ์ผ๋ก
NaN, None, NULL ๋ก ํํ
๊ฒฐ์ธก์น ํ์ธ
import pandas as pd
import numpy as np
# ๋ฐ์ดํฐํ๋ ์ ์์
data = { 'name' : ['Alice', 'Bob', 'Charlie', 'David'],
'age' : [25, 30, np.nan, 22],
'score' : [85, np.nan, 75, 90]}
df = pd.DataFrame(data)
# ๊ฒฐ์ธก์น ํ์ธ
print(df.isnull()) # ๊ฐ ๊ฐ์ด ๊ฒฐ์ธก์น์ธ์ง ํ์ธ
print(df.isnull().sum()) # ์ด ๋ณ ๊ฒฐ์ธก์น ๊ฐฏ์โ
1. ๊ฒฐ์ธก์น ์ญ์
df.dropna(inplace = True) # ๊ฒฐ์ธก์น๊ฐ ์๋ ํ ์ญ์
2. ๊ฒฐ์ธก์น ๋์ฒด
- ํ๊ท ๊ฐ, ์ค์๊ฐ, ์ต๋น๊ฐ์ผ๋ก ๋์ฒด
df['age'.fillna(df['age'].mean(), inplace = True) # ํ๊ท ๊ฐ์ผ๋ก ๋์ฒด, ๋ํ์ ์ธ ๋์ฒด ๋ฐฉ๋ฒ
df['score'].fillna(df['score'].median(), inplace = True) # ์ค์๊ฐ์ผ๋ก ๋์ฒด, ๋ฐ์ดํฐ์ ์ด์์น๊ฐ ๋ง์ ํ๊ท ๊ฐ์ด ๋ํ์ฑ์ด ์์ ๊ฒฝ์ฐ ์ด์ฉ
- ํน์ ๊ฐ์ผ๋ก ๋์ฒด
df.fillna(0, inplace = True) # ๋ชจ๋ ๊ฒฐ์ธก์น๋ฅผ 0์ผ๋ก ๋์ฒด
3. ๊ฒฐ์ธก์น ์์ธก
- ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ๋ก ์์ธก
- sklearn ๋๋ fancyimpute ํจํค์ง ์ฌ์ฉ
์ด์์น(Outlier)๋,
๊ด์ธก๋ ๋ฐ์ดํฐ ๋ฒ์ฃผ์์ ํฌ๊ฒ(±) ๋ฒ์ด๋ ๊ฐ์ ๋งํ๋ค
๋ฐ์ดํฐ ์ญ์ ์ ํ์ง์ ์ข์์ง ์ ์์ด๋ ์ ๋ณด์์ค์ ๋๋ฐํ๊ธฐ ๋๋ฌธ์ ์ฃผ์๊ฐ ํ์ํจ
์ด์์น ํ์ง ๋ฐฉ๋ฒ
ESD (Extreme Studentized Deviation)
- ๋ฐ์ดํฐ๊ฐ ์ ๊ท ๋ถํฌ๋ฅผ ๋ฐ๋ฅธ๋ค๊ณ ๊ฐ์ ํ์ ๋, ์ข์ฐ๋ก ํ๊ท ์์ ํ์คํธ์ฐจ์ 3๋ฐฐ ์ด์ ๋จ์ด์ง ๊ฐ
- ํ ๋ฒ์ ํ๋ ๋๋ ์ฌ๋ฌ ๊ฐ์ ์ด์์น๋ฅผ ํ์งํ ์ ์์
- ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์ ๊ท ๋ถํฌ๋ฅผ ๋ฐ๋ฅด๋ ๊ฒ์ ์๋๊ธฐ ๋๋ฌธ์ ๋ค์ ์ํฉ์์๋ ์ ํ๋จ
- ๋ฐ์ดํฐ๊ฐ ํฌ๊ฒ ๋น๋์นญ์ผ ๋
- ์ํ์ ํฌ๊ธฐ๊ฐ ์์ ๋
ESD ์ฌ์ฉ ๊ณผ์
1. ํต๊ณ๋ ๊ณ์ฐ:
- ๊ฐ ๋ฐ์ดํฐ ํฌ์ธํธ์ ํ๊ท ๊ณผ ํ์คํธ์ฐจ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ณํ ์ ์(Deviation)๋ฅผ ๊ณ์ฐํฉ๋๋ค.
-๊ฐ์ฅ ํฐ ๋ณํ ์ ์๋ฅผ ๊ฐ์ง ๊ฐ์ ์ ํํฉ๋๋ค.
2. ํต๊ณ์ ๊ฒ์ :
-์ ํ๋ ๊ฐ์ด ์ฃผ์ด์ง ์ ์ ์์ค(ex. 0.05)์์ ์ด์์น์ธ์ง ํ๋จํฉ๋๋ค.
-ํ๋จ ๊ธฐ์ค์ Studentized Deviate Test์ ์๊ณ๊ฐ์ ๋๋ค.
3. ๋ฐ๋ณต ์ํ:
-์ด์์น๋ก ํ์ธ๋ ๋ฐ์ดํฐ๋ฅผ ์ ๊ฑฐํ๊ณ ๋๋จธ์ง ๋ฐ์ดํฐ๋ก ์ ๊ณผ์ ์ ๋ฐ๋ณตํฉ๋๋ค.
ํ์ด์ฌ์์ ESD๋ฅผ ์ฌ์ฉํ ์ด์์น ํ์ง
scipy ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋๋ ์ฌ์ฉ์ ์ ์ ์ฝ๋๋ฅผ ์ฌ์ฉํด ESD๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.
import numpy as np
from scipy.stats import t
def esd_test(data, alpha=0.05, max_outliers=5):
data = np.array(data)
outliers = []
for i in range(max_outliers):
mean = np.mean(data)
std_dev = np.std(data, ddof=1)
# ESD ํต๊ณ๋ ๊ณ์ฐ
deviations = np.abs(data - mean) / std_dev
max_dev = np.max(deviations)
max_idx = np.argmax(deviations)
# ์๊ณ๊ฐ ๊ณ์ฐ
n = len(data)
p = 1 - alpha / (2 * (n - i))
t_value = t.ppf(p, df=n-i-2)
lambda_crit = t_value * (n-i-1) / ((n-i-2 + t_value**2) ** 0.5)
# ์ด์์น ํ์
if max_dev > lambda_crit:
outliers.append(data[max_idx])
data = np.delete(data, max_idx) # ์ด์์น ์ ๊ฑฐ
else:
break
return outliers
# ๋ฐ์ดํฐ ์์
data = [10, 12, 12, 14, 15, 100, 12, 13, 14]
outliers = esd_test(data, alpha=0.05, max_outliers=3)
print("์ด์์น:", outliers)
import numpy as np
mean = np.mean(data)
std = np.std(data)
upper_limit = mean + 3 * std
lower_limit = mean - 3 * std
ESD์ ์ฅ์
- ๋ฐ์ดํฐ๋ฅผ ์ ๊ท๋ถํฌ๋ก ๊ฐ์ ํ๋ ์ํฉ์์ ๋งค์ฐ ํจ์จ์
- ์ด์์น๊ฐ ๋ช ๊ฐ ์๋์ง ์ฌ์ ์ ์ถ์ ํ์ง ์์๋ ๋จ
ESD์ ๋จ์
- ์ ๊ท ๋ถํฌ ๊ฐ์ ์ด ๋ถํ์คํ ๊ฒฝ์ฐ ์ฑ๋ฅ ์ ํ
- ๋ฐ์ดํฐ์ ์ด์์น๊ฐ ๋ง๊ฑฐ๋ ๋ถํฌ๊ฐ ์๊ณก๋ ๊ฒฝ์ฐ ํจ๊ณผ๊ฐ ๋จ์ด์ง ์ ์์
ํต๊ณ ๊ธฐ๋ฐ ๋ฐฉ๋ฒ
- IQR (Interquartile Range) ๋ฐฉ๋ฒ
Q1 = df['Score'].quantile(0.25) # 1์ฌ๋ถ์์
Q3 = df['Score'].quantile(0.75) # 3์ฌ๋ถ์์
IQR = Q3 - Q1 # IQR ๊ณ์ฐ
# ์ด์์น ๊ธฐ์ค
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
# ์ด์์น ํ์ง
outliers = df[(df['Score'] < lower_bound) | (df['Score'] > upper_bound)]
print(outliers)
์๊ฐํ ๊ธฐ๋ฐ ๋ฐฉ๋ฒ
- ๋ฐ์คํ๋กฏ(Boxplot)
import matplotlib.pyplot as plt
df['Score'].plot(kind='box')
plt.show()
Z-score ๋ฐฉ๋ฒ
from scipy.stats import zscore
df['zscore'] = zscore(df['Score'])
outliers = df[(df['zscore'] < -3) | (df['zscore'] > 3)] # Z-score๊ฐ ±3์ ์ด๊ณผํ๋ฉด ์ด์์น๋ก ๊ฐ์ฃผ
print(outliers)
1. ์ด์์น ์ ๊ฑฐ
df = df[(df['score'] >= lower_bound & (df['score'] <= upper_bound)]
2. ์ด์์น ๋์ฒด
- ์ค์๊ฐ ๋๋ ํ๊ท ๊ฐ์ผ๋ก ๋์ฒด
median = df['Score'].median()
df['Score'] = df['Score'].apply(lambda x: median if x > upper_bound or x < lower_bound else x)
3. ์ด์์น ์ฒ๋ฆฌํ์ง ์๊ณ ๋ชจ๋ธ๋ง
- ์ด์์น์ ๋ ๋ฏผ๊ฐํ ๋ชจ๋ธ ์ฌ์ฉ: ๋๋คํฌ๋ ์คํธ, ๋ถ์คํ ๊ณ์ด
'[๋ด๋ฐฐ์บ ] ๋ณธ ์บ ํ (24.11.25 ~ 25.03.01)๐๐ปโโ๏ธโ > ๊ฐ๋ ์ ๋ฆฌ๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[241209] ๊ฐ์ค์น์ ์ ํํ๊ท ์ ๋ฆฌ (4) | 2024.12.09 |
---|---|
[241206] MarkDown .md ํ์ผ ์์ฑํ๋ ๋ฒ (2) | 2024.12.06 |
[241128] ํ๋ค์ค์ ๋ํ์ด ์ ๋ฆฌ (2) | 2024.11.28 |
[241126] ํ์ด์ฌ class ๋ณต์ต (0) | 2024.11.26 |
[241125] ์ธ๊ณต์ง๋ฅ์ ์ํ ํ์ด์ฌ 4์ฃผ์ฐจ-1~2 ๊ฐ์ (1) | 2024.11.25 |