Hướng dẫn dumbbell plot python - âm mưu quả tạ con trăn

Hiển thị sự khác biệt nhóm mà không có biểu đồ thanh

Các ô tạ, như biểu đồ thanh, có thể được sử dụng để so sánh hai nhóm (ví dụ: tỷ lệ nam và nữ). Một lợi thế của một âm mưu tạ là nó làm cho hình dung của bạn nhỏ gọn hơn, điều này hữu ích khi so sánh nhiều nhóm (ví dụ: tỷ lệ nam và nữ trong các ngành nghề khác nhau). Ngoài ra, nếu bạn muốn nhấn mạnh sự khác biệt giữa hai nhóm, một cốt truyện tạ là một hình ảnh tuyệt vời để sử dụng. Trái ngược với biểu đồ thanh, nó nhấn mạnh vào sự khác biệt giữa các nhóm hơn là các giá trị tuyệt đối. Trong bài viết này, tôi sẽ chỉ cho bạn cách tạo ra một cốt truyện tạ với một thư viện Python có tên là Plotly [1].

Bộ dữ liệu

Kết quả của cuộc bầu cử Phó Tổng thống Philippines 2016 sẽ là bộ dữ liệu mà chúng tôi sẽ làm việc ở đây. Dữ liệu thô bao gồm tổng số phiếu bầu cho sáu ứng cử viên khác nhau ở cấp độ trước [3]. Robredo đã giành chiến thắng trong cuộc bầu cử này với 14.418.817 phiếu bầu, nhưng đó là một trận chiến gần với Marcos, người đã giành được 14.155.344. Chúng tôi sẽ xem xét cách người Philippines ở các khu vực khác nhau của Philippines và những người ở nước ngoài vào thời điểm này (tức là, các cử tri của Overaseas) đã bỏ phiếu cho hai ứng cử viên này bằng cách sử dụng một âm mưu tạ.

Tôi đã giành chiến thắng trong các chi tiết cụ thể của tiền xử lý mà tôi đã thực hiện, nhưng về cơ bản, tôi đã tính toán tỷ lệ cử tri đã bỏ phiếu cho Marcos và Robredo ở mỗi khu vực. Bạn có thể thấy Hình 1 cho một ví dụ về định dạng bảng mà tôi đã tạo. Mỗi hàng trong bảng đại diện cho số người tuyệt đối và tương đối đã bỏ phiếu cho Robredo hoặc Marcos ở mỗi khu vực.

Hình 1. Snippet của bộ dữ liệu.

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

Để tạo ra một cốt truyện Dumbell với Plotly, điều đầu tiên cần làm là tạo ra một biểu đồ phân tán hoặc dấu chấm bình thường (xem Hình 2). Ở đây, trục X đại diện cho tỷ lệ phần trăm của các cá nhân đã bỏ phiếu cho một ứng cử viên cụ thể, trục Y đại diện cho khu vực và màu sắc đánh dấu đại diện cho ứng cử viên cụ thể.

import plotly.express as pxfig = px.scatter(df_region, x="pct", y="region",    color="candidate")fig.show()
Figure 2. Biểu đồ phân tán/chấm thông thường.

Điều tiếp theo cần làm là chỉ cần thêm một dòng kết nối hai điểm đánh dấu này. Chúng tôi sẽ sử dụng chức năng add_shape của Plotly để làm điều đó (xem Hình 3).

import plotly.express as pxfig = px.scatter(df_region, x="pct", y="region",    color="candidate")# iterate on each region
for i in df_region["region"].unique():
# filter by region
df_sub = df_region[df_region["region"] == i]

fig.add_shape(
type="line",
layer="below",
# connect the two markers
## e.g., y0='Robredo', x0=43.53
y0=df_sub.region.values[0], x0=df_sub.pct.values[0],

## e.g., y1='Marcos', x1=26.60
y1=df_sub.region.values[1], x1=df_sub.pct.values[1],
)
fig.show()
Figure 3. Lô tạ.

Về cơ bản, Hình 3 đã là một âm mưu tạ tạ. Nhưng để làm cho cốt truyện dễ hiểu hơn, chúng ta cũng có thể sắp xếp các Dumbell riêng lẻ của các khu vực từ cao nhất đến thấp nhất dựa trên sự khác biệt về phần trăm giữa Robredo và Marcos. Bằng cách này, chúng ta có thể dễ dàng so sánh sự khác biệt tương đối giữa các vùng. Hơn nữa, vì quy mô cử tri khác nhau theo khu vực, chúng ta có thể có kích thước điểm đánh dấu cho thấy số lượng cử tri tuyệt đối (xem Hình 4).

import plotly.express as pxfig = px.scatter(df_region, x="pct", y="region", color="candidate", size="n_voters", category_orders={"region": ["I", "II", "V", "VI", "CAR", "NIR", "VII", "OAV", "IV-B", "XIII", "NCR", "III", "ARMM", "X", "IX", "XI", "XII", "VIII", "IV-A"]})# iterate on each region
for i in df_region["region"].unique():
# filter by region
df_sub = df_region[df_region["region"] == i]

fig.add_shape(
type="line",
layer="below",
# connect the two markers
## e.g., y0='Robredo', x0=43.53
y0=df_sub.region.values[0], x0=df_sub.pct.values[0],

## e.g., y1='Marcos', x1=26.60
y1=df_sub.region.values[1], x1=df_sub.pct.values[1],
)
fig.show()
Figure 4. Biểu đồ quả tạ trong đó các đầu của Dumbells được thu nhỏ theo số lượng tuyệt đối của các cử tri.

Bây giờ chúng ta có một âm mưu tạ được sắp xếp và thu nhỏ, chúng ta có thể dễ dàng xác định sự khác biệt giữa các vùng. Nói chung, tại các khu vực mà Marcos nhận được một số lượng lớn phiếu bầu, Robredo đã nhận được một số lượng phiếu bầu nhỏ hơn và ngược lại. Cả Marcos và Robredo cũng có những người ủng hộ mạnh mẽ ở các khu vực khác nhau của đất nước. Đối với Marcos, họ là Vùng I và II, trong khi đối với Robredo, họ là Vùng V và VI. Chúng ta cũng có thể thấy các khu vực nào, chẳng hạn như khu vực VIII và IV-A, đã có các cuộc đua chặt chẽ trong cuộc bầu cử năm 2016.

Hoàn thiện chạm

Tôi đã cố gắng thay đổi một số khía cạnh thiết kế của đồ thị để làm cho cốt truyện trở nên hấp dẫn hơn về mặt thẩm mỹ. Để chỉ ra điểm đánh dấu, tôi đã chọn cùng một màu mà họ sử dụng trong các chiến dịch bầu cử gần đây của họ. Tôi cũng đã thêm các chú thích vào biểu đồ cuối cùng để giúp truyền đạt các phát hiện hiệu quả hơn. Biểu đồ cuối cùng được hiển thị dưới đây.

So sánh tỷ lệ phiếu bầu khu vực của Marcos, và Robredo, trong cuộc bầu cử Phó Tổng thống Philippines 2016.

References:

[1] Thư viện Python: https://plotly.com/python/

.