Hướng dẫn dứt khoát về phân cụm theo thứ bậc với Python và Scikit-Learn PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Hướng dẫn rõ ràng về phân cụm phân cấp với Python và Scikit-Learn

Giới thiệu

Trong hướng dẫn này, chúng tôi sẽ tập trung vào việc triển khai Thuật toán phân cụm phân cấp với Scikit-Learn để giải quyết một vấn đề tiếp thị.

Sau khi đọc hướng dẫn, bạn sẽ hiểu:

  • Khi nào áp dụng Phân cụm phân cấp
  • Cách hình dung tập dữ liệu để hiểu liệu nó có phù hợp để phân nhóm hay không
  • Cách xử lý trước các tính năng và thiết kế các tính năng mới dựa trên tập dữ liệu
  • Cách giảm kích thước của tập dữ liệu bằng PCA
  • Cách sử dụng và đọc biểu đồ dendrogram để tách các nhóm
  • Các phương pháp liên kết khác nhau và chỉ số khoảng cách được áp dụng cho các hình ảnh và thuật toán phân cụm là gì
  • Các chiến lược phân nhóm tổng hợp và phân chia là gì và cách chúng hoạt động
  • Cách triển khai Phân cụm phân cấp tổng hợp với Scikit-Learn
  • Các vấn đề thường gặp nhất khi xử lý các thuật toán phân cụm là gì và cách giải quyết chúng

Lưu ý: Bạn có thể tải xuống sổ tay chứa tất cả mã trong hướng dẫn này tại đây.

Động lực

Hãy tưởng tượng một tình huống trong đó bạn là thành viên của nhóm khoa học dữ liệu giao tiếp với bộ phận tiếp thị. Tiếp thị đã thu thập dữ liệu mua sắm của khách hàng được một thời gian và họ muốn hiểu dựa trên dữ liệu thu thập được, nếu có sự tương đồng giữa các khách hàng. Những điểm tương đồng đó chia khách hàng thành các nhóm và có các nhóm khách hàng sẽ giúp nhắm mục tiêu các chiến dịch, khuyến mại, chuyển đổi và xây dựng mối quan hệ khách hàng tốt hơn.

Có cách nào bạn có thể giúp xác định khách hàng nào tương tự không? Có bao nhiêu người trong số họ thuộc cùng một nhóm? Và có bao nhiêu nhóm khác nhau?

Một cách để trả lời những câu hỏi đó là sử dụng tập hợp thuật toán, chẳng hạn như K-Means, DBSCAN, Phân cụm phân cấp, v.v. Nói chung, thuật toán phân cụm tìm điểm tương đồng giữa các điểm dữ liệu và nhóm chúng lại.

Trong trường hợp này, dữ liệu tiếp thị của chúng tôi khá nhỏ. Chúng tôi chỉ có thông tin về 200 khách hàng. Xem xét nhóm tiếp thị, điều quan trọng là chúng tôi có thể giải thích rõ ràng cho họ biết các quyết định đã được đưa ra như thế nào dựa trên số lượng cụm, do đó giải thích cho họ cách thuật toán thực sự hoạt động.

Vì dữ liệu của chúng tôi nhỏ và khả năng giải thích là một yếu tố chính, chúng ta có thể tận dụng Phân cụm phân cấp để giải quyết vấn đề này. Quá trình này còn được gọi là Phân tích phân cụm theo thứ bậc (HCA).

Một trong những ưu điểm của HCA là nó có thể diễn giải được và hoạt động tốt trên các tập dữ liệu nhỏ.

Một điều khác cần xem xét trong trường hợp này là HCA là một không giám sát thuật toán. Khi nhóm dữ liệu, chúng tôi sẽ không có cách nào để xác minh rằng chúng tôi đang xác định chính xác rằng người dùng thuộc một nhóm cụ thể (chúng tôi không biết các nhóm). Không có nhãn để chúng tôi so sánh kết quả của chúng tôi với. Nếu chúng tôi xác định đúng các nhóm, điều này sẽ được bộ phận tiếp thị xác nhận sau đó hàng ngày (được đo lường bằng các chỉ số như ROI, tỷ lệ chuyển đổi, v.v.).

Bây giờ chúng tôi đã hiểu vấn đề chúng tôi đang cố gắng giải quyết và cách giải quyết nó, chúng tôi có thể bắt đầu xem xét dữ liệu của chúng tôi!

Phân tích dữ liệu khám phá ngắn gọn

Lưu ý: Bạn có thể tải xuống tập dữ liệu được sử dụng trong hướng dẫn này tại đây.

Sau khi tải xuống tập dữ liệu, hãy lưu ý rằng nó là CSV (các giá trị được phân tách bằng dấu phẩy) tệp được gọi là shopping-data.csv. Để giúp khám phá và thao tác dữ liệu dễ dàng hơn, chúng tôi sẽ tải dữ liệu đó vào DataFrame sử dụng gấu trúc:

import pandas as pd


path_to_file = 'home/projects/datasets/shopping-data.csv'
customer_data = pd.read_csv(path_to_file)

Tiếp thị cho biết họ đã thu thập được 200 hồ sơ khách hàng. Chúng tôi có thể kiểm tra xem dữ liệu đã tải xuống có đầy đủ 200 hàng hay không bằng cách sử dụng shape thuộc tính. Nó sẽ cho chúng ta biết chúng ta có bao nhiêu hàng và cột, tương ứng:

customer_data.shape

Kết quả này trong:

(200, 5)

Tuyệt quá! Dữ liệu của chúng tôi hoàn chỉnh với 200 hàng (hồ sơ khách hàng) và chúng tôi cũng có 5 cột (Tính năng, đặc điểm). Để xem bộ phận tiếp thị đã thu thập được những đặc điểm nào từ khách hàng, chúng ta có thể xem các tên cột có columns thuộc tính. Để làm điều đó, hãy thực hiện:

customer_data.columns

Tập lệnh trên trả về:

Index(['CustomerID', 'Genre', 'Age', 'Annual Income (k$)',
       'Spending Score (1-100)'],
      dtype='object')

Ở đây, chúng tôi thấy rằng hoạt động tiếp thị đã tạo ra CustomerID, tập hợp Genre, Age, Annual Income (tính bằng hàng nghìn đô la), và Spending Score tăng từ 1 đến 100 cho mỗi 200 khách hàng. Khi được yêu cầu làm rõ, họ nói rằng các giá trị trong Spending Score cột biểu thị tần suất một người tiêu tiền vào trung tâm mua sắm trên thang điểm từ 1 đến 100. Nói cách khác, nếu khách hàng có điểm 0, người này không bao giờ tiêu tiền và nếu điểm là 100, chúng tôi đã phát hiện ra người chi tiêu cao nhất.

