Khóa học
Dù thuật toán phân tích hay dự đoán của chúng ta tinh vi đến đâu, chất lượng đầu ra vẫn phụ thuộc vào dữ liệu đầu vào. Nói cách khác, "rác vào, rác ra".
Vì dữ liệu là nền tảng của tất cả các quy trình này, điều quan trọng là dành đủ thời gian để đảm bảo dữ liệu được tinh chỉnh đúng cách.
Làm sạch dữ liệu là một quy trình nền tảng trong vòng đời khoa học dữ liệu, và vai trò của nó không thể xem nhẹ khi tìm kiếm insight và tạo ra câu trả lời đáng tin cậy. Thường thì dữ liệu trong thế giới thực luôn bẩn, và việc làm sạch dữ liệu là không thể né tránh hoàn toàn.
Trong bài viết này, chúng ta sẽ đề cập đến một số ý tưởng quan trọng như cách xử lý giá trị thiếu, dữ liệu trùng lặp và ngoại lệ. Để có hướng dẫn đầy đủ hơn, hãy tham gia khóa Cleaning Data in Python hoặc Cleaning Data in R của chúng tôi.
Nguyên nhân nào khiến dữ liệu không sạch?
Nói đơn giản, làm sạch dữ liệu (hay gột rửa dữ liệu) là một quy trình cần thiết để chuẩn bị cho phân tích dữ liệu. Việc này có thể bao gồm tìm và loại bỏ bản ghi trùng lặp, không hoàn chỉnh, và chỉnh sửa dữ liệu để khắc phục bản ghi không chính xác.
Dữ liệu bẩn hoặc không sạch luôn là một vấn đề, và chúng ta đã chứng kiến sự bùng nổ trong việc tạo ra dữ liệu trong thập kỷ qua. Chỉ riêng năm 2020, thế giới tạo ra hơn 64 zettabyte dữ liệu, tương đương 6,4 nghìn tỷ gigabyte. Dù dưới 2% số dữ liệu này được lưu giữ, nó vẫn góp phần làm trầm trọng thêm vấn đề phổ biến "dữ liệu bẩn". Trước khi có thể làm sạch dữ liệu đúng cách, điều quan trọng là hiểu vì sao nó trở nên bẩn ngay từ đầu. Điều này có thể phát sinh từ những nguồn thường gặp như:
- Lỗi con người trong quá trình nhập liệu, ghi chép hoặc mã hóa
- Thiết bị cảm biến lỗi, như trường hợp của internet vạn vật (IoT)
- Hỏng hóc do lỗi phần cứng hoặc phần mềm dẫn tới tham nhũng dữ liệu.
Hiểu rõ nguyên nhân gốc rễ của dữ liệu bẩn mà chúng ta định làm sạch tạo nền tảng tốt để áp đặt các tiêu chí chất lượng dữ liệu, cho phép phân loại những vấn đề khác nhau liên quan đến tập dữ liệu của chúng ta.
Vì sao làm sạch dữ liệu lại quan trọng?
Quy trình làm sạch dữ liệu quan trọng vì nó giúp tạo ra một khuôn mẫu để làm sạch dữ liệu của tổ chức. Như đã đề cập, với mọi quy trình phân tích hay khoa học dữ liệu, rác vào thì rác ra. Nếu bị bỏ bê, hệ quả là kết quả phân tích sai lệch và tốn kém cả về thời gian, tiền bạc lẫn các nguồn lực khác.
Chất lượng dữ liệu là gì?
Chất lượng dữ liệu là thước đo định tính và/hoặc định lượng cho mức độ phù hợp của dữ liệu đối với mục đích mà nó cần phục vụ. Những thước đo này là các khuôn mẫu thực tiễn để chúng ta đánh giá dữ liệu có phù hợp với mục tiêu mong muốn hay không. Hãy xem các thước đo chất lượng dữ liệu như những phép kiểm định mà dữ liệu phải vượt qua để đủ điều kiện cho các quy trình khoa học dữ liệu.
Tiêu chí đánh giá chất lượng dữ liệu
- Độ chính xác: Câu hỏi đơn giản để kiểm tra độ chính xác là: thông tin trong dữ liệu có được cung cấp đúng ở mọi chi tiết không? Với dữ liệu, chúng ta cố gắng xấp xỉ các khuôn mẫu trong thế giới thực; độ chính xác giúp xác định mức độ đúng đắn của các xấp xỉ này.
- Tính liên quan: Thông tin này có tác động đến mục tiêu cuối cùng mong muốn của chúng ta không?
- Tính nhất quán: Nguồn dữ liệu này đã được xác minh chưa và thông tin trong đó có thể tin cậy không? Ví dụ, có một khách hàng 15 tuổi nhưng tình trạng hôn nhân lại ghi là đã kết hôn.
- Tính đầy đủ: Dữ liệu được cung cấp có đầy đủ và bao quát cho mục tiêu mong muốn không? Đây là vấn đề phổ biến liên quan đến dữ liệu thiếu và một cách xử lý là điều tra nguồn dữ liệu.
- Tính đồng nhất: Giả sử chúng ta có cột doanh số nhưng không phải mọi giao dịch đều cùng một đơn vị tiền tệ. Khi đó cần chuyển đổi tất cả giá trị doanh số về một loại tiền tệ duy nhất, và đó chính là tính đồng nhất; đảm bảo các thước đo dữ liệu được quy định theo cùng một đơn vị đo trong mọi hệ thống.
Làm sạch dữ liệu và biến đổi dữ liệu
Điều quan trọng là phân biệt giữa làm sạch dữ liệu và biến đổi dữ liệu. Biến đổi dữ liệu là tập hợp các quy trình giúp chúng ta khai thác thêm insight từ dữ liệu cung cấp. Những quy trình này thường thay đổi định dạng thô của dữ liệu sang một định dạng khác, vài ví dụ gồm:
- Mã hóa (Encoding): Quy trình chuyển đổi giá trị phân loại thành giá trị nhị phân để có thể dùng trong tính toán cho học máy. Hình minh họa cho thấy cột giới tính sẽ trông như thế nào khi được mã hóa. Dù vẫn mang cùng thông tin, nó đã được chuyển sang định dạng khác.

