Generalized Linear Models With Examples in R là cuốn sách giáo khoa hoặc tài liệu hướng dẫn chuyên sâu về Mô hình Tuyến tính Tổng quát (Generalized Linear Models - GLMs), đặc biệt nhấn mạnh vào việc áp dụng và minh họa các khái niệm bằng cách sử dụng phần mềm R. Cuốn sách được cấu trúc một cách logic, bắt đầu từ các mô hình cơ bản đến các mô hình phức tạp hơn, và bao gồm các phần quan trọng về lý thuyết, suy luận, chẩn đoán và ứng dụng.
Các phần chính được trình bày như sau:
Mô hình thống kê được sử dụng để mô tả cả các đặc điểm ngẫu nhiên và có hệ thống của dữ liệu.
Mô hình hồi quy là một loại mô hình thống kê. Việc diễn giải các mô hình hồi quy là một phần quan trọng.
Một triết lý quan trọng: “Tất cả các mô hình đều sai, nhưng một số hữu ích”.
Ảnh hưởng đến cách nó được phát triển. Có sự cân bằng giữa độ chính xác (Accuracy) và tính tiết kiệm (Parsimony) khi xây dựng mô hình.
Thu thập dữ liệu và khả năng tổng quát hóa (Generalizability) cũng là các yếu tố quan trọng. Đề cập đến các quy ước mô tả dữ liệu, vẽ biểu đồ dữ liệu và mã hóa cho các yếu tố phân loại.
Tài liệu sử dụng nhiều bộ dữ liệu thực tế để minh họa, trong đó bộ dữ liệu lungcap (liên quan đến dung tích thở gắng sức - FEV của thanh thiếu niên theo tuổi - Age, chiều cao - Height, giới tính - Gender và tình trạng hút thuốc - Smoke) được sử dụng thường xuyên nhất và xuất hiện ngay từ phần đầu của tài liệu.
Việc vẽ biểu đồ dữ liệu là một bước quan trọng để khám phá mối quan hệ giữa các biến. Các ví dụ bao gồm biểu đồ FEV so với Age và Height cho toàn bộ dữ liệu và theo nhóm Smoke(người hút thuốc/không hút thuốc).
Mô hình thống kê được giải thích bao gồm hai thành phần chính: Thành phần Ngẫu nhiên (Random Component) mô tả phân phối của biến phản hồi tại một tổ hợp biến giải thích nhất định, và Thành phần Hệ thống (Systematic Component) mô tả mối quan hệ toán học giữa giá trị trung bình của biến phản hồi và các biến giải thích. Với kỳ vọng, phương sai không đổi \(\text{var}[y_i] = \sigma^2\):
\[ \mu_i = \mathbb{E}[y_i] = \beta_0 + \beta_1 x_{1i} + \beta_2 x_{2i} + \beta_3 x_{3i} +..+ \beta_n x_{ni} \] \[ y_i \sim \mathcal{N}(\mu_i, \sigma^2) \]
Các quy ước ký hiệu cho mô hình hồi quy tuyến tính được giới thiệu, bao gồm số lượng biến giải thích p và số lượng tham số hồi quy p′.
Mô hình hồi quy tuyến tính bao gồm hai thành phần chính:
Thành phần hệ thống (Systematic
component):
Mô tả mối quan hệ giữa kỳ vọng của biến phản hồi \(y\) và các biến giải thích \(x\). Dạng tổng quát:
\[ \mu_i = \beta_0 + \beta_1 x_{1i} + \beta_2 x_{2i} + \beta_3 x_{3i} + \beta_4 x_{4i} \]
Trong đó, \(\beta_0, \beta_1, \ldots\) là các hệ số hồi quy cần được ước lượng từ dữ liệu.
Thành phần ngẫu nhiên (Random component):
Mô tả sự biến thiên của các quan sát xung quanh giá trị trung bình dự
đoán. Trong hồi quy tuyến tính tiêu chuẩn, giả định:
\[ \text{Var}(y_i) = \sigma^2 \]
với \(\sigma^2\) là phương sai không đổi (homoscedasticity), cần được ước lượng từ dữ liệu.
Ví dụ đơn giản:
Một mô hình hồi quy tuyến tính đơn có thể viết là: \[
\mu_i = \beta_0 + \beta_1 x_i
\]
\[ \text{RSS} = \sum w_i (y_i - \hat{\mu}_i)^2 \]
trong đó \(w_i\) là trọng số (bằng 1 nếu không có trọng số), và \(\hat{\mu}_i\) là giá trị dự đoán từ mô hình.
\[ df = n - p' \]
với \(p'\) là số hệ số trong mô hình (bao gồm cả hệ số chặn).
\[ s^2 = \frac{\text{RSS}}{n - p'} \]
\[ \text{Var}(\hat{\beta}) = s^2 (X^\top W X)^{-1} \]
\[ R^2 = 1 - \frac{\text{RSS}}{\text{SST}} \]
trong đó SST là tổng bình phương sai lệch so với trung bình.
Công thức kiểm định F:
\[ F = \frac{\text{RSS}_{\text{reduced}} - \text{RSS}_{\text{full}}}{p_{\text{full}} - p_{\text{reduced}}} \div s^2_{\text{full}} \]
Trong đó:
\[ s^2_{\text{full}} = \frac{\text{RSS}_{\text{full}}}{n - p_{\text{full}}} \]
So sánh mô hình không lồng nhau:
Dựa vào các tiêu chí:
\[ \text{AIC} = -2 \cdot \ell(\hat{\theta}) + 2k \]
\[ \text{BIC} = -2 \cdot \ell(\hat{\theta}) + \log(n) \cdot k \]
Trong đó:
\(\ell(\hat{\theta})\): log-likelihood tại ước lượng cực đại (MLE).
\(k\): Số lượng tham số trong mô hình (bao gồm cả hệ số chặn β₀).
\(n\): Kích thước mẫu.
Các tiêu chí này phạt mô hình phức tạp. Giá trị AIC/BIC càng nhỏ (gần −∞), mô hình càng tốt.
Nguyên tắc biên (Marginality Principle):
Nếu mô hình chứa tương tác giữa các biến, thì các hiệu ứng chính tương
ứng nên được giữ lại.
Kiểm tra các giả định của mô hình hồi quy tuyến tính:
Residuals vs Fitted
: phát hiện phương sai không
đồng nhất hoặc quan hệ phi tuyến chưa mô hình
hóaNormal Q-Q Plot
: kiểm tra phân phối
chuẩn của phần dưScale-Location
, Residuals vs Leverage
:
kiểm tra ảnh hưởng và phương sai phần dư\[ h_i = \frac{1}{n} + \frac{(x_i - \bar{x})^2}{\sum_{j=1}^n (x_j - \bar{x})^2}, \quad h_i \in \left[\frac{1}{n}, 1\right] \]
\[
D_i = \frac{(\hat{\mu} - \hat{\mu}_{(i)})^T(\hat{\mu} -
\hat{\mu}_{(i)})}{p' \cdot s^2}
\] Trong đó: - \(\hat{\mu}\):
vector dự đoán từ mô hình đầy đủ
- \(\hat{\mu}_{(i)}\): vector dự đoán
khi bỏ quan sát thứ i
- \(p'\): số tham số
- \(s^2\): phương sai phần dư
log(y)
hoặc
log(x)
sqrt(x)
1/x
Ví dụ dữ liệu:
log(FEV)
(dữ liệu phổi)log(Volume)
, log(Girth)
(cây anh đào)log(MaxWt)
, log(Temp)
,
log(FoodCon)
(dữ liệu cá)Thêm \(x^2\), \(x^3\) vào mô hình để mô tả mối quan
hệ phi tuyến
Sử dụng hàm: poly(x, degree = k)
poly()
– đa thức toàn cụcns()
– natural cubic splinesbs()
– B-splinesKhi hiệu ứng của một biến phụ thuộc vào biến khác:
Ví dụ: Sugar * Industrialization
Tìm tập hợp con tối ưu của các biến giải thích. Một số kỹ thuật:
stepAIC()
– lựa chọn bước (forward/backward)regsubsets()
từ leaps
packageglmnet()
– hồi quy LASSO / RidgePhương pháp OLS (bình phương tối thiểu) hoạt động tốt trong điều kiện lý tưởng: dữ liệu liên tục, phương sai đồng nhất và phân phối chuẩn. Tuy nhiên, dữ liệu thực tế có thể là nhị phân, đếm, hoặc chỉ nhận giá trị dương. Khi đó, phương pháp Ước lượng Hợp lý Tối đa (MLE) là lựa chọn phù hợp hơn, đặc biệt với các mô hình tuyến tính tổng quát (GLM).
Với một mẫu độc lập \(y_1, y_2, ..., y_n\) có phân phối xác suất \(f(y_i; \theta)\), ta có:
Hàm hợp lý: \[ L(\theta) = \prod_{i=1}^{n} f(y_i; \theta) \]
Log-likelihood: \[ \ell(\theta) = \log L(\theta) = \sum_{i=1}^{n} \log f(y_i; \theta) \]
Việc sử dụng log-likelihood giúp đơn giản hóa biểu thức và tối ưu dễ hơn.
MLE là giá trị \(\hat{\theta}\) sao cho: \[ \hat{\theta} = \arg\max_{\theta} \ell(\theta) \quad \Rightarrow \quad \frac{\partial \ell}{\partial \theta} = 0 \]
Giải phương trình trên thường sử dụng kỹ thuật số như Newton-Raphson hoặc Fisher Scoring. Ước lượng MLE có tính chất bất biến và cho phép ước lượng sai số chuẩn.
Thành phần | Công thức | Vai trò |
---|---|---|
Score | \(S(\theta) = \frac{\partial \ell}{\partial \theta}\), với \(E[S(\theta)] = 0\) | Kiểm định giả thuyết |
Thông tin Fisher | \(I(\theta) = -E\left[\frac{\partial^2 \ell}{\partial \theta^2}\right]\) | Lượng thông tin chứa trong dữ liệu |
Phương sai | \(\mathrm{Var}(\hat{\theta}) \approx I(\hat{\theta})^{-1}\) | Xấp xỉ phương sai |
Sai số chuẩn | \(SE(\hat{\theta}) = \sqrt{I(\hat{\theta})^{-1}}\) | Sai số chuẩn của ước lượng |
Khi \(n \to \infty\), MLE có các tính chất:
Tên | Công thức | Phân phối |
---|---|---|
Wald test | \(Z = \frac{\hat{\theta} - \theta_0}{SE(\hat{\theta})} \Rightarrow Z^2 \sim \chi^2_1\) | Chuẩn hóa |
Likelihood Ratio (LR) | \(LR = 2[\ell(\hat{\theta}) - \ell(\theta_0)] \sim \chi^2_{df}\) | So sánh mô hình |
Score test (LM) | \(S = \frac{S(\theta_0)^2}{I(\theta_0)} \sim \chi^2_{df}\) | Đạo hàm tại \(\theta_0\) |
Đối với hai mô hình không lồng nhau, ta so sánh qua:
AIC: \[ AIC = -2\ell + 2k \]
BIC: \[ BIC = -2\ell + k \log n \]
Trong đó:
Mô hình có AIC/BIC nhỏ hơn thường được ưu tiên.
Loại dữ liệu | Phân phối | Hàm liên kết \(h(\mu)\) | Ý nghĩa tham số |
---|---|---|---|
Nhị phân | Bernoulli | \(\text{logit}(\mu)\) | Logistic regression |
Đếm | Poisson | \(\log(\mu)\) | Tần suất sự kiện |
Dương liên tục | Gamma, Inverse-Gaussian | \(\log(\mu),\,\mu^{-1}\) | Chi phí, thời gian, v.v. |
Mô hình tuyến tính tổng quát (Generalized Linear Model - GLM) là một mở rộng của hồi quy tuyến tính, cho phép xử lý các loại dữ liệu không tuân theo phân phối chuẩn, như dữ liệu nhị phân, đếm, tỷ lệ, hoặc dương liên tục. GLM bao gồm nhiều mô hình như hồi quy logistic, Poisson, Gamma…
Mỗi GLM gồm ba thành phần cơ bản: - Phân phối xác suất (thuộc họ hàm mũ một tham số), - Hàm liên kết, - Cấu trúc tuyến tính hệ số.
Giả định biến phản hồi \(y_i\) tuân theo phân phối thuộc họ hàm mũ một tham số:
\[ f(y_i; \theta_i, \phi) = \exp\left\{ \frac{y_i \theta_i - b(\theta_i)}{\phi} + c(y_i, \phi) \right\} \]
Trong đó: - \(\theta_i\): tham số tự nhiên (natural parameter) - \(\phi\): tham số phân tán (dispersion parameter), ví dụ \(\phi = 1\) với Poisson - \(b(\cdot)\): hàm log phân hoạch - \(c(\cdot, \cdot)\): hàm chuẩn hóa
Một số phân phối trong họ này gồm: Normal, Binomial, Poisson, Gamma…
Predictor tuyến tính giống hồi quy tuyến tính:
\[ \eta_i = \mathbf{x}_i^\top \boldsymbol{\beta} = \beta_0 + \beta_1 x_{i1} + \dots + \beta_p x_{ip} \]
Trong đó: - \(\eta_i\): predictor tuyến tính - \(\mathbf{x}_i\): vector biến giải thích cho quan sát \(i\) - \(\boldsymbol{\beta}\): vector hệ số hồi quy
Liên kết giữa giá trị kỳ vọng \(\mu_i = E[y_i]\) và predictor tuyến tính:
\[ g(\mu_i) = \eta_i \quad \text{hay} \quad \mu_i = g^{-1}(\eta_i) \]
Một số ví dụ hàm liên kết phổ biến:
Phân phối | \(\mu_i\) | Hàm liên kết \(g(\mu)\) | Mô hình |
---|---|---|---|
Normal | \(\mu \in \mathbb{R}\) | \(g(\mu) = \mu\) | Hồi quy tuyến tính |
Binomial | \(\mu \in (0,1)\) | \(g(\mu) = \log\frac{\mu}{1-\mu}\) | Logistic |
Poisson | \(\mu > 0\) | \(g(\mu) = \log(\mu)\) | Đếm sự kiện |
Gamma | \(\mu > 0\) | \(g(\mu) = \log(\mu)\) hoặc \(g(\mu) = \frac{1}{\mu}\) | Dữ liệu dương |
\[ y_i \sim \text{Bernoulli}(\pi_i), \quad \log\left( \frac{\pi_i}{1 - \pi_i} \right) = \eta_i \]
Ứng dụng: kết quả nhị phân như “có/không”, “sống/chết”…
\[ y_i \sim \text{Poisson}(\mu_i), \quad \log(\mu_i) = \mathbf{x}_i^\top \boldsymbol{\beta} \]
Dùng trong các dữ liệu: số sự kiện, vi phạm, ca bệnh…
\[ y_i \sim \text{Gamma}(\alpha, \mu_i), \quad g(\mu_i) = \log(\mu_i) \text{ hoặc } g(\mu_i) = \frac{1}{\mu_i} \]
Thường dùng cho chi phí, thời gian, độ dài…
Phương sai \(y_i\) trong GLM không cần đồng nhất, mà phụ thuộc vào giá trị kỳ vọng:
\[ \operatorname{Var}(y_i) = \phi \cdot V(\mu_i) \]
Trong đó: - \(\phi\): tham số phân tán - \(V(\mu)\): hàm phương sai, thay đổi theo phân phối —
Phân phối | \(V(\mu)\) |
---|---|
Normal | 1 |
Binomial | \(\mu(1 - \mu)\) |
Poisson | \(\mu\) |
Gamma | \(\mu^2\) |
Việc mô hình hóa phương sai như vậy giúp xử lý hiện tượng phương sai thay đổi (heteroscedasticity) – điều mà OLS không thể làm.
Một số phân phối có hàm liên kết sao cho \(\eta_i = \theta_i\) (tức predictor tuyến tính chính là tham số tự nhiên):
Phân phối | Hàm liên kết chuẩn |
---|---|
Binomial | Logit: \(\log\frac{\mu}{1-\mu}\) |
Poisson | Log: \(\log(\mu)\) |
Normal | Identity: \(\mu\) |
Lưu ý: GLM được gọi là “tuyến tính” vì predictor tuyến tính theo biến độc lập, nhưng hàm phản hồi (mean function) có thể phi tuyến do hàm liên kết.
Sau khi xác định ba thành phần của GLM (phân phối, hàm liên kết và thành phần tuyến tính), bước tiếp theo là ước lượng các hệ số \(\boldsymbol{\beta}\) thông qua phương pháp ước lượng hợp lý tối đa (MLE). Khác với hồi quy tuyến tính cổ điển sử dụng OLS, GLM thường áp dụng thuật toán Iteratively Reweighted Least Squares (IRLS), cho phép cập nhật lặp lại các hệ số \(\boldsymbol{\beta}\) dựa trên trọng số điều chỉnh phù hợp với đặc điểm của phân phối và hàm liên kết được chọn
Giả sử ta có tập dữ liệu gồm:
GLM được mô tả dưới dạng:
\[ g(\mu_i) = \eta_i = \boldsymbol{x}_i^\top \boldsymbol{\beta}, \quad \mu_i = \mathbb{E}[y_i] = g^{-1}(\boldsymbol{x}_i^\top \boldsymbol{\beta}) \]
Hàm log-likelihood cần cực đại hóa là:
\[ \ell(\boldsymbol{\beta}) = \sum_{i=1}^n \log f(y_i; \theta_i) \]
Trong đó:
MLE được thực hiện thông qua thuật toán IRLS.
Thuật toán IRLS là phương pháp lặp, trong đó mỗi vòng lặp thực hiện một bước hồi quy tuyến tính có trọng số. Hai thành phần quan trọng cần cập nhật liên tục là:
Biến giả (working response): \[ z_i = \eta_i + \frac{y_i - \mu_i}{\frac{d\mu_i}{d\eta_i}} \]
Trọng số: \[ W_i = \left( \frac{d\mu_i}{d\eta_i} \right)^2 \bigg/ \text{Var}(y_i) \]
Suy ra:
\[ X^\top W X \hat{\beta} = X^\top W z \]
Lặp lại đến khi \(\hat{\boldsymbol{\beta}}\) hội tụ.
\[ U(\boldsymbol{\beta}) = \frac{\partial \ell(\boldsymbol{\beta})}{\partial \boldsymbol{\beta}} \]
Ước lượng cực đại thỏa mãn \(U(\boldsymbol{\beta}) = 0\).
Ma trận thông tin Fisher:
\[ I(\beta) = -\mathbb{E}\left[\frac{\partial^2 \ell(\beta)}{\partial \beta \, \partial \beta^\top} \right] \]
Xấp xỉ phương sai của ước lượng:
\[ \text{Var}(\hat{\boldsymbol{\beta}}) \approx (\boldsymbol{X}^\top \boldsymbol{W} \boldsymbol{X})^{-1} \]
Thể hiện: Với mô hình lớn, nên giải hệ phương trình hơn là đảo trực tiếp để tránh sai số số học.
Với ma trận hiệp phương sai đã tính được, sai số chuẩn từng hệ số:
\[ SE(\hat{\beta}_j) = \sqrt{[\text{Var}(\hat{\boldsymbol{\beta}})]_{jj}} \]
\[ \hat{\beta}_j \pm z_{\alpha/2} \cdot SE(\hat{\beta}_j) \]
Trong đó: \(z_{\alpha/2}\) là phân vị chuẩn (ví dụ: 1.96 cho 95%).
\[ Z = \frac{\hat{\beta}_j}{SE(\hat{\beta}_j)} \sim \mathcal{N}(0,1) \]
Nếu \(|Z| > z_{\alpha/2}\) → bác bỏ \(H_0\).
Trong một số GLM, cần ước lượng tham số phân tán \(\phi\):
\[ \hat{\phi} = \frac{1}{n - p} \sum_{i=1}^n \frac{(y_i - \hat{\mu}_i)^2}{V(\hat{\mu}_i)} \]
Trong đó:
Phân phối | Hàm phương sai \(V(\mu)\) |
---|---|
Gaussian | 1 |
Poisson | \(\mu\) |
Binomial (logit) | \(\mu(1 - \mu)\) |
Sau khi ước lượng tham số \(\beta\) trong GLM, cần đánh giá độ phù hợp của mô hình và lựa chọn mô hình tốt nhất khi có nhiều lựa chọn. Các công cụ phổ biến gồm: Deviance, kiểm định \(\chi^2\), AIC, BIC, so sánh mô hình lồng nhau, đồ thị phần dư và điểm ảnh hưởng.
Deviance đo mức độ khác biệt giữa mô hình hiện tại và mô hình bão hòa (saturated model): \[ D(y; \hat{\mu}) = 2 \left[ \ell(y; y) - \ell(\hat{\mu}; y) \right] \] với \(\ell(y;y)\) là log-likelihood của mô hình bão hòa, \(\ell(\hat{\mu};y)\) là log-likelihood của mô hình hiện tại. Deviance càng nhỏ mô hình càng phù hợp.
Khi hai mô hình lồng nhau, kiểm định sai biệt deviance: \[ \Delta D = D_{\text{reduced}} - D_{\text{full}} \sim \chi^2_{df} \] với \(df\) là số tham số bị ràng buộc. Nếu \(\Delta D\) lớn và \(p\)-value nhỏ, mô hình đầy đủ tốt hơn.
Các loại phần dư:
Biểu đồ chẩn đoán (Residuals vs Fitted, Q-Q plot, Scale-Location, Cook’s distance) giúp phát hiện điểm ngoại lai và điểm ảnh hưởng.
Phép kiểm định Pearson: \[ X^2 = \sum_{i=1}^n \frac{(y_i - \hat{\mu}_i)^2}{V(\hat{\mu}_i)} \] Nếu \(X^2\) lớn hơn phân phối \(\chi^2\) với bậc tự do thích hợp, mô hình có thể không phù hợp.
Mô hình Poisson, Binomial giả định hệ số phân tán \(\phi = 1\). Overdispersion xảy ra khi phương sai thực tế lớn hơn lý thuyết.
Ước lượng hệ số phân tán: \[ \hat{\phi} = \frac{\text{Deviance}}{n - p} \] với \(n\) là số quan sát, \(p\) số tham số. Nếu \(\hat{\phi} > 1.5\), mô hình có thể bị overdispersed.
Giải pháp: dùng quasi-Poisson hoặc Negative Binomial.
Hồi quy logistic là mô hình phổ biến thuộc họ GLM, dùng để phân tích biến phản hồi nhị phân \(y \in \{0,1\}\), ví dụ như bệnh/không bệnh, mua/không mua. Mục tiêu là mô hình hóa xác suất \(\mu_i = P(y_i=1)\) bằng hàm liên kết logit:
\[ g(\mu_i) = \log \frac{\mu_i}{1-\mu_i} = \eta_i = x_i^T \beta. \]
Biến \(y_i\) theo phân phối Bernoulli với tham số \(\pi_i = P(y_i=1)\), log-likelihood tổng thể là:
\[ \ell(\beta) = \sum_{i=1}^n \left[ y_i \log(\pi_i) + (1 - y_i) \log(1 - \pi_i) \right]. \]
Giải nghiệm tối ưu không có nghiệm đóng, cần dùng thuật toán IRLS để tìm ước lượng \(\hat{\beta}\).
Hệ số \(\beta_j\) thể hiện log-odds ratio, với:
\[ \text{Odds ratio} = \exp(\beta_j). \]
Nếu \(\beta_j > 0\), biến giải thích làm tăng xác suất \(y=1\); nếu \(\beta_j < 0\), làm giảm xác suất này.
Kiểm định Wald được dùng để đánh giá từng hệ số với:
\[ Z_j = \frac{\hat{\beta}_j}{SE(\hat{\beta}_j)} \sim N(0,1). \]
Khoảng tin cậy 95% cho \(\beta_j\) được tính theo công thức:
\[ \hat{\beta}_j \pm z_{0.975} \times SE(\hat{\beta}_j). \]
Chuyển sang odds ratio bằng cách lấy hàm mũ.
Sử dụng deviance và pseudo-\(R^2\) để đánh giá sự phù hợp:
\[ D = -2 [\ell(\hat{\beta}) - \ell_{\text{saturated}}], \quad R^2 = 1 - \frac{D_{\text{model}}}{D_{\text{null}}}. \]
Mô hình có thể bao gồm nhiều biến giải thích:
\[ \log \frac{\pi_i}{1 - \pi_i} = \beta_0 + \beta_1 x_{i1} + \cdots + \beta_p x_{ip}. \]
Khi dữ liệu tổng hợp theo nhóm:
\[ y_i \sim \text{Binomial}(n_i, \pi_i), \]
với log-likelihood:
\[ \ell(\beta) = \sum_{i=1}^n \left[ y_i \log(\pi_i) + (n_i - y_i) \log(1 - \pi_i) \right]. \]
Hồi quy Poisson dùng cho biến đếm \(y \in \{0,1,2,\dots\}\) như số lần nhập viện, tai nạn,… Mục tiêu là mô hình kỳ vọng số sự kiện dựa trên đặc tính \(x\).
Phân phối xác suất:
\[ P(y_i) = \frac{e^{-\mu_i} \mu_i^{y_i}}{y_i!}, \quad \mu_i = E[y_i]. \]
Hàm liên kết log chuẩn:
\[ \eta_i = \log(\mu_i) = x_i^T \beta \implies \mu_i = e^{x_i^T \beta}. \]
Log-likelihood:
\[ \ell(\beta) = \sum_{i=1}^n \left[ y_i x_i^T \beta - e^{x_i^T \beta} - \log(y_i!) \right]. \]
Ước lượng bằng IRLS từ phương trình điểm.
Hệ số \(\beta_j\) biểu thị tác động log tuyến tính tới kỳ vọng sự kiện; \(e^{\beta_j}\) là tỷ lệ thay đổi kỳ vọng khi \(x_j\) tăng 1 đơn vị.
Khi thời gian quan sát khác nhau, dùng offset \(\log(t_i)\) để điều chỉnh mô hình:
\[ \log(\mu_i) = \log(t_i) + x_i^T \beta. \]
Khi phương sai vượt quá kỳ vọng \(\text{Var}(y_i) > \mu_i\), gọi là overdispersion. Có thể dùng quasi-Poisson hoặc Negative Binomial để xử lý.
Sử dụng deviance, AIC, kiểm định deviance, biểu đồ phần dư và kiểm định Pearson để đánh giá.
Mô hình | Khi dùng |
---|---|
Poisson | Khi phương sai gần bằng kỳ vọng |
Quasi-Poisson | Khi có overdispersion nhẹ |
Negative Binomial | Khi overdispersion nặng hoặc nhiều giá trị 0 |
Hồi quy Gamma phù hợp với dữ liệu dương liên tục, phương sai tỷ lệ với bình phương kỳ vọng, ví dụ chi phí y tế, thời gian sống.
Giả định:
\[ y_i \sim \text{Gamma}(\alpha, \mu_i), \quad \text{với } \operatorname{Var}(y_i) = \phi \mu_i^2. \]
Hàm mật độ thuộc họ exponential family, với liên kết log:
\[ g(\mu_i) = \log(\mu_i) = \eta_i = x_i^T \beta. \]
Ước lượng tham số qua MLE dùng IRLS, log-likelihood:
\[ \ell(\beta) = \sum_{i=1}^n \left[ -\log(\mu_i) - \frac{y_i}{\mu_i} \right] + \text{hằng số}. \]
Với liên kết log, \(\beta_j\) biểu thị tác động log tuyến tính lên kỳ vọng \(\mu_i\), tức khi \(x_j\) tăng 1 đơn vị, \(\mu_i\) thay đổi theo tỷ lệ \(e^{\beta_j}\).
Kiểm định Wald và khoảng tin cậy cho \(\beta_j\) tương tự các mô hình GLM khác, có thể chuyển sang tỷ lệ thay đổi trung bình bằng hàm mũ.
Sử dụng deviance và Pearson chi-square để đánh giá mô hình và phát hiện overdispersion.
Mô hình | Khi dùng |
---|---|
Hồi quy tuyến tính | Dữ liệu chuẩn, phương sai không đổi |
Hồi quy Gamma | Dữ liệu dương, phương sai tỷ lệ với bình phương trung bình |
Hồi quy log-normal | Khi log biến đáp ứng phân phối chuẩn |
Dạng dữ liệu | Mô hình | Ghi chú |
---|---|---|
0/1 từng cá nhân | Hồi quy logistic | \(y_i \sim \mathrm{Bernoulli}(\pi_i)\) |
Nhóm nhiều cá nhân | Binomial GLM | \(y_i \sim \mathrm{Binomial}(n_i, \pi_i)\) |
Chú thích: Mô hình nhóm cho kết quả ước lượng chính xác hơn do tận dụng tổng số thử nghiệm \(n_i\) trên mỗi quan sát.
Phương sai của biến ngẫu nhiên \(Y\) được mô hình hóa theo dạng:
\[ \mathrm{Var}(Y) = \phi \mu^p \]
trong đó:
Một phụ lục hoặc chương giới thiệu về sử dụng R cho phân tích dữ liệu, bao gồm các khái niệm cơ bản và hàm R.
Phần Tài liệu tham khảo (References) liệt kê các nguồn trích dẫn.
Phần Lời giải cho Bài tập (Selected Solutions) cung cấp lời giải chi tiết cho một số bài tập từ các chương khác nhau.
Một Chỉ mục Bộ dữ liệu (Index: Data sets) liệt kê các bộ dữ liệu được sử dụng trong sách cùng với trang tham chiếu.
Tóm lại, tài liệu này cung cấp một cái nhìn toàn diện về GLM, từ nền tảng lý thuyết dựa trên EDM và độ lệch dư, đến các khía cạnh thực hành như suy luận, chẩn đoán và xây dựng mô hình, với các ví dụ chi tiết và hướng dẫn sử dụng R cho các loại dữ liệu khác nhau (liên tục, nhị phân, đếm, tỷ lệ, dương liên tục, dương liên tục có zero).
Bộ dữ liệu ghi nhận các giao dịch mua hàng của khách trong một khoảng thời gian nhất định, bao gồm nhiều thông tin chi tiết về đặc điểm khách hàng, vị trí địa lý, cùng các đặc điểm sản phẩm và giao dịch. Bộ dữ liệu gồm 14.059 quan sát và 16 biến.
Các biến trong bộ dữ liệu gồm:
library(readxl)
## Warning: package 'readxl' was built under R version 4.4.3
Supermarket_Transactions <- read_excel("C:/Users/Lenovo/Downloads/Supermarket Transactions.xlsx")#Tải dữ liệu lên
## New names:
## • `` -> `...1`
names(Supermarket_Transactions)
## [1] "...1" "PurchaseDate" "CustomerID"
## [4] "Gender" "MaritalStatus" "Homeowner"
## [7] "Children" "AnnualIncome" "City"
## [10] "StateorProvince" "Country" "ProductFamily"
## [13] "ProductDepartment" "ProductCategory" "UnitsSold"
## [16] "Revenue"
dim(Supermarket_Transactions)
## [1] 14059 16
PurchaseDate: Ngày thực hiện giao dịch mua hàng.
CustomerID: Mã định danh duy nhất của khách hàng.
Gender: Giới tính của khách hàng (F: nữ, M: nam).
MaritalStatus: Tình trạng hôn nhân của khách hàng (S: độc thân, M: đã kết hôn).
Homeowner: Khách hàng có sở hữu nhà hay không (Y: có, N: không).
Children: Số lượng con cái của khách hàng.
AnnualIncome: Thu nhập hàng năm của khách hàng, được phân loại theo khoảng giá trị.
City: Thành phố cư trú của khách hàng.
StateorProvince: Bang hoặc tỉnh thành nơi khách hàng cư trú.
Country: Quốc gia của khách hàng.
ProductFamily: Nhóm sản phẩm chính, phân loại theo đặc tính chung.
ProductDepartment: Nhóm sản phẩm nằm trong sản phẩm chính, giúp phân loại sản phẩm cụ thể hơn.
ProductCategory: Danh mục cụ thể của sản phẩm, mô tả chi tiết hơn về loại mặt hàng.
UnitsSold: Số lượng đơn vị sản phẩm được bán trong giao dịch.
Revenue: Doanh thu thu được từ giao dịch.
library(psych)
## Warning: package 'psych' was built under R version 4.4.3
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.4.3
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
describe(select(Supermarket_Transactions, Revenue, UnitsSold, Children))
## vars n mean sd median trimmed mad min max range skew
## Revenue 1 14059 13.00 8.22 11.25 12.05 7.40 0.53 56.7 56.17 1.13
## UnitsSold 2 14059 4.08 1.17 4.00 4.08 1.48 1.00 8.0 7.00 0.01
## Children 3 14059 2.53 1.49 3.00 2.53 1.48 0.00 5.0 5.00 -0.02
## kurtosis se
## Revenue 1.39 0.07
## UnitsSold -0.44 0.01
## Children -1.03 0.01
Trên tổng số 14 059 giao dịch, ta có các chỉ số tóm tắt như sau:
Doanh thu (Revenue)
Số đơn vị bán được (UnitsSold)
Số trẻ em (Children)
# Liệt kê các biến định tính
data <- c("Gender", "MaritalStatus", "Homeowner", "AnnualIncome",
"City", "StateorProvince", "Country",
"ProductFamily", "ProductDepartment", "ProductCategory")
# Thống kê mô tả
for (var in data) {
cat("===== Thống kê mô tả cho biến:", var, "=====\n")
print(table(Supermarket_Transactions[[var]]))
cat("\nTỷ lệ phần trăm:\n")
print(round(prop.table(table(Supermarket_Transactions[[var]])) * 100, 2))
cat("\n\n")
}
## ===== Thống kê mô tả cho biến: Gender =====
##
## F M
## 7170 6889
##
## Tỷ lệ phần trăm:
##
## F M
## 51 49
##
##
## ===== Thống kê mô tả cho biến: MaritalStatus =====
##
## M S
## 6866 7193
##
## Tỷ lệ phần trăm:
##
## M S
## 48.84 51.16
##
##
## ===== Thống kê mô tả cho biến: Homeowner =====
##
## N Y
## 5615 8444
##
## Tỷ lệ phần trăm:
##
## N Y
## 39.94 60.06
##
##
## ===== Thống kê mô tả cho biến: AnnualIncome =====
##
## $10K - $30K $110K - $130K $130K - $150K $150K + $30K - $50K
## 3090 643 760 273 4601
## $50K - $70K $70K - $90K $90K - $110K
## 2370 1709 613
##
## Tỷ lệ phần trăm:
##
## $10K - $30K $110K - $130K $130K - $150K $150K + $30K - $50K
## 21.98 4.57 5.41 1.94 32.73
## $50K - $70K $70K - $90K $90K - $110K
## 16.86 12.16 4.36
##
##
## ===== Thống kê mô tả cho biến: City =====
##
## Acapulco Bellingham Beverly Hills Bremerton Camacho
## 383 143 811 834 452
## Guadalajara Hidalgo Los Angeles Merida Mexico City
## 75 845 926 654 194
## Orizaba Portland Salem San Andres San Diego
## 464 876 1386 621 866
## San Francisco Seattle Spokane Tacoma Vancouver
## 130 922 875 1257 633
## Victoria Walla Walla Yakima
## 176 160 376
##
## Tỷ lệ phần trăm:
##
## Acapulco Bellingham Beverly Hills Bremerton Camacho
## 2.72 1.02 5.77 5.93 3.22
## Guadalajara Hidalgo Los Angeles Merida Mexico City
## 0.53 6.01 6.59 4.65 1.38
## Orizaba Portland Salem San Andres San Diego
## 3.30 6.23 9.86 4.42 6.16
## San Francisco Seattle Spokane Tacoma Vancouver
## 0.92 6.56 6.22 8.94 4.50
## Victoria Walla Walla Yakima
## 1.25 1.14 2.67
##
##
## ===== Thống kê mô tả cho biến: StateorProvince =====
##
## BC CA DF Guerrero Jalisco OR Veracruz WA
## 809 2733 815 383 75 2262 464 4567
## Yucatan Zacatecas
## 654 1297
##
## Tỷ lệ phần trăm:
##
## BC CA DF Guerrero Jalisco OR Veracruz WA
## 5.75 19.44 5.80 2.72 0.53 16.09 3.30 32.48
## Yucatan Zacatecas
## 4.65 9.23
##
##
## ===== Thống kê mô tả cho biến: Country =====
##
## Canada Mexico USA
## 809 3688 9562
##
## Tỷ lệ phần trăm:
##
## Canada Mexico USA
## 5.75 26.23 68.01
##
##
## ===== Thống kê mô tả cho biến: ProductFamily =====
##
## Drink Food Non-Consumable
## 1250 10153 2656
##
## Tỷ lệ phần trăm:
##
## Drink Food Non-Consumable
## 8.89 72.22 18.89
##
##
## ===== Thống kê mô tả cho biến: ProductDepartment =====
##
## Alcoholic Beverages Baked Goods Baking Goods Beverages
## 356 425 1072 680
## Breakfast Foods Canned Foods Canned Products Carousel
## 188 977 109 59
## Checkout Dairy Deli Eggs
## 82 903 699 198
## Frozen Foods Health and Hygiene Household Meat
## 1382 893 1420 89
## Periodicals Produce Seafood Snack Foods
## 202 1994 102 1600
## Snacks Starchy Foods
## 352 277
##
## Tỷ lệ phần trăm:
##
## Alcoholic Beverages Baked Goods Baking Goods Beverages
## 2.53 3.02 7.63 4.84
## Breakfast Foods Canned Foods Canned Products Carousel
## 1.34 6.95 0.78 0.42
## Checkout Dairy Deli Eggs
## 0.58 6.42 4.97 1.41
## Frozen Foods Health and Hygiene Household Meat
## 9.83 6.35 10.10 0.63
## Periodicals Produce Seafood Snack Foods
## 1.44 14.18 0.73 11.38
## Snacks Starchy Foods
## 2.50 1.97
##
##
## ===== Thống kê mô tả cho biến: ProductCategory =====
##
## Baking Goods Bathroom Products Beer and Wine
## 484 365 356
## Bread Breakfast Foods Candles
## 425 417 45
## Candy Canned Anchovies Canned Clams
## 352 44 53
## Canned Oysters Canned Sardines Canned Shrimp
## 35 40 38
## Canned Soup Canned Tuna Carbonated Beverages
## 404 87 154
## Cleaning Supplies Cold Remedies Dairy
## 189 93 903
## Decongestants Drinks Eggs
## 85 135 198
## Electrical Frozen Desserts Frozen Entrees
## 355 323 118
## Fruit Hardware Hot Beverages
## 765 129 226
## Hygiene Jams and Jellies Kitchen Products
## 197 588 217
## Magazines Meat Miscellaneous
## 202 761 42
## Packaged Vegetables Pain Relievers Paper Products
## 48 192 345
## Pizza Plastic Products Pure Juice Beverages
## 194 141 165
## Seafood Side Dishes Snack Foods
## 102 153 1600
## Specialty Starchy Foods Vegetables
## 289 277 1728
##
## Tỷ lệ phần trăm:
##
## Baking Goods Bathroom Products Beer and Wine
## 3.44 2.60 2.53
## Bread Breakfast Foods Candles
## 3.02 2.97 0.32
## Candy Canned Anchovies Canned Clams
## 2.50 0.31 0.38
## Canned Oysters Canned Sardines Canned Shrimp
## 0.25 0.28 0.27
## Canned Soup Canned Tuna Carbonated Beverages
## 2.87 0.62 1.10
## Cleaning Supplies Cold Remedies Dairy
## 1.34 0.66 6.42
## Decongestants Drinks Eggs
## 0.60 0.96 1.41
## Electrical Frozen Desserts Frozen Entrees
## 2.53 2.30 0.84
## Fruit Hardware Hot Beverages
## 5.44 0.92 1.61
## Hygiene Jams and Jellies Kitchen Products
## 1.40 4.18 1.54
## Magazines Meat Miscellaneous
## 1.44 5.41 0.30
## Packaged Vegetables Pain Relievers Paper Products
## 0.34 1.37 2.45
## Pizza Plastic Products Pure Juice Beverages
## 1.38 1.00 1.17
## Seafood Side Dishes Snack Foods
## 0.73 1.09 11.38
## Specialty Starchy Foods Vegetables
## 2.06 1.97 12.29
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.4.3
##
## Attaching package: 'ggplot2'
## The following objects are masked from 'package:psych':
##
## %+%, alpha
library(scales)
## Warning: package 'scales' was built under R version 4.4.3
##
## Attaching package: 'scales'
## The following objects are masked from 'package:psych':
##
## alpha, rescale
df_drink <- Supermarket_Transactions %>% filter(ProductFamily == "Drink")
# Đếm số lượng và tính % theo tổng
df_plot <- df_drink %>%
count(ProductDepartment, ProductCategory) %>%
mutate(percent = n / 1250)
# Vẽ biểu đồ
ggplot(df_plot, aes(x = ProductDepartment, y = percent, fill = ProductCategory)) +
geom_col(position = position_dodge2(preserve = "single")) +
geom_text(aes(label = scales::percent(percent, accuracy = 0.1)), # hiện % với 1 chữ số thập phân
position = position_dodge2(width = 0.9, preserve = "single"),
vjust = -0.2, size = 3) +
labs(
title = "Tỷ lệ (%) số lượng sản phẩm Drink theo phân loại và tên chi tiết sản phẩm",
x = "Phân loại sản phẩm",
y = "Tỷ lệ (%)",
fill = "Tên sản phẩm"
) +
scale_y_continuous(labels = percent_format(accuracy = 1)) + # trục y theo %
scale_fill_viridis_d(option = "C") +
theme(
axis.text.x = element_text(angle = 45, hjust = 1, size = 9) )
Các sản phẩm Drink (nước uống) được phân thành ba nhóm chính gồm:
Đồ uống có cồn (Alcoholic Beverages) 28,5%
Đồ uống từ sữa (Dairy) 1,5%
Các loại đồ uống khác (Beverages) 54.4%
Trong ba nhóm này, nhóm Beverages chiếm tỷ trọng cao nhất về tổng số lượng bán ra, cho thấy mức độ tiêu thụ phổ biến hơn so với các nhóm còn lại. Ngược lại, nhóm sản phẩm từ sữa ghi nhận lượng bán thấp nhất, phản ánh mức độ tiêu thụ hạn chế hơn trong tập dữ liệu này.
library(ggplot2)
# Lọc sản phẩm thuộc nhóm Food
df_food <- Supermarket_Transactions %>% filter(ProductFamily == "Food")
# Đếm số lượng và tính phần trăm
df_plot1 <- df_food %>%
count(ProductDepartment, ProductCategory) %>%
mutate(percent = n / sum(n))
# Vẽ biểu đồ
ggplot(df_plot1, aes(x = ProductDepartment, y = percent, fill = ProductCategory)) +
geom_col(position = position_dodge2(preserve = "single")) +
geom_text(aes(label = ifelse(percent > 0.02, scales::percent(percent, accuracy = 0.1), "")),
position = position_dodge2(width = 0.9, preserve = "single"),
vjust = -0.2, size = 3) +
labs(
title = "Tỷ lệ (%) sản phẩm Food theo phân loại và tên chi tiết sản phẩm",
x = "Phân loại sản phẩm",
y = "Tỷ lệ (%)",
fill = "Tên sản phẩm"
) +
scale_y_continuous(labels = percent_format(accuracy = 1)) +
scale_fill_viridis_d(option = "D") +
theme(
axis.text.x = element_text(angle = 60, hjust = 1, size = 8),
legend.key.size = unit(0.4, "cm"),
legend.spacing.y = unit(0.1, "cm"),
legend.text = element_text(size = 7) )
Các sản phẩm Food (thức ăn) có sự đa dạng về phân loại với tổng cộng 15 nhóm khác nhau. Trong đó, những nhóm sản phẩm có số lượng bán ra nổi bật bao gồm:
Produce (Rau cũ quả tương) 19,7%
Snack Foods (đồ ăn nhanh) 15.8%
Frozen Foods (đồ ăn đông lạnh) 13,7%
Ngược lại, nhóm sản phẩm Meat (thịt) 0,9% là loại ít được ưa chuộng nhất.
# Lọc dữ liệu
df_Non_Consumable <- Supermarket_Transactions %>% filter(ProductFamily == "Non-Consumable")
# Đếm số lượng và tính tỷ lệ phần trăm trên tổng số
df_plot2 <- df_Non_Consumable %>%
count(ProductDepartment, ProductCategory) %>%
mutate(percent = n / sum(n))
# Vẽ biểu đồ
ggplot(df_plot2, aes(x = ProductDepartment, y = percent, fill = ProductCategory)) +
geom_col(position = position_dodge2(preserve = "single")) +
geom_text(aes(label = scales::percent(percent, accuracy = 0.1)),
position = position_dodge2(width = 0.9, preserve = "single"),
vjust = -1, size = 3, color = 'red') +
labs(
title = "Tỷ lệ (%) sản phẩm Non-Consumable theo phân loại và tên chi tiết sản phẩm",
x = "Phân loại sản phẩm",
y = "Tỷ lệ (%)",
fill = "Tên sản phẩm"
) +
scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
scale_fill_viridis_d(option = "D") +
theme(
legend.key.size = unit(0.4, "cm"),
legend.spacing.y = unit(0.1, "cm"),
legend.position = "right" )
Đối với nhóm sản phẩm Non-Consumable (các sản phẩm không tiêu hao), có 5 phân loại chính gồm:
Carousel (dụng cụ xoay) 2,2%
Checkout (sản phẩm hỗ trợ thanh toán) 3,1%
Health and Hygiene (sản phẩm chăm sóc sức khỏe và vệ sinh) 33,6%
Household (vật dụng gia đình) 53,6%
Periodicals (ấn phẩm định kỳ) 7,6%
Trong đó, nhóm sản phẩm Household chiếm tỷ trọng lớn nhất về số lượng bán ra, cho thấy mức độ tiêu thụ cao. Ngược lại, Carousel là nhóm sản phẩm có số lượng bán ra thấp nhất, thể hiện mức độ quan tâm hạn chế từ phía người tiêu dùng.
library(ggplot2)
ggplot(Supermarket_Transactions, aes(x = PurchaseDate, y = Revenue)) +
geom_area(fill = "skyblue", alpha = 0.6) +
geom_line(color = "red") +
labs(
title = "Doanh thu theo thời gian",
x = "Ngày mua",
y = "Doanh thu"
) +
theme( )
Qua biểu đồ có thể thấy doanh thu từ tháng 1 đến tháng 7 năm 2009 đạt mức cao vượt trội so với các khoảng thời gian khác. Bên cạnh đó, doanh thu có xu hướng tăng dần từ năm 2008 đến năm 2009, nhưng bắt đầu giảm trở lại vào năm 2010.
Hoa Kỳ (USA) chiếm tới 68% tổng doanh thu từ các đơn hàng, thể hiện sức mua vượt trội và vai trò chủ đạo trên thị trường. Trong khi đó, Canada chỉ chiếm 5,8% tổng số đơn hàng và có doanh thu thấp nhất, phản ánh mức độ tiêu thụ còn hạn chế hơn so với các quốc gia khác.
# Đếm số lượng đơn hàng theo quốc gia, tính tỷ lệ %
df_pie <- Supermarket_Transactions %>%
count(Country) %>%
mutate(percent = n / sum(n),
label = scales::percent(percent, accuracy = 0.1))
# Vẽ pie chart
ggplot(df_pie, aes(x = "", y = percent, fill = Country)) +
geom_col(width = 1, color = "black") + # tạo cột cho pie chart
coord_polar(theta = "y") + # chuyển sang hình tròn
geom_text(aes(label = label),
position = position_stack(vjust = 0.5), size = 3, color = "black") + # label % ở giữa mỗi lát
labs(title = "Tỷ lệ % số đơn hàng theo quốc gia") +
theme_void() + # loại bỏ các trục, lưới
scale_fill_brewer(palette = "Set3") # màu sắc dễ nhìn
# Đếm số lượng và tính tỷ lệ phần trăm trên tổng số
df_a <- Supermarket_Transactions %>%
count(AnnualIncome, Country) %>%
mutate(percent = n / sum(n))
# Vẽ biểu đồ
ggplot(df_a, aes(x = AnnualIncome, y = n, fill = Country)) +
geom_col(position = position_dodge(width = 0.9)) +
geom_text(aes(label = scales::percent(percent, accuracy = 0.1)),
position = position_dodge(width = 0.9),
vjust = -0.5, size = 3) +
labs(
title = "Tổng doanh thu theo thu nhập của từng quốc gia",
x = "Thu nhập",
y = "Tổng doanh thu",
fill = "Quốc gia"
) +
scale_fill_brewer(palette = "Set1") +
theme(
axis.text.x = element_text(angle = 45, hjust = 1) )
Nhóm thu nhập trung bình thấp (đặc biệt là từ $30k đến $50k, chiếm 32,7%) chiếm tỷ lệ lớn trong tổng số người mua sắm, cho thấy đây là phân khúc khách hàng chủ lực của thị trường. Ngược lại, số lượng người tiêu dùng giảm dần ở các mức thu nhập cao hơn, đặc biệt là nhóm có thu nhập từ 150.000 USD trở lên (dưới 2%). Điều này phản ánh xu hướng nhóm thu nhập cao tập trung vào các sản phẩm cao cấp và chuyên biệt, thay vì các mặt hàng phổ thông.
# Lọc dữ liệu
df_b <- Supermarket_Transactions %>%
count(ProductFamily, Country) %>%
mutate(percent = n / sum(n))
# Vẽ biểu đồ cột theo phần trăm
ggplot(df_b, aes(x = ProductFamily, y = percent, fill = Country)) +
geom_col(position = position_dodge2(preserve = "single")) +
geom_text(aes(label = scales::percent(percent, accuracy = 0.1)),
position = position_dodge2(width = 0.9, preserve = "single"),
vjust = -0.5, size = 3) +
labs(
title = "Tỷ lệ phần trăm sản phẩm chính bán ra theo từng quốc gia",
x = "Sản phẩm chính",
y = "Tỷ lệ (%)",
fill = "Quốc gia"
) +
scale_y_continuous(labels = scales::percent_format(accuracy = 1), limits = c(0, NA)) +
scale_fill_brewer(palette = "Set4") +
theme(
axis.text.x = element_text(angle = 45, hjust = 1)
)
## Warning: Unknown palette: "Set4"
Trong các nhóm hàng hóa, thực phẩm (Food) 72,2% là mặt hàng được ưa
chuộng nhất, tiếp theo là nhóm sản phẩm không tiêu hao (Non-Consumable)
18,8% và cuối cùng là đồ uống (Drink) 8,9% . Do đó, để thúc đẩy doanh
thu, doanh nghiệp nên tập trung vào việc phát triển và đa dạng hóa mặt
hàng thực phẩm.
# Lọc dữ liệu
df_1 <- Supermarket_Transactions %>%
count(UnitsSold, Country) %>%
mutate(percent = n / sum(n))
# Vẽ biểu đồ cột
ggplot(df_1, aes(x = UnitsSold, y = percent, fill = Country)) +
geom_col(position = position_dodge2(preserve = "single")) +
geom_text(aes(label = scales::percent(percent, accuracy = 0.1)),
position = position_dodge2(width = 0.9, preserve = "single"),
vjust = -0.5, size = 3) +
scale_fill_viridis_d(option = "D") + # thang màu
scale_x_continuous(breaks = 1:8) +
labs(
title = "Tổng số lượng bán ra theo quốc gia",
x = "Số lượng bán ra",
y = "tỷ lệ (%)",
fill = "Quốc gia" ) +
theme_minimal()
Số lượng mặt hàng được bán ra chủ yếu tập trung trong khoảng từ 3 đến 6
món gần 80%, với điểm tập trung cao nhất là ở mức 4 món. Số lượng khách
hàng mua các mức hàng hóa nhiều hơn hoặc ít hơn mức này giảm dần, đặc
biệt, nhóm mua đủ 8 món hàng gần như không tồn tại hoặc rất hiếm
gặp.
# Lọc dữ liệu
df_1 <- Supermarket_Transactions %>%
count(Children, Country) %>%
mutate(percent = n / sum(n))
# Vẽ biểu đồ cột
ggplot(df_1, aes(x = Children, y = percent, fill = Country)) +
geom_col(position = position_dodge2(preserve = "single")) +
geom_text(aes(label = scales::percent(percent, accuracy = 0.1)),
position = position_dodge2(width = 0.9, preserve = "single"),
vjust = -0.5, size = 3) +
scale_fill_viridis_d(option = "A") + # thang màu
scale_x_continuous(breaks = 1:5) +
labs(
title = "Tỷ lệ khách hàng theo số trẻ em trong hộ gia đình và quốc gia",
x = "Số trẻ em trong hộ gia đình",
y = "Tỷ lệ (%)",
fill = "Nhóm sản phẩm"
) +
theme_minimal()
Có thể thấy rằng các hộ gia đình có từ 1 đến 4 người con chiếm tỷ trọng lớn trong tổng số, với tổng tỷ lệ gần 80%. Mức độ tiêu dùng của các nhóm này tương đối đồng đều giữa các quốc gia. Đáng chú ý, nhóm hộ gia đình có 3 người con là nhóm có tỷ lệ mua sắm cao nhất, chiếm khoảng 20,6%. Sau mức đỉnh này, tỷ lệ tiêu dùng có xu hướng giảm dần khi số lượng con tăng. Ngoài ra, các hộ gia đình chưa có con hoặc khách hàng độc thân có xu hướng tiêu dùng thấp hơn rõ rệt so với các nhóm còn lại.
# Lọc dữ liệu
library(RColorBrewer)
df_usa <- Supermarket_Transactions %>% filter(Country == "USA")
df_usa_summary <- df_usa %>%
group_by(MaritalStatus, Gender, Homeowner) %>%
summarise(Count = n(), .groups = "drop") %>%
mutate(Percent = Count / sum(Count))
colors <- brewer.pal(2, "Pastel1")
## Warning in brewer.pal(2, "Pastel1"): minimal value for n is 3, returning requested palette with 3 different levels
# Vẽ biểu đồ
ggplot(df_usa_summary, aes(x = MaritalStatus, y = Count, fill = Gender)) +
geom_col(position = position_dodge2(preserve = "single")) +
coord_flip() +
facet_grid(. ~ Homeowner) +
geom_text(aes(label = paste0(Count, "\n(", scales::percent(Percent, accuracy = 0.1), ")")),
position = position_dodge2(width = 0.9, preserve = "single"),
hjust = 1, size = 3) +
labs(
title = "Phân bố tình trạng hôn nhân theo giới tính và quyền sở hữu nhà (USA)",
x = "Tình trạng hôn nhân",
y = "Số lượng giao dịch"
) +
scale_fill_manual(values = colors) +
theme_minimal()
Phân tích tỉ lệ khách hàng theo giới tính cho thấy nam và nữ ở USA tương đương nhau, không có chênh lệch đáng kể (dưới 1%). Tuy nhiên, khi phân nhóm theo tình trạng hôn nhân và quyền sở hữu nhà, ta nhận thấy:
Nhóm độc thân: Số khách hàng không sở hữu nhà nhỉnh hơn nhóm có nhà khoảng 414 người (4,3%), cho thấy nhóm này phân bố tương đối cân bằng nhưng hơi nghiêng về phía thuê nhà hoặc chưa có nhà riêng.
Nhóm đã kết hôn: Số khách hàng sở hữu nhà vượt trội hơn nhóm không có nhà gần 2.332 (24,4%) người, phản ánh xu hướng vợ chồng đã ổn định về chỗ ở và có điều kiện kinh tế vững hơn.
Kết quả này cho thấy đa số người mua hàng trong dữ liệu đến từ các hộ gia đình ổn định, có nhà riêng - một minh chứng cho việc khách hàng có khả năng tài chính và sự an cư cao hơn thường chi tiêu nhiều hơn. Ngược lại, những khách hàng đã lập gia đình nhưng chưa sở hữu nhà ở có xu hướng chi tiêu hạn chế hơn.
# Lọc dữ liệu
df_usasummary <- df_usa %>%
group_by(StateorProvince, City) %>%
summarise(TotalRevenue = sum(Revenue), .groups = "drop") %>%
mutate(PercentRevenue = TotalRevenue / sum(TotalRevenue)) %>%
ungroup()
# Vẽ biểu đồ
ggplot(df_usasummary, aes(x = City, y = TotalRevenue, fill = City)) +
geom_col(show.legend = FALSE) +
geom_text(aes(label = paste0(
format(round(TotalRevenue, 2), nsmall = 2), # doanh thu làm tròn 2 chữ số thập phân
"\n(", scales::percent(PercentRevenue, accuracy = 0.1), ")"
)),
vjust = 1, size = 2) +
facet_wrap(~ StateorProvince, scales = "free_x") +
labs(
title = "Phân bố doanh thu theo thành phố và bang (USA)",
x = "Thành phố",
y = "Doanh thu "
) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Tại Hoa Kỳ (USA), tổng doanh thu của bang Washington (WA) đạt 43.271,67 USD, chiếm 47,7% — mức doanh thu cao nhất trong số các bang. Tuy nhiên, thành phố có số lượng đơn hàng nhiều nhất lại là Salem thuộc bang Oregon (OR), với tổng doanh thu 18.211,84 USD, chiếm 14,8% — vượt trội so với các thành phố khác. Ngược lại, tại bang Washington, thành phố Bellingham ghi nhận số lượng đơn hàng thấp nhất với doanh thu chưa đến 1.000 USD, chiếm 0,8%. Dựa trên những dữ liệu này, định hướng chiến lược tập trung mở rộng phân phối sản phẩm tại các thành phố có doanh thu cao như Salem, đồng thời khai thác tiềm năng phát triển tại các thị trường nhỏ hơn như Bellingham sẽ giúp tối ưu hóa hiệu quả kinh doanh và tiếp cận khách hàng mục tiêu một cách hiệu quả hơn..
# Lọc dữ liệu
df_Mexico <- Supermarket_Transactions %>% filter(Country == "Mexico")
# Tính tổng số giao dịch và tỷ lệ %
df_Mexico_summary <- df_Mexico %>%
group_by(MaritalStatus, Gender, Homeowner) %>%
summarise(Count = n(), .groups = "drop") %>%
mutate(Percent = Count / sum(Count))
colors <- brewer.pal(2, "Pastel2")
## Warning in brewer.pal(2, "Pastel2"): minimal value for n is 3, returning requested palette with 3 different levels
# Vẽ biểu đồ
ggplot(df_Mexico_summary, aes(x = MaritalStatus, y = Count, fill = Gender)) +
geom_col(position = position_dodge2(preserve = "single")) +
coord_flip() +
facet_grid(. ~ Homeowner) +
geom_text(aes(label = paste0(Count, "\n(", scales::percent(Percent, accuracy = 0.1), ")")),
position = position_dodge2(width = 0.9, preserve = "single"),
hjust = 1, size = 3) +
labs(
title = "Phân bố tình trạng hôn nhân theo giới tính và quyền sở hữu nhà (Mexico)",
x = "Tình trạng hôn nhân",
y = "Số lượng giao dịch"
) +
scale_fill_manual(values = colors) +
theme_minimal()
Phân tích tỷ lệ khách hàng theo giới tính tại Canada cho thấy có sự chênh lệch đáng kể giữa nam và nữ, với tỷ lệ nữ chiếm ưu thế (11,6%). Ngoại lệ duy nhất là ở nhóm khách hàng độc thân sở hữu nhà, nơi nam giới chiếm tỷ lệ cao hơn (2,7%). Tuy nhiên, khi xem xét cụ thể hơn theo tình trạng hôn nhân và quyền sở hữu nhà, có thể rút ra một số nhận định quan trọng:
Nhóm độc thân: Số lượng khách hàng không sở hữu nhà cao hơn nhóm có nhà khoảng 141 người (3,8%), cho thấy sự phân bổ tương đối đồng đều nhưng có xu hướng nghiêng về phía những người chưa có nhà riêng hoặc đang thuê nhà.
Nhóm đã kết hôn: Số lượng khách hàng sở hữu nhà vượt trội hơn nhóm không có nhà khoảng 883 người (24%), phản ánh xu hướng các cặp vợ chồng đã ổn định về nơi ở và có nền tảng kinh tế vững vàng hơn.
Kết quả này cho thấy đa số người mua hàng trong dữ liệu đến từ các hộ gia đình ổn định, có nhà riêng - điều này là minh chứng cho việc những khách hàng có điều kiện kinh tế và mức độ an cư cao hơn thường có xu hướng chi tiêu nhiều hơn. Ngược lại, những người đã lập gia đình nhưng chưa sở hữu nhà ở có xu hướng thận trọng hơn trong hành vi tiêu dùng.
# Lọc dữ liệu
df_Mexicosummary <- df_Mexico %>%
group_by(StateorProvince, City) %>%
summarise(TotalRevenue = sum(Revenue), .groups = "drop") %>%
mutate(PercentRevenue = TotalRevenue / sum(TotalRevenue)) %>%
ungroup()
# Vẽ biểu đồ
ggplot(df_Mexicosummary, aes(x = City, y = TotalRevenue, fill = City)) +
geom_col(show.legend = FALSE) +
geom_text(aes(label = paste0(
format(round(TotalRevenue, 2), nsmall = 2), # doanh thu làm tròn 2 chữ số thập phân
"\n(", scales::percent(PercentRevenue, accuracy = 0.1), ")"
)),
vjust = 1, size = 3) +
facet_wrap(~ StateorProvince, scales = "free_x") +
labs(
title = "Phân bố doanh thu theo thành phố và bang (Mexico)",
x = "Thành phố",
y = "Doanh thu "
) +
theme_minimal()
Tại Mexico, bang Zacatecas ghi nhận tổng doanh thu cao nhất trong số 6 bang được khảo sát. Trong đó, thành phố Hidalgo dẫn đầu về số lượng đơn hàng với doanh thu đạt 17.110,22 USD, chiếm 35,3% tổng doanh thu — vượt trội so với các thành phố còn lại. Ngược lại, thành phố Bellingham (thuộc bang Jalisco) ghi nhận doanh thu thấp nhất, chỉ đạt 523,32 USD, tương đương 1,1%..
# Lọc dữ liệu
df_Canada <- Supermarket_Transactions %>% filter(Country == "Canada")
# Tính tổng số giao dịch và tỷ lệ phần trăm
df_Canada_summary <- df_Canada %>%
group_by(MaritalStatus, Gender, Homeowner) %>%
summarise(Count = n(), .groups = "drop") %>%
mutate(Percent = Count / sum(Count))
colors <- brewer.pal(3, "Paired")
# Vẽ biểu đồ
ggplot(df_Canada_summary, aes(x = MaritalStatus, y = Count, fill = Gender)) +
geom_col(position = position_dodge2(preserve = "single")) +
coord_flip() +
facet_grid(. ~ Homeowner) +
geom_text(aes(label = paste0(Count, "\n(", scales::percent(Percent, accuracy = 0.1), ")")),
position = position_dodge2(width = 0.9, preserve = "single"),
hjust = 1, size = 3) +
labs(
title = "Phân bố tình trạng hôn nhân theo giới tính và quyền sở hữu nhà (Canada)",
x = "Tình trạng hôn nhân",
y = "Số lượng giao dịch"
) +
scale_fill_manual(values = colors) +
theme_minimal()
Phân tích tỷ lệ khách hàng theo giới tính tại Mexico cho thấy có sự chênh lệch đáng kể giữa nam và nữ (7,8%), với tỷ lệ nam gần như chiếm ưu thế. Ngoại lệ duy nhất là ở nhóm khách hàng có gia đình sở hữu nhà, nơi nữ giới chiếm tỷ lệ cao hơn (1,9%). Tuy nhiên, khi xem xét cụ thể hơn theo tình trạng hôn nhân và quyền sở hữu nhà, có thể rút ra một số nhận định quan trọng:
Nhóm độc thân: Số lượng khách hàng không sở hữu nhà cao hơn nhóm có nhà khoảng 44 người (5,4%), cho thấy sự phân bổ tương đối đồng đều nhưng có xu hướng nghiêng về phía những người chưa có nhà riêng hoặc đang thuê nhà.
Nhóm đã kết hôn: Số lượng khách hàng sở hữu nhà vượt trội hơn nhóm không có nhà khoảng 213 người (26,3%), phản ánh xu hướng các cặp vợ chồng đã ổn định về nơi ở và có nền tảng kinh tế vững vàng hơn.
Kết quả này cho thấy đa số người mua hàng trong dữ liệu đến từ các hộ gia đình ổn định, có nhà riêng - điều này là minh chứng cho việc những khách hàng có điều kiện kinh tế và mức độ an cư cao hơn thường có xu hướng chi tiêu nhiều hơn. Ngược lại, những người đã lập gia đình nhưng chưa sở hữu nhà ở có xu hướng thận trọng hơn trong hành vi tiêu dùng.
# Lọc dữ liệu
df_Canadasummary <- df_Canada %>%
group_by(StateorProvince, City) %>%
summarise(TotalRevenue = sum(Revenue), .groups = "drop") %>%
mutate(PercentRevenue = TotalRevenue / sum(TotalRevenue)) %>%
ungroup()
# Vẽ biểu đồ
ggplot(df_Canadasummary, aes(x = City, y = TotalRevenue, fill = City)) +
geom_col(show.legend = FALSE) +
geom_text(aes(label = paste0(
format(round(TotalRevenue, 2), nsmall = 2), # doanh thu làm tròn 2 chữ số thập phân
"\n(", scales::percent(PercentRevenue, accuracy = 0.1), ")"
)),
vjust = 1, size = 3) +
facet_wrap(~ StateorProvince, scales = "free_x") +
labs(
title = "Phân bố doanh thu theo thành phố và bang (Canada)",
x = "Thành phố",
y = "Doanh thu "
) +
theme_minimal()
Tại bang British Columbia (BC) của Canada, các giao dịch chỉ được ghi
nhận tại hai thành phố: Vancouver và Victoria. Trong đó, Vancouver chiếm
ưu thế rõ rệt với tổng doanh thu đạt 8.665,5 USD tương đương 78,3% tổng
doanh thu của bang - cho thấy đây là khu vực tập trung hoạt động mua sắm
sôi động hơn. Ngược lại, Victoria đóng góp phần nhỏ hơn trong tổng doanh
thu, cho thấy tiềm năng mở rộng phân phối sản phẩm tại khu vực này trong
tương lai.
library(dplyr)
# Danh sách các biến định tính cần phân tích
dinh_tinh_vars <- c("Gender", "MaritalStatus", "Homeowner", "AnnualIncome",
"City", "StateorProvince", "Country",
"ProductFamily", "ProductDepartment", "ProductCategory")
# Hàm tóm tắt số lượng và tỷ lệ theo từng mức độ của biến định tính
tomtat_dinh_tinh <- function(df, var) {
bien_goc <- trimws(df[[var]]) # loại bỏ khoảng trắng dư thừa
bien_goc <- as.factor(bien_goc) # chuyển thành kiểu factor
tan_so <- table(bien_goc, useNA = "ifany") # bảng tần số
ty_le <- prop.table(tan_so) # tỷ lệ tương ứng
data.frame(
Ten_Bien = var,
Gia_Tri = names(tan_so),
Tan_So = as.vector(tan_so),
Ti_Le_Phan_Tram = round(100 * as.vector(ty_le), 2),
stringsAsFactors = FALSE
)
}
# Áp dụng cho toàn bộ danh sách biến định tính
bang_tomtat_lon <- bind_rows(
lapply(dinh_tinh_vars, function(x) tomtat_dinh_tinh(Supermarket_Transactions, x))
)
# Tính các thống kê mô tả cho từng biến định tính
thongke_mota_daydu <- bang_tomtat_lon %>%
group_by(Ten_Bien) %>%
summarise(
Trung_Binh = mean(Tan_So, na.rm = TRUE),
Do_Lech_Chuan = sd(Tan_So, na.rm = TRUE),
Nho_Nhat = min(Tan_So, na.rm = TRUE),
Phan_Vi_1 = quantile(Tan_So, 0.25, na.rm = TRUE),
Trung_Vi = quantile(Tan_So, 0.5, na.rm = TRUE),
Phan_Vi_3 = quantile(Tan_So, 0.75, na.rm = TRUE),
Lon_Nhat = max(Tan_So, na.rm = TRUE)
)
# Hiển thị bảng bằng kable
library(knitr)
## Warning: package 'knitr' was built under R version 4.4.3
kable(
thongke_mota_daydu,
digits = 2,
col.names = c("Biến định tính", "Giá trị TB", "Độ lệch chuẩn", "Nhỏ nhất", "Q1", "Trung vị", "Q3", "Lớn nhất"),
caption = "Bảng mô tả thống kê tần suất các mức độ theo từng biến định tính"
)
Biến định tính | Giá trị TB | Độ lệch chuẩn | Nhỏ nhất | Q1 | Trung vị | Q3 | Lớn nhất |
---|---|---|---|---|---|---|---|
AnnualIncome | 1757.38 | 1511.35 | 273 | 635.50 | 1234.5 | 2550.00 | 4601 |
City | 611.26 | 370.75 | 75 | 285.00 | 633.0 | 870.50 | 1386 |
Country | 4686.33 | 4461.08 | 809 | 2248.50 | 3688.0 | 6625.00 | 9562 |
Gender | 7029.50 | 198.70 | 6889 | 6959.25 | 7029.5 | 7099.75 | 7170 |
Homeowner | 7029.50 | 2000.41 | 5615 | 6322.25 | 7029.5 | 7736.75 | 8444 |
MaritalStatus | 7029.50 | 231.22 | 6866 | 6947.75 | 7029.5 | 7111.25 | 7193 |
ProductCategory | 312.42 | 358.15 | 35 | 102.00 | 197.0 | 356.00 | 1728 |
ProductDepartment | 639.05 | 569.43 | 59 | 190.50 | 390.5 | 958.50 | 1994 |
ProductFamily | 4686.33 | 4786.18 | 1250 | 1953.00 | 2656.0 | 6404.50 | 10153 |
StateorProvince | 1405.90 | 1393.40 | 75 | 511.50 | 812.0 | 2020.75 | 4567 |
1. AnnualIncome
Biến AnnualIncome có giá trị trung bình là 1,757.38 và trung vị là 1,234.5, cho thấy phân phối có thể lệch phải. Khoảng giá trị dao động khá rộng (từ 273 đến 4,601) và độ lệch chuẩn cao (1,511.35), phản ánh sự chênh lệch đáng kể về mức thu nhập hàng năm giữa các đối tượng quan sát.
2. City
Biến City có trung bình là 611.26 và độ lệch chuẩn là 370.75, với giá trị nhỏ nhất là 75 và lớn nhất là 1,386. Khoảng dao động này cho thấy có nhiều thành phố được ghi nhận, tuy nhiên mức độ phân bổ số lượng quan sát giữa các thành phố là không đều.
3. Country
Country có giá trị trung bình là 4,686.33 và độ lệch chuẩn cao (4,461.08), với khoảng dao động từ 809 đến 9,562. Điều này cho thấy sự phân bố không đồng đều giữa các quốc gia, trong đó một số quốc gia có số lượng quan sát vượt trội hơn hẳn so với các quốc gia còn lại.
4. Gender
Biến Gender có giá trị trung bình và trung vị đều là 7,029.5, với độ lệch chuẩn rất thấp (198.7), dao động từ 6,889 đến 7,170. Điều này cho thấy số lượng nam và nữ trong tập dữ liệu là gần như cân bằng.
5. Homeowner
Tương tự Gender, biến Homeowner có trung bình và trung vị đều là 7,029.5, với độ lệch chuẩn là 2,000.41. Khoảng giá trị từ 5,615 đến 8,444 cho thấy có sự chênh lệch giữa hai nhóm (có sở hữu nhà và không), nhưng nhìn chung vẫn khá cân đối.
6. MaritalStatus
Biến MaritalStatus cũng có trung bình và trung vị bằng nhau (7,029.5), độ lệch chuẩn thấp (231.22), thể hiện rằng số lượng giữa các nhóm tình trạng hôn nhân (đã kết hôn, độc thân, v.v.) là gần bằng nhau, không có sự chênh lệch lớn.
7. ProductCategory
ProductCategory có trung bình 312.42 và độ lệch chuẩn 358.15, với giá trị thấp nhất là 35 và cao nhất là 1,728. Sự chênh lệch lớn giữa Min và Max cho thấy một số danh mục sản phẩm có số lượng vượt trội hơn nhiều so với các danh mục khác.
8. ProductDepartment
Biến này có giá trị trung bình là 639.05 và độ lệch chuẩn là 569.43, dao động từ 59 đến 1,994. Điều này phản ánh sự phân bố không đồng đều giữa các bộ phận sản phẩm, có thể do một số bộ phận có mức tiêu thụ hoặc phân phối cao hơn hẳn.
9. ProductFamily
ProductFamily có trung bình là 4,686.33, độ lệch chuẩn khá cao (4,786.18) và dao động rộng (1,250 đến 10,153). Điều này cho thấy sự phân phối mạnh mẽ của một số nhóm sản phẩm so với các nhóm còn lại.
10. StateorProvince
Biến StateorProvince có trung bình 1,405.90, độ lệch chuẩn 1,393.40 và giá trị nằm trong khoảng từ 75 đến 4,567. Phân bố dữ liệu giữa các bang/tỉnh khá phân tán, một số khu vực có tần suất xuất hiện cao hơn nhiều so với các khu vực khác.