Hãy xem nhanh sự phân bổ của điểm số này để kiểm tra thói quen chi tiêu của người dùng trong tập dữ liệu của chúng tôi. Đó là nơi gấu trúc hist() phương pháp đi kèm để trợ giúp:

customer_data['Spending Score (1-100)'].hist()

img

Bằng cách nhìn vào biểu đồ, chúng tôi thấy rằng hơn 35 khách hàng có điểm số giữa 4060, thì dưới 25 có điểm giữa 7080. Vì vậy, hầu hết khách hàng của chúng tôi là người chi tiêu cân bằng, tiếp theo là những người chi tiêu từ trung bình đến cao. Chúng ta cũng có thể thấy rằng có một dòng sau 0, ở bên trái của phân phối và một dòng khác trước 100, ở bên phải của phân phối. Những khoảng trống này có thể có nghĩa là bản phân phối không chứa những người không chi tiêu, sẽ có điểm là 0và cũng không có người chi tiêu cao với số điểm 100.

Để xác minh xem điều đó có đúng không, chúng ta có thể xem xét các giá trị tối thiểu và tối đa của phân phối. Có thể dễ dàng tìm thấy những giá trị đó như một phần của thống kê mô tả, vì vậy chúng tôi có thể sử dụng describe() phương pháp để hiểu về các phân phối giá trị số khác:


customer_data.describe().transpose()

Điều này sẽ cung cấp cho chúng tôi một bảng từ đó chúng tôi có thể đọc các bản phân phối của các giá trị khác trong tập dữ liệu của chúng tôi:

 						count 	mean 	std 		min 	25% 	50% 	75% 	max
CustomerID 				200.0 	100.50 	57.879185 	1.0 	50.75 	100.5 	150.25 	200.0
Age 					200.0 	38.85 	13.969007 	18.0 	28.75 	36.0 	49.00 	70.0
Annual Income (k$) 		200.0 	60.56 	26.264721 	15.0 	41.50 	61.5 	78.00 	137.0
Spending Score (1-100) 	200.0 	50.20 	25.823522 	1.0 	34.75 	50.0 	73.00 	99.0

Giả thuyết của chúng tôi được xác nhận. Các min giá trị của Spending Score is 1 và tối đa là 99. Vì vậy, chúng tôi không có 0 or 100 điểm số người chi tiêu. Sau đó, chúng ta hãy xem xét các cột khác của describe bàn. Khi nhìn vào meanstd , chúng ta có thể thấy điều đó cho Age các mean is 38.85std khoảng 13.97. Điều tương tự cũng xảy ra đối với Annual Income, Với một mean of 60.56std 26.26, Và cho Spending Score với một mean of 50std of 25.82. Đối với tất cả các tính năng, mean khác xa so với độ lệch chuẩn, cho thấy dữ liệu của chúng tôi có độ thay đổi cao.

Để hiểu rõ hơn về cách dữ liệu của chúng tôi thay đổi, hãy vẽ biểu đồ Annual Income phân phối:

customer_data['Annual Income (k$)'].hist()

Điều đó sẽ cung cấp cho chúng tôi:

img

Lưu ý trong biểu đồ rằng hầu hết dữ liệu của chúng tôi, hơn 35 khách hàng, tập trung gần số 60, trên của chúng tôi mean, theo trục ngang. Nhưng điều gì sẽ xảy ra khi chúng ta tiến về phía cuối của sự phân phối? Khi đi về phía bên trái, từ giá trị trung bình $60.560, giá trị tiếp theo chúng ta sẽ gặp là $34.300 – giá trị trung bình ($60.560) trừ đi biến thể tiêu chuẩn ($26.260). Nếu chúng ta đi xa hơn về phía bên trái của phân phối dữ liệu, một quy tắc tương tự sẽ được áp dụng, chúng ta sẽ trừ biến thể tiêu chuẩn ($26.260) khỏi giá trị hiện tại ($34.300). Do đó, chúng ta sẽ gặp giá trị là $8.040. Hãy chú ý xem dữ liệu của chúng tôi đã tăng nhanh chóng từ $60k lên $8k như thế nào. Nó đang “nhảy” $26.260 mỗi lần – thay đổi rất nhiều và đó là lý do tại sao chúng tôi có mức độ biến động cao như vậy.

img

Sự thay đổi và kích thước của dữ liệu rất quan trọng trong phân tích phân cụm vì các phép đo khoảng cách của hầu hết các thuật toán phân cụm đều nhạy cảm với cường độ dữ liệu. Sự khác biệt về kích thước có thể thay đổi kết quả phân nhóm bằng cách làm cho một điểm có vẻ gần hơn hoặc xa hơn với điểm khác so với thực tế, làm sai lệch việc nhóm dữ liệu thực tế.

Cho đến nay, chúng tôi đã thấy hình dạng dữ liệu của mình, một số phân phối của nó và thống kê mô tả. Với Pandas, chúng tôi cũng có thể liệt kê các loại dữ liệu của mình và xem liệu tất cả 200 hàng của chúng tôi đã được lấp đầy hoặc có một số null các giá trị:

customer_data.info()

Kết quả này trong:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 200 entries, 0 to 199
Data columns (total 5 columns):
 #   Column                  Non-Null Count  Dtype 
---  ------                  --------------  ----- 
 0   CustomerID              200 non-null    int64 
 1   Genre                   200 non-null    object
 2   Age                     200 non-null    int64 
 3   Annual Income (k$)      200 non-null    int64 
 4   Spending Score (1-100)  200 non-null    int64 
dtypes: int64(4), object(1)
memory usage: 7.9+ KB

Ở đây, chúng ta có thể thấy rằng không có null giá trị trong dữ liệu và chúng tôi chỉ có một cột phân loại - Genre. Ở giai đoạn này, điều quan trọng là chúng ta phải lưu ý những tính năng nào có vẻ thú vị để được thêm vào mô hình phân cụm. Nếu chúng tôi muốn thêm cột Thể loại vào mô hình của mình, chúng tôi sẽ cần chuyển đổi các giá trị của nó từ phân loại đến số học.

Hãy xem cách Genre được lấp đầy bằng cách xem nhanh 5 giá trị đầu tiên trong dữ liệu của chúng tôi:

customer_data.head() 

Kết quả này trong:

    CustomerID 	Genre 	Age 	Annual Income (k$) 	Spending Score (1-100)
0 	1 			Male 	19 		15 					39
1 	2 			Male 	21 		15 					81
2 	3 			Female 	20 		16 					6
3 	4 			Female 	23 		16 					77
4 	5 			Female 	31 		17 					40

Dường như nó chỉ có FemaleMale Thể loại. Chúng ta có thể chắc chắn điều đó bằng cách xem xét các giá trị độc đáo của nó với unique:

customer_data['Genre'].unique()

Điều này xác nhận giả định của chúng tôi:

array(['Male', 'Female'], dtype=object)