- Phân ngăn dữ liệu (Data binning): Còn gọi là gom nhóm, quy trình này giúp giảm ảnh hưởng/kích thước của các quan sát nhỏ lẻ. Nó bao gồm việc nhóm các giá trị liên tục vào các ngăn (hay danh mục).

- Chuẩn hóa tỉ lệ (Scaling): Kỹ thuật phổ biến trong học máy để chuẩn hóa các giá trị có thang đo khác nhau vào một khoảng cố định.

Lưu ý rằng trong hầu hết các quy trình biến đổi dữ liệu, biểu diễn gốc của dữ liệu bị thay đổi. Dù vẫn là cùng dữ liệu, một số kỹ thuật đã được áp dụng để chuyển nó sang định dạng phù hợp cho học máy hoặc mục đích khác.
Làm sạch dữ liệu được thực hiện như thế nào
Cần có một bộ hướng dẫn để đạt được dữ liệu chất lượng cao. Những hướng dẫn này có thể gọi là quy trình làm sạch dữ liệu. Chúng giúp chúng ta tính đến tất cả các bước cần thiết cho việc làm sạch dữ liệu. Các bước trong quy trình này gồm:
- Khám phá dữ liệu
- Làm sạch dữ liệu
- Thẩm định dữ liệu
- Báo cáo làm sạch dữ liệu Một số bước trong số này cũng sẽ được minh họa bằng Python
Khám phá dữ liệu
Khám phá dữ liệu là hiểu dữ liệu thông qua việc đi sâu vào các biến có trong dữ liệu. Nó đòi hỏi nhiều kỹ thuật trực quan hóa và tổng hợp để phát hiện đúng các vấn đề tiềm ẩn. Để khám phá hiệu quả, cần lưu ý vài điểm sau:
Ngữ cảnh dữ liệu
Trước khi có thể làm sạch bất kỳ dữ liệu nào, chúng ta phải hiểu ngữ cảnh của dữ liệu. Ngữ cảnh dữ liệu là nguồn gốc của mọi thực thể có trong dữ liệu. Nó ghi lại các hoàn cảnh liên quan đến cách dữ liệu được thu thập, và cách thu thập cho biết dữ liệu có thể được dùng thế nào và dùng cho việc gì.
Điều này đóng vai trò như kim chỉ nam cho những gì được phép trong làm sạch (và phân tích) để chúng ta rút ra insight đúng từ dữ liệu. Khi đã hiểu rõ cách dữ liệu được/đã được thu thập, chúng ta cần khám phá dữ liệu đó.
Phân tích dữ liệu khám phá
Phân tích dữ liệu khám phá là quá trình quan trọng thực hiện điều tra ban đầu trên dữ liệu nhằm phát hiện khuôn mẫu, phát hiện bất thường, kiểm định giả thuyết và kiểm tra giả định với sự hỗ trợ của thống kê tóm tắt và biểu diễn đồ họa. Không có khám phá thì không có phát hiện. Nếu không khám phá dữ liệu, rất khó để phát hiện những vấn đề tồn tại trong dữ liệu.
Ví dụ, chúng ta có một tập dữ liệu được cung cấp tại đây. Tệp Rolling Sales của Sở Tài chính liệt kê các bất động sản đã bán trong 12 tháng gần nhất ở Thành phố New York cho các loại thuế 1, 2 và 4. Chúng ta sẽ tải xuống và đọc dữ liệu Bronx được cung cấp.
#pandas
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
#read excel file
df = pd.read_excel("rollingsales_bronx.xls")
#preview data
df.head()

