Làm sạch dữ liệu là gì? Hướng dẫn làm sạch dữ liệu bằng Pandas

Làm sạch dữ liệu là gì
22 Phút Đọc

Làm sạch dữ liệu là gì?

Làm sạch dữ liệu là quy trình cần thiết để xử lý dữ liệu thô để chuẩn bị cho quá trình phân tích dữ liệu hoặc cho các ứng dụng máy học (ML). Dữ liệu thô có thể chứa nhiều lỗi có khả năng ảnh hưởng tới độ chính xác của quá trình phân tích dữ liệu. Việc làm sạch dữ liệu giúp loại bỏ hoặc sửa chữa các lỗi này, từ đó cải thiện chất lượng dữ liệu và đảm bảo kết quả phân tích chính xác hơn.

Tại sao làm sạch dữ liệu lại quan trọng?

Khi một công ty sử dụng dữ liệu để đưa ra các quyết định trong hoạt động. Dữ liệu liên quan, đầy đủ, và chính xác là yếu tố vô cùng quan trọng. Thông thường, các tập dữ liệu thường chứa các lỗi cần phải được loại bỏ trước khi phân tích như:

  • Lỗi định dạng: ngày tháng hoặc đơn vị tiền tệ không chính xác cũng như những đơn vị đo lường khác có thể ảnh hưởng đáng kể đến phân tích và dự đoán.
  • Dữ liệu ngoại lai: là những giá trị khác biệt lớn so với các giá trị còn lại trong tập dữ liệu. Chúng có thể gây ra sự sai lệch trong phân tích và ảnh hưởng đến độ chính xác của các mô hình dự đoán. Ví dụ, trong một tập dữ liệu về số lượng sản phẩm được đặt hàng, nếu hầu hết các đơn hàng chỉ chứa từ 1 đến 3 sản phẩm, nhưng có một vài đơn hàng chứa tới 50 hoặc 100 sản phẩm, các giá trị này được coi là ngoại lai.
  • Dữ liệu trùng lặp: thông tin lặp đi lặp lại, có thể khiến tính toán các giá trị tổng hoặc đếm số lượng bị sai.
  • Các lỗi phổ biến khác: dữ liệu bị lỗi, thiếu thông tin và lỗi do đánh máy, bị khoảng trắng phía trước hoặc phía sau, không nhất quán (cùng 1 thuộc tính như trường giới tính Nam hoặc Nữ nhưng đánh máy có thể viết thường viết hoa gây khó khăn khi group dữ liệu…) có thể dẫn đến phân tích sai lệch.

Làm sạch dữ liệu giúp mức độ chính xác khi phân tích cao hơn và hỗ trợ quyết định kinh doanh hiệu quả hơn. Đây là lý do giai đoạn làm sạch dữ liệu là một trong những bước cực kỳ quan trọng trong phân tích dữ liệu và chuẩn bị dữ liệu cho các mô hình máy học (ML).

Các bước cơ bản trong làm sạch dữ liệu

Quá trình làm sạch dữ liệu bao gồm một số bước xác định và sửa chữa các mục bị lỗi. Nó bao gồm 3 bước phổ biến:

1. Phân tích dữ liệu:

Bước đầu tiên trong quá trình làm sạch dữ liệu là phân tích dữ liệu để xác định các lỗi. Điều này bao gồm việc sử dụng các công cụ phân tích như Pandas để kiểm tra các giá trị không hợp lệ và lỗi trong dữ liệu.

  • Kiểm tra thông tin tổng quát về dữ liệu: Xem bằng mắt thường có thể lướt qua dữ liệu để hình dung được dữ liệu đang được cấu trúc như thế nào? Chứa những gì? Sau đó sử dụng phương pháp info() và describe() để xem thông tin tổng quát và thống kê về dữ liệu (dữ liệu có bao nhiêu, min, max, medium, std..).
  • Kiểm tra dữ liệu thiếu: Sử dụng phương thức isnull() hoặc isna() trong Pandas để kiểm tra các giá trị thiếu trong dữ liệu. Bước này giúp xác định các cột trong bảng dữ liệu chứa bao nhiêu dòng, thiếu bao nhiêu dữ liệu so với tổng số hàng. Nó giúp bạn xem cột đó có giá trị trong phân tích không có thể quyết định loại bỏ cột hay giữ lại, hoặc đi thu thập cho đầy đủ.
  • Kiểm tra dữ liệu trùng lặp: Sử dụng phương thức duplicated() để kiểm tra các hàng dữ liệu trùng lặp. Giúp loại bỏ các giá trị lặp đi lặp lại không mang nhiều ý nghĩa có thể dẫn đến các lỗi sai khi phân tích tổng sum() hoặc đếm số lượng count()
  • Kiểm tra lỗi định dạng: Sử dụng phương thức info() để kiểm tra kiểu dữ liệu của từng cột trong bảng dữ liệu. Nếu cột ngày có kiểu dữ liệu object sẽ bị sai trong quá trình phân tích sử dụng các hàm thời gian. Sử dụng phương pháp to_datetime() định dạng của các cột ngày tháng nếu bị sai kiểu dữ liệu, hoặc phương thức to_numeric() để định dạng của các cột liên quan tới số như số.
  • Kiểm tra dữ liệu ngoại lai: Sử dụng phương pháp IQR, vẽ Boxplot…để xác định các giá trị ngoại lai trong dữ liệu. Hai phương pháp này khá phổ biến để xác định giá trị ngoại lai.

Phân tích dữ liệu là bước quan trọng đầu tiên trong quá trình làm sạch dữ liệu. Sử dụng Pandas, bạn có thể dễ dàng kiểm tra thông tin tổng quát về dữ liệu, xác định các giá trị thiếu, dữ liệu trùng lặp, lỗi định dạng và dữ liệu ngoại lai.

2. Loại bỏ hoặc sửa lỗi:

Sau khi xác định được các lỗi, bước tiếp theo là loại bỏ hoặc sửa chữa chúng. Đây là bước quan trọng để đảm bảo dữ liệu của bạn trở nên chính xác và đáng tin cậy. Các bước bao gồm:

Xóa dữ liệu trùng lặp: Loại bỏ các hàng dữ liệu lặp lại để tránh sai lệch trong phân tích.

data.drop_duplicates(inplace=True)

Xử lý dữ liệu thiếu: Thay thế hoặc loại bỏ các giá trị bị thiếu. Có thể sử dụng các phương pháp như thay thế bằng giá trị trung bình, trung vị, hoặc xóa các hàng có giá trị thiếu.

data.dropna(inplace=True)  # Xóa các hàng có giá trị thiếu 

data.fillna(data.mean(), inplace=True)  # Thay thế giá trị thiếu bằng giá trị trung bình

data.fillna(data.median(), inplace=True) # hoặc thay thế giá trị thiếu bằng giá trị trung vị

Sửa lỗi định dạng: Chỉnh sửa các lỗi về định dạng như ngày tháng, số tiền để dữ liệu nhất quán và dễ xử lý.

# Chuyển đổi cột 'date' sang kiểu ngày tháng
data['date'] = pd.to_datetime(data['date'], errors='coerce')

# Chuyển đổi cột 'quantity' sang kiểu số (numeric)
data['quantity'] = pd.to_numeric(data['quantity'], errors='coerce')

Xử lý dữ liệu ngoại lai: Xác định và xử lý các giá trị ngoại lai có thể làm sai lệch kết quả phân tích. Các giá trị ngoại lai có thể được thay thế bằng giá trị trung vị để giảm thiểu tác động của chúng. Ở đây mình ví dụ cách sử dụng phương pháp IQR để xác định giá trị ngoại lai.

Q1 = data['quantity'].quantile(0.25)
Q3 = data['quantity'].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR

data = data[(data['quantity'] >= lower_bound) & (data['quantity'] <= upper_bound)]

