0Pricing
Pandas & NumPy Academy · บทเรียน

การตรวจหาและจัดการค่าผิดปกติ

ระบุค่าผิดปกติด้วยเกณฑ์ IQR และ Z-score ตัดสินใจว่าจะจำกัดค่า ลบ หรือทำเครื่องหมาย และบันทึกเหตุผลของการตัดสินใจ

การตรวจหาและจัดการค่าผิดปกติ เป็นบทเรียน Pandas & NumPy Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Pandas & NumPy Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน

ค่าผิดปกติคืออะไร

ค่าผิดปกติ คือจุดข้อมูลที่แตกต่างจากข้อมูลส่วนที่เหลือของชุดข้อมูลอย่างมาก ค่าผิดปกติอาจเป็นค่าจริง (เช่น ลูกค้าองค์กรรายหนึ่งสั่งซื้อ 500,000 ดอลลาร์ ในชุดข้อมูลที่คำสั่งซื้อโดยเฉลี่ยมีมูลค่า 100 ดอลลาร์) หรือเป็นค่าที่ผิดพลาด (เช่น ราคาติดลบ หรือการพิมพ์ผิดที่เปลี่ยน 120 เป็น 12,000) ขั้นตอนแรกในการจัดการค่าผิดปกติคือการตัดสินใจว่าค่าสุดขั้วนั้นเป็นค่าจริงที่มีความหมาย หรือเป็นปัญหาด้านคุณภาพข้อมูล เพราะวิธีจัดการทั้งสองกรณีแตกต่างกันอย่างมาก

import pandas as pd
import numpy as np

df = pd.read_parquet('sales_clean.parquet')
print(df['revenue'].describe())

การตรวจหาค่าผิดปกติด้วยภาพ: แผนภาพกล่อง

แผนภาพกล่อง เป็นเครื่องมือแสดงภาพที่รวดเร็วที่สุดสำหรับตรวจหาค่าผิดปกติ กล่องครอบคลุมพิสัยระหว่างควอไทล์ (IQR, Q1–Q3) หนวดแผ่ไปถึง 1.5 เท่าของ IQR และจุดที่อยู่นอกหนวดจะแสดงแยกเป็นรายจุดในฐานะค่าผิดปกติที่น่าสงสัย ใช้ df['revenue'].plot(kind='box') หรือ sns.boxplot() ของ Seaborn เพื่อดูค่าผิดปกติได้ทันทีโดยไม่ต้องคำนวณขอบเขตด้วยตนเอง

import matplotlib.pyplot as plt
import seaborn as sns

fig, ax = plt.subplots(figsize=(6, 4))
df['revenue'].plot(kind='box', ax=ax)
ax.set_title('Revenue Distribution — Box Plot')
plt.tight_layout()
plt.show()

วิธีสร้างขอบเขตด้วย IQR

วิธีสร้างขอบเขตด้วย IQR จะคำนวณพิสัยระหว่างควอไทล์ แล้วกำหนดขอบเขตที่ Q1 − 1.5 เท่าของ IQR และ Q3 + 1.5 เท่าของ IQR ค่าที่อยู่นอกขอบเขตเหล่านี้จะถูกทำเครื่องหมายว่าเป็นค่าผิดปกติ ตัวคูณ 1.5 เป็นค่ามาตรฐานสำหรับค่าผิดปกติระดับไม่รุนแรง ส่วน 3.0 ใช้เฉพาะกับค่าผิดปกติที่รุนแรง วิธีนี้มีความทนทาน เพราะต่างจากคะแนน Z ตรงที่ไม่ต้องสมมติว่าข้อมูลมีการแจกแจงแบบปกติ

Q1 = df['revenue'].quantile(0.25)
Q3 = df['revenue'].quantile(0.75)
IQR = Q3 - Q1

lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR

outliers = df[(df['revenue'] < lower) | (df['revenue'] > upper)]
print(f'Q1={Q1:.0f}, Q3={Q3:.0f}, IQR={IQR:.0f}')
print(f'Bounds: [{lower:.0f}, {upper:.0f}]')
print(f'Outliers: {len(outliers)}')

วิธีคะแนน Z สำหรับตรวจหาค่าผิดปกติ

คะแนน Z ใช้วัดว่าค่าหนึ่งอยู่ห่างจากค่าเฉลี่ยกี่ส่วนเบี่ยงเบนมาตรฐาน โดยทั่วไปค่าที่มี |Z| > 3 จะถือว่าเป็นค่าผิดปกติ ซึ่งครอบคลุมข้อมูลที่มีการแจกแจงแบบปกติถึง 99.7% อย่างไรก็ตาม คะแนน Z ไวต่อค่าผิดปกติที่กำลังพยายามตรวจหา เพราะค่าที่สุดขั้วจะดึงค่าเฉลี่ยและเพิ่มค่าความเบี่ยงเบนมาตรฐาน อาจทำให้ค่าผิดปกติอื่นถูกบดบัง

