Hướng dẫn remove outlier python

Nguồn ảnh

Outliers [dữ liệu ngoại lai hay là nhiễu] là một trong những thuật ngữ được sử dụng rất rộng rãi trong thế giới data science. Trong quá trình xây dựng các mô hình dự đoán, việc xác định và loại bỏ outliers trong dữ liệu là một bước vô cùng quan trọng. Nó giúp tăng cao độ chính xác cho các mô hình dự đoán.

Khi phân tích, chúng ta thường dùng các tham số như là mean, medianmode để biết xu hướng tập trung của dữ liệu. Tuy nhiên, một câu hỏi quan trọng cần phải trả lời khi xem xét chất lượng của một mẫu dữ liệu trong phân tích đó là “làm sao để đo được độ biến động [hay độ phân tán] của mẫu dữ liệu đó”?. Vì chúng ta có thể có 2 mẫu dữ liệu với cùng giá trị mean nhưng độ biến động của chúng lại hoàn toàn khác nhau. Trong thống kê những đại lượng phổ biến nhất để đo lường tiêu chí này là khoảng phần tư [interquartile range, IQR] [hay còn được gọi là khoảng cách giữa các tứ phân vị], phương sai [variance] và độ lệch chuẩn [standard deviation, STD].

Ở post này tôi sẽ giới thiệu với các bạn cách sử dụng 2 phương pháp thống kê trong R và Python để xác định và loại bỏ outliers trong dữ liệu đó là:

  1. STD có thể sử dụng để xác định outliers trong dữ liệu có dạng/gần như dạng phân phối chuẩn [hay còn gọi là phân phối Gauss]
  2. IQR có thể sử dụng để xác định và loại bỏ outliers không phụ thuộc vào dạng phân phối của dữ liệu.

Và ở cuối post tôi sẽ hướng dẫn các bạn viết hàm tự động xác định và loại bỏ outliers từ dữ liệu sử dụng hai phương pháp trên.

1. Tạo dữ liệu để thực hành

Để thực hành tôi sử dụng hàm mô phỏng phân phối chuẩn rnorm[] trong R để tạo ra dãy số ngẫu nhiên gồm 5000 số với các tham số giá trị trung bình là 20 và độ lệnh chuẩn là 2 như sau:

# R
data = rnorm[5000, mean = 20, sd = 2]

Với Python thì ta thực hiện như sau:

Trước hết cần nạp thư viện reticulate để sử dụng Python trong R:

# R
library[reticulate]

Cụ thể về cách sử dụng thư viện reticulate để kết hợp R và Python tôi đã giới thiệu ở post trước, các bạn có thể đọc ở đây

Tạo dữ liệu trong python:

# Python
# Tạo dữ liệu tương tự như trong R
from numpy.random import randn
data = 2* randn[5000] + 20

Trong dữ liệu được tạo ra từ phân phối chuẩn sẽ có một số giá trị nằm cách xa giá trị trung bình mean mà chúng ta có thể xác định là outliers.

Biểu diễn dữ liệu bằng histogam sử dụng hàm hist[]:

# R
hist[data, breaks= 60, main="Histogram With breaks=60"]

Nhân tiện đây tôi cũng xin giới thiệu một số hàm hỗ trợ cho các tính toán thống kê trong R như: summary[], sample[], dnorm[], pnorm[], qnorm[], dunif[], punif[], qunif[], runif[], mean[], sd[], cov[], cor[],…

Hàm summay[] cho phép thực hiện thống kê mô tả [descriptive statistics] để cung cấp cho chúng ta một số thông tin thống kê cơ bản về một biến số:

# R
summary[data]
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   12.32   18.66   19.99   19.99   21.30   26.54

Ví dụ sử dụng hàm sample[] để tạo mẫu ngẫu nhiên có lặp lại 10 số nguyên từ 0 đến 9:

# R
sample[0:9, replace = TRUE]
##  [1] 6 6 0 9 7 1 6 6 8 4

Ví dụ sử dụng hàm tính mật độ phân phối chuẩn dnorm[] để ước tính xác xuất của học sinh có điểm là 16.5 biết rằng điểm của học sinh tuân theo phân phối chuẩn với giá trị trung bình là 15, độ lệnh chuẩn là 2.5:

# R
dnorm[16.5, mean = 15, sd = 2.5]
## [1] 0.1332898

Tiếp theo ví dụ trên để ước tính xác suất học sinh có điểm tối thiểu là 16.5, ta có thể sử dụng hàm tính xác suất chuẩn tích lũy pnorm[] như sau:

# R
1 - pnorm[16.5, mean = 15, sd = 2.5]
## [1] 0.2742531

Chức năng của các hàm R còn lại cũng như các hàm tương tự trong Python các bạn có thể tự tìm hiểu thêm.

2. Phương pháp STD

Nếu như biết được rằng dữ liệu có dạng phân phối Gauss thì chúng ta có thể sử dụng STD trong vài trò là thước đo giới hạn độ phân tán của dữ liệu để xác định outliers.

Trong phân phối Gauss dựa vào giá trị trung bình meanSTD cho phép chúng ta kiểm tra được độ phân tán [hay là phần trăm bao phủ] của dữ liệu đó như thế nào. Ví dụ:

  • Độ bao phủ với 1 STD từ mean là 68%
  • Độ bao phủ với 2 STD từ mean là 95%
  • Độ bao phủ với 3 STD từ mean là 99.7%

Nguồn ảnh

Vậy nên với dữ liệu dạng Gauss có độ phân tán bình thường thì với 3STD, chúng ta sẽ bao phủ được khoảng > 99% của dữ liệu. Từ đó những điểm dữ liệu nằm ngoài 3STD sẽ được coi là outliers.

Các bước xác định outliers bằng phương pháp STD như sau:

Bước 1: Tính meanstd

# tính mean và std
# R
mean_data 

Chủ Đề