Những vấn đề đáng chú ý với dataframe này gồm:
- các cột không có tên
- giá trị thiếu ở ba hàng đầu
Tuy nhiên, khi khám phá dữ liệu trong Excel, thấy rằng bảng thực sự trong sổ làm việc chỉ bắt đầu từ hàng thứ 4. Vì vậy, đọc dữ liệu lại nhưng thiết lập một vài tham số cho phép chúng ta chỉ định những hàng cần bỏ qua và hàng nào làm tiêu đề:
#we read the data in again but skill 3 rows this time
df = pd.read_excel("rollingsales_bronx.xls", skiprows = 4, header = [0])
df.head()

Cách hiển thị dữ liệu đã thay đổi đáng kể. Dù chúng ta có thể làm sạch lần nhập đầu tiên, việc khám phá dữ liệu đã giúp tiết kiệm nhiều thời gian chỉ với vài điều chỉnh cho hàm nhập dữ liệu trong Python.
Khám phá dữ liệu giống như bước vào hiện trường vụ án với vai trò điều tra viên, nơi ta quan sát thụ động mọi thứ không đúng chỗ; còn làm sạch dữ liệu là quá trình chủ động giải quyết vụ án thực sự.
Làm sạch dữ liệu
Khám phá dữ liệu thường đi đôi với các bước làm sạch. Khi phát hiện vấn đề bằng phương pháp trực quan, tổng hợp hoặc thống kê, chúng ta cần khắc phục. Ở giai đoạn này, dữ liệu sẽ bị loại bỏ, sửa chữa hoặc bù đắp (impute).
Bản ghi không nhất quán
Một ví dụ điển hình về bản ghi không nhất quán là biểu mẫu nơi người dùng phải nhập giới tính. Ta có thể gặp nhiều định dạng biểu thị cùng một ý, ví dụ 'M', 'm', 'Male' hoặc 'MALE'; và tháng này chúng ta đã bán 'aples', 'apples', hay 'APPLES'. Cách tốt nhất để phát hiện là dùng biểu đồ tần suất hoặc liệt kê các giá trị khác nhau trong cột. Một số thao tác với bản ghi không nhất quán bao gồm nhưng không giới hạn ở:
- Chuyển chuỗi về chữ thường hoặc chuẩn hóa kiểu chữ
- Loại bỏ khoảng trắng
- Đổi tên cột
Ví dụ Python: Dùng tập dữ liệu đã nhập ở phần khám phá dữ liệu, lưu ý tên cột được viết không nhất quán:

Dù có vẻ không nghiêm trọng, việc đặt tên cột nhất quán giúp truy cập thuận tiện. Ví dụ, EASE-MENT có dấu gạch nối (-) giữa các từ, trong khi các cột khác chỉ có khoảng trắng.
Một phần của làm sạch dữ liệu là đảm bảo tính nhất quán. Hãy thử sửa trong hai bước:
- Thay khoảng trắng giữa các từ bằng dấu gạch dưới
- Chuyển về kiểu chữ chuẩn
# Extract columns
cols = df.columns
# Create empty list for new column names
new_cols = []
# Iterate over each column name to fix issues
for column in cols:
# Convert column name to title case
proper_cols = column.title()
# Replace spaces and hyphens with underscores
proper_cols_hyphen = proper_cols.replace(" ", "_")
clean_col = proper_cols_hyphen.replace("-", "_")
# Append the cleaned column name to the list
new_cols.append(clean_col)
# Display the transformed column names
new_cols
# Replace existing columns in the dataframe with the cleaned list
df.columns = new_cols
# Preview the updated dataframe
df.head()

Kiểu dữ liệu và chuyển đổi kiểu
Kiểu dữ liệu là cách dữ liệu được biểu diễn, cho trình biên dịch biết dữ liệu sẽ được dùng như thế nào. Cách biểu diễn quyết định loại thao tác có thể thực hiện. Hãy xem trước kiểu dữ liệu ở mỗi cột của dataframe từ dữ liệu Bronx.
#data types
df.dtypes

