Data Mining Demo

An overview of Data Mining (DM), its techniques, applications, and challenges.

Warning

This article is a work in progress and may contain incomplete information or inaccuracies. Please verify details from reliable sources.

Data Mining Demo

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score

# ==========================================
# 1. INPUT DATA (Data Collection)
# ==========================================
# จำลองข้อมูลลูกค้า 10 คน (ในความเป็นจริงข้อมูลจะมาจาก SQL Database หรือ CSV)
# สมมติ 1 = เลิกเป็นสมาชิก (Churn), 0 = ยังอยู่ต่อ
data = {
    'Customer_ID': ['C001', 'C002', 'C003', 'C004', 'C005', 'C006', 'C007', 'C008', 'C009', 'C010'],
    'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank', 'Grace', 'Hannah', 'Ian', 'Jack'],
    'Age': [25, 45, 35, 50, 23, 60, 32, 28, 40, 55],
    'Salary': [18000, 85000, 45000, 120000, 15000, 90000, 50000, 22000, 60000, 110000],
    'Days_Since_Last_Buy': [2, 45, 10, 5, 60, 3, 15, 40, 7, 2],
    'Total_Spend': [500, 12000, 3000, 25000, 200, 15000, 4000, 800, 5500, 30000],
    'Churn_Label': [0, 1, 0, 0, 1, 0, 0, 1, 0, 0] 
}

df = pd.DataFrame(data)

print("--- ข้อมูลดิบ (Raw Data) ---")
print(df.head(3)) # ดูแค่ 3 แถวแรก
print("\n")


# ==========================================
# 2. DATA PREPROCESSING
# ==========================================

# --- 2.1 Feature Selection (เลือกเฉพาะคอลัมน์ที่มีผล) ---
# HINT: ID กับ ชื่อ เป็น Unique Identifier ไม่มีผลต่อพฤติกรรมการซื้อ ตัดทิ้งได้เลย
# นี่คือการลด Dimensions แบบง่ายที่สุด (Manual Feature Selection)
features = df.drop(['Customer_ID', 'Name', 'Churn_Label'], axis=1)
labels = df['Churn_Label']

# --- 2.2 Data Subsetting (Train/Test Split) ---
# HINT: แบ่งข้อมูลไว้ "สอน" (Train) และ "สอบ" (Test) เพื่อจำลองการใช้งานจริง
# สุ่ม 80% ไปสอน, 20% ไปสอบ
X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.2, random_state=42)

# --- 2.3 Normalization (ปรับสเกลข้อมูล) ---
# HINT: Salary หลักหมื่น vs Age หลักสิบ ถ้าไม่ปรับ โมเดลจะลำเอียงไปทาง Salary
# เราใช้ Min-Max Scaler ปรับทุกอย่างให้อยู่ในช่วง 0 ถึง 1
scaler = MinMaxScaler()

# fit_transform กับตัว Train (จำค่า Min/Max ของ Train ไว้)
X_train_scaled = scaler.fit_transform(X_train) 
# transform ตัว Test (ใช้ค่า Min/Max เดิมจาก Train เพื่อความแฟร์)
X_test_scaled = scaler.transform(X_test)

print("--- ข้อมูลหลัง Preprocessing (Normalized) ---")
print(pd.DataFrame(X_train_scaled, columns=features.columns).head(3))
print("\n")


# ==========================================
# 3. DATA MINING
# ==========================================

# เลือก Algorithm: Decision Tree (ต้นไม้ตัดสินใจ)
# เพราะเข้าใจง่าย เหมาะกับการเริ่มเรียนรู้
clf = DecisionTreeClassifier(random_state=42)

# สั่งให้โมเดล "เรียนรู้" จากข้อมูลที่เตรียมไว้ (Machine Learning)
clf.fit(X_train_scaled, y_train)

# ลองทำนายข้อมูลชุดสอบ (Test Set)
y_pred = clf.predict(X_test_scaled)


# ==========================================
# 4. POSTPROCESSING & INFORMATION
# ==========================================

# --- 4.1 Evaluation (วัดผล) ---
accuracy = accuracy_score(y_test, y_pred)
print(f"--- ผลลัพธ์ (Information) ---")
print(f"ความแม่นยำของโมเดล: {accuracy * 100:.2f}%")

# --- 4.2 Pattern Interpretation (ดูว่าโมเดลรู้อะไร) ---
# HINT: ดูว่า Feature ไหนสำคัญที่สุดในการตัดสินใจว่าลูกค้าจะเลิกหรือไม่เลิก
feature_importance = pd.DataFrame({
    'Feature': features.columns,
    'Importance': clf.feature_importances_
}).sort_values(by='Importance', ascending=False)

print("\nปัจจัยที่มีผลต่อการเลิกเป็นสมาชิก (เรียงตามความสำคัญ):")
print(feature_importance)

คำอธิบายเพิ่มเติม

1. Data Preprocessing