Cho đến nay, chúng tôi biết rằng chúng tôi chỉ có hai thể loại, nếu chúng tôi định sử dụng tính năng này trên mô hình của mình, Male có thể được chuyển đổi thành 0Female đến 1. Việc kiểm tra tỷ lệ giữa các thể loại cũng rất quan trọng, xem chúng có cân đối không. Chúng tôi có thể làm điều đó với value_counts() phương pháp và đối số của nó normalize=True để hiển thị phần trăm giữa MaleFemale:

customer_data['Genre'].value_counts(normalize=True)

Kết quả này cho ra:

Female    0.56
Male      0.44
Name: Genre, dtype: float64

Chúng tôi có 56% phụ nữ trong bộ dữ liệu và 44% nam giới. Sự khác biệt giữa chúng chỉ là 16% và dữ liệu của chúng tôi không phải là 50/50 mà là đủ cân bằng không để gây ra bất kỳ rắc rối. Nếu kết quả là 70/30, 60/40, thì có thể cần phải thu thập thêm dữ liệu hoặc sử dụng một số loại kỹ thuật tăng dữ liệu để làm cho tỷ lệ đó cân bằng hơn.

Cho đến nay, tất cả các tính năng nhưng Age, đã được khám phá ngắn gọn. Trong những mối quan tâm Age, điều thú vị là chia nó thành các thùng để có thể phân khúc khách hàng dựa trên nhóm tuổi của họ. Nếu chúng tôi làm điều đó, chúng tôi sẽ cần phải chuyển đổi các danh mục tuổi thành một số trước khi thêm chúng vào mô hình của mình. Bằng cách đó, thay vì sử dụng danh mục trong 15-20 năm, chúng tôi sẽ tính xem có bao nhiêu khách hàng trong 15-20 danh mục và đó sẽ là một số trong một cột mới được gọi là 15-20.

Khuyên bảo: Trong hướng dẫn này, chúng tôi chỉ trình bày phân tích dữ liệu khám phá ngắn gọn. Nhưng bạn có thể đi xa hơn và bạn nên đi xa hơn. Bạn có thể xem liệu có sự khác biệt về thu nhập và sự khác biệt về điểm số dựa trên thể loại và độ tuổi. Điều này không chỉ làm phong phú thêm phân tích mà còn dẫn đến kết quả mô hình tốt hơn. Để đi sâu hơn vào Phân tích dữ liệu khám phá, hãy xem Chương EDA trong “Dự đoán giá trực tiếp tại nhà - Học máy bằng Python" Dự án có hướng dẫn.

Sau khi phỏng đoán về những gì có thể được thực hiện với cả phân loại - hoặc phân loại - GenreAge , hãy áp dụng những gì đã được thảo luận.

Mã hóa các biến và kỹ thuật tính năng

Hãy bắt đầu bằng cách chia Age thành các nhóm khác nhau trong 10, để chúng ta có 20-30, 30-40, 40-50, v.v. Vì khách hàng trẻ nhất của chúng tôi là 15 tuổi, nên chúng tôi có thể bắt đầu ở tuổi 15 và kết thúc ở tuổi 70, đây là độ tuổi của khách hàng lớn tuổi nhất trong dữ liệu. Bắt đầu từ 15 và kết thúc ở 70, chúng ta sẽ có các khoảng thời gian 15-20, 20-30, 30-40, 40-50, 50-60 và 60-70.

Để nhóm hoặc bin Age các giá trị trong các khoảng thời gian này, chúng tôi có thể sử dụng Pandas cut() phương pháp cắt chúng thành các thùng và sau đó gán các thùng vào một Age Groups cột:

intervals = [15, 20, 30, 40, 50, 60, 70]
col = customer_data['Age']
customer_data['Age Groups'] = pd.cut(x=col, bins=intervals)


customer_data['Age Groups'] 

Kết quả này trong:

0      (15, 20]
1      (20, 30]
2      (15, 20]
3      (20, 30]
4      (30, 40]
         ...   
195    (30, 40]
196    (40, 50]
197    (30, 40]
198    (30, 40]
199    (20, 30]
Name: Age Groups, Length: 200, dtype: category
Categories (6, interval[int64, right]): [(15, 20] < (20, 30] < (30, 40] < (40, 50] < (50, 60] < (60, 70]]

Lưu ý rằng khi nhìn vào các giá trị cột, cũng có một dòng cho biết chúng ta có 6 danh mục và hiển thị tất cả các khoảng dữ liệu được phân loại. Bằng cách này, chúng tôi đã phân loại dữ liệu số trước đây của mình và tạo Age Groups tính năng này.

Và chúng ta có bao nhiêu khách hàng trong mỗi loại? Chúng ta có thể nhanh chóng biết điều đó bằng cách nhóm cột và đếm các giá trị với groupby()count():

customer_data.groupby('Age Groups')['Age Groups'].count()

Kết quả này trong:

Age Groups
(15, 20]    17
(20, 30]    45
(30, 40]    60
(40, 50]    38
(50, 60]    23
(60, 70]    17
Name: Age Groups, dtype: int64

Có thể dễ dàng nhận ra rằng hầu hết khách hàng ở độ tuổi từ 30 đến 40, tiếp theo là khách hàng từ 20 đến 30 và sau đó là khách hàng từ 40 đến 50. Đây cũng là một thông tin tốt cho bộ phận Marketing.

Hiện tại, chúng tôi có hai biến phân loại, AgeGenre, chúng ta cần chuyển đổi thành số để có thể sử dụng trong mô hình của mình. Có nhiều cách khác nhau để thực hiện chuyển đổi đó - chúng tôi sẽ sử dụng Gấu trúc get_dummies() phương pháp tạo một cột mới cho từng khoảng thời gian và thể loại, sau đó điền các giá trị của nó bằng 0 và 1 - loại thao tác này được gọi là mã hóa một nóng. Hãy xem nó trông như thế nào:


customer_data_oh = pd.get_dummies(customer_data)

customer_data_oh 

Điều này sẽ cho chúng tôi biết trước bảng kết quả:

img

Với kết quả đầu ra, có thể dễ dàng nhận thấy rằng cột Genre được chia thành các cột - Genre_FemaleGenre_Male. Khi khách hàng là nữ, Genre_Female bằng 1và khi khách hàng là nam giới, nó tương đương với 0.

Ngoài ra, Age Groups cột được chia thành 6 cột, một cột cho mỗi khoảng thời gian, chẳng hạn như Age Groups_(15, 20], Age Groups_(20, 30], và như thế. Cùng một cách Genre, khi khách hàng 18 tuổi, Age Groups_(15, 20] giá trị là 1 và giá trị của tất cả các cột khác là 0.

Sản phẩm lợi thế của mã hóa một lần là sự đơn giản trong việc biểu diễn các giá trị cột, dễ hiểu điều gì đang xảy ra - trong khi bất lợi là bây giờ chúng tôi đã tạo thêm 8 cột, để tổng hợp với các cột chúng tôi đã có.