Lưu ý: Hãy xem cách chúng ta giờ có thể dễ dàng chọn tên cột bằng phương thức chấm (df.Year_Built).
Tất cả kiểu dữ liệu có vẻ ổn ngoại trừ cột Year_Built, lẽ ra nên là kiểu phân loại. Dù không quá quan trọng, khi tổng hợp các cột này thì Year_Built có thể sẽ bị đưa vào.
#Fix Year_Built column
df.Year_Built = df.Year_Built.astype("str")
#Check
df.dtypes

Dữ liệu thiếu
Đôi khi có những quan sát (hàng) bị thiếu dữ liệu và đôi khi có cả cột hoàn toàn trống. Vậy ta làm gì trong những trường hợp như vậy? Có nên bỏ qua không? Điều này giống như mái nhà bị dột và sẽ rò nước khi trời mưa.
Giá trị thiếu có các biểu diễn khác nhau tùy công cụ. Bao gồm NULL, chuỗi rỗng, NaN, NA, #NA, v.v. Ngữ cảnh dữ liệu rất quan trọng khi xử lý dữ liệu thiếu, và hiểu vì sao dữ liệu thiếu là điều cốt yếu. Có hai phương pháp chính để xử lý dữ liệu thiếu:
- Loại bỏ dữ liệu
- Bù đắp dữ liệu (imputation)
Trước khi quyết định dùng phương pháp nào, phải xem xét mẫu hình của các giá trị thiếu trên các cột. Chúng ta sẽ dùng kỹ thuật trực quan và mô tả để đánh giá.
#extract the column names
cols = df.columns
#plot a heatmap of missing values with seaborn
plt.figure(figsize = (10,5))
sns.heatmap(df[cols].isnull())

Biểu đồ cho thấy trực quan rằng:
- Tất cả giá trị ở Ease_ment và gần như toàn bộ giá trị ở Apartment_Number bị thiếu
- Các cột liên quan đến Units và Square_Feet có giá trị thiếu rải rác Với các tập dữ liệu lớn hơn nhiều, biểu đồ này có thể không lý tưởng. Một cách khác là xem xét mức độ đáng kể của các giá trị thiếu so với kích thước dữ liệu thực tế.
#Get the percentage of missing values in each column missing_pct = round(df.isnull().sum()/len(df) * 100, 1) print(missing_pct)

Chúng ta sẽ bỏ các cột Ease_Ment và Apartment_Number rồi thay thế các giá trị thiếu ở những cột còn lại.
#columns with more than 30% missing values
drop_cols = missing_pct[missing_pct > 30].index
#We can drop these columns with greater than 30 percent missing values
df_new = df.drop(columns = drop_cols)
#Extract columns with mising values between 1 and 30%
replace_cols = missing_pct[(missing_pct > 0) & (missing_pct < 30)].index
#Iterate to replace missing values
for col in replace_cols:
#if column is year built we replace with median otherwise the mean
if col == "Year_Built":
df_new.fillna(df_new[col].median(), inplace = True)
else:
mean_value = df_new[col].mean()
df_new.fillna(mean_value, inplace = True)
df_new.isnull().sum() #preview for missing values

Tất nhiên, còn nhiều điều về xử lý giá trị thiếu, như được đề cập trong khóa của Datacamp về Dealing with Missing Values in Python. Các tập dữ liệu, kiểu và cấu trúc khác nhau có nhu cầu khác nhau, do đó xử lý dữ liệu thiếu không phải là quy trình thẳng băng, rõ ràng cho mọi loại tập dữ liệu. Hình dưới minh họa các kịch bản khác nhau để áp dụng kỹ thuật xóa hay bù đắp.

