ปรึกษา Data Mining
Data Mining 4124305 • Chapter 03

บทที่ 3 การเตรียมข้อมูลสำหรับการทำเหมืองข้อมูล

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

Data Preparation Data Cleaning Python Pandas Data Leakage

หัวใจของบทนี้

  • Raw Data → Tidy Data
  • Missing Value, Duplicate, Outlier
  • Encoding, Scaling, Feature Selection
  • Train/Test Split และ Data Leakage
เนื้อหาครบตามลำดับบท
มีตัวอย่าง Python
ใช้ทำโครงงานได้จริง
ปรึกษาผ่าน LINE OA

ภาพรวมบทเรียน

Data Preparation หรือการเตรียมข้อมูล เป็นขั้นตอนสำคัญก่อนทำเหมืองข้อมูลและสร้างโมเดล Machine Learning เพราะข้อมูลจริงมักมีปัญหา เช่น ค่าว่าง ข้อมูลซ้ำ รูปแบบไม่สอดคล้อง ค่าผิดปกติ และตัวแปรที่ยังไม่พร้อมให้โมเดลนำไปเรียนรู้

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

เป้าหมายของบทที่ 3

เปลี่ยน Raw Data ให้เป็น Clean, Consistent, Structured และ Model-ready Data เพื่อรองรับการวิเคราะห์ สถิติ กฎความสัมพันธ์ การจำแนกข้อมูล และการสร้างโมเดลทำนายในบทถัดไป

ผลลัพธ์การเรียนรู้

อธิบายบทบาทของ Data Preparation ต่อคุณภาพโมเดลได้
ตรวจ Missing Value, Duplicate, Outlier และ Inconsistent Data ได้
แปลงข้อมูลด้วย Encoding, Scaling และ Feature Engineering ได้
แบ่ง Train/Test และป้องกัน Data Leakage ได้อย่างถูกต้อง

Pipeline การเตรียมข้อมูล

ภาพรวม Data Preparation Pipeline

Raw DataCSV / DB / API Exploreshape, info Cleanmissing/outlier Ready DatasetModel / Dashboard นำเข้า → สำรวจ → ทำความสะอาด → แปลงข้อมูล → เลือกฟีเจอร์ → แบ่งข้อมูล

Data Import

อ่านข้อมูลจากไฟล์ ฐานข้อมูล API หรือระบบภายนอก

Data Exploration

สำรวจชนิดข้อมูล จำนวนแถว ค่าสถิติ ค่าว่าง และข้อมูลซ้ำ

Data Cleaning

แก้ไข Missing Value, Duplicate, Inconsistent Value และ Outlier

Data Transformation

Encoding, Scaling, Discretization และสร้าง Feature ใหม่

Feature Selection และ Splitting

เลือกตัวแปรสำคัญ แบ่ง Train/Test และป้องกัน Data Leakage

ข้อมูลและประเภทข้อมูล

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

ประเภทข้อมูลที่พบบ่อย

Numericalอายุ / รายได้ / คะแนน10, 25, 98.5Categoricalเพศ / จังหวัด / สถานะชาย, หญิงUnstructuredข้อความ / ภาพ / เสียงText, Imageการเลือกวิธีเตรียมข้อมูลต้องสอดคล้องกับชนิดของข้อมูล

Qualitative / Categorical

ข้อมูลเชิงคุณภาพ เช่น เพศ จังหวัด กลุ่มเลือด ประเภทสินค้า หรือสถานะการสั่งซื้อ

Quantitative / Numerical

ข้อมูลเชิงปริมาณ เช่น อายุ น้ำหนัก รายได้ คะแนน หรือจำนวนการซื้อ

Structured Data

ข้อมูลแบบตาราง เช่น Excel, CSV และฐานข้อมูล SQL

Semi/Unstructured Data

JSON, XML, ข้อความ รูปภาพ เสียง วิดีโอ และข้อมูลจากโซเชียลมีเดีย

แหล่งข้อมูลและคุณภาพข้อมูล

ข้อมูลอาจมาจากหลายแหล่ง เช่น ฐานข้อมูลธุรกิจ คลังข้อมูล เว็บไซต์ ระบบ IoT แบบสอบถาม ไฟล์เอกสาร หรือ API ภายนอก ข้อมูลที่ดีควรมีความครบถ้วน ถูกต้อง สอดคล้อง ทันสมัย และเกี่ยวข้องกับปัญหาที่ต้องการวิเคราะห์

มิติคุณภาพข้อมูล

DataQualityCompletenessConsistencyAccuracyTimeliness

