- vừa được xem lúc

Buổi hẹn hò đầu tiên với bộ dữ liệu, chúng ta nên làm gì?

0 0 28

Người đăng: Tùng Dương Bùi

Theo Viblo Asia

Khi có một bộ dữ liệu trong tay, phần lớn những newbie (trong đó có cả mình) sẽ nghĩ tới việc bắt tay vào mô hình hoá, tính toán, phân tích, thậm chí bê nguyên các model machine learning vào để predict rất hoành tráng. Nhưng..., bùm, lỗi hiện lên khi dùng các thư viện, nếu may mắn không có lỗi, thì kết quả cũng hết sức tệ, không chính xác.

"Garbage in, garbage out."

image.png Nguồn: Gil Press - Forbes

Ta có thể thấy, Data Scientists dành tới 60% thời gian của mình để Clean và tổ chức lại dữ liệu.

"Quality data beats fancy algorithms."

Quá trình Cleaning Data không chỉ diễn ra một lần, mà sẽ luôn được lặp lại qua việc mô hình hoá, trực quan hoá, khai phá dữ liệu. image.png Nguồn: Datacamp

Import các thư viện và thiết lập một số thông số

import pandas as pd
import numpy as np import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = (12, 8) import seaborn as sns
sns.set(style='whitegrid') import warnings
warnings.filterwarnings('ignore')

Load dữ liệu.

Dữ liệu mình sẽ sử dụng sẽ là "Đánh giá các loại mì ăn liền".

https://www.kaggle.com/residentmario/ramen-ratings

df = pd.read_csv('/content/gdrive/My Drive/ramen-ratings.csv')
df.head()

Mình sẽ load dữ liệu vào biến "df". Và luôn in ra vài dòng của dữ liệu với head() để có cái nhìn đầu tiên về "đối tượng" nhé ❤️. image.png

Chuẩn hoá định dạng của dữ liệu.

Từ đây ta có thể thấy có Review Id, Brand (thương hiệu), Variety (Sản phẩm), Style (Kiểu đóng gói), Country (Xuất xứ), Stars (Đánh giá), Top Ten !? (cái này mình không rõ là Top Ten cái gì).

df.info()

info() là một method khá hữu ích để xem thông tin về kiểu dữ liệu của các cột, số lượng hàng và cột, các giá trị bị thiếu, bộ nhớ sử dụng. image.png

Brand, Variety, Style, Country có kiểu 'object' vì nó có chứa dữ liệu kiểu 'str'. Review id thì không có gì đáng quan tâm lắm. Chỉ còn 'Stars' và 'Top Ten'. 'Stars' là các đánh giá bằng số thực, nên để hợp lý, ta nên chuyển nó sang kiểu 'float'.

df['Stars'] = pd.to_numeric(df['Stars'])

image.png

Á, có dữ liệu không theo định dạng số.. Ta sẽ tự viết hàm để kiểm tra, nếu không thể đưa về float, thì sẽ in chúng ra.

def check(e): try: float(e) except: print(e) for _, row in df.iterrows(): check(row['Stars'])

image.png

Giờ thì dễ rồi, chúng đều là 'Unrated', ta chỉ cần replace chúng với một giá trị khác, mình tạm thời sẽ replace chúng với 'NaN'. Rồi dùng method to_numeric() để thực hiện nốt công việc bên trên.

df['Stars'].replace('Unrated', np.NaN, inplace=True)
df['Stars'] = pd.to_numeric(df['Stars'])

'Top Ten', có lẽ cần phải đào sâu hơn để biết được chính xác nó có những gì.

df['Top Ten'].unique()

image.png

Có thể hiểu rằng, nếu Sản phẩm đó nằm trong top 10 của năm nào đó, thì sẽ có số năm và hạng. Còn không có thì sẽ là nan. '\n' có thể là lỗi khi thu thập dữ liệu. Vậy ta sẽ replace nan và '\n' thành 'No'.

