Có thể bạn quan tâm: Cách Vẽ Platform Trong Game: Hướng Dẫn Từ Cơ Bản Đến Nâng Cao
TÓM TẮT
- 1 1. Giới thiệu chung về Odds Ratio và tầm quan trọng của việc vẽ plot
- 2 2. Kiến thức nền tảng: Tính Odds Ratio và Confidence Interval
- 3 3. Chuẩn bị dữ liệu cho plot odds ratio
- 4 4. Vẽ plot odds ratio bằng R
- 5 5. Vẽ plot odds ratio bằng Python (matplotlib & seaborn)
- 6 6. Vẽ plot odds ratio bằng Excel
- 7 7. Vẽ plot odds ratio trong SPSS
- 8 8. Các lưu ý khi trình bày plot odds ratio
- 9 9. Ví dụ thực tế: Phân tích dữ liệu bệnh tim
- 10 10. Kết luận và khuyến nghị
1. Giới thiệu chung về Odds Ratio và tầm quan trọng của việc vẽ plot
Odds Ratio (OR) là một chỉ số thống kê phổ biến trong y học, sinh học, kinh tế và các lĩnh vực nghiên cứu xã hội. Nó đo lường mức độ liên quan giữa một yếu tố (exposure) và một kết quả (outcome). Khi OR > 1, yếu tố được cho là làm tăng khả năng xảy ra kết quả; khi OR < 1, yếu tố có khả năng bảo vệ; và OR = 1 cho thấy không có mối liên hệ.
Trong thực tiễn, việc chỉ báo một giá trị OR duy nhất thường chưa đủ để truyền tải toàn bộ thông tin. Các nhà nghiên cứu thường muốn hiển thị:
- Khoảng tin cậy (Confidence Interval – CI) của OR, giúp đánh giá độ tin cậy.
- So sánh nhiều nhóm (ví dụ: các biến độc lập khác nhau, các phân nhóm bệnh nhân).
- Biểu đồ Forest Plot hoặc dot plot để thể hiện trực quan.
Do đó, plot odds ratio trở thành công cụ không thể thiếu trong báo cáo kết quả nghiên cứu. Bài viết này sẽ hướng dẫn chi tiết cách vẽ plot odds ratio bằng các ngôn ngữ lập trình phổ biến (R, Python) và các công cụ trực quan (Excel, SPSS). Chúng ta sẽ đi từ chuẩn bị dữ liệu, tính toán OR, xây dựng CI, tới việc tạo đồ thị đẹp mắt, tùy chỉnh màu sắc, nhãn, và xuất bản.
Có thể bạn quan tâm: Cách Vẽ Platform Trong Game: Hướng Dẫn Chi Tiết Từ Cơ Bản Đến Nâng Cao
2. Kiến thức nền tảng: Tính Odds Ratio và Confidence Interval
2.1. Định nghĩa Odds và Odds Ratio
-
Odds của một sự kiện là tỉ lệ giữa khả năng xảy ra và không xảy ra:
\text{Odds} = \frac{p}{1-p}
trong đó p là xác suất xảy ra.
-
Odds Ratio giữa hai nhóm (exposed vs. non‑exposed) được tính từ bảng 2×2:
| Outcome = Yes | Outcome = No | |
|---|---|---|
| Exposed | a | b |
| Non‑exposed | c | d |
\text{OR} = \frac{a/b}{c/d} = \frac{a \times d}{b \times c}
2.2. Confidence Interval cho OR
Vì OR luôn dương, ta thường làm việc trên log‑OR. Công thức chuẩn cho 95 % CI:
-
Tính log‑OR:
\ln(\text{OR}) = \ln\left(\frac{a d}{b c}\right)
-
Độ lệch chuẩn (SE) của log‑OR:
SE_{\ln(\text{OR})} = \sqrt{\frac{1}{a} + \frac{1}{b} + \frac{1}{c} + \frac{1}{d}}
-
Khoảng tin cậy trên log‑scale:
\ln(\text{OR}) \pm Z_{1-\alpha/2} \times SE_{\ln(\text{OR})}
với (Z_{0.975}=1.96) cho mức 95 %.
-
Đưa lại về thang OR bằng cách lấy exp:
\text{CI}_{95\%} = \left( \exp\big\ln(\text{OR}) – 1.96 \times SE\big,\; \exp\big\ln(\text{OR}) + 1.96 \times SE\big \right)
2.3. Khi nào sử dụng phương pháp Wald vs. phương pháp exact?
- Wald method (phương pháp trên) thích hợp khi mọi ô trong bảng 2×2 đều >5.
- Khi có ô có giá trị nhỏ (<5) hoặc bằng 0, Fisher exact hoặc mid‑P được khuyến nghị. Một số phần mềm tự động chuyển sang phương pháp exact để tránh sai lệch.
3. Chuẩn bị dữ liệu cho plot odds ratio
3.1. Định dạng dữ liệu
Đối với hầu hết các công cụ, dữ liệu cần ở dạng “long” (mỗi dòng là một biến/nhóm) với các cột:
| Variable | a | b | c | d |
|---|---|---|---|---|
| Age≥60 | 30 | 70 | 15 | 85 |
| Male | 40 | 60 | 20 | 80 |
| Smoking | 25 | 75 | 10 | 90 |
| … | … | … | … | … |
Hoặc nếu đã tính sẵn OR và CI, cấu trúc:
| Variable | OR | CI_low | CI_high |
|---|---|---|---|
| Age≥60 | 2.57 | 1.35 | 4.89 |
| Male | 2.00 | 1.20 | 3.33 |
| Smoking | 2.25 | 1.05 | 4.84 |
3.2. Kiểm tra dữ liệu
- Đảm bảo không có giá trị NA hoặc NaN.
- Kiểm tra tổng số mẫu để xác định phương pháp tính CI.
- Nếu có biến phân loại nhiều mức (ví dụ: mức độ hút thuốc: không, vừa, nhiều), cần chuyển sang các so sánh từng mức so với nhóm tham chiếu.
4. Vẽ plot odds ratio bằng R
R là ngôn ngữ thống kê mạnh mẽ, có nhiều gói hỗ trợ vẽ forest plot cho OR. Dưới đây là các bước chi tiết.
4.1. Cài đặt và load gói cần thiết

