จัดการกับ Outliers

Garbage in, garbage out.
ค่าผิดปกติ (Outliers) จำเป็นต้องถูกจัดการ ก่อนนำข้อมูลไปสร้าง Machine Learning Model ตัวอย่างการจัดการกับค่า Outliers โดยใช้ Python code ดังนี้
import numpy as np
import pandas as pd
from scipy import stats
# ข้อมูลตัวอย่าง
data = pd.DataFrame({'values': [1, 2, 3, 4, 5, 100, 200, 300]})
# 1. วิธี Z-score
def remove_outliers_zscore(df, column, threshold=3):
z_scores = np.abs(stats.zscore(df[column]))
return df[z_scores < threshold]
data_no_outliers_zscore = remove_outliers_zscore(data, 'values')
# 2. วิธี IQR
def remove_outliers_iqr(df, column):
Q1 = df[column].quantile(0.25)
Q3 = df[column].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
return df[(df[column] >= lower_bound) & (df[column] <= upper_bound)]
data_no_outliers_iqr = remove_outliers_iqr(data, 'values')
# 3. วิธี Winsorization
def winsorize(df, column, limits=(0.05, 0.05)):
return pd.DataFrame({column: stats.mstats.winsorize(df[column], limits=limits)})
data_winsorized = winsorize(data, 'values')
# 4. การแปลงลอการิทึม
def log_transform(df, column):
return pd.DataFrame({column: np.log1p(df[column])})
data_log_transformed = log_transform(data, 'values')
# 5. วิธีการกำหนดขอบเขต
def cap_outliers(df, column, lower_percentile=0.01, upper_percentile=0.99):
lower_limit = df[column].quantile(lower_percentile)
upper_limit = df[column].quantile(upper_percentile)
df[column] = df[column].clip(lower=lower_limit, upper=upper_limit)
return df
data_capped = cap_outliers(data, 'values')
print("ข้อมูลต้นฉบับ:", data['values'].tolist())
print("หลังใช้วิธี Z-score:", data_no_outliers_zscore['values'].tolist())
print("หลังใช้วิธี IQR:", data_no_outliers_iqr['values'].tolist())
print("หลังใช้ Winsorization:", data_winsorized['values'].tolist())
print("หลังการแปลงลอการิทึม:", data_log_transformed['values'].tolist())
print("หลังการกำหนดขอบเขต:", data_capped['values'].tolist())
คำอธิบายของวิธีการต่างๆ ที่ใช้ใน Code
- วิธี Z-score: เทคนิคนี้ระบุค่า Outliers โดยพิจารณาว่าข้อมูลแต่ละจุดอยู่ห่างจากค่าเฉลี่ย (mean) ไปกี่ส่วนเบี่ยงเบนมาตรฐาน (standard deviation) จุดข้อมูลที่มีค่า z-score สูงกว่าเกณฑ์ที่กำหนด (โดยทั่วไปคือ 3) จะถือว่าเป็นค่า Outliers
- วิธี Interquartile Range (IQR): วิธีนี้ใช้ช่วงควอไทล์ในการระบุค่า Outliers จุดข้อมูลที่ต่ำกว่า Q1 - 1.5 * IQR หรือสูงกว่า Q3 + 1.5 * IQR จะถือว่าเป็นค่า Outliers
- วิธี Winsorization: เทคนิคนี้จำกัดค่าสูงสุดที่เปอร์เซ็นไทล์ที่กำหนด ในตัวอย่าง เราจำกัดข้อมูล 5% ล่างสุดและ 5% บนสุด
- การใช้ Log transformation: วิธีนี้ลดผลกระทบของค่าผิดปกติโดยใช้ Log transformation กับข้อมูล มีประโยชน์มากสำหรับข้อมูลที่เบ้ขวา
- วิธีการกำหนดขอบเขต (Capping): วิธีนี้กำหนดขีดจำกัดล่างและบน (มักอิงตามเปอร์เซ็นไทล์) และปรับค่าที่อยู่นอกช่วงนี้ (Outliers) ให้อยู่ในขอบเขตที่กำหนด
แต่ละวิธีมีข้อดีและข้อเสีย การเลือกใช้ขึ้นอยู่กับลักษณะของชุดข้อมูลและการประยุกต์ใช้งาน สิ่งสำคัญคือต้องเข้าใจธรรมชาติของข้อมูลและผลกระทบที่อาจเกิดขึ้นจากการตัดออกหรือแปลงค่า Outliers ก่อนที่จะเลือกใช้เทคนิคเหล่านี้
Blog นี้ เขียนร่วมกับ Claude.ai โดยใช้ Prompt
Please explain how to handle outliers with Python code.