Sửa lỗi cấu trúc: Sửa lỗi đánh máy và các điểm không nhất quán khác để dữ liệu tuân theo một mẫu hoặc quy ước chung như các giá trị không đồng nhất như trường ‘Nguồn dữ liệu’ có các dữ liệu (Google search, google search, Google Search). Với 3 giá trị khác nhau nhưng thực chất chỉ là từ một nguồn.

# Chuyển tất cả các tên nguồn dữ liệu thành chữ thường
data['source'] = data['source'].str.lower()

# Chuyển đổi chữ cái đầu tiên của mỗi từ thành chữ hoa
data['source'] = data['source'].str.title()

# Chuyển đổi chỉ chữ cái đầu tiên của chuỗi thành chữ hoa
data['source'] = data['source'].str.capitalize()

3. Xác nhận dữ liệu sạch:

Sau khi thực hiện các bước làm sạch dữ liệu, bạn cần kiểm tra lại để đảm bảo rằng tất cả các lỗi đã được xử lý và dữ liệu của bạn đã hoàn toàn sạch. Đây là bước cuối cùng để đảm bảo rằng dữ liệu của bạn sẵn sàng cho các phân tích sâu hơn. Kiểm tra lại dữ liệu:

  • Đảm bảo không còn giá trị bị thiếu.
  • Kiểm tra lại dữ liệu trùng lặp.
  • Xác nhận rằng các cột ngày tháng, các cột số đều có định dạng đúng.
# Kiểm tra lại dữ liệu thiếu
data.isnull().sum()

# Kiểm tra lại dữ liệu trùng lặp
data.duplicated().sum()

# Kiểm tra định dạng các cột
data.dtypes

# Hoặc
data.info()

Ví dụ làm sạch dữ liệu cơ bản bằng Pandas

Ở ví dụ này, chúng ta sẽ sử dụng dataset nổi tiếng “Titanic – Machine Learning from Disaster” từ Kaggle để minh họa các bước làm sạch dữ liệu. Dataset này chứa thông tin chi tiết về hành khách trên tàu Titanic, bao gồm các thông tin như tên, tuổi, giới tính, số vé và thông tin sống sót.

Dataset này phù hợp để thực hành làm sạch dữ liệu vì nó bao gồm nhiều vấn đề phổ biến mà chúng ta cần giải quyết như dữ liệu thiếu, dữ liệu trùng lặp, lỗi định dạng và dữ liệu ngoại lai.

Dataset Titanic còn được sử dụng rộng rãi trong các khóa học phân tích dữ liệu và dự án học máy vì các lý do sau:

  • Đa dạng về loại dữ liệu: Dataset này bao gồm nhiều loại dữ liệu khác nhau (số, chuỗi, ngày tháng), giúp bạn thực hành với nhiều kỹ thuật làm sạch dữ liệu.
  • Dữ liệu thực tế: Dữ liệu này phản ánh các vấn đề thực tế mà bạn có thể gặp phải khi làm việc với dữ liệu trong các dự án thực tế.
  • Tính phổ biến: Dataset này rất phổ biến trong cộng đồng khoa học dữ liệu, có nhiều tài liệu và hướng dẫn đi kèm, giúp bạn dễ dàng tìm hiểu và tham khảo.

Tiến hành làm sạch dữ liệu bằng notebooks trên Kaggle

Nếu các bạn có hứng thú với phân tích dữ liệu, có thể làm theo các bước sau, mình sẽ để code mà hình chụp từng bước để các bạn dễ thực hành và hình dung hơn.

Đầu tiên bạn vào Kaggle tạo một tài khoản mới, ở góc trên bên phải có icon hình con ngỗng bạn click vào và chọn ‘Your Work’ để truy cập vào phần quản lý và theo dõi các hoạt động của tài khoản cá nhân. Sau đó:

  • Click vào ‘Create’
  • Chọn ‘New Notebook’ để tạo một notebook mới

Import dữ liệu:

  • Click vào Add input
  • Nhập ‘Titanic – Machine Learning from Disaster’ vào ô tìm kiếm
  • Click vào dấu ‘+’ của dataset đầu tiên
  • Rồi bấm dấu ‘X’ góc trên bên phải để tắt phần tìm kiếm sau khi đã thêm dataset