Cảnh báo: Nếu bạn có tập dữ liệu trong đó số cột được mã hóa một nóng vượt quá số hàng, tốt nhất là sử dụng phương pháp mã hóa khác để tránh các vấn đề về kích thước dữ liệu.

Mã hóa một nóng cũng thêm số 0 vào dữ liệu của chúng tôi, làm cho dữ liệu trở nên thưa thớt hơn, đây có thể là vấn đề đối với một số thuật toán nhạy cảm với sự thưa thớt dữ liệu.

Đối với nhu cầu phân nhóm của chúng tôi, mã hóa một nóng dường như hoạt động. Nhưng chúng tôi có thể vẽ biểu đồ dữ liệu để xem liệu có thực sự có các nhóm riêng biệt để chúng tôi phân cụm hay không.

Vẽ đồ thị cơ bản và giảm kích thước

Tập dữ liệu của chúng tôi có 11 cột và có một số cách để chúng tôi có thể hình dung dữ liệu đó. Cách đầu tiên là vẽ nó theo 10 chiều (chúc bạn may mắn với điều đó). Mười vì Customer_ID cột không được xem xét. Cách thứ hai là bằng cách vẽ các đặc điểm số ban đầu của chúng tôi và cách thứ ba là bằng cách chuyển 10 đối tượng địa lý của chúng tôi thành 2 - do đó, thực hiện giảm kích thước.

Vẽ từng cặp dữ liệu

Vì việc vẽ 10 thứ nguyên là một chút không thể, chúng tôi sẽ chọn thực hiện với cách tiếp cận thứ hai - chúng tôi sẽ vẽ các đặc điểm ban đầu của chúng tôi. Chúng tôi có thể chọn hai trong số chúng để phân tích nhóm của chúng tôi. Một cách chúng ta có thể thấy tất cả các cặp dữ liệu của chúng ta được kết hợp là với Seaborn pairplot():

import seaborn as sns


customer_data = customer_data.drop('CustomerID', axis=1)

sns.pairplot(customer_data)

Hiển thị:

img

Trong nháy mắt, chúng ta có thể phát hiện ra các biểu đồ phân tán dường như có các nhóm dữ liệu. Một điều có vẻ thú vị là biểu đồ phân tán kết hợp Annual IncomeSpending Score. Lưu ý rằng không có sự phân tách rõ ràng giữa các biểu đồ phân tán biến khác. Nhiều nhất, chúng ta có thể nói rằng có hai nồng độ điểm khác nhau trong Spending Score vs Age phân tán.

Cả hai biểu đồ phân tán bao gồm Annual IncomeSpending Score về cơ bản là giống nhau. Chúng ta có thể thấy nó hai lần vì trục x và y đã được hoán đổi. Bằng cách xem xét bất kỳ nhóm nào trong số họ, chúng ta có thể thấy những gì dường như là năm nhóm khác nhau. Hãy vẽ sơ đồ hai tính năng đó với Seaborn scatterplot() để xem xét kỹ hơn:

sns.scatterplot(x=customer_data['Annual Income (k$)'],
                y=customer_data['Spending Score (1-100)'])

img

Bằng cách quan sát kỹ hơn, chúng ta chắc chắn có thể phân biệt được 5 nhóm dữ liệu khác nhau. Có vẻ như khách hàng của chúng tôi có thể được tập hợp lại dựa trên số tiền họ kiếm được trong một năm và số tiền họ chi tiêu. Đây là một điểm có liên quan khác trong phân tích của chúng tôi. Điều quan trọng là chúng tôi chỉ xem xét hai tính năng để phân nhóm khách hàng của chúng tôi. Bất kỳ thông tin nào khác mà chúng tôi có về chúng không được đưa vào phương trình. Điều này mang lại ý nghĩa phân tích - nếu chúng ta biết khách hàng kiếm được và chi tiêu bao nhiêu, chúng ta có thể dễ dàng tìm thấy những điểm tương đồng mà chúng ta cần.

img

Thật tuyệt! Cho đến nay, chúng ta đã có hai biến để xây dựng mô hình của mình. Bên cạnh những gì điều này thể hiện, nó cũng làm cho mô hình trở nên đơn giản hơn, dễ hiểu hơn và dễ giải thích hơn.

Xem hướng dẫn thực hành, thực tế của chúng tôi để học Git, với các phương pháp hay nhất, các tiêu chuẩn được ngành công nghiệp chấp nhận và bảng lừa đảo đi kèm. Dừng lệnh Googling Git và thực sự học nó!

Lưu ý: Khoa học dữ liệu thường ủng hộ các phương pháp tiếp cận đơn giản nhất có thể. Không chỉ vì nó dễ giải thích hơn cho doanh nghiệp, mà còn vì nó trực tiếp hơn - với 2 tính năng và một mô hình có thể giải thích được, rõ ràng mô hình đó đang làm gì và hoạt động như thế nào.

Lập sơ đồ dữ liệu sau khi sử dụng PCA

Có vẻ như cách tiếp cận thứ hai của chúng tôi có lẽ là tốt nhất, nhưng chúng ta hãy cũng xem xét cách tiếp cận thứ ba của chúng tôi. Nó có thể hữu ích khi chúng ta không thể vẽ biểu đồ dữ liệu vì nó có quá nhiều thứ nguyên hoặc khi không có nồng độ dữ liệu hoặc sự phân tách rõ ràng theo nhóm. Khi những tình huống đó xảy ra, bạn nên thử giảm thứ nguyên dữ liệu bằng một phương pháp được gọi là Phân tích thành phần chính (PCA).

Lưu ý: Hầu hết mọi người sử dụng PCA để giảm kích thước trước khi hình dung. Có những phương pháp khác giúp trực quan hóa dữ liệu trước khi phân cụm, chẳng hạn như Phân cụm không gian dựa trên mật độ của các ứng dụng có tiếng ồn (DBSCAN)Bản đồ tự tổ chức (SOM) phân cụm. Cả hai đều là thuật toán phân cụm, nhưng cũng có thể được sử dụng để trực quan hóa dữ liệu. Vì phân tích phân cụm không có tiêu chuẩn vàng, điều quan trọng là phải so sánh các hình dung khác nhau và các thuật toán khác nhau.

PCA sẽ giảm kích thước dữ liệu của chúng tôi trong khi cố gắng lưu giữ càng nhiều thông tin càng tốt. Đầu tiên chúng ta hãy tìm hiểu về cách PCA hoạt động, sau đó chúng ta có thể chọn số lượng thứ nguyên dữ liệu mà chúng ta sẽ giảm dữ liệu của mình xuống.

