Loại bỏ các ngoại lệ z-score python

Ngoại lệ/bất thường (dữ liệu ngoại lai/dữ liệu bất thường) là một trong những thuật ngữ được sử dụng rất rộng rãi trong dữ liệu thế giới và đặc biệt là khoa học dữ liệu. Xác định và loại bỏ các ngoại lệ là một bước cực kỳ quan trọng trong quá trình xử lý dữ liệu. Việc xử lý các dữ liệu bên ngoài sẽ giúp nâng cao độ chính xác cho các mô hình dự đoán hoặc báo cáo doanh nghiệp một cách đáng kể.

Trong bài này chúng ta sẽ cùng nhau tìm hiểu các vấn đề sau

  • Outliers thực chất là gì?
  • Tầm quan trọng của công việc được xác định và loại bỏ các ngoại lệ?
  • So sánh và phân tích kết quả của trước và sau khi loại bỏ các ngoại lệ
  • Phương pháp và các bước thực hiện loại bỏ các ngoại lệ
  • Thực hiện xử lý các ngoại lệ bằng MySQL
  • Cuối cùng là câu hỏi cho bạn thực hiện

Lưu ý. Bài viết sẽ không đi nghiên cứu quá sâu về Outliers. Bài này chỉ dừng lại ở mức cơ bản để các bạn có thể đọc, hiểu và thực hiện ngay

Mục Lục

  • 1 Ngoại lai (dữ liệu ngoại lai) là gì?
  • 2 Khi nào cần xác định và loại bỏ các ngoại lệ
  • 3 Phương pháp xác định ngoại lệ
  • 4 Report sample về loại bỏ Outlier trên Tableau
  • 5 Các bước cần thực hiện để xác định giá trị ngoại lệ
    • 5. 1 Bước 0. Trực quan hóa/vẽ dữ liệu của bạn
    • 5. 2 Bước 2. Tính Trung bình & Độ lệch chuẩn
    • 5. 3 Bước 3. Tính giá trị biên Upper/Lower ria mép
    • 5. 4 Bước 4. Xác định ngoại lệ dựa trên giá trị biên
    • 5. 5 Bước 5. Thực hiện tính toán khi đã loại bỏ các ngoại lệ
    • 5. 6 Bước 6. Kiểm tra tra cứu và điều chỉnh bước đánh giá
  • 6 Hướng dẫn xác định và loại bỏ các ngoại lệ bằng SQL
  • 7 Tổng kết và thực thi

Outliers (dữ liệu ngoại lai) là gì?

Để hiểu được bản chất thực sự của các ngoại lệ là gì, các bạn trước tiên hãy tham khảo các hình bên dưới. Chú ý sự khác nhau giữa các điểm màu đỏ với các điểm còn lại

Loại bỏ các ngoại lệ z-score python
Các giá trị ngoại lệ của bộ dữ liệu 2 chiều – Nguồn ảnh
Loại bỏ các ngoại lệ z-score python
Các giá trị ngoại lệ của bộ dữ liệu 1 dựa trên tốc độ phân tán của dữ liệu

Qua các bức ảnh trên, chắc các bạn cũng thấy được điểm chung của các ngoại lệ. Hiểu đơn giản thì Outliers là một hoặc nhiều cá thể khác Chắc chắn đối với các thành viên còn lại của nhóm. Sự khác biệt này có thể dựa trên nhiều tiêu chí khác nhau như giá trị hoặc thuộc tính

Đối với 2 hình trên, chúng ta có thể dễ dàng xác định các điểm khác biệt dựa trên giá trị của họ vì các giá trị này khác với các giá trị còn lại của nhóm

Ví dụ. trong một lớp học gồm 100 học sinh, phần lớn học sinh đều đạt kết quả đào tạo từ 5 đến 7, riêng chỉ có 1 bạn đạt điểm 1 và một bạn đạt điểm 10. Trong trường hợp này, 2 bạn có điểm 1 và 10 có thể được coi là 2 Người xuất sắc nhất cho bài kiểm tra đó

Trong trường hợp khác, các ngoại lệ là những thành phần có thuộc tính hoặc tính cách khác với số lượng còn lại

