Kỹ thuật xây dựng Prompt để Phát hiện Giá trị Ngoại Lai (Outlier Detection)

Giới thiệu
Giá trị ngoại lai là những giá trị bất thường trong tập dữ liệu, có thể làm sai lệch kết quả phân tích và ảnh hưởng đến các thống kê như trung bình, phương sai. Chẳng hạn, với dữ liệu chiều cao cầu thủ, một người cao 12 feet sẽ bị xem là ngoại lai ngay cả với cầu thủ NBA, và giá trị này sẽ kéo trung bình lên rất nhiều.
Vậy làm sao xử lý các giá trị ngoại lai? Bài viết dưới đây sẽ giải đáp thông qua một dự án thực tế do Physician Partners đặt hàng trong quá trình tuyển dụng chuyên viên dữ liệu.
Chúng ta sẽ lần lượt tìm hiểu các cách phát hiện, định nghĩa giá trị ngoại lai, và cuối cùng là xây dựng các prompt để xử lý bài toán này.
Các phương pháp phát hiện & loại bỏ giá trị ngoại lai
Phương pháp phát hiện ngoại lai sẽ phụ thuộc vào đặc điểm tập dữ liệu. Ví dụ, nếu dữ liệu có phân phối chuẩn, bạn có thể dùng phương pháp độ lệch chuẩn hoặc Z-score để xác định ngoại lai. Nếu dữ liệu không tuân theo phân phối chuẩn, có thể sử dụng phương pháp phần trăm, phân tích thành phần chính (PCA), hoặc khoảng tứ phân vị (IQR).
Bạn có thể tham khảo bài viết này để biết cách phát hiện ngoại lai bằng biểu đồ box plot.
Dưới đây là các phương pháp phát hiện ngoại lai phổ biến và mã Python minh họa.
Phương pháp Độ lệch chuẩn
Với cách này, giá trị ngoại lai được xác định dựa vào khoảng cách của mỗi giá trị so với trung bình. Nếu giá trị nằm ngoài khoảng trung bình cộng trừ ba lần độ lệch chuẩn, thì thường được xem là ngoại lai.
Ví dụ minh họa phân phối chuẩn và khoảng ±3 độ lệch chuẩn:

Cách thực hiện bằng Pandas:
import pandas as pd
import numpy as np
col = df['column']
mean = col.mean()
std = col.std()
lower = mean - 3 * std
upper = mean + 3 * std
# Lọc dữ liệu giữ lại giá trị trong khoảng 3 độ lệch chuẩn
filtered_df = df[(col >= lower) & (col <= upper)]
Lưu ý: Phương pháp này giả định dữ liệu có phân phối chuẩn (bell-shaped). Với cách này, khoảng 0,3% dữ liệu sẽ bị đánh dấu là ngoại lai, vì ba độ lệch chuẩn bao phủ khoảng 99,7% dữ liệu.

Phương pháp IQR (Khoảng tứ phân vị)
IQR đại diện cho 50% dữ liệu ở giữa, phản ánh các giá trị phổ biến nhất trong tập dữ liệu. Biểu đồ minh họa như sau:

Cách tính IQR và xác định ngưỡng:
Q1 = df['column'].quantile(0.25)
Q3 = df['column'].quantile(0.75)
IQR = Q3 - Q1
lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR
# Lọc giá trị nằm trong ngưỡng IQR
filtered_df = df[(df['column'] >= lower) & (df['column'] <= upper)]
Các giá trị nằm ngoài khoảng này sẽ được coi là ngoại lai. IQR có thể dùng cho nhiều loại phân phối, hiệu quả nhất khi dữ liệu không quá lệch.