Để tiến hành làm sạch dữ liệu, chúng ta cần import dữ liệu vào notebook. Dưới đây là các bước cụ thể để thực hiện điều này:

  • Bước 1: Click vào file train.csv để hiển thị đường dẫn dữ liệu
  • Bước 2: Click vào nút ‘Code’ để tạo một ô code mới, copy đoạn code bên dưới để vào ô code. Và thay đường dẫn file train.csv bằng đường dẫn của bạn.
  • Bước 3: Copy đường dẫn của file train.csv. Đường dẫn này sẽ được sử dụng trong đoạn mã để đọc dữ liệu vào Pandas DataFrame.
  • Cuối cùng bạn click vào icon hình tam giác bên trái của ô code để chạy dòng lệnh

Nhập đoạn code sau vào ô code mới bạn tạo, bạn thay đường dẫn của bạn vào giữa data = pd.read_csv(”)

import pandas as pd
data = pd.read_csv('/kaggle/input/titanic/train.csv') 
data.head()

Kiểm tra thông tin tổng quát dữ liệu

Tạo một ô code mới bằng cách click vào nút ‘Code’ rồi nhập code sau vào ô code và bấm icon tam giác để chạy code.

data.info()

Sau khi chạy thì bạn nhận được các thông tin về tập dữ liệu:

  • 891 dòng dữ liệu và 12 cột
  • Mỗi cột sẽ hiển thị thêm các thông tin: Tên cột, số lượng các giá trị không null (có dữ liệu), và kiểu dữ liệu của cột

Thống kê cơ bản về dữ liệu

Phương thức describe() trong Pandas cung cấp một bản tóm tắt thống kê về các cột số trong DataFrame. Dưới đây là kết quả của data.describe() được áp dụng trên dataset Titanic và giải thích chi tiết cho từng chỉ số thống kê:

  • count: Số lượng giá trị không bị thiếu trong mỗi cột. Ví dụ: Có 891 giá trị không bị thiếu trong các cột PassengerId, Survived, Pclass, SibSp, Parch, Fare, nhưng chỉ có 714 giá trị không bị thiếu trong cột Age.
  • mean: Giá trị trung bình của các giá trị trong mỗi cột. Ví dụ: Tuổi trung bình của hành khách (Age) là 29.70, số lượng anh chị em/đi cùng (SibSp) trung bình là 0.52, giá vé trung bình (Fare) là 32.20.
  • std: Độ lệch chuẩn của các giá trị trong mỗi cột, cho biết mức độ phân tán của dữ liệu. Ví dụ: Độ lệch chuẩn của tuổi hành khách (Age) là 14.53. Điều này có nghĩa là tuổi của hành khách trên tàu Titanic thường nằm trong khoảng ± 14.53 tuổi so với giá trị trung bình là 29.70. Phần lớn hành khách có độ tuổi từ 15.17 (29.70 – 14.53) đến 44.23 (29.70 + 14.53).
  • min: Giá trị nhỏ nhất trong mỗi cột. Ví dụ: Tuổi nhỏ nhất của hành khách (Age) là 0.42, giá vé nhỏ nhất (Fare) là 0.00.
  • 25%: Phân vị thứ 25 (hay còn gọi là Q1) là giá trị mà tại đó 25% các giá trị trong tập dữ liệu nhỏ hơn hoặc bằng giá trị này. Ví dụ: 25% hành khách trên tàu Titanic có tuổi nhỏ hơn hoặc bằng 20.125 tuổi.
  • 50%: Phân vị thứ 50 (hay còn gọi là Q2 hoặc trung vị) là giá trị mà tại đó 50% các giá trị trong tập dữ liệu nhỏ hơn hoặc bằng giá trị này. Ví dụ: 50% hành khách trên tàu Titanic có tuổi nhỏ hơn hoặc bằng 28 tuổi.
  • 75%: Phân vị thứ 75 (hay còn gọi là Q3) là giá trị mà tại đó 75% các giá trị trong tập dữ liệu nhỏ hơn hoặc bằng giá trị này. Ví dụ: 75% hành khách trên tàu Titanic có tuổi nhỏ hơn hoặc bằng 38 tuổi.
  • max: Giá trị lớn nhất trong mỗi cột. • Ví dụ: Tuổi lớn nhất của hành khách là 80.