Loại bỏ các ngoại lệ z-score python
Các ngoại lệ dựa trên tính chất của dữ liệu – Nguồn ảnh

Ví dụ. một công ty với mô hình B2B có rất nhiều khách hàng khác nhau nhưng trong những khách hàng này có một doanh nghiệp đến từ nước ngoài. Doanh nghiệp nước ngoài này có thể được coi là ngoại lệ khi xem xét về tính chất khách hàng. Vì họ có thể có những hành vi mua hàng rất khác với khách hàng nội địa

Trên thực tế, người ta chia ra những ngoại lệ khá nhiều loại khác nhau. Nhưng ở đây mình chỉ muốn các bạn hiểu được bản chất của các ngoại lệ và cách xác định các loại ngoại lệ đơn giản. Do đó, mình phải chia sẻ lại thành 2 dạng như trên

Nếu muốn tìm hiểu xâu hơn về Outliers, các bạn có thể Google về nó. Có nhiều tài liệu khác nhau cả tiếng Anh lẫn tiếng Việt giải thích về thuật ngữ này. Mình sẽ không phân tích sâu nữa về định nghĩa cũng như phân loại

Khi nào cần xác định và loại bỏ ngoại lệ

Trên thực tế, khi chúng ta làm báo cáo hay xây dựng mô hình, sẽ rất khó để đạt được giá trị tuyệt đối. Trong hầu hết các trường hợp, dữ liệu xấu hoặc bất thường sẽ luôn tồn tại. Những dữ liệu này tồn tại do khá nhiều nguyên nhân khác nhau tùy theo hoàn cảnh và mô hình kinh doanh

Một vài ví dụ cụ thể như

  1. Lỗi phát sinh trong quá trình nhập và chỉnh sửa dữ liệu như dư hoặc thiếu vài số 0 hoặc sai địa chỉ. Lỗi này mình thấy cực kỳ phổ biến
  2. Đối với các mô hình trực tuyến, người ta có thể cố ý tạo ra giá trị ảo để kiểm tra thị trường hoặc làm mồi nhử. Ví dụ một căn nhà có thể được bán với giá 100.000 đồng hay 999 tỷ. Nếu bạn tính trung bình giá nhà ở khu vực tính luôn cả nhà phía trên, chắc chắn giá nhà sẽ cao ngất ngưởng như vậy với thực tế
  3. Khi muốn biết tổng giá trị sản phẩm bán ra trong ngày của một cửa hàng, chúng ta phát hiện có vài ngày, con số này cao một cách đột biến so với các ngày còn lại. Nguyên nhân là do gần đó có một sự kiện cộng đồng kiến ​​nghị khách hàng đột ngột tăng lên

Chúng ta có thể thấy được với 2 ví dụ (1) và (2) thì những dữ liệu xấu này cần được loại bỏ để tăng tính chính xác cho các mô hình hoặc báo cáo. Nhưng với trường hợp thứ (3), các ngoại lệ này lại có thể cho chúng ta thấy là một tiềm năng kinh doanh mới. Nếu chúng ta tìm hiểu nguyên nhân tại sao lại có sự gia tăng đột biến và chuẩn bị cho kỳ tiếp theo, khả năng là sẽ có thêm nhiều lợi nhuận

Do đó, việc xác định các ngoại lệ là cần thiết trong phần lớn các trường hợp. Nhưng việc xử lý chúng như thế nào thì còn tùy thuộc vào từng hoàn cảnh. Chúng ta cần tìm hiểu sâu hơn nguyên nhân gây ra các ngoại lệ trước khi quyết định loại bỏ hoặc giữ lại các ngoại lệ này

Phương pháp xác định Outliers

Vì bản chất của các ngoại lệ có nhiều loại khác nhau nên cũng sẽ có nhiều phương pháp khác nhau để xác định các ngoại lệ. Trong bài viết này, chúng tôi sẽ chỉ tập trung vào một loại ngoại lệ là những điểm dữ liệu có giá trị quá cao hoặc quá thấp so với phần dữ liệu lớn