Đối với mỗi cặp tính năng, PCA xem liệu các giá trị lớn hơn của một biến có tương ứng với các giá trị lớn hơn của biến kia hay không và nó cũng thực hiện tương tự đối với các giá trị nhỏ hơn. Vì vậy, về cơ bản nó tính toán mức độ thay đổi của các giá trị tính năng đối với nhau - chúng tôi gọi đó là hiệp phương sai. Những kết quả đó sau đó được sắp xếp thành một ma trận, thu được ma trận hiệp phương sai.

Sau khi nhận được ma trận hiệp phương sai, PCA cố gắng tìm ra sự kết hợp tuyến tính của các đặc điểm giải thích nó tốt nhất - nó phù hợp với các mô hình tuyến tính cho đến khi xác định được mô hình giải thích được ma trận đó. tối đa số lượng phương sai.

Chú thích: PCA là một phép biến đổi tuyến tính và độ tuyến tính nhạy cảm với quy mô dữ liệu. Do đó, PCA hoạt động tốt nhất khi tất cả các giá trị dữ liệu trên cùng một thang đo. Điều này có thể được thực hiện bằng cách trừ đi cột nghĩa là từ các giá trị của nó và chia kết quả cho độ lệch chuẩn của nó. Cái đó được gọi là tiêu chuẩn hóa dữ liệu. Trước khi sử dụng PCA, hãy đảm bảo dữ liệu được chia tỷ lệ! Nếu bạn không chắc chắn về cách thực hiện, hãy đọc “Dữ liệu chia tỷ lệ tính năng với Scikit-Learn cho Máy học bằng Python”!

Với đường tốt nhất (kết hợp tuyến tính) được tìm thấy, PCA nhận được hướng của các trục của nó, được gọi là người di cưvà các hệ số tuyến tính của nó, giá trị riêng. Sự kết hợp của eigenvector và eigenvalue - hoặc hướng trục và hệ số - là Thành phần chủ yếu của PCA. Và đó là khi chúng ta có thể chọn số thứ nguyên của mình dựa trên phương sai được giải thích của từng đối tượng địa lý, bằng cách hiểu các thành phần chính mà chúng ta muốn giữ lại hoặc loại bỏ dựa trên mức độ phương sai mà chúng giải thích.

Sau khi có được các thành phần chính, PCA sử dụng các eigenvectors để tạo thành một vectơ các đặc trưng định hướng lại dữ liệu từ các trục ban đầu đến các trục được đại diện bởi các thành phần chính - đó là cách giảm kích thước dữ liệu.

Lưu ý: Một chi tiết quan trọng cần xem xét ở đây là, do tính chất tuyến tính của nó, PCA sẽ tập trung hầu hết các phương sai được giải thích trong các thành phần chính đầu tiên. Vì vậy, khi nhìn vào phương sai được giải thích, thường thì hai thành phần đầu tiên của chúng ta sẽ đủ. Nhưng điều đó có thể gây hiểu lầm trong một số trường hợp - vì vậy hãy cố gắng tiếp tục so sánh các âm mưu và thuật toán khác nhau khi phân cụm để xem liệu chúng có mang lại kết quả tương tự hay không.

Trước khi áp dụng PCA, chúng ta cần lựa chọn giữa các Age cột hoặc Age Groups trong dữ liệu được mã hóa một lần trước đây của chúng tôi. Vì cả hai cột đại diện cho cùng một thông tin, việc giới thiệu nó hai lần sẽ ảnh hưởng đến phương sai dữ liệu của chúng tôi. Nếu Age Groups cột được chọn, chỉ cần xóa Age cột sử dụng gấu trúc drop() và gán lại nó cho customer_data_oh biến:

customer_data_oh = customer_data_oh.drop(['Age'], axis=1)
customer_data_oh.shape 

Bây giờ dữ liệu của chúng tôi có 10 cột, có nghĩa là chúng tôi có thể lấy một thành phần chính theo cột và chọn số lượng chúng tôi sẽ sử dụng bằng cách đo lường mức độ giới thiệu một thứ nguyên mới giải thích nhiều hơn phương sai dữ liệu của chúng tôi.

Hãy làm điều đó với Scikit-Learn PCA. Chúng tôi sẽ tính toán phương sai được giải thích của từng thứ nguyên, được đưa ra bởi explained_variance_ratio_ và sau đó xem xét tổng tích lũy của chúng với cumsum() :

from sklearn.decomposition import PCA

pca = PCA(n_components=10)
pca.fit_transform(customer_data_oh)
pca.explained_variance_ratio_.cumsum()

Các phương sai được giải thích tích lũy của chúng tôi là:

array([0.509337  , 0.99909504, 0.99946364, 0.99965506, 0.99977937,
       0.99986848, 0.99993716, 1.        , 1.        , 1.        ])

Chúng ta có thể thấy rằng thứ nguyên đầu tiên giải thích 50% dữ liệu và khi kết hợp với thứ nguyên thứ hai, chúng giải thích 99% phần trăm. Điều này có nghĩa là 2 thứ nguyên đầu tiên đã giải thích 99% dữ liệu của chúng tôi. Vì vậy, chúng ta có thể áp dụng PCA với 2 thành phần, lấy các thành phần chính của chúng ta và vẽ biểu đồ của chúng:

from sklearn.decomposition import PCA

pca = PCA(n_components=2)
pcs = pca.fit_transform(customer_data_oh)

pc1_values = pcs[:,0]
pc2_values = pcs[:,1]
sns.scatterplot(x=pc1_values, y=pc2_values)

img

Biểu đồ dữ liệu sau PCA rất giống với biểu đồ chỉ sử dụng hai cột dữ liệu mà không có PCA. Lưu ý rằng các điểm đang hình thành nhóm gần nhau hơn và tập trung hơn một chút sau PCA so với trước đây.

img

Hình dung cấu trúc phân cấp với các biểu đồ

Cho đến nay, chúng tôi đã khám phá dữ liệu, các cột phân loại được mã hóa một lần, quyết định cột nào phù hợp để phân nhóm và giảm kích thước dữ liệu. Các biểu đồ chỉ ra rằng chúng tôi có 5 cụm trong dữ liệu của mình, nhưng cũng có một cách khác để hình dung mối quan hệ giữa các điểm của chúng tôi và giúp xác định số lượng cụm - bằng cách tạo chương trình dendro (thường bị sai chính tả là dendogram). dendro có nghĩa cây trong Latin.

Sản phẩm chương trình dendro là kết quả của việc liên kết các điểm trong một tập dữ liệu. Nó là một đại diện trực quan của quá trình phân cụm phân cấp. Và quy trình phân cụm phân cấp hoạt động như thế nào? Chà… điều đó còn tùy - có thể một câu trả lời bạn đã nghe nhiều trong Khoa học dữ liệu.

Hiểu phân cụm phân cấp