Có thể bạn quan tâm: Cách Vẽ Pline Trong Autocad: Hướng Dẫn Chi Tiết Từ Cơ Bản Đến Nâng Cao
install.packages(c("ggplot2", "dplyr", "tidyr", "meta", "forestplot"))
library(ggplot2)
library(dplyr)
library(tidyr)
library(meta)
library(forestplot)
4.2. Tính OR và CI (nếu chưa có)
Giả sử dữ liệu gốc là df_raw dạng bảng 2×2 cho mỗi biến.
calc_or <- function(a, b, c, d){ or <- (a d) / (b c) log_or <- log(or) se_log_or <- sqrt(1/a + 1/b + 1/c + 1/d) ci_low <- exp(log_or - 1.96 se_log_or) ci_high <- exp(log_or + 1.96 se_log_or) data.frame(OR = or, CI_low = ci_low, CI_high = ci_high)
} df_or <- df_raw %>% rowwise() %>% mutate(res = list(calc_or(a, b, c, d))) %>% unnest(cols = c(res))
4.3. Tạo forest plot với ggplot2
df_or <- df_or %>% arrange(desc(OR)) %>% # sắp xếp để hiển thị đẹp mutate(Variable = factor(Variable, levels = Variable)) ggplot(df_or, aes(x = OR, y = Variable)) + geom_point(shape = 15, size = 3, colour = "steelblue") + geom_errorbarh(aes(xmin = CI_low, xmax = CI_high), height = 0.2, colour = "gray50") + geom_vline(xintercept = 1, linetype = "dashed", colour = "red") + scale_x_log10() + # log10 để OR > 1 và < 1 hiển thị cân đối labs(title = "Forest Plot of Odds Ratios", x = "Odds Ratio (log scale)", y = "") + theme_minimal(base_size = 12) + theme(axis.text.y = element_text(face = "bold"))
Giải thích chi tiết:
geom_point()vẽ điểm OR.geom_errorbarh()vẽ thanh CI ngang.geom_vline(xintercept = 1)là đường tham chiếu OR = 1.scale_x_log10()giúp các OR < 1 và > 1 cân đối trên cùng trục.theme_minimal()tạo giao diện sạch sẽ.
4.4. Forest plot sử dụng gói meta
Nếu bạn đã có đối tượng meta‑analysis (ví dụ: từ nhiều nghiên cứu), meta cung cấp hàm forest().
meta_obj <- metabin(event.e = a, n.e = a+b, event.c = c, n.c = c+d, studlab = Variable, sm = "OR", method = "Inverse")
forest(meta_obj, xlab = "Odds Ratio", leftcols = c("studlab"), rightcols = FALSE, colgap.forest = 5, col.square = "steelblue", col.diamond = "darkorange")
4.5. Tùy chỉnh nâng cao
- Thêm p‑value: tính chi‑square hoặc Fisher exact và hiển thị trong nhãn.
- Màu sắc theo mức ý nghĩa: ví dụ, OR có p < 0.05 màu đỏ, ngược lại màu xanh.
- Đánh dấu nhóm tham chiếu: sử dụng
annotate()để chèn text.
df_or <- df_or %>% mutate(Signif = ifelse(CI_low > 1 | CI_high < 1, "Yes", "No")) ggplot(df_or, aes(x = OR, y = Variable, colour = Signif)) + geom_point(size = 3) + geom_errorbarh(aes(xmin = CI_low, xmax = CI_high), height = .2) + scale_colour_manual(values = c("Yes" = "red", "No" = "gray")) + ...
5. Vẽ plot odds ratio bằng Python (matplotlib & seaborn)
Python ngày càng trở nên phổ biến trong khoa học dữ liệu. Dưới đây là cách thực hiện với matplotlib, seaborn và statsmodels.
5.1. Cài đặt thư viện
pip install pandas numpy matplotlib seaborn statsmodels
5.2. Chuẩn bị dữ liệu
import pandas as pd
import numpy as np # ví dụ dữ liệu
data = { 'Variable': 'Age≥60', 'Male', 'Smoking', 'a': 30, 40, 25, 'b': 70, 60, 75, 'c': 15, 20, 10, 'd': 85, 80, 90
}
df = pd.DataFrame(data)
5.3. Tính OR và CI
def calc_or(row): a, b, c, d = row'a', row'b', row'c', row'd' or_val = (a d) / (b c) log_or = np.log(or_val) se = np.sqrt(1/a + 1/b + 1/c + 1/d) ci_low = np.exp(log_or - 1.96 se) ci_high = np.exp(log_or + 1.96 se) return pd.Series({'OR': or_val, 'CI_low': ci_low, 'CI_high': ci_high}) df'OR','CI_low','CI_high' = df.apply(calc_or, axis=1)
5.4. Vẽ forest plot với seaborn
import matplotlib.pyplot as plt
import seaborn as sns # sắp xếp để hiển thị đẹp
df = df.sort_values('OR', ascending=False) fig, ax = plt.subplots(figsize=(8,6)) # vẽ CI dưới dạng error bar
ax.errorbar(df'OR', df'Variable', xerr=df'OR' - df'CI_low', df'CI_high' - df'OR', fmt='o', color='steelblue', ecolor='gray', capsize=3) # đường tham chiếu OR = 1
ax.axvline(1, linestyle='--', color='red') # log scale
ax.set_xscale('log')
ax.set_xlabel('Odds Ratio (log scale)')
ax.set_title('Forest Plot of Odds Ratios') plt.tight_layout()
plt.show()
5.5. Thêm màu sắc dựa trên ý nghĩa
df'Signif' = np.where((df'CI_low' > 1) | (df'CI_high' < 1), 'Yes', 'No')
palette = {'Yes':'red', 'No':'gray'} sns.set_style("whitegrid")
fig, ax = plt.subplots(figsize=(8,6))
sns.pointplot(data=df, x='OR', y='Variable', join=False, hue='Signif', palette=palette, dodge=0.5, ax=ax) # thêm error bar thủ công
for i, row in df.iterrows(): ax.errorbar(row'OR', i, xerr=row'OR'-row'CI_low', row'CI_high'-row'OR', fmt='none', ecolor='black', capsize=3) ax.axvline(1, ls='--', color='red')
ax.set_xscale('log')
ax.set_xlabel('Odds Ratio (log scale)')
ax.set_title('Forest Plot of Odds Ratios')
ax.get_legend().remove()
plt.show()
6. Vẽ plot odds ratio bằng Excel
Mặc dù không mạnh mẽ bằng R/Python, Excel vẫn được nhiều nhà nghiên cứu sử dụng vì tính thân thiện.
6.1. Bước 1: Chuẩn bị bảng tính
| Variable | OR | CI_low | CI_high |
|---|---|---|---|
| Age≥60 | 2.57 | 1.35 | 4.89 |
| Male | 2.00 | 1.20 | 3.33 |
| Smoking | 2.25 | 1.05 | 4.84 |
6.2. Bước 2: Tính log‑OR để vẽ trên trục log (tùy chọn)
- Thêm cột
Log_OR = LOG10(OR). - Thêm cột
Log_CI_low = LOG10(CI_low),Log_CI_high = LOG10(CI_high).
6.3. Bước 3: Chèn biểu đồ “Scatter with Straight Lines”
- Chọn cột
Variable(trục Y) vàLog_OR(trục X). - Vào Insert → Scatter → Scatter with Straight Lines and Markers.
- Định dạng trục X: Format Axis → Logarithmic Scale (nếu không dùng log‑OR, bỏ qua).
6.4. Bước 4: Thêm Error Bars
- Click vào một điểm dữ liệu → Chart Elements → Error Bars → More Options.
- Chọn Custom → Specify Value → chọn dải
Log_CI_high - Log_ORcho Positive Error vàLog_OR - Log_CI_lowcho Negative Error.
6.5. Bước 5: Tô màu và thêm đường tham chiếu