ใน Code นี้ผมรวมขั้นตอนย่อยๆ ไว้ในช่วง Step 2:

  • Feature Selection: คำสั่ง df.drop(['Customer_ID', 'Name'...]) คือการบอก "อย่าเอา Name คนมาคิดนะ มันไม่เกี่ยว" นี่คือการลด Noise ครับ

  • Dimensionality Reduction: ใน Code นี้เราทำแบบ Basic คือการ "ตัด column ทิ้ง" แต่ถ้าเป็นขั้นสูง (ในหนังสือ Tan) อาจจะใช้คำสั่ง PCA เพื่อยุบรวม Salary + Total_Spend ให้เหลือตัวแปรเดียว แต่ในทางปฏิบัติเบื้องต้น การเลือก Feature ที่ดีก็เพียงพอแล้วครับ

  • Normalization: คำสั่ง MinMaxScaler สำคัญมาก สังเกตว่า Salary (หลักแสน) จะถูกย่อเหลือแค่ 0.x เพื่อให้เท่าเทียมกับ Age (หลักสิบ) ถ้าไม่ทำขั้นตอนนี้ โมเดลจะมองว่า Salary สำคัญที่สุดเสมอเพราะตัวเลขมันเยอะ

2. Data Mining vs Algorithm

  • Data Mining คือชื่อกระบวนการภาพใหญ่
  • Decision Tree Classifier คือ "เครื่องมือ" หรือ Algorithm ที่เราหยิบมาใช้ในขั้นตอนนี้ (เหมือนเราหยิบสว่านมาเจาะรู)

3. Postprocessing

  • ผลลัพธ์ที่เป็นตัวเลข (y_pred) อาจจะดูยาก

  • เราจึงทำ feature_importance ออกมา เพื่อแปลงคณิตศาสตร์ให้เป็นภาษาธุรกิจว่า:

    "อ๋อ... สิ่งสำคัญที่สุดคือ จำนวนวันที่หายไป (Days_Since_Last_Buy) ถ้าหายไปนาน มีโอกาสเลิกสูง"

    นี่แหละครับคือ Knowledge ที่ค้นพบ

Python Code: Visualizing Decision Tree

# ==========================================
# 5. VISUALIZATION (แถมพิเศษ: ดูหน้าตาโมเดล)
# ==========================================
import matplotlib.pyplot as plt
from sklearn.tree import plot_tree

# กำหนดขนาดของภาพที่จะวาด (กว้าง 15 นิ้ว, สูง 10 นิ้ว) agar ให้เห็นชัดๆ
plt.figure(figsize=(15, 10))

# คำสั่งวาดต้นไม้
plot_tree(clf, 
          feature_names=features.columns,  # ใส่ชื่อคอลัมน์เพื่อให้ร่องรู้ง่ายขึ้น (Age, Salary)
          class_names=['Stay (0)', 'Churn (1)'], # ตั้งชื่อให้ผลลัพธ์ (0=อยู่ต่อ, 1=เลิก)
          filled=True,     # ระบายสีกล่องตามกลุ่มผลลัพธ์ (สีฟ้า=อยู่ต่อ, สีส้ม=เลิก)
          rounded=True,    # ทำขอบมนๆ ให้สวยงาม
          fontsize=12)     # ขนาดตัวอักษร

plt.title("Decision Tree Logic for Customer Churn Prediction")
plt.show() # แสดงภาพขึ้นมา

⚠️ สิ่งที่สำคัญที่สุดในการอ่าน Diagram นี้ (อ่านก่อนรัน!)

เนื่องจากในขั้นตอน Preprocessing เราได้ทำ Normalization (Min-Max Scaling) ไปแล้ว ข้อมูลทั้งหมดถูกบีบให้เหลือค่าระหว่าง 0 ถึง 1

ดังนั้น ใน Diagram คุณจะไม่เห็นเงื่อนไขแบบ "Age <= 30 ปี" แต่คุณจะเห็นเงื่อนไขแบบนี้แทน:

Age <= 0.354

การแปลความหมาย: นี่ไม่ได้แปลว่าอายุ 0.3 ปี! แต่มันหมายถึง "ค่าอายุที่ถูกสเกลแล้ว ที่มีค่าน้อยกว่าหรือเท่ากับ 0.354"

ตัวอย่างการคำนวณกลับ:

  • ถ้าค่าน้อยสุด (0.0) = อายุ 23 ปี
  • ถ้าค่ามากสุด (1.0) = อายุ 60 ปี
  • ค่า 0.354 ในโมเดล ≈ อายุจริงประมาณ 36 ปี

นี่คือเหตุผลที่ Data Scientist ต้องเข้าใจ Preprocessing เป็นอย่างดี เพราะมันส่งผลต่อการแปลผลลัพธ์ให้ฝั่ง Business ฟัง

ตัวอย่างหน้าตาของ Diagram ที่คุณจะได้

เมื่อรันแล้ว คุณจะได้ภาพประมาณนี้ (รูปร่างจริงจะเปลี่ยนไปตามการสุ่มข้อมูลในการรันแต่ละครั้ง):

องค์ประกอบของ Diagram:

  • กล่องบนสุด (Root Node): คือคำถามแรกที่สำคัญที่สุดที่โมเดลใช้แบ่งคน เช่น มันอาจจะถามเรื่อง "จำนวนวันที่หายไป" ก่อน

  • สีของกล่อง (Filled Color):

    • 🔵 สีฟ้า (โทนเย็น): แนวโน้มคือกลุ่มที่จะ "อยู่ต่อ (Stay)"
    • 🟠 สีส้ม (โทนร้อน): แนวโน้มคือกลุ่มที่จะ "เลิก (Churn)"
  • gini: คือค่าทางคณิตศาสตร์ที่บอกว่า "ความไม่บริสุทธิ์" ของข้อมูลในกล่องนั้นมีแค่ไหน

    • ยิ่งเข้าใกล้ 0.0 = ในกล่องนั้นมีแต่คนกลุ่มเดียวกันล้วนๆ (ดีมาก)