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= ในกล่องนั้นมีแต่คนกลุ่มเดียวกันล้วนๆ (ดีมาก)
- ยิ่งเข้าใกล้