Chúng ta sẽ sử dụng bộ dữ liệu là SuperStore Sales và tìm kiếm các ngoại lệ dựa trên tổng giá trị của mỗi đơn hóa tại mỗi tiểu bang. Với câu hỏi này, dữ liệu mà chúng ta cần xử lý chỉ có một chiều (xem lại hình 2). Bạn nào chưa có dữ liệu SupperStore thì xem hướng dẫn tại đây

Loại bỏ các ngoại lệ z-score python
Phân tích giá trị cực trị – Nguồn ảnh

Kết hợp với các loại ngoại lệ, mình sẽ sử dụng phương pháp Phân tích giá trị cực đoan. Phương pháp này đơn giản là xác định các điểm dữ liệu có giá trị cực cao/thấp (giá trị cực cao). Các giá trị cực đoan sẽ được xác định bằng khoảng cách của chúng so với giá trị trung bình (Trung bình/Trung bình). Toàn bộ các giá trị Extreme đều được xác định là ngoại lệ

Lưu ý. trên thực tế, các giá trị ngoại lai có khả năng không phải là giá trị Extreme. Đặc biệt là đối với các mảng dữ liệu nhiều hơn 1 chiều

Bạn nào tò mò về các phương pháp khác thì có thể vào hỏi Google hoặc xem tại blog này

Được rồi, trước khi đi vào hướng dẫn các tìm kiếm và loại bỏ các ngoại lệ, các bạn cùng xem báo cáo mẫu do mình thiết kế trên Tableau để có thể định cấu hình các ngoại lệ như thế nào

Report sample about type outlier on Tableau

Sử dụng báo cáo này như thế nào

  • Các bạn có thể rê chuột trên các giá trị để có thể thấy được các giá trị ngoại lệ
  • So sánh sự khác nhau giữa giá trị trung bình mỗi đơn hóa trước và sau khi loại bỏ các ngoại lệ
  • Điều chỉnh giá trị phía trên góc phải để thấy được sự thay đổi của Outliers. Các bạn sẽ hiểu những biến này ở phần sau của bài viết
  • Bình luận bên dưới xem bạn đã tìm được thông tin chi tiết gì hay từ báo cáo này chưa?
  • Đổi chế độ điện thoại sang ngang (ngang) nếu không biết số liệu
  • Boxplot trong hình chỉ để so sánh mục đích vì cách tính khác nhau

Các bạn có thể tải Workbook này xuống để tham khảo cách làm. Nếu có nhiều yêu cầu mình sẽ làm bài mới hướng dẫn từng bước cách làm một cái tương tự như vậy

Loại bỏ các ngoại lệ z-score python


Okay giờ mình vào phần tiếp theo xem cách thức xác định Outliers nhé

Các bước cần thực hiện để xác định Outliers

Như mình đã nói về phía trên, trong bài này chúng ta sẽ xác định ngoại lệ là những đơn hàng có giá trị cao hoặc thấp hơn bất thường so với những đơn hàng còn lại trong nhóm. Để làm điều này chúng ta thực hiện các bước sau. Tùy theo từng môi trường mà chúng ta sẽ có những cách khác nhau để thực hiện từng bước, nhưng cơ bản chúng ta sẽ đều trải nghiệm qua những bước này

Bước 0. Trực quan hóa/vẽ dữ liệu của bạn

Up data sketchup. Đây là cách nhanh nhất để phát hiện xem dữ liệu của bạn có xuất hiện Ngoại lệ hay không (bảng điều khiển phía trên chính là ví dụ). Nếu dữ liệu của bạn hoàn toàn bình thường thì bạn không cần phải thêm gì nữa. Nếu có dấu hiệu bất thường thì continue nhé

Bước 1. Search the total value of each order. Các bạn có thể thay đổi giá trị cần thiết để tùy thuộc vào tập dữ liệu mà các bạn đang làm việc. Ví dụ như số lượng khách hàng hàng mới hoặc số lượng hợp đồng được ký trong ngày,…

Bước 2. Tính Trung bình & Độ lệch chuẩn

Tính giá trị trung bình (Average/Mean) và độ lệch chuẩn (Standard Deviation) của tổng giá trị thứ tự theo từng Sub-Category. Việc tính 2 giá trị này sẽ cho chúng ta giá trị trung tâm (Average) và từ giá trị trung tâm chúng ta sẽ kiểm tra xem mức độ phân tán của dữ liệu như thế nào dựa trên giá trị của độ lệch chuẩn (Độ lệch chuẩn)