Kiểm tra và xử lý giá trị thiếu

Ở dòng lệnh đầu tiên sẽ trả về các giá trị null trong mỗi cột dữ liệu. Ở cột Age có 177 giá trị thiếu, cột Cabin có 687 giá trị thiếu, Embarked có 2 giá trị thiếu

# 2. Kiểm tra và xử lý dữ liệu thiếu
data.isnull().sum()

Ở ô lệnh tiếp theo sẽ tiến hành thay thế các giá trị thiếu trong cột ‘Age’ bằng giá trị trung bình, và xoá các hàng có giá trị thiếu trong cột ‘Embarked’.

# Thay thế giá trị thiếu trong cột 'Age' bằng giá trị trung bình
data['Age'] = data['Age'].fillna(data['Age'].mean())

# Xóa các hàng có giá trị thiếu trong cột 'Embarked'
data = data.dropna(subset=['Embarked'])

Sau khi chạy 2 lệnh trên, khi kiểm tra lại giá trị thiếu thì các cột ‘Age’ và ‘Embarked’ đã không còn giá trị thiếu.

Kiểm tra và xoá giá trị trùng lặp

Bạn chạy 2 lệnh dưới đây để kiểm tra xem tập dữ liệu của bạn có bao nhiêu giá trị trùng lặp. Nếu bạn muốn xoá các giá trị trùng lặp đó thì thực hiện lệnh thứ 2 ở dưới.

# Kiểm tra và xóa dữ liệu trùng lặp
data.duplicated().sum()

# Xoá giá trị trùng lặp
data.drop_duplicates(inplace=True)

Xử lý dữ liệu ngoại lai

Bạn thực hiện đoạn code dưới đây để lọc bỏ các giá trị ngoại lai cho cột Fare, bạn có thể làm tương tự cho các cột khác.

# Nhập thư viện NumPy
import numpy as np

# Tính toán các phân vị và IQR
Q1 = data['Fare'].quantile(0.25)
Q3 = data['Fare'].quantile(0.75)
IQR = Q3 - Q1

# Xác định các giới hạn để phát hiện giá trị ngoại lai
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR

# Lọc và giữ lại các giá trị không phải là ngoại lai
data = data[(data['Fare'] >= lower_bound) & (data['Fare'] <= upper_bound)]

Làm sạch dữ liệu là một bước quan trọng trong quá trình phân tích dữ liệu. Việc sử dụng thư viện Pandas trong Python giúp cho quá trình này trở nên dễ dàng và hiệu quả hơn. Hy vọng bài viết này cung cấp cho bạn một cái nhìn tổng quan và hướng dẫn cơ bản về làm sạch dữ liệu.

Tài liệu tham khảo:

  • https://pandas.pydata.org/pandas-docs/stable/user_guide/index.html#user-guide
  • https://realpython.com/python-data-cleaning-numpy-pandas/

Có thể bạn quan tâm:

Chia sẻ bài viết này
Theo dõi
Tôi tin rằng chìa khóa để thành công trong digital marketing nằm ở việc đưa ra quyết định dựa trên dữ liệu. Đó là lý do tại sao tôi đặc biệt quan tâm đến việc thiết lập theo dõi tracking và thu thập dữ liệu hiệu quả, để hiểu hành vi người dùng của từng nền tảng quảng cáo. Nó giúp tôi tự tin hơn trong việc tối ưu hóa các chiến dịch quảng cáo. Mỗi con số, mỗi phân tích đều giúp tôi tiến gần hơn đến mục tiêu cuối cùng: không chỉ đạt được kết quả, mà còn có khả năng mở rộng vượt trội.
Để lại một bình luận

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Exit mobile version