mean = df['revenue'].mean()
std = df['revenue'].std()

df['revenue_z'] = (df['revenue'] - mean) / std
z_outliers = df[df['revenue_z'].abs() > 3]

print(f'Z-score outliers (|z|>3): {len(z_outliers)}')
print(z_outliers[['revenue', 'revenue_z']].head())

การทำเครื่องหมายเทียบกับการลบค่าผิดปกติ

อย่าลบค่าผิดปกติโดยไม่บันทึกและให้เหตุผลประกอบการตัดสินใจ ก่อนอื่นให้ทำเครื่องหมายค่าผิดปกติเหล่านั้นด้วยคอลัมน์แบบบูลีน (is_outlier) จากนั้นวิเคราะห์ว่ามีรูปแบบร่วมกันหรือไม่ (เช่น ภูมิภาคเดียวกัน สินค้าเดียวกัน หรือวันเดียวกัน) หากเป็นค่าจริง ให้เก็บไว้และสร้างแบบจำลองให้รองรับโดยตรง หากเป็นข้อผิดพลาด ให้ลบออกและบันทึกจำนวนที่ลบไว้ในบันทึกการตรวจสอบของกระบวนการ

df['is_revenue_outlier'] = (df['revenue'] < lower) | (df['revenue'] > upper)

print('Flagged rows:', df['is_revenue_outlier'].sum())
print(df.groupby('is_revenue_outlier')['revenue'].describe())

การจำกัดค่าผิดปกติ (Winsorizing)

การจำกัดค่า (หรือ Winsorising) จะแทนค่าที่เกินขอบเขตด้วยค่าขอบเขตนั้นเอง แทนที่จะลบแถวนั้นออก วิธีนี้ช่วยเก็บทุกแถวไว้ในชุดข้อมูล พร้อมลดการบิดเบือนที่ค่าผิดปกติมีต่อแบบจำลองเชิงเส้นและสถิติสรุป ใช้ clip(lower=, upper=) เพื่อกำหนดขอบเขตในกระบวนการแบบเวกเตอร์เพียงครั้งเดียว

df['revenue_capped'] = df['revenue'].clip(lower=lower, upper=upper)

print('Original max:', df['revenue'].max())
print('Capped max:', df['revenue_capped'].max())
print('Rows changed:', (df['revenue'] != df['revenue_capped']).sum())

การแปลงลอการิทึมสำหรับข้อมูลที่เบ้ขวา

การแจกแจงของรายได้และราคามักเบ้ขวา โดยมีหางยาวที่ประกอบด้วยค่าขนาดใหญ่ การใช้การแปลงลอการิทึมด้วย np.log1p() (ลอการิทึมของค่า + 1 เพื่อรองรับศูนย์) จะบีบหางให้สั้นลงและทำให้การแจกแจงสมมาตรมากขึ้น แบบจำลองทางสถิติและการแสดงภาพจำนวนมากตั้งอยู่บนสมมติฐานว่าข้อมูลมีการแจกแจงแบบปกติ ดังนั้นการแปลงคอลัมน์รายได้ด้วยลอการิทึมก่อนสร้างแบบจำลองจึงมักช่วยปรับปรุงผลลัพธ์ได้

df['log_revenue'] = np.log1p(df['revenue'])

fig, axes = plt.subplots(1, 2, figsize=(12, 4))
df['revenue'].hist(bins=50, ax=axes[0])
axes[0].set_title('Original Revenue')
df['log_revenue'].hist(bins=50, ax=axes[1])
axes[1].set_title('Log Revenue')
plt.tight_layout()
plt.show()

ค่าผิดปกติในหลายคอลัมน์

เมื่อต้องวิเคราะห์หลายคอลัมน์พร้อมกัน ให้คำนวณขอบเขตค่าผิดปกติด้วย IQR สำหรับคอลัมน์ตัวเลขทั้งหมดโดยใช้โปรแกรม วนซ้ำผ่านคอลัมน์ตัวเลข คำนวณขอบเขต และเก็บผลลัพธ์ไว้ในพจนานุกรม วิธีนี้ช่วยให้สร้างรายงานค่าผิดปกติฉบับเต็มได้ในไม่กี่บรรทัด แทนการคำนวณ IQR ซ้ำด้วยตนเองสำหรับแต่ละคอลัมน์

numeric_cols = df.select_dtypes(include=['number']).columns

outlier_report = {}
for col in numeric_cols:
    Q1 = df[col].quantile(0.25)
    Q3 = df[col].quantile(0.75)
    IQR = Q3 - Q1
    n_out = ((df[col] < Q1 - 1.5*IQR) | (df[col] > Q3 + 1.5*IQR)).sum()
    outlier_report[col] = n_out

print(pd.Series(outlier_report).sort_values(ascending=False))

ค่าผิดปกติแบบสองตัวแปรด้วยแผนภาพกระจาย

