[Tech Blog #22 | Data Science] Nhập Môn Học Không Giám Sát: Phân Cụm K-Means & Bài Toán Phân Khúc Khách Hàng Thực Chiến
![[Tech Blog #22 | Data Science] Nhập Môn Học Không Giám Sát: Phân Cụm K-Means & Bài Toán Phân Khúc Khách Hàng Thực Chiến](/uploads/ai-images/cover-phan-cum-k-means.png)
1. Đặt vấn đề: Khi dữ liệu không có sẵn "Đáp án" (Unlabeled Data)
Trong tất cả các bài toán Machine Learning chúng ta đã học ở các kỳ trước (Linear Regression, Logistic Regression, Decision Tree, KNN), mô hình luôn được cung cấp sẵn "đáp án mẫu" (gọi là nhãn mục tiêu ):
- Dự đoán giá nhà: đã có sẵn giá trị giao dịch thực tế.
- Phát hiện gian lận: đã có sẵn nhãn giao dịch gian lận hay hợp lệ. Đây là Học có giám sát (Supervised Learning), giống như học sinh giải bài tập có sách giải ở trang cuối.
Thế nhưng trong kinh doanh thực tế, hầu hết dữ liệu thu thập được lại không hề có nhãn dán sẵn:
Bạn có hồ sơ của 500.000 khách hàng với lịch sử giao dịch, tần suất vào app, và số tiền chi tiêu. Ban Giám đốc hỏi: "Hãy chia khách hàng thành các nhóm riêng biệt để gửi khuyến mãi cá nhân hóa."
Không có ai dán nhãn sẵn ai là "Khách VIP", ai là "Khách tiềm năng", hay ai là "Khách chỉ thích săn sale".
Làm sao để máy tính tự động nhìn vào dữ liệu và gom những khách hàng có nét tương đồng lại với nhau?
Câu trả lời nằm ở nhánh Học không giám sát (Unsupervised Learning) với thuật toán kinh điển nhất: K-Means Clustering (Phân cụm K-Means).
2. Vũ điệu 4 bước của thuật toán K-Means
Thuật toán K-Means phân chia điểm dữ liệu thành cụm riêng biệt thông qua một quy trình lặp đi lặp lại rất trực quan:
[Bước 1: Khởi tạo] Chọn ngẫu nhiên K điểm làm "Trọng tâm cụm" (Centroids)
│
▼
[Bước 2: Gán cụm] Từng điểm dữ liệu đo khoảng cách và gia nhập Cụm gần nó nhất
│
▼
[Bước 3: Cập nhật tâm] Tính trung bình cộng tọa độ các thành viên để dời Tâm cụm về vị trí mới
│
▼
[Bước 4: Hội tụ] Lặp lại Bước 2 và 3 cho đến khi Tâm cụm đứng yên không di chuyển nữa!
- Inertia (Độ vẩn đục nội cụm / WCSS): Là tổng bình phương khoảng cách từ các điểm dữ liệu đến tâm cụm của chúng. Cụm càng gom chặt, các điểm càng sát tâm thì Inertia càng nhỏ.
3. Nghệ thuật chọn K: Phương pháp Khuỷu tay (The Elbow Method)
Một câu hỏi hóc búa luôn xuất hiện: "Nên chia khách hàng thành 2, 3, 4 hay 5 cụm?"
- Nếu : Toàn bộ khách hàng bị nhét vào 1 cụm duy nhất Khoảng cách tới tâm rất lớn, vô nghĩa.
- Nếu (mỗi khách hàng là 1 cụm riêng): Khoảng cách bằng 0, nhưng bạn không gom nhóm được ai cả.
Phương pháp Khuỷu tay (Elbow Method):
Chúng ta chạy thử K-Means với các giá trị từ 1 đến 10 và vẽ biểu đồ đường biểu diễn sự sụt giảm của chỉ số Inertia:
Inertia
▲
│ *
│ \
│ \
│ \
│ * (K=2)
│ \
│ * (K=3) <--- VỊ TRÍ KHUỶU TAY (ELBOW POINT)
│ \_________*_________ (K=4, 5...) Giảm rất chậm
└──────────────────────────────► Số cụm K
Điểm mà tại đó tốc độ giảm Inertia đột ngột chậm lại (tạo thành hình góc gập giống như cùi chỏ tay) chính là con số tối ưu nhất về mặt toán học.
4. Bảng so sánh: Supervised Learning vs. Unsupervised Learning
| Tiêu chí | Học có giám sát (Supervised Learning) | Học không giám sát (Unsupervised Learning) |
|---|---|---|
| Dữ liệu đầu vào | Có cả đặc trưng () và nhãn đáp án (). | Chỉ có đặc trưng (), hoàn toàn không có nhãn (). |
| Mục tiêu chính | Dự đoán kết quả cho dữ liệu mới chưa từng thấy. | Khám phá cấu trúc, quy luật và phân nhóm ẩn bên trong dữ liệu. |
| Cách đánh giá | Rất rõ ràng: Accuracy, Precision, Recall, MAE, RMSE. | Trừu tượng hơn: Dựa vào Silhouette Score, Inertia và ý nghĩa kinh doanh. |
| Thuật toán tiêu biểu | Linear/Logistic Regression, Decision Tree, Random Forest. | K-Means, Hierarchical Clustering, PCA (Giảm chiều dữ liệu). |
| Ứng dụng thực tế | Dự đoán giá nhà, lọc email spam, chấm điểm rủi ro nợ xấu. | Phân khúc khách hàng, gợi ý bài hát tương tự, phát hiện hành vi bất thường. |
5. Thực hành thực chiến: Phân khúc khách hàng bằng Python Scikit-Learn
Đoạn mã Python dưới đây mô phỏng bài toán phân nhóm 300 khách hàng dựa trên hai chỉ số: Thu nhập hàng năm và Điểm chi tiêu mua sắm:
import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
# 1. Tạo tập dữ liệu khách hàng thực tế (3 nhóm hành vi tự nhiên)
np.random.seed(42)
# Nhóm 1: Thu nhập thấp nhưng nghiện mua sắm (Khách trẻ tuổi/Săn sale)
g1_income = np.random.normal(25, 5, 100)
g1_spend = np.random.normal(75, 8, 100)
# Nhóm 2: Thu nhập cao và chi tiêu mạnh tay (Khách hàng VIP)
g2_income = np.random.normal(85, 8, 100)
g2_spend = np.random.normal(80, 7, 100)
# Nhóm 3: Thu nhập cao nhưng cực kỳ tiết kiệm (Khách hàng cẩn trọng)
g3_income = np.random.normal(80, 7, 100)
g3_spend = np.random.normal(20, 6, 100)
df = pd.DataFrame({
"annual_income_k": np.concatenate([g1_income, g2_income, g3_income]),
"spending_score": np.concatenate([g1_spend, g2_spend, g3_spend])
})
X = df[["annual_income_k", "spending_score"]]
# 2. BẮT BUỘC: Chuẩn hóa dữ liệu vì K-Means sử dụng khoảng cách Euclid (đã học ở bài 18)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 3. Áp dụng phương pháp Khuỷu tay (Elbow Method) để tìm K tối ưu
inertias = []
k_range = range(1, 8)
for k in k_range:
kmeans = KMeans(n_clusters=k, init="k-means++", random_state=42, n_init=10)
kmeans.fit(X_scaled)
inertias.append(kmeans.inertia_)
print("--- KẾT QUẢ ĐỘ BIẾN THIÊN NỘI CỤM (INERTIA) THEO TỪNG K ---")
for k, val in zip(k_range, inertias):
print(f"K = {k}: Inertia = {val:.2f}")
# 4. Huấn luyện mô hình K-Means với K = 3 (Vị trí khuỷu tay rõ rệt nhất)
optimal_k = 3
final_kmeans = KMeans(n_clusters=optimal_k, init="k-means++", random_state=42, n_init=10)
df["cluster"] = final_kmeans.fit_predict(X_scaled)
# 5. Đo lường chất lượng phân cụm bằng Silhouette Score (-1 đến +1, càng gần 1 càng tốt)
sil_score = silhouette_score(X_scaled, df["cluster"])
print(f"\nĐiểm Silhouette Score của mô hình: {sil_score:.4f} (Phân tách rất sắc nét!)")
# 6. Diễn giải ý nghĩa kinh doanh của từng phân khúc (Actionable Business Insights)
cluster_summary = df.groupby("cluster").agg({
"annual_income_k": "mean",
"spending_score": "mean",
"cluster": "count"
}).rename(columns={"cluster": "customer_count"}).round(1)
print("\n--- BÁO CÁO ĐẶC TRƯNG TỪNG PHÂN KHÚC KHÁCH HÀNG ---")
print(cluster_summary)
# Gợi ý chiến lược cho từng nhóm:
# - Cụm Thu nhập cao, Chi tiêu cao: Phân khúc VIP -> Gợi ý sản phẩm xa xỉ, dịch vụ chăm sóc 1-1.
# - Cụm Thu nhập thấp, Chi tiêu cao: Phân khúc Tiềm năng -> Tung voucher giảm giá, tích điểm đổi quà.
# - Cụm Thu nhập cao, Chi tiêu thấp: Phân khúc Giữ tiền -> Gửi các chương trình khuyến mãi tài chính, đầu tư.
6. Câu hỏi phỏng vấn thực tế (Interview Q&A)
Câu 1 (Mức độ: Entry / Junior)
Câu hỏi: "Phân biệt sự khác biệt cốt lõi giữa Classification (Phân loại) và Clustering (Phân cụm)?"
Gợi ý trả lời:
*"Điểm khác biệt lớn nhất là sự hiện diện của nhãn mục tiêu (Labels):
- Classification (Phân loại) thuộc nhóm Học có giám sát. Chúng ta đã biết trước các nhóm là gì (ví dụ: Spam hay Không spam, Giao dịch hợp lệ hay Lừa đảo), và mô hình được dạy để gán nhãn chính xác cho dữ liệu mới.
- Clustering (Phân cụm) thuộc nhóm Học không giám sát. Chúng ta hoàn toàn không biết trước có những nhóm nào và mỗi nhóm có ý nghĩa gì. Mô hình tự động dựa vào khoảng cách toán học để gom các điểm dữ liệu tương đồng lại với nhau, và con người sau đó phải dùng kiến thức nghiệp vụ để tự đặt tên cho từng cụm đó."*
Câu 2 (Mức độ: Junior / Mid-level)
Câu hỏi: "Thuật toán K-Means++ giải quyết điểm yếu chết người nào của K-Means truyền thống?"
Gợi ý trả lời:
*"Điểm yếu lớn nhất của K-Means truyền thống là sự nhạy cảm cực cao với việc khởi tạo ngẫu nhiên các tâm cụm ban đầu (Centroid Initialization). Nếu chọn ngẫu nhiên trúng hai tâm cụm nằm quá sát nhau, thuật toán rất dễ bị rơi vào nghiệm tối ưu cục bộ (Local Minima) và cho ra kết quả phân cụm sai lệch hoàn toàn.
K-Means++ giải quyết triệt để vấn đề này bằng cách khởi tạo thông minh:
- Chọn ngẫu nhiên tâm cụm đầu tiên.
- Các tâm cụm tiếp theo được lựa chọn dựa trên phân phối xác suất tỉ lệ thuận với bình phương khoảng cách tới các tâm đã có sẵn Buộc các tâm cụm ban đầu phải nằm cách xa nhau nhất có thể.
Nhờ đó, K-Means++ giúp thuật toán hội tụ nhanh hơn gấp nhiều lần và kết quả phân cụm luôn ổn định, chất lượng cao."*
7. Key Takeaways (Ghi nhớ nhanh)
- Học không giám sát tự tìm cấu trúc: Dành cho dữ liệu không có nhãn sẵn, tiêu biểu nhất là bài toán phân khúc khách hàng (Segmentation).
- K-Means dựa trên khoảng cách: Bắt buộc phải chuẩn hóa dữ liệu (
StandardScaler) trước khi chạy để tránh các biến có thang đo lớn áp đảo kết quả. - Quy tắc khuỷu tay (Elbow Method): Chọn số cụm tại điểm uốn cong nơi tốc độ giảm Inertia bắt đầu chững lại.
- Luôn dùng
init='k-means++': Đây là tùy chọn mặc định trong Scikit-Learn giúp rải đều các tâm ban đầu, tránh rơi vào bẫy tối ưu cục bộ.