Loại bỏ các ngoại lệ z-score python
Standard Deviation and data partition – Nguồn ảnh

Với bộ dữ liệu có mức phân tán bình thường thì với 3 Độ lệch chuẩn (STD), chúng ta sẽ bao phủ khoảng >99% của dữ liệu. Do đó, những dữ liệu nằm ngoài 3 STD thường sẽ là ngoại lệ

Các bạn xem thêm về Độ lệch chuẩn tại đây nhé

Bước 3. Tính giá trị biên Upper/Lower ria mép

Râu trên/dưới là 2 giá trị cực đại/tiểu giúp chúng ta xác định dữ liệu chuẩn (kỳ vọng) và giá ngoại lai (ngoại lệ). Header header (upper ria mép) và gốc (lower ria mép) theo công thức sau

Râu trên = AVG + STDEV*Bước

Râu dưới = AVG – STDEV*Bước

bước. ở đây là một dãy số tự nhiên chúng ta đặt tùy chọn theo phân tán dữ liệu. Trong phần lớn trường hợp, Steps = 3 (tương đương 3 Độ lệch chuẩn) sẽ bao phủ tầm nhìn trên 90% tổng số liệu. Các bạn có thể bắt đầu với Step = 3 trong phần lớn trường hợp

Bước 4. Xác định ngoại lệ dựa trên giá trị biên

Việc này khá đơn giản, chúng ta chỉ cần thực hiện việc so sánh giá trị của Đơn hàng giữa râu trên và râu dưới. Nếu giá trị của đơn đặt hàng nằm bên trong đoạn từ trên đến dưới thì sẽ là dữ liệu mong đợi, còn bên ngoài sẽ là ngoại lệ. Mình có công thức sau

Nếu Sum_sale > Upper_whisker hoặc Sum_sale < Lower_whiske

sau đó là 'Ngoại lệ' khác 'Được mong đợi'

Như các định nghĩa về phía trên là mọi giá trị nằm ngoài vùng biên đều là ngoại lệ

Bước 5. Thực hiện tính toán khi đã loại bỏ các ngoại lệ

Bây giờ chúng ta đã biết những thứ tự nào là Outliers. Bước tiếp theo đơn giản là thực hiện các tính năng cần thiết với điều kiện để loại bỏ các ngoại lệ

Ở đây mình sẽ thực hiện lại việc tính giá trị trung bình của mỗi hóa đơn tại mỗi Bang

Bước 6. Kiểm tra tra cứu và điều chỉnh giá trị Bước

Sau khi đã có kết quả mới, chúng ta thực hiện việc so sánh với kết quả trước đó để xem sự khác nhau như thế nào. Lúc này chúng ta cũng cần quan tâm đến một giá trị khác nữa là lượng dữ liệu mà chúng ta còn lại sau khi loại bỏ các ngoại lệ

Việc làm này cực kỳ quan trọng đối với kết quả cuối cùng. Tùy thuộc vào mục đích sử dụng mà chúng ta chọn các giá trị khác nhau

Lúc này các bạn thực hiện tính toán tổng số lượng dữ liệu (đặt hàng) còn lại so với dữ liệu gốc là bao nhiêu. With the data data number as have enough or too many?

Nếu muốn tăng số lượng dữ liệu, chúng ta sẽ tăng giá trị của các bước lên và lùi lại. Mình khuyến khích mỗi lần nên tăng/giảm đi 0. 5.
Sau đó chúng ta quay lại bước 3 và lặp lại cho đến khi bạn cảm thấy hài lòng.

Hướng dẫn xác định và loại bỏ các ngoại lệ bằng SQL

Bây giờ các bạn đọc đoạn mã phía bên dưới nhé. Lưu ý, trong phần mình sử dụng SQL CTE (lệnh với). Bạn nào chưa hiểu về lệnh này thì đọc bài trước của mình tại link này nhé