จุดข้อมูลบางจุดจะเป็นค่าผิดปกติเฉพาะเมื่อพิจารณาร่วมกันเท่านั้น: ราคาต่อหน่วย 10 ดอลลาร์เป็นเรื่องปกติ จำนวน 500 หน่วยอาจผิดปกติแต่ยังเป็นไปได้ แต่ราคา 10 ดอลลาร์ต่อหน่วยและจำนวน 500 หน่วยสำหรับสินค้าหรูนั้นน่าสงสัย ค่าผิดปกติแบบสองตัวแปรจะปรากฏเป็นจุดโดดเดี่ยวในแผนภาพกระจาย ใช้ df.plot.scatter('quantity', 'unit_price') เพื่อค้นหาจุดที่อยู่ห่างจากกลุ่มหลัก

fig, ax = plt.subplots(figsize=(8, 5))
df.plot.scatter(x='quantity', y='unit_price', alpha=0.3, ax=ax)
ax.set_title('Quantity vs. Unit Price — Bivariate Outliers')
plt.tight_layout()
plt.show()

การบันทึกการตัดสินใจเกี่ยวกับค่าผิดปกติ

ควรบันทึกการตัดสินใจเกี่ยวกับค่าผิดปกติทุกครั้ง ได้แก่ คอลัมน์ วิธีตรวจหา เกณฑ์ที่ใช้ จำนวนแถวที่ถูกทำเครื่องหมาย และวิธีจัดการ (เก็บ จำกัดค่า หรือลบ) เอกสารนี้ช่วยปกป้องนักวิเคราะห์ระหว่างการทบทวนโค้ดและการตรวจสอบ จัดเก็บข้อมูลดังกล่าวไว้ในพจนานุกรมบันทึกการทำความสะอาด และบันทึกไว้พร้อมกับชุดข้อมูลผลลัพธ์

outlier_log = {
    'column': 'revenue',
    'method': 'IQR 1.5x',
    'lower_bound': round(lower, 2),
    'upper_bound': round(upper, 2),
    'rows_flagged': int(df['is_revenue_outlier'].sum()),
    'treatment': 'cap (winsorise)'
}
for k, v in outlier_log.items():
    print(f'{k}: {v}')

การบันทึกชุดข้อมูลที่จัดการค่าผิดปกติแล้ว

หลังจากทำเครื่องหมายและจัดการค่าผิดปกติแล้ว ให้บันทึก DataFrame ที่อัปเดตแล้ว เก็บคอลัมน์ทำเครื่องหมาย is_outlier ไว้ในผลลัพธ์ เพื่อให้ผู้ใช้ในขั้นตอนถัดไปเลือกตัดแถวที่ถูกทำเครื่องหมายออกสำหรับการวิเคราะห์บางประเภทได้ บันทึกค่าที่ถูกจำกัดไว้ในคอลัมน์ที่มีส่วนต่อท้ายชัดเจน (_capped) ควบคู่กับคอลัมน์เดิม เพื่อให้ย้อนกลับการทำความสะอาดได้

cols_to_save = [c for c in df.columns if c not in ['revenue_z']]
df[cols_to_save].to_parquet('sales_treated.parquet', index=False)
print('Outlier-treated dataset saved:', df.shape)

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจแนวคิดด้านการวิเคราะห์ข้อมูลจากบทเรียนนี้

สรุปบทเรียน

ในบทเรียนนี้ คุณได้เรียนรู้เกี่ยวกับ การตรวจหาค่าผิดปกติด้วยการสร้างขอบเขตจาก IQR และคะแนน Z การตัดสินใจว่าจะทำเครื่องหมาย จำกัดค่า หรือลบค่าผิดปกติ และ การใช้การแปลงลอการิทึมกับการแจกแจงที่เบ้ขวา บทถัดไปเราจะศึกษาการทำให้ป้ายกำกับหมวดหมู่ที่ไม่สอดคล้องกันในคอลัมน์ข้อความเป็นมาตรฐาน

คำถามที่พบบ่อย

บทเรียน “การตรวจหาและจัดการค่าผิดปกติ” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การตรวจหาและจัดการค่าผิดปกติ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Pandas & NumPy Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การตรวจหาและจัดการค่าผิดปกติ”

ระบุค่าผิดปกติด้วยเกณฑ์ IQR และ Z-score ตัดสินใจว่าจะจำกัดค่า ลบ หรือทำเครื่องหมาย และบันทึกเหตุผลของการตัดสินใจ คุณปฏิบัติ Pandas & NumPy Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Pandas & NumPy Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Pandas & NumPy Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การตรวจหาและจัดการค่าผิดปกติ” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Pandas & NumPy Academy นี้ได้ไหม

ได้ บทเรียน Pandas & NumPy Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การตรวจหาและลบข้อมูลซ้ำ
  2. การตรวจหาและจัดการค่าผิดปกติ
  3. การทำหมวดหมู่ที่ไม่สอดคล้องให้เป็นมาตรฐาน
  4. การตรวจสอบโครงสร้างข้อมูลและการยืนยันเงื่อนไข
← กลับไปที่ Pandas & NumPy Academy