df['Top Ten'].replace([np.NaN, '\n'], ['No', 'No'], inplace=True)

Giờ ta sẽ xem tới các giá trị của chúng có gì bất thường không.

df.describe()

image.png

Stars có min là 0, max là 5, hoàn toàn hợp lý.

Loại bỏ các giá trị sai, trùng lặp.

Loại bỏ toàn bộ các giá trị trùng lặp trong bộ dữ liệu.

df.drop_duplicates(inplace=True)

Giờ ta sẽ thử vizualize cột 'Country' nhé.

sns.countplot(df.Country, order=df.Country.value_counts().index)
plt.xticks(rotation=75)
plt.title('Số lượng sản phẩm theo từng quốc gia')
plt.xlabel('Quốc gia')
plt.ylabel('Số lượng sản phẩm')
plt.show()

image.png

Ta có thể thấy có vài quốc gia là một, nhưng do cách viết khác nhau nên thành 2 giá trị khác nhau (USA và United States, Netherlands và Holland), một số không phải quốc gia như (Dubai, Sarawak), UK thì mình sẽ chuyển sang United Kingdom để lát nữa có thể dùng được thư viện 'awoc'.

df['Country'].replace(['USA', 'UK', 'Holland', 'Dubai', 'Sarawak'],
['United States', 'United Kingdom', 'Netherlands', 'United Arab Emirates', 'Malaysia'],
inplace=True)

image.png

Nếu để ý thấy ở biểu đồ có Việt Nam ❤️. Để đơn giản, mình sẽ tách ra thành DataFrame riêng và clean DataFrame này thôi nhé.

vietnam = df[df['Country'] == 'Vietnam']
len(vietnam.Variety)
>>> 108

Có tới 108 Sản phẩm Mì ở Việt Nam. Ta sẽ cùng xem mỗi Thương hiệu có bao nhiêu sản phẩm mì.

sns.countplot(vietnam.Brand, order=vietnam.Brand.value_counts().index)
plt.title('Số lượng sản phẩm theo thương hiệu')
plt.xlabel('Thương hiệu')
plt.ylabel('Số lượng sản phẩm')
plt.xticks(rotation=75)
plt.show()

image.png

Từ đây ta thấy có vài giá trị cần phải sửa, như Acecook chính là Vina Acecook. Saigon Ve Wong là Ve Wong và có Thương hiệu A-One, ta sẽ cho chúng thành A-One. Một số thương hiệu là nhập khẩu hoặc xách tay (vì người đánh giá có thể là ăn được chúng tại Việt Nam nên nghĩ rằng chúng là thương hiệu Việt Nam) như Noah Foods, Unif / Tung-I, Uni-President.

vietnam['Brand'].replace(['Saigon Ve Wong', 'Ve Wong', 'Acecook'], ['A-One', 'A-One', 'Vina Acecook'], inplace=True) vietnam = vietnam[~vietnam['Brand'].isin(['Noah Foods', 'Unif / Tung-I', 'Uni-President'])]

Vizualize lại các sản phẩm theo thương hiệu. image.png

Thêm các tính năng mới.

Việc biết được các tính năng có gì, và cấu trúc ra sao, ràng buộc chúng về cùng một định dạng, mình hoàn toàn có thể tạo ra thêm các tính năng mới cho bộ dữ liệu.

Mình sẽ thêm cột 'Awared' để thể hiện sản phẩm đó đã nằm trong top 10 hay chưa. Rồi sẽ là True, chưa là False.

df['Awared'] = df['Top Ten'].apply(lambda x: True if x != 'No' else False)

Hay với tên quốc gia chuẩn, mình có thể kết hợp được với các thư viện khác một cách dễ dàng, mình dùng thư viện 'awoc' để thêm tính năng cho bộ dữ liệu. Mình sẽ thêm cột 'Continent' theo từng quốc gia.