Khi Thuật toán phân cụm phân cấp (HCA) bắt đầu liên kết các điểm và tìm các cụm, trước tiên nó có thể chia các điểm thành 2 nhóm lớn, sau đó chia mỗi nhóm đó thành 2 nhóm nhỏ hơn, có tổng cộng 4 nhóm, đó là phân chiatừ trên xuống tiếp cận.

Ngoài ra, nó có thể làm ngược lại - nó có thể xem xét tất cả các điểm dữ liệu, tìm 2 điểm gần nhau hơn, liên kết chúng và sau đó tìm các điểm khác gần nhất với các điểm được liên kết đó và tiếp tục xây dựng 2 nhóm từ từ dưới lên. Cái nào là kết lại cách tiếp cận chúng tôi sẽ phát triển.

Các bước để thực hiện phân cụm phân cấp tổng hợp

Để làm cho cách tiếp cận tích tụ trở nên rõ ràng, có các bước Phân cụm phân cấp tổng hợp (AHC) thuật toán:

  1. Khi bắt đầu, hãy coi mỗi điểm dữ liệu là một cụm. Do đó, số lượng cụm khi bắt đầu sẽ là K - trong khi K là số nguyên đại diện cho số điểm dữ liệu.
  2. Tạo thành một cụm bằng cách nối hai điểm dữ liệu gần nhất dẫn đến cụm K-1.
  3. Tạo thành nhiều cụm hơn bằng cách nối hai cụm gần nhất dẫn đến cụm K-2.
  4. Lặp lại ba bước trên cho đến khi một cụm lớn được hình thành.

Chú thích: Để đơn giản hóa, chúng tôi đang nói "hai điểm dữ liệu gần nhất" trong bước 2 và 3. Nhưng có nhiều cách liên kết các điểm hơn như chúng ta sẽ thấy trong một chút.

Nếu bạn đảo ngược các bước của thuật toán ACH, từ 4 thành 1 – đó sẽ là các bước để *Phân cụm phân chia thứ bậc (DHC) *.

Lưu ý rằng các HCA có thể là phân chia và từ trên xuống, hoặc kết tụ và từ dưới lên. Cách tiếp cận DHC từ trên xuống hoạt động tốt nhất khi bạn có ít cụm hơn, nhưng lớn hơn, do đó, nó đắt hơn về mặt tính toán. Mặt khác, cách tiếp cận AHC từ dưới lên được phù hợp khi bạn có nhiều cụm nhỏ hơn. Nó đơn giản hơn về mặt tính toán, được sử dụng nhiều hơn và sẵn có hơn.

Lưu ý: Dù từ trên xuống hoặc từ dưới lên, biểu diễn dendrogram của quá trình phân cụm sẽ luôn bắt đầu bằng phép chia làm hai và kết thúc với mỗi điểm riêng lẻ được phân biệt, một khi cấu trúc cơ bản của nó là cây nhị phân.

Hãy vẽ biểu đồ dendrogram dữ liệu khách hàng của chúng tôi để trực quan hóa các mối quan hệ phân cấp của dữ liệu. Lần này, chúng tôi sẽ sử dụng scipy thư viện để tạo dendrogram cho tập dữ liệu của chúng tôi:

import scipy.cluster.hierarchy as shc
import matplotlib.pyplot as plt

plt.figure(figsize=(10, 7))
plt.title("Customers Dendrogram")


selected_data = customer_data_oh.iloc[:, 1:3]
clusters = shc.linkage(selected_data, 
            method='ward', 
            metric="euclidean")
shc.dendrogram(Z=clusters)
plt.show()

Đầu ra của tập lệnh trông giống như sau:

img

Trong đoạn mã ở trên, chúng tôi đã tạo các cụm và cụm con với các điểm của chúng tôi, xác định cách các điểm của chúng tôi sẽ liên kết (bằng cách áp dụng ward phương pháp) và cách đo khoảng cách giữa các điểm (bằng cách sử dụng euclidean Hệ mét).

Với sơ đồ của dendrogram, có thể hình dung các quá trình được mô tả của DHC và AHC. Để hình dung cách tiếp cận từ trên xuống, hãy bắt đầu từ phần trên cùng của biểu đồ dendrogram và đi xuống, và làm ngược lại, bắt đầu xuống và di chuyển lên trên để hình dung cách tiếp cận từ dưới lên.

Phương thức liên kết

Có rất nhiều phương pháp liên kết khác, bằng cách hiểu thêm về cách thức hoạt động của chúng, bạn sẽ có thể chọn một phương pháp phù hợp với nhu cầu của mình. Bên cạnh đó, mỗi người trong số họ sẽ mang lại kết quả khác nhau khi áp dụng. Không có quy tắc cố định trong phân tích phân cụm, nếu có thể, hãy nghiên cứu bản chất của vấn đề để xem cách nào phù hợp nhất với nó, thử nghiệm các phương pháp khác nhau và kiểm tra kết quả.

Một số phương pháp liên kết là:

  • Liên kết đơn: Còn được gọi là Người hàng xóm gần nhất (NN). Khoảng cách giữa các cụm được xác định bởi khoảng cách giữa các thành viên gần nhất của chúng.

img

  • Liên kết hoàn chỉnh: Còn được gọi là Người hàng xóm xa nhất (FN), Thuật toán điểm xa nhất, hoặc là Thuật toán Voor Hees. Khoảng cách giữa các cụm được xác định bằng khoảng cách giữa các thành viên xa nhất của chúng. Phương pháp này tốn kém về mặt tính toán.

img

  • Liên kết trung bình: cũng được biết đến như là UPGMA (Phương pháp nhóm cặp không trọng số với trung bình số học). Tỷ lệ phần trăm số điểm của mỗi cụm được tính so với số điểm của hai cụm nếu chúng được hợp nhất.

img

  • Liên kết có trọng số: cũng được biết đến như là WPGMA (Phương pháp nhóm cặp có trọng số với trung bình số học). Các điểm riêng lẻ của hai cụm đóng góp vào khoảng cách tổng hợp giữa một cụm nhỏ hơn và một cụm lớn hơn.
  • Liên kết trung tâm: Còn được gọi là UPGMC (Phương pháp nhóm cặp không trọng số sử dụng Centroid). Một điểm được xác định bằng giá trị trung bình của tất cả các điểm (centroid) được tính cho mỗi cụm và khoảng cách giữa các cụm là khoảng cách giữa các tâm tương ứng của chúng.

img

  • Liên kết phường: Cũng được biết đến như là MISSQ (Mức tăng tối thiểu của tổng bình phương). Nó chỉ định khoảng cách giữa hai cụm, tính toán tổng sai số bình phương (ESS) và liên tiếp chọn các cụm tiếp theo dựa trên ESS nhỏ hơn. Phương pháp của Ward tìm cách giảm thiểu sự gia tăng của ESS ở mỗi bước. Do đó, giảm thiểu sai sót.

img

Số liệu Khoảng cách