Có thể bạn quan tâm: Cách Vẽ Plc Trong Visio: Hướng Dẫn Chi Tiết Từ Cơ Bản Đến Nâng Cao
- Thêm Vertical Line tại giá trị log(1)=0 bằng cách vẽ một Line Shape.
- Đổi màu các điểm dựa trên ý nghĩa (sử dụng Conditional Formatting trước khi tạo biểu đồ hoặc thay đổi thủ công).
6.6. Lưu và xuất
- Định dạng lại tiêu đề, nhãn, kích thước chữ.
- Chuột phải → Save as Picture để lưu dưới dạng PNG hoặc PDF cho báo cáo.
7. Vẽ plot odds ratio trong SPSS
SPSS cung cấp công cụ “Logistic Regression” để tính OR và “Chart Builder” để vẽ.
7.1. Tính OR
- Analyze → Regression → Binary Logistic…
- Đưa biến phụ thuộc (Outcome) và các biến độc lập.
- Trong Options, chọn Confidence intervals for exp(B) (đây là OR).
- Nhấn OK, SPSS sẽ xuất bảng có
Exp(B)(OR) và95% CI.
7.2. Chuẩn bị dữ liệu cho plot
- Copy bảng kết quả vào Data Editor tạo một dataset mới:
Variable,OR,CI_low,CI_high.
7.3. Chart Builder
- Graphs → Chart Builder.
- Chọn Scatter/Dot → “Simple Scatter”.
- Đặt Y‑Axis =
Variable(định dạng “Ordinal”). - Đặt X‑Axis =
OR. - Click Element Properties, bật Logarithmic Scale cho X.
- Sau khi tạo scatter, vào Chart Editor, Add → Error Bars → Horizontal và chỉ định giá trị CI.
7.4. Tùy chỉnh cuối cùng
- Thêm Reference Line tại X = 1 (đánh dấu không có ảnh hưởng).
- Đổi màu điểm và error bar.
- Lưu dưới dạng
.savvà Export → Graphics → PNG.
8. Các lưu ý khi trình bày plot odds ratio
| Yếu tố | Lý do | Gợi ý thực hành |
|---|---|---|
| Log scale | Giúp hiển thị OR < 1 và > 1 cân đối | Dùng scale_x_log10() trong R, set_xscale('log') trong Python |
| Đường tham chiếu OR = 1 | Dễ nhận biết các OR không có ý nghĩa thống kê | Vẽ đường dashed màu đỏ |
| Màu sắc | Nhấn mạnh các biến có ý nghĩa | Tô đỏ cho CI không chứa 1 |
| Sắp xếp | Đọc dễ dàng, nhóm các OR lớn hơn ở trên | Sắp xếp giảm dần theo OR hoặc theo p‑value |
| Nhãn | Tránh nhầm lẫn | Ghi đầy đủ tên biến, số mẫu, p‑value nếu cần |
| Kích thước | Đảm bảo in ấn và trình chiếu | Đặt chiều rộng ít nhất 6‑8 inch, chiều cao tùy số biến |
| Công cụ | Lựa chọn phù hợp với khán giả | R/Python cho chuyên gia, Excel cho người không chuyên |
9. Ví dụ thực tế: Phân tích dữ liệu bệnh tim
Giả sử chúng ta có một nghiên cứu hồi cứu 500 bệnh nhân, mục tiêu đánh giá các yếu tố nguy cơ (tuổi, giới tính, hút thuốc, tiểu đường) liên quan tới bệnh tim. Dữ liệu 2×2 cho mỗi yếu tố đã được tổng hợp.
9.1. Kết quả tính OR (R)
| Variable | a | b | c | d | OR | CI_low | CI_high |
|---|---|---|---|---|---|---|---|
| Age≥60 | 80 | 120 | 30 | 270 | 6.00 | 3.70 | 9.73 |
| Male | 70 | 130 | 40 | 260 | 3.55 | 2.30 | 5.48 |
| Smoking | 60 | 140 | 50 | 250 | 2.14 | 1.38 | 3.33 |
| Diabetes | 55 | 145 | 55 | 250 | 1.82 | 1.17 | 2.84 |
Sau khi vẽ plot (xem hình dưới), chúng ta thấy:
- Age≥60 có OR cao nhất, CI không chạm 1 → yếu tố mạnh nhất.
- Diabetes dù OR >1 nhưng CI chạm 1 (1.17‑2.84) → cần cẩn trọng.
- Đường tham chiếu OR=1 nằm giữa, giúp nhanh nhận diện các yếu tố không có ảnh hưởng.
9.2. Đánh giá bằng Python
# (đoạn code tính OR và plot đã trình bày ở mục 5)
Kết quả đồ thị hiển thị ba điểm màu đỏ (có ý nghĩa) và một điểm màu xám (không đủ ý nghĩa). Điều này giúp người đọc nhanh chóng nắm bắt.
10. Kết luận và khuyến nghị
- Plot odds ratio là công cụ trực quan mạnh mẽ giúp truyền tải mối liên hệ giữa yếu tố và kết quả một cách nhanh chóng và dễ hiểu.
- Việc tính toán chính xác OR và CI là nền tảng; lựa chọn phương pháp (Wald, exact) tùy thuộc vào kích thước mẫu và số lượng ô có giá trị nhỏ.
- R và Python cung cấp sự linh hoạt cao, cho phép tùy chỉnh chi tiết (màu, hình dạng, log‑scale, annotation). Excel và SPSS thích hợp cho người không chuyên hoặc khi cần nhanh chóng tạo biểu đồ trong môi trường văn phòng.
- Khi trình bày, luôn đánh dấu OR = 1, dùng log scale, sắp xếp biến một cách logic và dùng màu để nhấn mạnh các kết quả có ý nghĩa thống kê.
- Đối với báo cáo khoa học, định dạng chuẩn (độ rộng, độ cao, font) và đính kèm bảng số liệu là cần thiết để người đọc có thể kiểm chứng.
Khuyến nghị cuối cùng: Trước khi công bố, hãy nhờ một đồng nghiệp hoặc chuyên gia thống kê kiểm tra lại các bước tính toán và đồ thị. Điều này giúp tránh những sai sót thường gặp như CI không đúng, hoặc biểu đồ không phản ánh đúng dữ liệu gốc.
Tài liệu tham khảo (để mở rộng)
- Bland JM, Altman DG. Statistics notes: The odds ratio. BMJ. 2000.
- Evan J. Meta‑analysis in R: The
metapackage. 2026. - Cohen J. Statistical Power Analysis for the Behavioral Sciences. 2nd ed. 1988.
- Python Documentation – statsmodels.stats.proportion.proportions_ztest – cho kiểm định tỉ lệ.
- R Documentation – forestplot – hướng dẫn chi tiết các tùy chọn.
Với những kiến thức và hướng dẫn chi tiết trên, bạn đã sẵn sàng để tự tin tạo plot odds ratio cho bất kỳ dự án nghiên cứu nào, từ các phân tích đơn giản đến các meta‑analysis phức tạp. Chúc bạn thành công!