ปัญหาที่พบบ่อย

  • Incomplete Data: มีค่าว่างหรือข้อมูลไม่ครบ
  • Noisy Data: มีข้อมูลรบกวนหรือค่าผิดปกติ
  • Inconsistent Data: ค่าเดียวกันเขียนต่างกัน เช่น กรุงเทพ, กรุงเทพฯ, กทม.
  • Data Leakage: มีข้อมูลอนาคตหรือข้อมูลคำตอบปะปนในชุดฝึก ทำให้ประเมินโมเดลเกินจริง

การนำเข้าข้อมูล (Data Import)

Python สามารถนำเข้าข้อมูลได้จาก CSV, Excel, JSON, Text, SQL, API และ Web Scraping โดยนิยมใช้ Pandas เพื่ออ่านข้อมูลเข้าสู่ DataFrame

แหล่งข้อมูล → Pandas DataFrame

CSVExcelSQL/APIPandasDataFrameExploreClean / Model
import pandas as pd

df_csv = pd.read_csv("data.csv")
df_excel = pd.read_excel("data.xlsx", sheet_name="Sheet1")
df_json = pd.read_json("data.json")

print(df_csv.head())

การสำรวจข้อมูล (Data Exploration)

หลังจากนำเข้าข้อมูล ควรสำรวจข้อมูลเบื้องต้นเพื่อตรวจโครงสร้าง ชนิดข้อมูล ค่าสถิติ ความครบถ้วน และปัญหาเบื้องต้นก่อนเริ่มทำความสะอาด

head() shape info() describe() isnull() duplicated()
data = pd.read_excel("data01.xlsx")

print(data.head())
print(data.shape)
print(data.info())
print(data.describe())
print(data.isnull().sum())
print(data.duplicated().sum())

การทำความสะอาดข้อมูล (Data Cleaning)

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

Data Cleaning: ปัญหาและวิธีแก้

Missing ValueNaN / Blank / Nullเติมค่า / ลบแถวDuplicateข้อมูลซ้ำdrop_duplicates()Outlierค่าสูง/ต่ำผิดปกติIQR / Domain Ruleเป้าหมายคือทำให้ข้อมูลถูกต้อง สอดคล้อง และพร้อมวิเคราะห์

Missing Value

ข้อมูลที่หายไปอาจจัดการได้หลายวิธี เช่น ลบแถว เติมค่าเฉลี่ย เติมค่ามัธยฐาน เติมฐานนิยม หรือเติมค่าตามกลุ่มข้อมูล ขึ้นอยู่กับชนิดของข้อมูลและบริบทของปัญหา

import numpy as np
import pandas as pd

df = pd.DataFrame({
    "Age": [28, 23, np.nan, 45, 32],
    "Salary": [50000, 60000, 75000, np.nan, 80000],
    "Gender": ["Male", "Female", "Male", "Female", np.nan]
})

df["Age"] = df["Age"].fillna(df["Age"].mean())
df["Salary"] = df["Salary"].fillna(df["Salary"].median())
df["Gender"] = df["Gender"].fillna(df["Gender"].mode()[0])

Duplicate, Inconsistent Value และ Outlier

# ลบข้อมูลซ้ำ
df = df.drop_duplicates()

# ปรับค่าที่เขียนไม่สอดคล้องกัน
df["province"] = df["province"].replace({
    "กรุงเทพ": "กรุงเทพมหานคร",
    "กรุงเทพฯ": "กรุงเทพมหานคร",
    "กทม.": "กรุงเทพมหานคร"
})

# ตรวจ Outlier ด้วย IQR
q1 = df["score"].quantile(0.25)
q3 = df["score"].quantile(0.75)
iqr = q3 - q1
lower = q1 - 1.5 * iqr
upper = q3 + 1.5 * iqr
outliers = df[(df["score"] < lower) | (df["score"] > upper)]

ต้องการเตรียมข้อมูลสำหรับงานวิจัยหรือ Dashboard?

Siam2Dev ช่วยวิเคราะห์โครงสร้างข้อมูล ทำความสะอาดข้อมูล สร้างชุดข้อมูลพร้อมใช้ และต่อยอดเป็นโมเดล Machine Learning หรือ Dashboard สำหรับงานจริงได้

การรวมข้อมูล (Data Integration)

Data Integration คือการรวมข้อมูลจากหลายแหล่งให้เป็นชุดข้อมูลเดียว เช่น รวมข้อมูลลูกค้าจากระบบ CRM กับข้อมูลการขายจาก POS เพื่อให้เห็นภาพรวมของลูกค้าและพฤติกรรมการซื้อ

customers = pd.DataFrame({
    "customer_id": [1, 2, 3],
    "name": ["Ann", "Bob", "Chris"]
})

orders = pd.DataFrame({
    "customer_id": [1, 1, 3],
    "total": [250, 120, 700]
})