Bên cạnh liên kết, chúng tôi cũng có thể chỉ định một số chỉ số khoảng cách được sử dụng nhiều nhất:

  • Euclide: Còn được gọi là Pitago hoặc đường thẳng khoảng cách. Nó tính toán khoảng cách giữa hai điểm trong không gian, bằng cách đo độ dài của một đoạn thẳng đi qua giữa chúng. Nó sử dụng định lý Pitago và giá trị khoảng cách là kết quả (c) của phương trình:

$$
c ^ 2 = a ^ 2 + b ^ 2
$$

  • Manhattan: còn được gọi là City-block, Taxi khoảng cách. Nó là tổng của sự khác biệt tuyệt đối giữa các số đo trong tất cả các chiều của hai điểm. Nếu các kích thước đó là hai, nó tương tự như việc rẽ phải rồi rẽ trái khi đi một khối.

img

  • chồn: nó là tổng quát của cả hai khoảng cách Euclidean và Manhattan. Đó là một cách để tính toán khoảng cách dựa trên sự khác biệt tuyệt đối với thứ tự của chỉ số Minkowski p. Mặc dù nó được định nghĩa cho bất kỳ p> 0, nó hiếm khi được sử dụng cho các giá trị khác 1, 2 và ∞ (vô hạn). Khoảng cách Minkowski bằng với khoảng cách Manhattan khi p = 1, và giống như khoảng cách Euclide khi p = 2.

$$
Dleft (X, Yright) = left (sum_ {i = 1} ^ n | x_i-y_i | ^ pright) ^ {frac {1} {p}}
$$

img

  • Chebyshev: cũng được biết đến như là Bàn cờ khoảng cách. Đó là trường hợp cực đoan của khoảng cách Minkowski. Khi chúng ta sử dụng vô cực làm giá trị của tham số p (p = ∞), chúng tôi kết thúc với một số liệu xác định khoảng cách là chênh lệch tuyệt đối lớn nhất giữa các tọa độ.
  • Cô sin: nó là khoảng cách cosin góc giữa hai dãy điểm, hoặc vectơ. Tính tương tự cosine là tích số chấm của các vectơ chia cho tích độ dài của chúng.
  • Jaccard: đo sự giống nhau giữa các tập hợp điểm hữu hạn. Nó được định nghĩa là tổng số điểm (cardinality) trong các điểm chung trong mỗi tập hợp (giao điểm), chia cho tổng số điểm (cardinality) của tổng số điểm của cả hai tập hợp (liên hiệp).
  • Jensen-Shannon: dựa trên sự phân kỳ Kullback-Leibler. Nó xem xét các phân bố xác suất của các điểm và đo lường sự giống nhau giữa các phân bố đó. Nó là một phương pháp phổ biến của lý thuyết xác suất và thống kê.

Chúng ta đã chọn Khu vựcEuclide cho dendrogram vì chúng là phương pháp và thước đo được sử dụng phổ biến nhất. Chúng thường cho kết quả tốt vì Ward liên kết các điểm dựa trên việc giảm thiểu sai số và Euclidean hoạt động tốt ở các kích thước thấp hơn.

Trong ví dụ này, chúng tôi đang làm việc với hai tính năng (cột) của dữ liệu tiếp thị và 200 quan sát hoặc hàng. Vì số lượng quan sát lớn hơn số lượng đối tượng (200> 2), chúng tôi đang làm việc trong một không gian chiều thấp.

Khi số lượng các tính năng (f) lớn hơn số lượng quan sát (N) - chủ yếu được viết là f >> N, nó có nghĩa là chúng ta có một không gian chiều cao.

Nếu chúng ta bao gồm nhiều thuộc tính hơn, vì vậy chúng ta có hơn 200 đặc điểm, thì khoảng cách Euclid có thể không hoạt động tốt lắm, vì nó sẽ gặp khó khăn trong việc đo tất cả các khoảng cách nhỏ trong một không gian rất lớn mà chỉ lớn hơn. Nói cách khác, cách tiếp cận theo khoảng cách Euclid gặp khó khăn khi làm việc với dữ liệu thưa thớt. Đây là một vấn đề được gọi là lời nguyền của chiều. Các giá trị khoảng cách sẽ trở nên quá nhỏ, như thể chúng trở nên "loãng" trong không gian lớn hơn, bị bóp méo cho đến khi chúng trở thành 0.

Lưu ý: Nếu bạn gặp phải một tập dữ liệu với f >> p, bạn có thể sẽ sử dụng các chỉ số khoảng cách khác, chẳng hạn như mahalanobis khoảng cách. Ngoài ra, bạn cũng có thể giảm kích thước tập dữ liệu bằng cách sử dụng Phân tích thành phần chính (PCA). Vấn đề này thường xuyên xảy ra, đặc biệt là khi phân cụm dữ liệu giải trình tự sinh học.

Chúng ta đã thảo luận về các chỉ số, liên kết và cách mỗi một trong số chúng có thể ảnh hưởng đến kết quả của chúng ta. Bây giờ chúng ta hãy tiếp tục phân tích dendrogram và xem nó có thể cung cấp cho chúng ta dấu hiệu về số lượng các cụm trong tập dữ liệu của chúng ta như thế nào.

Tìm một số cụm thú vị trong một biểu đồ giống như việc tìm không gian ngang lớn nhất không có bất kỳ đường thẳng đứng nào (không gian có các đường thẳng đứng dài nhất). Điều này có nghĩa là có nhiều sự tách biệt hơn giữa các cụm.

Chúng ta có thể vẽ một đường ngang đi qua khoảng cách dài nhất đó:

plt.figure(figsize=(10, 7))
plt.title("Customers Dendogram with line")
clusters = shc.linkage(selected_data, 
            method='ward', 
            metric="euclidean")
shc.dendrogram(clusters)
plt.axhline(y = 125, color = 'r', linestyle = '-')

img

Sau khi xác định vị trí của đường ngang, chúng ta đếm số lần các đường dọc của chúng ta bị nó cắt ngang - trong ví dụ này là 5 lần. Vì vậy, 5 có vẻ là một dấu hiệu tốt về số lượng các cụm có khoảng cách giữa chúng nhiều nhất.

Chú thích: Biểu đồ dendrogram chỉ nên được coi là tài liệu tham khảo khi được sử dụng để chọn số lượng cụm. Nó có thể dễ dàng nhận được con số đó và hoàn toàn bị ảnh hưởng bởi loại liên kết và số liệu khoảng cách. Khi tiến hành phân tích cụm chuyên sâu, chúng tôi khuyên bạn nên xem xét các hình ảnh dendrograms với các liên kết và số liệu khác nhau và xem xét kết quả được tạo ra với ba dòng đầu tiên trong đó các cụm có khoảng cách giữa chúng nhiều nhất.

Triển khai Phân cụm phân cấp tổng hợp