!pip install awoc
import awoc
my_world = awoc.AWOC() df['Continent'] = df['Country'].apply(lambda x: my_world.get_country_continent_name(x))

Check thử xem đã ổn chưa.

df['Continent'].unique()

image.png

Và đây là bộ dữ liệu chúng ta có được sau cùng. image.png

Kết.

Vậy là kết thúc buổi hẹn đầu tiên rồi. Càng dành nhiều thời gian chuẩn bị, ta càng có thể có được cái mình muốn từ "nàng". Khi đã đủ tốt, ta thích nhét cái gì vào cũng đều cho ra kết quả mong đợi, hoặc chí ít cũng không bị fail một cách thảm hại.

Đây chỉ là những bước rất cơ bản để có thể clean dữ liệu, để tiến hành các bước tiếp theo như phân tích, áp dụng model machine learning. Chúng ta cũng có thể dễ dàng thêm các tính năng mới, để thấy được các insight thú vị, cũng như cải thiện độ chính xác cho model. Tuy vậy, vẫn còn rất nhiều việc phải làm với bộ data này.

Nếu mọi người có câu hỏi gì, hay có ý kiến đóng góp xin hãy bình luận bên dưới ạ. Rất mong các anh chị nhận xét, góp ý, và đặc biệt chỉ ra các lỗi sai để em khắc phục. Cảm ơn mọi người đọc tới đây, em xin trân thành cảm ơn ??.

Tài liệu tham khảo

https://towardsdatascience.com/the-ultimate-guide-to-data-cleaning-3969843991d4 https://www.forbes.com/sites/gilpress/2016/03/23/data-preparation-most-time-consuming-least-enjoyable-data-science-task-survey-says/?sh=14918e66f637 https://www.kaggle.com/residentmario/ramen-ratings

Bình luận

Bài viết tương tự

- vừa được xem lúc

Giới thiệu về Matplotlib (một thư viện rất hữu ích của Python dùng để vẽ đồ thị)

Matplotlib. Để thực hiện các suy luận thống kê cần thiết, cần phải trực quan hóa dữ liệu của bạn và Matplotlib là một trong những giải pháp như vậy cho người dùng Python.

0 0 34

- vừa được xem lúc

What exactly is matplotlib?

Introduction. For Python and its numerical extension NumPy, Matplotlib is a cross-platform data visualisation and graphical charting package.

0 0 14

- vừa được xem lúc

Lập Trình Hướng Đối Tượng trong Python

Chào các bạn Trong bài này, bạn sẽ tìm hiểu về Lập trình hướng đối tượng (OOP) bằng Python và khái niệm cơ bản của nó và một số các ví dụ. Các bạn cùng tìm hiểu trong bài viết của mình nhé.

0 0 50

- vừa được xem lúc

Lớp trong Python

. Hôm ni, mình học tiếp về bạn “Lớp(class) trong python”, bài blog tiếp theo nằm trong series “Khám phá Đại Bản Doanh Python”(nội dung trong bài series này từ chủ yếu mình lấy từ python.org rồi viết lại hoặc dịch lại theo ngôn ngữ của mình).

0 0 33

- vừa được xem lúc

Tìm hiểu về thư viện Numpy trong Python(Phần 3)

Trong bài viết trước tôi đã giới thiệu cho bạn về NumPy, tìm hiểu về Mảng trong NumPy. Trong bài viết này chúng ta sẽ tiếp tục tìm hiểu về các kiểu dữ liệu khác trong NumPy.

0 0 141

- vừa được xem lúc

Hướng dẫn cài đặt Anaconda trên Ubuntu

Anaconda là một nền tảng mã nguồn mở về Data Science và Machine Learning trên Python thông dụng nhất hiện nay, Anaconda có vai trò đơn giản hóa việc triển khai và quản lí các gói cài đặt khi làm việc với Python. Anaconda được cài đặt dễ dàng trên 3 nền tảng hệ điều hành thông dụng hiện nay là Ubuntu

0 0 43