Chuyển đến nội dung chính

Hướng dẫn Trực quan hóa Dữ liệu với Python và Tableau

Tìm hiểu cách bạn có thể dùng Python để mở rộng khả năng trực quan hóa dữ liệu của Tableau.
Đã cập nhật 5 thg 10, 2026  · 15 phút đọc

Khám phá cùng AI

ChatGPTClaudePerplexity

Hướng dẫn Python Tableau

Vì sao dùng Python với Tableau

Tableau cung cấp nhiều lựa chọn để bổ sung và tạo các trường dữ liệu mới. Bạn có thể thực hiện các hàm số học, logic, không gian, và mô hình dự báo bằng trường tính toán. Tableau là một công cụ Business Intelligence (BI) mạnh mẽ, nhưng vẫn có những giới hạn; đó là lúc ngôn ngữ Python phát huy tác dụng.  

Python rất phổ biến trong cộng đồng dữ liệu. Bạn có thể dùng nó để trích xuất, làm sạch, xử lý và áp dụng các hàm thống kê phức tạp lên dữ liệu. Python cung cấp các framework học máy, điều phối dữ liệu, đa xử lý, và thư viện phong phú để thực hiện hầu như mọi tác vụ có thể. 

Python là ngôn ngữ đa dụng, và dùng nó cùng Tableau cho phép chúng ta tự do thực hiện các tác vụ rất phức tạp. Trong hướng dẫn này, chúng ta sẽ dùng Python để trích xuất và làm sạch dữ liệu. Sau đó, chúng ta sẽ dùng dữ liệu sạch để tạo trực quan hóa dữ liệu trên Tableau.

Chúng ta sẽ không dùng Tabpy để tạo máy chủ Python cho Tableau và chạy script Python trong Tableau. Thay vào đó, trước tiên chúng ta sẽ trích xuất và làm sạch dữ liệu bằng Python (Jupyter Notebook) rồi dùng Tableau để tạo trực quan hóa tương tác. 

Trực quan hóa dữ liệu với Tableau
Goodreads Data Viz | Tableau Public

Đây là hướng dẫn tuần tự dựa trên mã về Goodreads API và tạo trực quan hóa phức tạp trên Tableau. Xem liên kết dưới đây để truy cập mã và bảng điều khiển Tableau. 

Nạp và Xử lý Dữ liệu với Python

Ở phần đầu của hướng dẫn, chúng ta sẽ học cách dùng Goodreads API để truy cập dữ liệu công khai. Trong trường hợp này, chúng ta sẽ tập trung vào hồ sơ người dùng và chuyển đổi nó thành một dataframe Pandas dễ đọc. Sau đó, chúng ta sẽ làm sạch dữ liệu và xuất ra định dạng tệp CSV. 

Bắt đầu

Chúng ta sẽ dùng DataLab để chạy mã Python. Môi trường này đi kèm các gói Python cần thiết cho các tác vụ khoa học dữ liệu. 

Nếu bạn mới dùng Python và muốn thiết lập môi trường trên máy cục bộ, hãy cài đặt Anaconda. Gói này sẽ cài Python, Jupyter Notebook và các gói Python cần thiết. 

Trước khi bắt đầu viết mã, chúng ta cần cài đặt gói xmltodict vì nó không nằm trong DataLab hay bộ công cụ dữ liệu của Anaconda. Chúng ta sẽ dùng `pip` để cài gói Python còn thiếu.

Lưu ý: Ký hiệu `!` chỉ hoạt động trong Jupyter Notebook. Nó cho phép chúng ta truy cập terminal ngay trong ô mã của Jupyter. 

!pip install xmltodict

>>> Collecting xmltodict
>>>   Using cached xmltodict-0.13.0-py2.py3-none-any.whl (10.0 kB)
>>> Installing collected packages: xmltodict
>>> Successfully installed xmltodict-0.13.0

Ở bước tiếp theo, chúng ta sẽ import các gói cần thiết. 

import pandas as pd
import xmltodict
import urllib.request

Phân tách liên kết hồ sơ

Để trích xuất dữ liệu người dùng, chúng ta cần cả user id và user name. Trong phần này, chúng ta sẽ phân tách liên kết hồ sơ người dùng (Abid). 