Sử dụng dữ liệu gốc

Cho đến nay, chúng tôi đã tính toán số cụm được đề xuất cho tập dữ liệu phù hợp với phân tích ban đầu và phân tích PCA của chúng tôi. Bây giờ chúng ta có thể tạo mô hình phân cụm theo cấp bậc tổng hợp của mình bằng Scikit-Learn AgglomerativeClustering và tìm ra nhãn của các điểm tiếp thị với labels_:

from sklearn.cluster import AgglomerativeClustering

clustering_model = AgglomerativeClustering(n_clusters=5, affinity='euclidean', linkage='ward')
clustering_model.fit(selected_data)
clustering_model.labels_

Kết quả này trong:

array([4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3,
       4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 1,
       4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 0, 2, 0, 2,
       1, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 2, 1, 2, 0, 2, 0, 2, 0, 2,
       0, 2, 0, 2, 0, 2, 1, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2,
       0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2,
       0, 2])

Chúng tôi đã điều tra rất nhiều để đi đến thời điểm này. Và những nhãn này có nghĩa là gì? Ở đây, chúng tôi có từng điểm dữ liệu của chúng tôi được gắn nhãn là một nhóm từ 0 đến 4:

data_labels = clustering_model.labels_
sns.scatterplot(x='Annual Income (k$)', 
                y='Spending Score (1-100)', 
                data=selected_data, 
                hue=data_labels,
                pallete="rainbow").set_title('Labeled Customer Data')

img

Đây là dữ liệu phân cụm cuối cùng của chúng tôi. Bạn có thể thấy các điểm dữ liệu được mã hóa màu ở dạng năm cụm.

Các điểm dữ liệu ở dưới cùng bên phải (nhãn: 0, điểm dữ liệu màu tím) thuộc về những khách hàng có mức lương cao nhưng chi tiêu thấp. Đây là những khách hàng tiêu tiền cẩn thận.

Tương tự, các khách hàng ở trên cùng bên phải (nhãn: 2, điểm dữ liệu xanh), là những khách hàng có mức lương cao và chi tiêu cao. Đây là loại khách hàng mà các công ty hướng tới.

Khách hàng ở giữa (nhãn: 1, điểm dữ liệu màu xanh lam) là những người có thu nhập trung bình và chi tiêu trung bình. Số lượng khách hàng cao nhất thuộc về loại này. Các công ty cũng có thể nhắm mục tiêu đến những khách hàng này với thực tế là họ có số lượng rất lớn.

Các khách hàng ở dưới cùng bên trái (nhãn: 4, màu đỏ) là những khách hàng có mức lương thấp và chi tiêu thấp, họ có thể bị thu hút bằng cách đưa ra các chương trình khuyến mãi.

Và cuối cùng, những khách hàng ở phía trên bên trái (nhãn: 3, điểm dữ liệu màu cam) là những người có thu nhập cao và chi tiêu thấp, được tiếp thị nhắm mục tiêu lý tưởng.

Sử dụng Kết quả từ PCA

Nếu chúng ta ở trong một kịch bản khác, trong đó chúng ta phải giảm kích thước của dữ liệu. Chúng tôi cũng có thể dễ dàng vẽ biểu đồ kết quả PCA phân nhóm. Điều đó có thể được thực hiện bằng cách tạo một mô hình phân cụm tích tụ khác và lấy nhãn dữ liệu cho từng thành phần chính:

clustering_model_pca = AgglomerativeClustering(n_clusters=5, affinity='euclidean', linkage='ward')
clustering_model_pca.fit(pcs)

data_labels_pca = clustering_model_pca.labels_

sns.scatterplot(x=pc1_values, 
                y=pc2_values,
                hue=data_labels_pca,
                palette="rainbow").set_title('Labeled Customer Data Reduced with PCA')

img

Quan sát rằng cả hai kết quả đều rất giống nhau. Sự khác biệt chính là kết quả đầu tiên với dữ liệu gốc dễ giải thích hơn nhiều. Rõ ràng là khách hàng có thể được chia thành năm nhóm theo thu nhập và điểm chi tiêu hàng năm của họ. Mặc dù, trong cách tiếp cận PCA, chúng tôi đang xem xét tất cả các tính năng của mình, càng nhiều càng tốt để xem xét phương sai được giải thích bởi từng tính năng, đây là một khái niệm khó nắm bắt hơn, đặc biệt là khi báo cáo cho bộ phận Tiếp thị.

Ít nhất chúng ta phải chuyển đổi dữ liệu của mình, thì càng tốt.

Nếu bạn có một tập dữ liệu rất lớn và phức tạp, trong đó bạn phải thực hiện giảm kích thước trước khi phân cụm - hãy cố gắng phân tích các mối quan hệ tuyến tính giữa từng đối tượng và phần dư của chúng để sao lưu việc sử dụng PCA và nâng cao khả năng giải thích của quy trình. Bằng cách tạo mô hình tuyến tính cho mỗi cặp đối tượng, bạn sẽ có thể hiểu cách các đối tượng tương tác.

Nếu khối lượng dữ liệu quá lớn, không thể vẽ được các cặp tính năng, hãy chọn một mẫu dữ liệu của bạn, cân bằng và gần với phân phối chuẩn nhất có thể và thực hiện phân tích trên mẫu trước, hiểu nó, tinh chỉnh nó - và áp dụng nó sau này cho toàn bộ tập dữ liệu.

Bạn luôn có thể chọn các kỹ thuật trực quan hóa phân cụm khác nhau tùy theo bản chất dữ liệu của bạn (tuyến tính, phi tuyến tính) và kết hợp hoặc kiểm tra tất cả chúng nếu cần.

Kết luận

Kỹ thuật phân cụm có thể rất tiện dụng khi nói đến dữ liệu không được gắn nhãn. Vì hầu hết dữ liệu trong thế giới thực đều không được gắn nhãn và việc chú thích dữ liệu có chi phí cao hơn, nên kỹ thuật phân cụm có thể được sử dụng để gắn nhãn dữ liệu không được gắn nhãn.

Trong hướng dẫn này, chúng tôi đã đưa ra một vấn đề khoa học dữ liệu thực tế, vì các kỹ thuật phân cụm được sử dụng phần lớn trong phân tích tiếp thị (và cả trong phân tích sinh học). Chúng tôi cũng đã giải thích nhiều bước điều tra để có được một mô hình phân cụm phân cấp tốt và cách đọc các biểu đồ và đặt câu hỏi liệu PCA có phải là một bước cần thiết hay không. Mục tiêu chính của chúng tôi là một số cạm bẫy và các tình huống khác nhau trong đó chúng tôi có thể tìm thấy phân nhóm phân cấp được che đậy.

Chúc các bạn thành nhóm vui vẻ!

Dấu thời gian:

Thêm từ xếp chồng lên nhau