Phương pháp phần trăm (Percentile)
Phương pháp này loại bỏ giá trị dựa trên các phần trăm đầu và cuối của dữ liệu. Thường chọn ngưỡng 1% hoặc 5% để loại đi những giá trị lớn nhỏ nhất (cực đoan).
Cách thực hiện:
lower_p = df['column'].quantile(0.01)
upper_p = df['column'].quantile(0.99)
filtered_df = df[(df['column'] >= lower_p) & (df['column'] <= upper_p)]
Khác với độ lệch chuẩn và IQR, phương pháp này không cần giả định về phân phối dữ liệu.
Dự án phát hiện ngoại lai của Physician Partners
Physician Partners là tổ chức hỗ trợ các bác sĩ nâng cao hiệu quả chăm sóc bệnh nhân. Trong dự án này, họ yêu cầu xây dựng thuật toán phát hiện các giá trị ngoại lai trên một hoặc nhiều cột dữ liệu.
Đầu tiên, khám phá tập dữ liệu với đoạn mã sau:
sfrs = pd.read_csv('sfr_test.csv')
sfrs.head()
Kết quả:
| member_unique_id | gender | dob | eligible_year | eligible_month | affiliation_type | pbp_group | plan_name | npi | line_of_business |
|---|---|---|---|---|---|---|---|---|---|
| 1 | F | 21/06/1990 | 2020 | 202006 | Affiliate | NON-SNP | MEDICARE - CAREFREE | 1 | HMO |
| 2 | M | 02/01/1948 | 2020 | 202006 | Affiliate | NON-SNP | NaN | 1 | HMO |
| 3 | M | 14/06/1948 | 2020 | 202006 | Affiliate | NON-SNP | MEDICARE - CAREFREE | 1 | HMO |
| 4 | M | 10/02/1954 | 2020 | 202006 | Affiliate | D-SNP | MEDICARE - CARENEEDS | 1 | HMO |
| 5 | M | 31/12/1953 | 2020 | 202006 | Affiliate | NON-SNP | NaN | 1 | HMO |
Để xem chi tiết hơn, dùng:
sfrs.info()

Dữ liệu này gồm thông tin y tế, tài chính, nhân khẩu học, chỉ số lâm sàng, và các trường liên quan đến bảo hiểm, giúp xác định thành viên có chi phí bất thường.
Giải thích một số cột:
| Cột | Diễn giải |
|---|---|
| member_unique_id | Mã thành viên |
| gender | Giới tính |
| dob | Ngày sinh |
| eligible_year | Năm đủ điều kiện |
| eligible_month | Tháng đủ điều kiện |
| affiliation_type | Loại bác sĩ |
| pbp_group | Nhóm bảo hiểm |
| plan_name | Tên gói bảo hiểm |
| npi | Mã số bác sĩ |
| line_of_business | Loại bảo hiểm |
| esrd | Có chạy thận không |
| hospice | Có chăm sóc cuối đời không |
Một lưu ý quan trọng: một số trường dữ liệu tài chính đang chứa ký hiệu đô la "$" và dấu phẩy, cần phải xử lý lại trước khi phân tích.

Ví dụ cột:
sfrs["plan_premium"]
Kết quả:

Vì vậy, cần loại bỏ ký hiệu "$" và dấu phẩy, chuyển về kiểu số để phân tích chính xác.
Sau khi đã hiểu rõ dữ liệu, bước tiếp theo là xây dựng hai prompt: một phát hiện ngoại lai, một để loại bỏ ngoại lai.
Prompt phát hiện giá trị ngoại lai
Vì đã học ba phương pháp trên, prompt sẽ áp dụng cả ba. Ngoài ra, dữ liệu có giá trị thiếu (NaN) ở một số trường, nên cần xử lý trước khi phân tích.
Prompt phát hiện ngoại lai:
Bạn là trợ lý phân tích dữ liệu. Tôi đã đính kèm một tập dữ liệu. Nhiệm vụ của bạn là phát hiện ngoại lai bằng ba phương pháp: Độ lệch chuẩn, IQR và phần trăm.
Thực hiện lần lượt các bước sau:
1. Tải tập dữ liệu đã đính kèm, loại bỏ tất cả ký hiệu "$" và dấu phẩy trong các trường tài chính, chuyển về kiểu số.
2. Xử lý giá trị thiếu: loại bỏ các dòng có giá trị NA tại các cột tài chính cần phân tích.
3. Áp dụng cả ba phương pháp với các trường tài chính:
- Độ lệch chuẩn: đánh dấu các giá trị nằm ngoài khoảng trung bình ± 3 lần độ lệch chuẩn.
- IQR: đánh dấu giá trị ngoài khoảng Q1 - 1.5 IQR và Q3 + 1.5 IQR.
- Phần trăm: đánh dấu giá trị ngoài ngưỡng 1% và 99%.
4. Không cần liệt kê chi tiết từng giá trị ngoại lai, chỉ cần:
- Tổng số ngoại lai phát hiện trên tất cả các trường tài chính cho từng phương pháp.
- Số ngoại lai trung bình trên mỗi trường cho từng phương pháp.
5. Lưu lại chỉ số dòng của các giá trị ngoại lai thành ba file CSV riêng biệt:
- sd_outlier_indices.csv
- iqr_outlier_indices.csv
- percentile_outlier_indices.csvChỉ cần xuất ra các số liệu tổng hợp và lưu chỉ số dòng vào file CSV.
financial_columns = [
"ipa_funding",
"ma_premium",
"ma_risk_score",
"mbr_with_rx_rebates",
"partd_premium",
"pcp_cap",
"pcp_ffs",
"plan_premium",
"prof",
"reinsurance",
"risk_score_partd",
"rx",
"rx_rebates",
"rx_with_rebates",
"rx_without_rebates",
"spec_cap"
]
Prompt này giúp kiểm tra và tóm tắt kết quả phát hiện ngoại lai ở các trường tài chính, đồng thời xuất chỉ số dòng ra file CSV để tiện xử lý tiếp theo.
Prompt loại bỏ giá trị ngoại lai
Sau khi đã có chỉ số dòng các ngoại lai, bước tiếp theo là loại chúng khỏi tập dữ liệu.
Prompt loại bỏ ngoại lai:
Bạn là trợ lý phân tích dữ liệu. Tôi đã đính kèm tập dữ liệu và một file CSV chứa chỉ số dòng các ngoại lai.
Yêu cầu bạn:
1. Tải tập dữ liệu và file chỉ số dòng.
2. Loại bỏ toàn bộ ngoại lai khỏi tập dữ liệu dựa trên các chỉ số dòng đã cung cấp.
3. Xác nhận số lượng giá trị đã bị loại bỏ.
4. Trả về tập dữ liệu đã làm sạch.
Prompt này sẽ giúp bạn xử lý nhanh việc loại bỏ các giá trị ngoại lai, trả về tập dữ liệu sạch để tiếp tục phân tích hoặc xây dựng mô hình.
Thử nghiệm prompt
Để kiểm tra hiệu quả các prompt trên, bạn có thể thực hành với tập dữ liệu thực tế.
Prompt phát hiện ngoại lai
Đầu tiên, tải tập dữ liệu và đính kèm lên ChatGPT (hoặc AI tương tự), dán prompt phát hiện ngoại lai và chờ kết quả. Hệ thống sẽ trả về số lượng giá trị ngoại lai phát hiện theo từng phương pháp, trung bình mỗi trường, đồng thời tạo các file CSV chứa chỉ số dòng.

Tiếp theo, yêu cầu hệ thống chuẩn bị các file CSV có thể tải về:
Prepare the cleaned CSVs for download
Hệ thống sẽ trả về các đường dẫn tải file CSV chứa chỉ số dòng các giá trị ngoại lai.

Prompt loại bỏ ngoại lai
Cuối cùng, chọn phương pháp loại ngoại lai bạn muốn (ví dụ: theo độ lệch chuẩn), đính kèm file chỉ số dòng và dùng prompt loại bỏ ngoại lai ở trên. Hệ thống sẽ trả về tập dữ liệu đã loại bỏ các giá trị ngoại lai.

Bạn có thể kiểm tra lại bằng Python:
cleaned = pd.read_csv("/cleaned_dataset.csv")
print("Trước:", sfrs.shape)
print("Sau :", cleaned.shape)
print("Số dòng đã loại:", sfrs.shape[0] - cleaned.shape[0])
Kết quả sẽ xác nhận số lượng giá trị ngoại lai đã được loại bỏ.

Tổng kết
Việc loại bỏ giá trị ngoại lai không chỉ giúp phân tích dữ liệu chính xác hơn mà còn nâng cao chất lượng mô hình học máy. Ngoại lai có thể xuất phát từ lỗi nhập liệu, hoặc là giá trị quá đặc biệt không đại diện cho tổng thể, ví dụ như trường hợp cầu thủ siêu cao.
Bạn có thể áp dụng các kỹ thuật đã giới thiệu bằng Python hoặc sử dụng các prompt AI giúp quy trình tự động và tối ưu hơn. Lưu ý: mỗi tập dữ liệu có đặc điểm riêng, AI không phải lúc nào cũng tự động nhận biết các vấn đề như ký hiệu "$", vì vậy, bạn cần bổ sung bước xử lý phù hợp trước khi phân tích.
Tham khảo thêm các gợi ý ChatGPT sáng tạo nội dung hay nhất của tôi để nâng cao hiệu quả khi làm việc với dữ liệu và AI.
Tags: outlier detection, prompt engineering, data cleaning
Tags: outlier detection, prompt engineering, data cleaning