merged = pd.merge(customers, orders, on="customer_id", how="left")
print(merged)

การแปลงข้อมูล (Data Transformation)

Data Transformation คือการปรับข้อมูลให้อยู่ในรูปแบบที่เหมาะกับการวิเคราะห์ เช่น แปลงข้อความเป็นตัวเลข แปลงวันที่ สร้างตัวแปรใหม่ แบ่งช่วงข้อมูล และปรับสเกลข้อมูล

Data Transformation ที่ใช้บ่อย

Categoricalชาย/หญิงEncoding0/1 หรือ One-hotNumericalเงินเดือน/อายุScalingNormalize / StandardizeModel-readyข้อมูลพร้อมสร้างโมเดล

Encoding, Scaling และ Discretization

from sklearn.preprocessing import OneHotEncoder, StandardScaler
import pandas as pd

df = pd.DataFrame({
    "gender": ["ชาย", "หญิง", "หญิง"],
    "age": [22, 35, 45],
    "income": [15000, 32000, 50000]
})

# One-hot encoding
df_encoded = pd.get_dummies(df, columns=["gender"])

# Standardization
scaler = StandardScaler()
df_encoded[["age", "income"]] = scaler.fit_transform(
    df_encoded[["age", "income"]]
)

# Discretization
df["age_group"] = pd.cut(df["age"], bins=[20, 30, 40, 50],
                         labels=["20-30", "31-40", "41-50"])

Feature Engineering จากวันที่

df["order_date"] = pd.to_datetime(df["order_date"])
df["year"] = df["order_date"].dt.year
df["month"] = df["order_date"].dt.month
df["dayofweek"] = df["order_date"].dt.dayofweek

การเลือกฟีเจอร์ (Feature Selection)

Feature Selection คือการเลือกตัวแปรที่สำคัญต่อ Target เพื่อลด Noise ลดความซับซ้อน และช่วยให้โมเดลตีความง่ายขึ้น วิธีที่ใช้ได้ เช่น ความสัมพันธ์ทางสถิติ SelectKBest, Feature Importance จากต้นไม้ตัดสินใจ หรือการเลือกตามความรู้เชิงโดเมน

Feature Selection

All FeaturesAge, IncomeGender, CityNoise...FilterSelectKBestSelected FeaturesAge + Income + Purchase Frequencyลด Noise และเพิ่มความเข้าใจโมเดล
from sklearn.feature_selection import SelectKBest, chi2
from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
X_scaled = scaler.fit_transform(X)

selector = SelectKBest(score_func=chi2, k=5)
X_selected = selector.fit_transform(X_scaled, y)

print("Scores:", selector.scores_)
print("Selected shape:", X_selected.shape)

ข้อมูลไม่สมดุล (Imbalanced Data)

ข้อมูลไม่สมดุลเกิดเมื่อจำนวนตัวอย่างแต่ละคลาสต่างกันมาก เช่น ธุรกรรมปกติมี 99% แต่ธุรกรรมทุจริตมี 1% หากใช้ Accuracy เพียงอย่างเดียวอาจทำให้เข้าใจผิด เพราะโมเดลที่ทำนายว่า “ปกติทั้งหมด” อาจได้ Accuracy สูงแต่ใช้งานจริงไม่ได้

Imbalanced Data และการจัดการ

Class 0Class 1ImbalancedSMOTEOversamplingBalancedTrainTestSplit
from imblearn.over_sampling import SMOTE

smote = SMOTE(random_state=42)
X_resampled, y_resampled = smote.fit_resample(X_train, y_train)

print("Before:", y_train.value_counts())
print("After:", y_resampled.value_counts())

การแบ่งข้อมูล Train/Test และ Data Leakage

ก่อนสร้างโมเดลควรแบ่งข้อมูลเป็น Training Set และ Test Set เพื่อประเมินว่าโมเดลสามารถทำนายข้อมูลใหม่ได้ดีเพียงใด โดยทั่วไปอาจใช้สัดส่วน 80/20 หรือ 70/30 และในกรณีข้อมูลไม่สมดุลควรใช้ stratify=y เพื่อรักษาสัดส่วนของแต่ละคลาส

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(
    X, y,
    test_size=0.2,
    random_state=42,
    stratify=y
)
ระวัง Data Leakage: ควร fit ตัวแปลงข้อมูล เช่น Scaler หรือ Encoder เฉพาะกับชุด Train แล้ว transform ชุด Test เพื่อไม่ให้ข้อมูลจากชุดทดสอบรั่วไปสู่กระบวนการฝึกโมเดล

เครื่องมือและไลบรารีที่ใช้

Pandas

จัดการข้อมูลตาราง อ่านไฟล์ ตรวจ Missing/Duplicate และแปลงข้อมูล