Lưu ý: Bạn có thể dùng hồ sơ của bạn bè hoặc liên kết hồ sơ của chính bạn để chạy script này. 

  1. Trích xuất user_id bằng cách lọc các chữ số trong liên kết và trả về “73376016”. 
  2. Để trích xuất user_name, chúng ta sẽ tách chuỗi dựa trên user_id rồi tách tiếp trên dấu “-” để lấy tên người dùng. Sau khi thay “-” bằng khoảng trắng, chúng ta có được tên người dùng “abid”.
  3. Cuối cùng, chúng ta sẽ nối user_id với user_name. ID duy nhất này sẽ được dùng ở phần tiếp theo để truy cập dữ liệu người dùng.
Goodread_profile = "https://www.goodreads.com/user/show/73376016-abid"

user_id = ''.join(filter(lambda i: i.isdigit(), Goodread_profile))
user_name = Goodread_profile.split(user_id, 1)[1].split('-', 1)[1].replace('-', ' ')
user_id_name = user_id+'-'+user_name

print(user_id_name)

>>> 73376016-abid

Trích xuất dữ liệu từ Goodreads

Cuối năm 2020, Goodreads sẽ ngừng cung cấp developer API. Bạn có thể đọc toàn bộ thông báo tại đây. Để vượt qua vấn đề này, chúng ta sẽ dùng các khóa API từ những dự án cũ như streamlit_goodreads_app. Dự án này giải thích cách truy cập dữ liệu người dùng Goodreads bằng API. 

Goodreads cũng cho phép bạn tải dữ liệu ở định dạng CSV mà không cần khóa API, nhưng nó chỉ giới hạn cho một người dùng và không cho phép trích xuất dữ liệu thời gian thực. 

Trong phần này, chúng ta sẽ tạo các hàm nhận vào user_id_name, version, shelf, per_page và apiKey. 

  • apiKey: dùng để truy cập dữ liệu công khai
  • version: chỉ định kiểu dữ liệu mới nhất.
  • shelf: Có nhiều kệ trong hồ sơ người dùng nhưng thường là read, to-read và currently-reading.
  • per_page: Số lượng sách mỗi trang

Hàm sẽ nhận đầu vào của người dùng để tạo URL rồi tải dữ liệu bằng urllib.request. Cuối cùng, chúng ta nhận dữ liệu ở định dạng XML. 

apiKey = "ZRnySx6awjQuExO9tKEJXw"
version = "2"
shelf = "read"
per_page = "200"

def get_user_data(user_id, apiKey, version, shelf, per_page):
    api_url_base = "https://www.goodreads.com/review/list"
    final_url = (
        api_url_base
        + user_id
        + ".xml?key="
        + apiKey
        + "&v="
        + version
        + "&shelf="
        + shelf
        + "&per_page="
        + per_page
    )
    contents = urllib.request.urlopen(final_url).read()
    return contents
contents = get_user_data(user_id_name,apiKey,version, shelf, per_page)
print(contents[0:100])


>>> b'<?xml version="1.0" encoding="UTF-8"?>\n<GoodreadsResponse>\n  <Request>\n    <authentication>true</aut'

Chuyển đổi XML sang JSON

Dữ liệu ban đầu của chúng ta ở định dạng XML và không có cách trực tiếp để chuyển thành cơ sở dữ liệu có cấu trúc. Vì vậy, chúng ta sẽ chuyển nó sang JSON bằng gói Python xmltodict. 

Dữ liệu XML được chuyển thành JSON lồng nhau, và để hiển thị mục đầu tiên trong dữ liệu đánh giá sách, chúng ta sẽ dùng dấu ngoặc vuông để truy cập dữ liệu được đóng gói. 

Bạn có thể thử nghiệm với metadata và khám phá thêm, nhưng trong hướng dẫn này, chúng ta sẽ tập trung vào dữ liệu đánh giá của người dùng.  

contents_json = xmltodict.parse(contents)
print(contents_json["GoodreadsResponse"]["reviews"]["review"][:1])