-- Bước 0: mình đã làm với Tableau dashboard phía
-- trên rồi nên mình không quan tâm ở đây
-- Bước 1: Tổng giá trị mỗi order
with sales_per_order as (
select Order_ID
	, state
	, sum(Sales) as total_order_sales
from superstore.orders
group by Order_ID, state
)
-- Bước 2: Tính avg và standard deviation 
-- dựa trên total_order_sales và State
, avg_std as (
select state 
	,sum(total_order_sales) as sum_sales
	,count(*) as number_of_orders
	,avg(total_order_sales) as avg_sales
	,std(total_order_sales) as std_sales
from sales_per_order 
group by state
)
-- Bước 3: tính Upper whisker và Lower whisker mỗi state
-- upper_whisker = avg + std*steps
-- lower_whisker = avg - std*steps
-- ở đây mình mặc đinh steps = 3
, upper_lower_whisker as (
select state
	, std_sales
	, avg_sales
	, number_of_orders
	, (avg_sales + std_sales*3) as upper_whisker
	-- chúng ta đang kiểm tra giá trị của mỗi order 
	-- nên những giá trị <0 đều sẽ là lỗi 
	, case when (avg_sales - std_sales*3) < 0 then 0 
	else (avg_sales - std_sales*3) end as lower_whisker 
from avg_std 
) 
-- Bước 4: xác định order là outliers 
-- So sánh total_order_sales với upper và lower 
, find_outliers as ( 
select spo.Order_ID 
	, spo.state 
	, spo.total_order_sales 
	, ulh.number_of_orders 
	, ulh.std_sales 
	, ulh.avg_sales 
	, ulh.upper_whisker 
	, ulh.lower_whisker 
	, case when spo.total_order_sales > ulh.upper_whisker
		or spo.total_order_sales < ulh.lower_whisker 
	then 'Outlier' else 'Expected' end as Outlier_status 
from sales_per_order as spo 
	left join upper_lower_whisker as ulh on ulh.state = spo.state ) 
-- Bước 5: Tính lại giá trị trung bình của mỗi order 
-- sau khi loại bỏ các outliers (chỉ giữ lại Expected) 
select state 
	-- toàn bộ order của state 
	, number_of_orders 
	, std_sales 
	, upper_whisker 
	, lower_whisker 
	, avg_sales 
	, avg(total_order_sales) as avg_sales_no_outliers 
	-- số order sau khi đã loại bỏ outliers 
	, count(*) as new_number_of_orders 
	-- tỉ lệ phần trăm dữ liệu còn lại 
	, count(*)/number_of_orders*100 as remaining_data 
from find_outliers where outlier_status = 'Expected' 
group by state,number_of_orders 
-- ở đây mình thấy với Step=3 mình đã có được phần lớn dữ liệu (>95%)
-- cộng với việc khi visualise mình thấy đã xác loại được khá nhiều outliers
-- vậy nên mình không thay đổi step nữa

Sau khi chạy đoạn mã các bạn sẽ thấy được rất nhiều tiểu ban có giá trị trung bình mỗi hóa đơn giảm hơn rất nhiều so với các bạn đầu

Nếu đã có kết quả, bạn có thể quay lại Bảng điều khiển phía trên để kiểm tra và so sánh cũng như kiểm tra xem những ngoại lệ đã bị loại bỏ là những đơn đặt hàng nào

Tổng kết và thực hiện

Bài này chúng ta đã cùng nhau làm quen với khái niệm, có thể mới với một số bạn, là Outliers. Cùng với đó là những lợi ích cũng như cách để xác định và loại bỏ những Ngoại lệ không mong muốn

Mình đã thử demo cách xác định các ngoại lệ và loại bỏ chúng dựa trên tổng giá trị của một Đơn đặt hàng và Trạng thái. Bây giờ các bạn có thể thực hiện hành động tương tự với tập dữ liệu đó nhưng sử dụng câu hỏi sau

“Tính trung bình tổng giá trị mỗi đơn hàng của mỗi tháng trong năm. ”

Bạn nào chưa hiểu chỗ nào có thể bình luận phía dưới. Mình sẽ cố gắng giải đáp nếu có thể. Đánh dấu lại để quay lại khi cần thiết nhé