NumPy

จัดการอาเรย์และการคำนวณเชิงตัวเลข

Scikit-learn

แปลงข้อมูล เลือกฟีเจอร์ แบ่งข้อมูล และสร้างโมเดล

Imbalanced-learn

จัดการข้อมูลไม่สมดุล เช่น SMOTE และ Undersampling

Checklist การเตรียมข้อมูลก่อนสร้างโมเดล

ตรวจโครงสร้างข้อมูล
จำนวนแถว คอลัมน์ ชนิดข้อมูล และความหมายของตัวแปร
ตรวจคุณภาพข้อมูล
Missing Value, Duplicate, Inconsistent Value และ Outlier
แปลงข้อมูลให้เหมาะสม
Encoding, Scaling, Discretization และ Date/Time Feature Engineering
เลือก Feature และแบ่งข้อมูล
เลือกตัวแปรสำคัญ แบ่ง Train/Test และป้องกัน Data Leakage

ตัวอย่างหัวข้อโครงงาน

  • การวิเคราะห์พฤติกรรมนักเรียนเพื่อคาดการณ์ความเสี่ยงการลาออก
  • การจัดกลุ่มลูกค้าเพื่อเสนอโปรโมชันที่เหมาะสม
  • การตรวจจับการทุจริตทางการเงินด้วยเทคนิคเหมืองข้อมูล
  • การวิเคราะห์แนวโน้มมลพิษในอากาศโดยใช้ข้อมูล IoT
  • การวิเคราะห์ข้อมูลสภาพอากาศเพื่อเพิ่มผลผลิตทางการเกษตร

แบบฝึกหัดท้ายบท

  1. อธิบายความหมายของ Data Preparation และเหตุผลที่สำคัญต่อการทำเหมืองข้อมูล
  2. ยกตัวอย่างปัญหา Missing Value, Duplicate, Inconsistent Data และ Outlier อย่างละ 1 ตัวอย่าง
  3. ใช้ Pandas อ่านไฟล์ CSV หรือ Excel แล้วตรวจสอบ head(), shape, describe(), isnull() และ duplicated()
  4. ทดลองเติม Missing Value ด้วยค่าเฉลี่ย มัธยฐาน และฐานนิยม พร้อมอธิบายว่าแต่ละวิธีเหมาะกับข้อมูลแบบใด
  5. สร้างตัวอย่างข้อมูล Categorical แล้วแปลงเป็นตัวเลขด้วย Label Encoding หรือ One-hot Encoding
  6. แบ่งข้อมูลเป็น Training Set และ Test Set พร้อมอธิบายเหตุผลของสัดส่วนที่เลือก
  7. ทดลองเลือก Feature ด้วยวิธีใดวิธีหนึ่ง และสรุปว่า Feature ใดสำคัญต่อ Target มากที่สุด

สรุปบทที่ 3

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

อ่านต่อ

ต่อยอดความรู้ด้าน Data Mining

เรียนต่อเนื่องจากการเตรียมข้อมูลไปสู่สถิติ กฎความสัมพันธ์ และการจำแนกข้อมูล

FAQ

คำถามที่พบบ่อยเกี่ยวกับการเตรียมข้อมูล

สรุปคำถามสำคัญก่อนเริ่มสร้างโมเดล Data Mining และ Machine Learning

ทำไม Data Preparation จึงสำคัญ?

เพราะข้อมูลจริงมักมีค่าว่าง ข้อมูลซ้ำ รูปแบบไม่สอดคล้อง และค่าผิดปกติ หากไม่แก้ก่อน โมเดลอาจเรียนรู้ผิดและประเมินผลเกินจริงได้

ควรจัดการ Missing Value อย่างไร?

ขึ้นอยู่กับชนิดข้อมูลและบริบท อาจลบแถว เติมค่าเฉลี่ย มัธยฐาน ฐานนิยม หรือเติมตามกลุ่มข้อมูล โดยต้องอธิบายเหตุผลให้ชัดเจน

Data Leakage คืออะไร?

คือการที่ข้อมูลจากชุดทดสอบหรือข้อมูลอนาคตรั่วเข้าไปในขั้นตอนฝึกโมเดล ทำให้คะแนนดูสูงผิดจริง ควร fit scaler/encoder เฉพาะชุด train ก่อน

บทนี้ควรต่อยอดไปบทใด?

หลังเข้าใจการเตรียมข้อมูลแล้ว ควรเรียนบทที่ 4 เทคนิคเชิงสถิติ เพื่อเข้าใจการสรุปข้อมูล ความสัมพันธ์ และแนวโน้มก่อนเข้าสู่โมเดลขั้นสูง