>>> [{'id': '4626706284', 'book': {'id': {'@type': 'integer', '#text': '57771224'}, 'isbn': '1250809606', 'isbn13': '9781250809605', 'text_reviews_count': {'@type': 'integer', '#text': '150'}, 'uri': 'kca://book/amzn1.gr.book.v3.tcNoY0o7ErAhczdQ', 'title': 'Good Intentions', 'title_without_series': 'Good Intentions', 'image_url': .........

Chuyển đổi JSON sang Dataframe Pandas 

Để chuyển kiểu dữ liệu JSON sang dataframe Pandas, chúng ta sẽ dùng hàm json_normalize. Dữ liệu review nằm ở cấp độ thứ ba, và để truy cập, chúng ta sẽ đi qua GoodreadsResponse, reviews, và review.

Trước khi hiển thị dataframe, chúng ta sẽ lọc bỏ dữ liệu không liên quan bằng cách loại các sách thiếu cột date_updated. 

Tìm hiểu nhiều cách nạp tệp CSV, bảng tính, JSON, cơ sở dữ liệu SQL và API bằng Pandas qua khóa học Streamlined Data Ingestion with pandas. 

df = pd.json_normalize(contents_json["GoodreadsResponse"]["reviews"]["review"])
df = df[df["date_updated"].notnull()]
df.head()

Chuyển đổi JSON sang Dataframe Pandas

Làm sạch dữ liệu

Dataframe thô trông khá sạch, nhưng chúng ta vẫn cần giảm số lượng cột. 

Như có thể thấy, có 61 cột.

df.shape
(200, 61)

Hãy loại các cột trống. 

df.dropna(axis=1, how='all', inplace=True)
df.shape
(200, 58)

Chúng ta đã loại thành công 3 cột có giá trị thiếu.

Giờ chúng ta sẽ kiểm tra tất cả tên cột bằng `df.columns` và chọn các cột hữu ích nhất. 

final_df = df[
    [
        "rating",
        "started_at",
        "read_at",
        "date_added",
        "book.title",
        "book.average_rating",
        'book.ratings_count',
        "book.publication_year",
        "book.authors.author.name"
    ]
]
final_df.head()

Như có thể quan sát, dataframe cuối cùng trông sạch với các trường dữ liệu liên quan. 

Dataframe cuối cùng

Xuất tệp CSV

Ở phần cuối, chúng ta sẽ xuất dataframe ra tệp CSV tương thích với Tableau. Trong hàm to_csv, thêm tên tệp với phần mở rộng và bỏ chỉ mục bằng cách đặt tham số index thành False. 

final_df.to_csv("abid_goodreads_clean_data.csv",index=False)

Tệp CSV sẽ xuất hiện trong thư mục hiện tại.

Tệp CSV Goodreads đã làm sạch

Tệp CSV Goodreads đã làm sạch

Bạn cũng có thể xem Python Jupyter Notebook: Nạp dữ liệu bằng Goodreads API. Nó sẽ giúp bạn gỡ lỗi mã, và nếu bạn muốn bỏ qua phần lập trình Python, bạn có thể tải tệp bằng cách nhấp vào nút Copy & Edit và chạy script. 

Trực quan hóa dữ liệu trong Tableau

Ở phần thứ hai, chúng ta sẽ dùng dữ liệu sạch và tạo các trực quan hóa dữ liệu đơn giản lẫn phức tạp trong Tableau. Mục tiêu là vẽ các biểu đồ tương tác giúp chúng ta hiểu hành vi đọc sách của người dùng. 

Kết nối dữ liệu

Chúng ta sẽ kết nối tệp CSV bằng cách chọn tùy chọn Text và chọn tệp abid_goodreads_clean_data.csv. Sau đó, chúng ta sẽ đổi các trường dữ liệu Started At, Read At và Date Added sang Date & Time, như minh họa bên dưới. 

Lưu ý: Thực hành tốt là chỉnh sửa các trường dữ liệu của bạn ngay từ đầu.  

Kết nối dữ liệu và chỉnh kiểu dữ liệu
Kết nối dữ liệu và chỉnh kiểu dữ liệu

Tạo biểu đồ tần suất xếp hạng

Trong phần này, chúng ta sẽ tạo biểu đồ histogram về xếp hạng sách của người dùng. 

  • Trước tiên, kéo thả trường Rating vào kệ Rows. 

Histogram xếp hạng của người dùng Phần 1
Histogram xếp hạng của người dùng Phần 1

  • Nhấp vào nút thả xuống Show Me để truy cập các mẫu trực quan hóa. Chúng ta sẽ chuyển biểu đồ cột thành histogram bằng cách chọn tùy chọn Histogram.

Histogram xếp hạng của người dùng Phần 2
Histogram xếp hạng của người dùng Phần 2

  • Trục Rating có vạch chia khoảng 0,5. Hãy đổi vạch chia bằng cách nhấp chuột phải vào trục dưới cùng và chọn Edit Axis. Sau đó chuyển sang thẻ Tick Marks và đổi Major Tick Marks sang Fixed. Đảm bảo Tick Origin là 0 và Tick Interval là 1.


Histogram xếp hạng của người dùng Phần 3

  • Chúng ta sẽ tùy biến histogram bằng cách làm gọn nhãn trục, đổi màu và đường viền cột, và thêm nhãn đánh dấu. Bạn có thể làm tất cả bằng cách truy cập các tùy chọn trên bảng Marks ở phần giữa bên trái. 

Histogram xếp hạng của người dùng Phần 4
Histogram xếp hạng của người dùng Phần 4

Người dùng thường cho điểm trong khoảng từ 3 đến 4. Điểm 0 là các sách chưa được đánh giá. 

Biểu đồ đường

Để vẽ biểu đồ đường:

  1. Kéo thả trường Book.Publication Year vào kệ Rows và Columns.
  2. Đổi trường dữ liệu ở Rows thành đếm bằng cách nhấp chuột phải và chọn Measure > Count. 
  3. Đổi trường dữ liệu ở Columns thành kiểu Dimension bằng cách nhấp chuột phải và chọn Dimensions.
  4. Vào bảng Marks, nhấp tùy chọn thả xuống Automatic và đổi thành Line. 
  5. Làm gọn nhãn trục, tùy biến biểu đồ, thêm tiêu đề và loại bỏ giá trị null.

Biểu đồ đường Năm xuất bản sách
Biểu đồ đường Năm xuất bản sách

Người dùng đã đọc một số sách cũ, nhưng họ đặc biệt quan tâm đến các sách xuất bản trong giai đoạn 2015 đến 2020. 

Nếu bạn cảm thấy quá tải và muốn học những điều cơ bản về Tableau, bạn có thể thấy Hướng dẫn Tableau cho người mới bắt đầu của Eugenia Anello hữu ích. 

Biểu đồ hộp

Để vẽ box-and-whisker plot:

  1. Kéo thả trường dữ liệu Books.Ratings Count vào kệ Rows. Đổi từ Discrete sang Continuous. 
  2. Kéo thả trường dữ liệu Books.Ratings Count vào tùy chọn Detail ở bảng Marks. Đổi từ Measure sang Dimension.
  3. Nhấp tùy chọn thả xuống Show Me và chọn loại box-and-whisker plots. 
  4. Di chuyển trường dữ liệu từ Rows sang kệ Columns để làm ngang. 
  5. Phần cuối là tùy biến: tăng kích thước, đổi màu, thêm tiêu đề và đổi tên trục thành “Popularity”.

Boxplot số lượt đánh giá mỗi cuốn sách
Boxplot số lượt đánh giá mỗi cuốn sách

Có vẻ người dùng đọc các sách ít phổ biến và một vài sách nổi tiếng. Điều này cho thấy người dùng có gu riêng dựa trên nội dung chứ không phải độ phổ biến. 

Biểu đồ bong bóng

Chúng ta đã tạo các trực quan hóa đơn giản nhưng hữu ích để tìm hiểu hành vi đọc sách của người dùng. Tiếp theo, chúng ta sẽ học trực quan hóa phức tạp hơn bao gồm tạo trường tính toán mới, chỉnh sửa bins và tạo nhiều lớp.

Trong biểu đồ bong bóng, nhãn thể hiện số ngày người dùng hoàn thành một cuốn sách, và kích thước bong bóng biểu thị số lần xuất hiện. Chúng ta không có trường dữ liệu về thời lượng, nhưng có thể tạo từ Started At và Read At.

Bước đầu tiên, chúng ta phải tạo một trường tính toán mới bằng cách nhấp mũi tên xuống trong bảng Data và chọn Create Calculated Field. 

Tạo trường tính toán
Tạo trường tính toán

Một cửa sổ mới sẽ bật lên, và bạn cần:

  1. Đổi tên tiêu đề thành “Read Duration”
  2. Dùng hàm DATEDIFF để lấy chênh lệch giữa Read At và Started At.
  3. Đảm bảo đối số đầu tiên của hàm là “day”.
  4. Kéo thả hoặc gõ tên trường trong ngoặc vuông làm đối số thứ hai và thứ ba. 

Thời lượng đọc theo ngày
Thời lượng đọc theo ngày

Trường dữ liệu Read Duration là liên tục, và để vẽ trực quan hóa packed bubbles, chúng ta phải chia trường này thành các phần nhỏ gọi là bins. 

  1. Kéo thả trường `Read Duration` vừa tạo lên kệ Rows.
  2. Nhấp Show Me và chọn histogram. Tableau sẽ tự động tạo một trường bin cho bạn.

Tạo trường Bin
Tạo trường Bin 

  1. Nhấp chuột phải vào trường Read Duration (bin) vừa tạo và chọn tùy chọn Read Duration in Days.
  2. Đổi Size of Bins thành 10. Việc này sẽ tạo nhiều phần dữ liệu nhỏ hơn giúp chúng ta tạo phiên bản tinh chỉnh hơn của packed bubbles plot. 

Chỉnh sửa Bins
Chỉnh sửa Bins

Chúng ta đã vượt qua phần khó, giờ là lúc hưởng thành quả. 

  1. Để tạo trực quan hóa đơn giản, nhấp Show Me và chọn tùy chọn packed bubbles. Bạn sẽ thấy các vòng tròn đơn sắc với kích thước khác nhau. 
  2. Để thêm màu sắc, chúng ta sẽ kéo thả trường Read Duration vào tùy chọn Color trong bảng Marks. 
  3. Đổi trường màu sang Count (Distinct) bằng cách nhấp chuột phải vào trường và chọn Measure > Count (Distinct). Mỗi bin hoặc nhãn sẽ có một màu riêng. 

Biểu đồ Packed Bubbles đơn sắc
Biểu đồ Packed Bubbles đơn sắc

  1. Nhấp vào tùy chọn Color trong bảng Marks và chọn Edit Colors… > Sunrise-Sunset Diverging. Bạn có thể chọn bất kỳ dải màu chuyển sắc nào phù hợp. 
  2. Phần cuối là tùy biến để đảm bảo trực quan hóa hấp dẫn và truyền tải đúng thông điệp.

Biểu đồ Packed Bubbles
Biểu đồ Packed Bubbles 

Người dùng mất chưa đến một ngày để hoàn thành phần lớn sách. Bạn cũng có thể thấy một vài ngoại lệ trên 300. 

Chúng ta cũng có thể tạo một bảng điều khiển Tableau bằng cách kết hợp các trực quan hóa này. Học cách tạo bảng điều khiển Tableau trong hướng dẫn này.

Kết luận

Trong hướng dẫn này, chúng ta đã học tầm quan trọng của Python và cách dùng nó với Tableau. Ở phần đầu, chúng ta trích xuất dữ liệu người dùng Goodreads bằng developer API và chuyển dữ liệu XML thành dataframe Pandas sạch và có cấu trúc. Ở phần hai, chúng ta dùng dữ liệu sạch để tạo trực quan hóa dữ liệu cả đơn giản lẫn phức tạp. 

Sự kết hợp giữa Python và Tableau mở ra một thế giới khả năng mới. Bạn có thể tích hợp pipeline dữ liệu, triển khai mô hình học máy, chạy phân tích thống kê phức tạp và thực hiện nhiều tác vụ vốn không thể chạy chỉ với Tableau. 

Bạn có thể chạy mã Python trên DataLab miễn phí, và nền tảng này đi kèm tất cả gói cần thiết để bạn chạy ví dụ này. Để tạo trực quan hóa Tableau, chúng ta dùng phiên bản miễn phí của Tableau là Tableau Public.

Nếu bạn mới dùng Python và muốn tìm hiểu thêm về chức năng và cú pháp, hãy xem khóa học Introduction to Data Science in Python. Bạn cũng có thể nắm vững các kiến thức cơ bản về trực quan hóa và tùy biến trong Tableau bằng lộ trình kỹ năng Tableau Fundamentals. Lộ trình gồm 5 khóa học bao phủ giới thiệu về Tableau, phân tích dữ liệu, tạo bảng điều khiển tương tác, làm việc trên nghiên cứu tình huống và kết nối nhiều nguồn dữ liệu.

Chủ đề
Tableau
Trực quan hóa Dữ liệu
Python

Khóa học Tableau và Python tại DataCamp 

Khóa học

Nhập môn Python

4 giờ
7.1M
Nắm vững phân tích dữ liệu với Python chỉ trong 4 giờ. Khóa học online này giúp bạn làm quen với giao diện Python và các thư viện phổ biến.
Xem chi tiếtRight Arrow
Bắt Đầu Khóa Học
Xem thêmRight Arrow
Liên quan

blog

Claude Opus 4.6: Tính năng, Điểm chuẩn, Bài kiểm tra thực hành và hơn thế nữa

Mô hình mới nhất của Anthropic dẫn đầu ở mã hóa tác tử và lập luận phức tạp. Thêm vào đó, nó có cửa sổ ngữ cảnh 1M.
Matt Crabtree's photo

Matt Crabtree

10 phút

Xem ThêmXem Thêm