Trùng lặp
Chúng ta phải đảm bảo có một nguồn sự thật duy nhất cho mỗi quan sát. Có những tình huống có nhiều quan sát về một khách hàng, hoặc do người dùng gửi biểu mẫu hai lần, hoặc lỗi trong nhập liệu. Dù do đâu, chúng ta cần phát triển một phiên bản duy nhất, đầy đủ của sự thật. Điều này giúp doanh nghiệp đảm bảo rằng:
- Không lãng phí thời gian và tiền bạc để nhắm mục tiêu cùng một khách hàng hai lần
- Xây dựng một phiên bản sự thật đáng tin cậy và hoàn chỉnh, từ đó có thể đưa ra quyết định kinh doanh đáng tin dựa trên kết quả phân tích.
Ngoại lệ
Ngoại lệ là các điểm dữ liệu cực trị. Chúng thường là giá trị rất thấp hoặc rất cao không phù hợp với khuôn mẫu còn lại trong dữ liệu, ví dụ:
- Một khách hàng 200 tuổi
- Đo cảm biến 40° Celsius ở khu vực Nam Cực
Xác định ngoại lệ Có nhiều kỹ thuật để xác định ngoại lệ bằng trực quan hoặc thống kê
-
Sắp xếp tập dữ liệu: Chỉ cần sắp xếp, ta có thể dễ dàng phát hiện ngoại lệ trong tập dữ liệu hoặc biến quan tâm. Tuy nhiên, kỹ thuật này thất bại với tập dữ liệu lớn và khó xem tất cả giá trị trong nháy mắt.
-
Trực quan hóa: Dùng các kỹ thuật như boxplot, histogram và scatterplot có thể giúp phát hiện ngoại lệ dễ dàng.
-
Dùng Z-score: Đây là kỹ thuật thống kê để định lượng mức độ bất thường của một giá trị quan sát giả định dữ liệu phân phối chuẩn. Nó là số độ lệch chuẩn mà giá trị quan sát nằm trên hoặc dưới giá trị trung bình.
Quy trình xử lý ngoại lệ Xử lý ngoại lệ là quá trình loại bỏ hoặc thay thế các ngoại lệ trong dữ liệu:
- Loại bỏ ngoại lệ khỏi dữ liệu: Có thể loại bỏ các giá trị nằm ở X_percentile thấp hoặc cao của dữ liệu. Một số kịch bản có thể loại bỏ ngoại lệ:
- Khi rõ ràng dữ liệu được đo không chính xác. Như đề cập, một khách hàng đang hoạt động 200 tuổi là đầu vào không hợp lệ, ví dụ điển hình của ngoại lệ nên xóa.
-
Nếu ngoại lệ không làm thay đổi kết quả phân tích, bạn có thể loại bỏ nó. Điều này cũng có thể cân nhắc khi số lượng ngoại lệ trong tập dữ liệu không nhiều so với tổng thể.
-
Thay thế ngoại lệ: Thay thế các giá trị cực trị này bằng giá trị trung bình, trung vị hoặc mốt. Nếu số lượng ngoại lệ khá lớn so với dữ liệu thực, thì xóa sẽ thất bại. Lưu ý: Giá trị trung bình nhạy cảm với ngoại lệ. Do đó nên cân nhắc trung vị hoặc mốt để thay thế.
Thẩm định dữ liệu
Khi hoàn tất làm sạch, điều quan trọng là đánh giá lại chất lượng dữ liệu bằng phương pháp khám phá dữ liệu. Việc này nhằm xác minh tính đúng đắn và đầy đủ của quy trình làm sạch, một phần để đảm bảo không bỏ sót bước nào, đồng thời đảm bảo phù hợp với ngữ cảnh dữ liệu.
Làm sạch dữ liệu, báo cáo và tự động hóa
Báo cáo bao gồm việc ghi chép tình trạng dữ liệu sau khi làm sạch, cũng như tài liệu hóa các bước đã thực hiện trong quá trình làm sạch. Báo cáo đảm bảo có tài liệu hướng dẫn cho các nhu cầu làm sạch tương tự trong tương lai (khả năng tái lập), để quy trình này có thể tự động hóa khi cần.
Tự động hóa là đảm bảo việc làm sạch dữ liệu có thể tái lập. Phần lớn quy trình làm sạch gồm các script có thể tái sử dụng, do đó có thể dùng lại với vài thay đổi nhỏ khi phát sinh nhu cầu.
Kết luận
Chúng ta đã bàn luận sâu về làm sạch dữ liệu và tất cả thành phần bạn cần tính đến để thực hiện một dự án làm sạch dữ liệu thành công. Đây là giai đoạn tốn thời gian, nơi các chuyên gia dữ liệu ước tính dành khoảng 60% tổng thời lượng của dự án khoa học dữ liệu. Nó là nền tảng quyết định trực tiếp kết quả của dự án. Dữ liệu khác nhau từ các nguồn khác nhau có nhu cầu khác nhau, và bạn sẽ cần điều chỉnh quy trình tương ứng cho phù hợp trường hợp sử dụng của mình.
Tài nguyên:
- Các hình ảnh liên quan đến biến đổi dữ liệu được cắt từ một sổ làm việc Excel tại đây
- Sổ tay Python có sẵn trên DataCamp workspace