“Generalized Linear Models with Examples in R” là một cuốn sách chuyên sâu về mô hình tuyến tính tổng quát (GLMs), được viết bởi hai chuyên gia thống kê là Peter K. Dunn và Gordon K. Smyth. Mục tiêu chính của cuốn sách là kết hợp chặt chẽ giữa lý thuyết và thực hành, giúp người học và người làm nghiên cứu hiểu rõ cấu trúc, phương pháp ước lượng, kiểm định và ứng dụng của GLMs, đồng thời thành thạo sử dụng phần mềm R để thực hiện các phân tích thống kê thực tế.
Chương 1 giới thiệu các khái niệm nền tảng về mô hình thống kê, là cơ sở để hiểu được mô hình tuyến tính và mô hình tuyến tính tổng quát (GLMs). Mục đích là để hiểu rõ cách mô hình hóa mối quan hệ giữa các biến số trong một tập dữ liệu.
Thành phần hệ thống (Systematic Component)
Là phần có thể giải thích được của mô hình, thể hiện mối quan hệ tuyến tính hoặc phi tuyến giữa biến phụ thuộc và các biến giải thích (covariates).
Được biểu diễn thông qua một hàm tuyến tính của các biến giải thích, ví dụ:
\[\eta_i = \beta_0 + \beta_1 x_{1i} + \dots + \beta_p x_{pi}\] Trong đó: \(\eta_i\) là giá trị của hàm liên kết tại quan sát thứ i
Thành phần ngẫu nhiên (Random Component)
Là phần không giải thích được của mô hình – thể hiện sự biến thiên tự nhiên, nhiễu đo lường hoặc các yếu tố không quan sát được.
Được mô tả bằng một phân phối xác suất phù hợp với loại dữ liệu:Phản ánh rằng ngay cả khi các biến giải thích giống nhau, kết quả đầu ra vẫn có thể khác do yếu tố ngẫu nhiên.
Ý nghĩa các hệ số:
Chương này giới thiệu mô hình hồi quy tuyến tính nói riêng và các mô hình hồi quy tuyến tính tổng quát nói chung. Nội dung bao gồm: định nghĩa, giả định cơ bản, ước lượng bình phương tối thiểu, sử dụng R để xây dựng và diễn giải mô hình, cùng với các phương pháp suy luận, phân tích phương sai và so sánh mô hình.
Mô hình hồi quy tuyến tính là một phương pháp thống kê dùng để mô hình hóa mối quan hệ giữa một biến phụ thuộc (phản hồi) và một hoặc nhiều biến độc lập (giải thích).
Mô hình hồi quy tuyến tính đơn được biểu diễn bằng: \[
y_i = \beta_0 + \beta_1 x_i + \varepsilon_i
\] Trong đó - \(y_i\): giá trị
quan sát của biến phụ thuộc tại điểm \(i\)
- \(x_i\): giá trị quan sát của biến
độc lập tại điểm \(i\)
- \(\beta_0\): hệ số chặn
(intercept)
- \(\beta_1\): hệ số góc (slope)
- \(\varepsilon_i\): sai số ngẫu nhiên,
với giả định: \(\varepsilon_i \sim
\mathcal{N}(0, \sigma^2)\)
Các hệ số \(\beta_0\) và \(\beta_1\) được ước lượng bằng cách tối thiểu hóa tổng bình phương sai số (SSE):
\[ SSE = \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 \]
Trong đó: \(\hat{y}_i = \hat{\beta}_0 + \hat{\beta}_1 x_i\) là giá trị dự đoán của \(y_i\).
Các ước lượng cho \(\beta_1\) và \(\beta_0\) được tính như sau:
\[ \hat{\beta}_1 = \frac{ \sum_{i=1}^{n} (x_i - \bar{x})(y_i - \bar{y}) }{ \sum_{i=1}^{n} (x_i - \bar{x})^2 } \]
\[ \hat{\beta}_0 = \bar{y} - \hat{\beta}_1 \bar{x} \]
Trong đó:
\(\bar{x}\): giá trị trung bình của
biến \(x\)
\(\bar{y}\): giá trị trung bình của
biến \(y\)
Ước lượng không chệch của phương sai sai số \(\sigma^2\) được tính bằng:
\[ \hat{\sigma}^2 = \frac{1}{n - 2} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 \]
Trong đó:
\(y_i\): giá trị quan sát của biến
phụ thuộc
\(\hat{y}_i\): giá trị dự đoán từ mô
hình hồi quy
\(n\): số lượng quan sát
\(\hat{\sigma}^2\): phương sai sai số
ước lượng
Mẫu số \(n - 2\) là do đã ước lượng 2
tham số \(\hat{\beta}_0\) và \(\hat{\beta}_1\)
\[ SE(\hat{\beta}_1) = \sqrt{ \frac{ \hat{\sigma}^2 }{ \sum_{i=1}^{n} (x_i - \bar{x})^2 } } \]
\[ SE(\hat{\beta}_0) = \sqrt{ \hat{\sigma}^2 \left( \frac{1}{n} + \frac{ \bar{x}^2 }{ \sum_{i=1}^{n} (x_i - \bar{x})^2 } \right) } \]
Trong đó:Sai số chuẩn cho biết mức độ không chắc chắn trong ước lượng các hệ số hồi quy, và là cơ sở để tính khoảng tin cậy và kiểm định giả thuyết.
Sai số chuẩn (Standard Error) của giá trị dự đoán \(\hat{y}_g\) tại điểm \(x_g\) được tính như sau:
\[ SE(\hat{\mu}_g)^2 = \hat{\sigma}^2 \left( w_i \left[ \frac{1}{n} + \frac{(x_g - \bar{x})^2}{SS_x} \right] \right) \]
Trong đó:
\(\hat{\mu}_g = \hat{\beta}_0 + \hat{\beta}_1 x_g\): là giá trị dự đoán tại điểm \(x_g\)
\(\hat{\sigma}^2\): phương sai sai số ước lượng
\(w_i\): trọng số cho quan sát \(i\) (nếu có, nếu không thì mặc định là 1)
\(\bar{x}\): giá trị trung bình của biến \(x_i\)
\(SS_x = \sum (x_i - \bar{x})^2\): tổng bình phương sai lệch của các giá trị \(x_i\) so với trung bình
Mô hình hồi quy tuyến tính bội (multiple linear regression) có dạng: \[ y_i = \beta_0 + \beta_1 x_{i1} + \beta_2 x_{i2} + \cdots + \beta_p x_{ip} + \varepsilon_i \] Viết gọn bằng ký hiệu ma trận: \[ \mathbf{y} = \mathbf{X} \boldsymbol{\beta} + \boldsymbol{\varepsilon} \] Trong đó:
\(\mathbf{y}\): vector \(n \times 1\) chứa các giá trị quan sát của
biến phụ thuộc
\(\mathbf{X}\): ma trận thiết kế \(n \times (p + 1)\), trong đó cột đầu tiên
là toàn 1 (tương ứng với hệ số chặn \(\beta_0\))
\(\boldsymbol{\beta}\): vector \((p + 1) \times 1\) chứa các hệ số hồi
quy
\(\boldsymbol{\varepsilon}\): vector
\(n \times 1\) chứa sai số ngẫu nhiên,
với giả định \(\varepsilon_i \sim
\mathcal{N}(0, \sigma^2)\)
Ước lượng bình phương tối thiểu (OLS estimator) cho \(\boldsymbol{\beta}\): \[ \hat{\boldsymbol{\beta}} = (\mathbf{X}^\top \mathbf{X})^{-1} \mathbf{X}^\top \mathbf{y} \]
Phần dư (residual) tại quan sát \(i\):
\[ e_i = y_i - \hat{y}_i \]
Tổng bình phương phần dư (RSS - Residual Sum of Squares):
\[ RSS = \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 = \| \mathbf{y} - \hat{\mathbf{y}} \|^2 \]
Ước lượng không chệch của phương sai \(\sigma^2\):
\[ \hat{\sigma}^2 = \frac{RSS}{n - p - 1} \] Trong đó:
Phương sai của vector hệ số ước lượng \(\hat{\boldsymbol{\beta}}\):
\[ \mathrm{Var}(\hat{\boldsymbol{\beta}}) = \hat{\sigma}^2 (\mathbf{X}^\top \mathbf{X})^{-1} \]
Sai số chuẩn (Standard Error) của từng hệ số hồi quy:
\[ SE(\hat{\beta}_j) = \sqrt{ \hat{\sigma}^2 \cdot \left[ (\mathbf{X}^\top \mathbf{X})^{-1} \right]_{jj} } \]
Trong đó:Phần này hướng dẫn cách sử dụng R để ước lượng mô hình hồi quy tuyến tính bằng hàm lm(). \[model <- lm(y ~ x1 + x2 + ..., data = dataset)\] y: biến phụ thuộc (response variable).
x1, x2, …: biến độc lập (predictors).
dataset: bộ dữ liệu chứa các biến.
Các hàm quan trọng trong phân tích hồi quy tuyến tính trong R
Dưới đây là các hàm cơ bản thường dùng khi làm việc với mô hình hồi
quy tuyến tính trong R (ví dụ mô hình đã được lưu trong biến
model sau khi chạy lm()):
summary(model) in kết quả chi tiết bao gồm: hệ số
hồi quy, sai số chuẩn, giá trị thống kê t, p-values, hệ số xác định
\(R^2\), v.v.
coef(model) trả về các hệ số ước lượng \(\hat{\beta}_0, \hat{\beta}_1, \dots,
\hat{\beta}_p\)
fitted(model) trả về giá trị dự đoán \(\hat{y}_i\) từ mô hình, theo công thức:
\(\hat{y}_i = \hat{\beta}_0 + \hat{\beta}_1
x_{i1} + \hat{\beta}_2 x_{i2} + \cdots + \hat{\beta}_p
x_{ip}\)
residuals(model) trả về phần dư (residual) \(e_i\), được tính theo công thức:\(e_i = y_i - \hat{y}_i\)
anova(model) tạo bảng phân tích phương sai (ANOVA
table) cho mô hình, giúp kiểm định tổng thể ý nghĩa của mô
hình.
Mục này trình bày các bước suy luận thống kê đối với các hệ số hồi quy \(\beta_j\) trong mô hình tuyến tính, sử dụng kiểm định t và khoảng tin cậy.
Giả định: Sai số \(\varepsilon_i\) là độc lập và tuân theo phân phối chuẩn:
\[ \varepsilon_i \sim \mathcal{N}(0, \sigma^2) \]
Dưới giả định này, mô hình hồi quy tuyến tính có dạng:
\[ y_i = \beta_0 + \beta_1 x_{i1} + \cdots + \beta_p x_{ip} + \varepsilon_i \]
Với giả định sai số chuẩn, ước lượng \(\hat{\beta}_j\) có phân phối:
\[ \hat{\beta}_j \sim \mathcal{N} \left( \beta_j,\ \operatorname{Var}(\hat{\beta}_j) \right) \]
Khi thay thế \(\sigma^2\) bằng ước lượng \(s^2\), ta có thống kê:
\[ t_j = \frac{ \hat{\beta}_j - \beta_j }{ \operatorname{SE}(\hat{\beta}_j) } \sim t_{n - p} \]
Trong đó:Mục tiêu kiểm định:
\[ H_0: \beta_j = 0 \quad \text{vs} \quad H_1: \beta_j \neq 0 \]Khoảng tin cậy (CI) 95% cho \(\beta_j\):
\[ \hat{\beta}_j \pm t_{n - p,\ \alpha/2} \cdot \operatorname{SE}(\hat{\beta}_j) \]
Giá trị kỳ vọng của \(Y\) tại \(x = x_g\):
\[ \mu_g = E(Y|x_g) = x_g^T \beta \]
Khoảng tin cậy cho \(\mu_g\):
\[ \hat{\mu}_g \pm t_{n - p,\ \alpha/2} \cdot \operatorname{SE}(\hat{\mu}_g) \]
Trong đó phương sai của \(\hat{\mu}_g\) là:
\[ \operatorname{Var}(\hat{\mu}_g) = \sigma^2 x_g^T (X^T X)^{-1} x_g \]
Mục tiêu của phần này là phân tích tổng phương sai (ANOVA) nhằm đánh giá mức độ giải thích biến phụ thuộc bởi mô hình hồi quy tuyến tính.
Tổng phương sai
Tổng phương sai của biến phụ thuộc \(Y\) được chia thành:
Công thức:
\[ \text{SST} = \sum_{i=1}^{n} (y_i - \bar{y})^2 = \text{SSR} + \text{RSS} \]
Trong đó:
Hệ số xác định \(R^2\)
\[ R^2 = \frac{\text{SSR}}{\text{SST}} = 1 - \frac{\text{RSS}}{\text{SST}} \]
Ý nghĩa:
Kiểm định tổng thể mô hình (F-test)
Giả thuyết:
\[ H_0: \beta_1 = \beta_2 = \cdots = \beta_p = 0 \]
(nghĩa là mô hình không giải thích gì được cho dữ liệu)
Thống kê kiểm định:
\[ F = \frac{\text{SSR} / p}{\text{RSS} / (n - p - 1)} = \frac{\text{MSR}}{\text{MSE}} \]
Trong đó:
Phân phối của \(F\):
\[ F \sim F_{p,\ n - p - 1} \]
R trong ANOVA
Trong R, sử dụng hàm:anova(model)để in ra bảng phân tích
phương sai, bao gồm:
Phần này giới thiệu cách so sánh hai mô hình hồi quy lồng nhau (nested models) để kiểm tra xem mô hình đầy đủ (full model) có cải thiện đáng kể so với mô hình rút gọn (reduced model) hay không.
Khái niệm:
Giả thuyết kiểm định:
\[ H_0: \text{Các hệ số thêm vào bằng 0} \quad \text{vs} \quad H_a: \text{Ít nhất một hệ số thêm khác 0} \]
Thống kê kiểm định:
\[ F = \frac{(\text{RSS}_0 - \text{RSS}_1)/(p_1 - p_0)}{\text{RSS}_1 / (n - p_1)} \]
Trong đó:
Kết luận: Nếu giá trị \(F\) lớn → mô hình đầy đủ cải thiện đáng kể → bác bỏ \(H_0\)
Ý tưởng: Đưa từng biến vào mô hình theo thứ tự cụ thể → đo lường mức độ đóng góp của từng biến.
Ứng dụng:
Hữu ích khi thứ tự nhập biến có ý nghĩa (ví dụ: thiết kế thí nghiệm)
Cho phép kiểm tra biến thứ \(j\) sau khi đã đưa các biến từ 1 đến \(j-1\) vào mô hình
So sánh hồi quy riêng biệt giữa các nhóm (ví dụ: nam/nữ, vùng miền…):
Kiểm định:
Phương pháp:
Nguyên tắc biên (marginality):
Nếu mô hình bao gồm một biến tương tác (như \(x_1 x_2\)), thì bắt buộc phải giữ cả hai biến chính \(x_1\) và \(x_2\)
Không được bỏ biến chính khi giữ biến tương tác
Mục tiêu: Đảm bảo mô hình có ý nghĩa thống kê và dễ diễn giải
AIC – Akaike Information Criterion
Công thức:
\[ \text{AIC} = -2 \log(L) + 2p \]
Trong đó:
Ý nghĩa:
BIC – Bayesian Information Criterion
Công thức:
\[ \text{BIC} = -2 \log(L) + p \log(n) \]
Trong đó:
Ý nghĩa:
So sánh AIC và BIC
library(knitr)
library(kableExtra)
## Warning: package 'kableExtra' was built under R version 4.3.3
comparison <- data.frame(
`Tiêu chí` = c("AIC", "BIC"),
`Ưu điểm` = c("Linh hoạt, dùng cho dự đoán",
"Chọn mô hình đơn giản hơn, gần với lý thuyết Bayes"),
`Nhược điểm` = c("Có thể chọn mô hình quá phức tạp",
"Có thể bỏ sót biến hữu ích trong mô hình nhỏ")
)
kable(comparison, caption = "So sánh AIC và BIC", format = "html") %>%
kable_styling(bootstrap_options = c("striped", "hover", "bordered", "condensed"),
full_width = FALSE)
| Tiêu.chí | Ưu.điểm | Nhược.điểm |
|---|---|---|
| AIC | Linh hoạt, dùng cho dự đoán | Có thể chọn mô hình quá phức tạp |
| BIC | Chọn mô hình đơn giản hơn, gần với lý thuyết Bayes | Có thể bỏ sót biến hữu ích trong mô hình nhỏ |
Đây là cách thủ công để xây dựng mô hình phù hợp: bắt đầu với mô hình nhỏ và thêm biến, hoặc bắt đầu với mô hình đầy đủ rồi loại bỏ biến.
Cần xem xét ý nghĩa thống kê (p-value) và mặt thực tiễn (hiểu biết về biến đó).
3 phương pháp chính tự động:
Bắt đầu từ mô hình không có biến nào.
Thêm lần lượt từng biến sao cho cải thiện tiêu chí (AIC hoặc BIC).
Bắt đầu với mô hình đầy đủ (tất cả biến).
Loại dần các biến không cần thiết (p-value lớn, không cải thiện tiêu chí).
Kết hợp cả hai phương pháp trên: sau mỗi lần thêm, xem xét có cần loại biến nào đi không.
Trong mô hình hồi quy tuyến tính thông thường, phần dư (residual) là hiệu giữa giá trị thực tế và giá trị dự đoán: \[ r_i = y_i - \hat{\mu}_i \]
Trong đó:
Các loại phần dư thường dùng:
Phần dư thô (Raw residual):
\[ r_i = y_i - \hat{y}_i \]
Phần dư chuẩn hóa (Standardized residual):
\[ r_{i,\text{std}} = \frac{r_i}{\hat{\sigma} \sqrt{1 - h_{ii}}} \]
Phần dư Studentized:
\[ t_i = \frac{r_i}{\hat{\sigma}_{(i)} \sqrt{1 - h_{ii}}} \]
Trong đó:
Residual plots được sử dụng để kiểm tra các giả định trong mô hình hồi quy tuyến tính thông qua phần dư \(r_i = y_i - \hat{\mu}_i\)
Biểu đồ phần dư theo từng biến giải thích \(x_j\) để kiểm tra giả định tuyến tính giữa biến \(x_j\) và biến phụ thuộc. Nếu biểu đồ không có mẫu hoặc xu hướng rõ ràng, giả định tuyến tính được thỏa mãn.
Giúp đánh giá ảnh hưởng riêng biệt của biến \(x_j\) trong mô hình đa biến bằng cách tách phần dư liên quan đến biến này, hỗ trợ phát hiện mối quan hệ phi tuyến hoặc ảnh hưởng đặc biệt.
Biểu đồ phần dư theo giá trị dự đoán \(\hat{\mu}\) để kiểm tra giả định phương sai đồng nhất (homoscedasticity). Nếu phần dư phân bố đều, không có xu hướng thay đổi phương sai theo \(\hat{\mu}\), giả định được giữ.
Sử dụng biểu đồ Q-Q để kiểm tra phân phối chuẩn của phần dư. Phần dư tuân theo phân phối chuẩn nếu các điểm gần thẳng hàng trên biểu đồ.
Sử dụng biểu đồ lag để phát hiện sự phụ thuộc hoặc mẫu trong phần dư theo thời gian, giúp kiểm tra giả định độc lập của các sai số.
Outliers là các quan sát có phần dư lớn, có thể làm sai lệch kết quả hồi quy.
Influential observations là những điểm có ảnh hưởng lớn tới ước lượng mô hình, có thể không phải outlier về phần dư nhưng lại có leverage cao.
Phần dư studentized (studentized residuals) giúp phát hiện outliers bằng cách chuẩn hóa phần dư theo độ lệch chuẩn dự đoán. Công thức: \[ t_i = \frac{r_i}{\hat{\sigma} \sqrt{1 - h_{ii}}} \] Trong đó:
\(r_i = y_i - \hat{\mu}_i\) là phần dư quan sát thứ \(i\).
\(\hat{\sigma}\) là ước lượng độ lệch chuẩn sai số (residual standard error).
\(h_{ii}\) là leverage (giá trị trên đường chéo của ma trận \(H = X (X^T X)^{-1} X^T\)).
Chú ý: Giá trị \(|t_i|\) lớn (thường > 2 hoặc > 3) cảnh báo quan sát đó có thể là outlier.
Đánh giá mức độ ảnh hưởng của điểm dữ liệu dựa trên các chỉ số: - Leverage \(h_{ii}\): đo độ “xa” của điểm quan sát trên không gian biến độc lập
Trong đó:
Ghi chú: Quan sát có Cook’s Distance lớn (ví dụ \(D_i > 1\)) được xem là có ảnh hưởng mạnh đến mô hình và cần được xem xét kỹ lưỡng.
Khái quát về phương pháp Ước lượng Cực đại (Maximum Likelihood Estimation - MLE) như một phương pháp tổng quát cho các mô hình thống kê vượt ra ngoài hồi quy tuyến tính thông thường.
Khi nào mô hình tuyến tính không phù hợp:
Các loại dữ liệu và mô hình phù hợp:
Mở rộng mô hình tuyến tính chuẩn sang mô hình tổng quát với phân phối khác (exponential family), chuẩn bị cho phương pháp MLE.
Hàm Likelihood \(L(\theta)\):
Xác suất đồng thời của quan sát dưới tham số \(\theta\): \[
L(\theta) = \prod_{i=1}^n f(y_i \mid \theta)
\]
Log-likelihood:
Để tính toán dễ dàng hơn, lấy log hàm likelihood:
\[ \ell(\theta) = \log L(\theta) = \sum_{i=1}^n \log f(y_i \mid \theta) \]
Phương trình score:
Đạo hàm log-likelihood theo tham số:
\[ U(\theta) = \frac{d\ell(\theta)}{d\theta} \]
Giải \(U(\theta) = 0\) để tìm \(\hat{\theta}\).
Hàm thông tin (Information):
Thông tin quan sát:
\[ I(\theta) = - \frac{d^2 \ell(\theta)}{d\theta^2} \]
Thông tin kỳ vọng (Fisher Information):
\[ \mathcal{I}(\theta) = \mathrm{E}\left[ I(\theta) \right] \]
Độ lệch chuẩn của ước lượng:
\[ \mathrm{SE}(\hat{\theta}) = \sqrt{\frac{1}{\mathcal{I}(\hat{\theta})}} \]
Score vector:
\[ U(\boldsymbol{\theta}) = \nabla \ell(\boldsymbol{\theta}) = \left(\frac{\partial \ell}{\partial \theta_1}, \ldots, \frac{\partial \ell}{\partial \theta_p} \right)^T \] Hessian matrix (Observed information):
\[ I(\boldsymbol{\theta}) = -\nabla^2 \ell(\boldsymbol{\theta}) = - \left[\frac{\partial^2 \ell}{\partial \theta_i \partial \theta_j}\right] \]
Ước lượng \(\hat{\boldsymbol{\theta}}\) tìm bằng giải hệ \(U(\boldsymbol{\theta}) = 0\).
Độ lệch chuẩn tham số:
Được tính từ ma trận nghịch đảo thông tin Fisher:
\[ \mathrm{Cov}(\hat{\boldsymbol{\theta}}) \approx I(\hat{\boldsymbol{\theta}})^{-1} \]
Sử dụng ký hiệu vector và ma trận để biểu diễn score và thông tin.
Phương trình score:
\[ U(\boldsymbol{\theta}) = \mathbf{X}^T \mathbf{W}(\mathbf{y} - \boldsymbol{\mu}) \]
với \(\mathbf{W}\) là ma trận trọng số tùy theo phân phối.
Thông tin Fisher quan sát:
\[ I(\boldsymbol{\theta}) = \mathbf{X}^T \mathbf{W} \mathbf{X} \]
Thuật toán lặp dựa trên mở rộng Newton-Raphson, sử dụng Fisher Information để cập nhật tham số:
\[ \boldsymbol{\theta}^{(t+1)} = \boldsymbol{\theta}^{(t)} + I(\boldsymbol{\theta}^{(t)})^{-1} U(\boldsymbol{\theta}^{(t)}) \]
Tính chất:
Các phương pháp kiểm định giả thuyết sử dụng MLE:
Cách xây dựng khoảng tin cậy cho tham số dựa trên phân phối chuẩn của MLE:
\[ \hat{\theta} \pm z_{\alpha/2} \cdot \mathrm{SE}(\hat{\theta}) \]
AIC (Akaike Information Criterion):
\[ \mathrm{AIC} = -2\ell(\hat{\theta}) + 2k \]
với \(k\) là số tham số ước lượng.
BIC (Bayesian Information Criterion):
\[ \mathrm{BIC} = -2\ell(\hat{\theta}) + k \log n \]
Dùng để so sánh các mô hình không lồng nhau, chọn mô hình có giá trị AIC hoặc BIC nhỏ hơn.
Phần này trình bày mục đích và phạm vi của GLM như một khuôn khổ mở rộng cho hồi quy, giúp mô hình hóa các biến phụ thuộc không tuân theo phân phối chuẩn.
Hai thành phần chính của GLM
Thành phần ngẫu nhiên: Mô hình phân phối EDM
EDM là họ phân phối bao gồm nhiều phân phối phổ biến như chuẩn, Poisson,
binomial.
Hàm mật độ xác suất được viết dưới dạng:
\[ f(y; \theta, \phi) = a(y, \phi) \exp\left(\frac{y \theta - \kappa(\theta)}{\phi}\right) \]
Trong đó:
\(\theta\) là tham số tự nhiên,
\(\phi\) là tham số phân tán
(dispersion parameter),
\(\kappa(\theta)\) là hàm cumulant liên
quan đến trung bình và phương sai.
Trung bình và phương sai của biến \(Y\) được tính như sau:
\[ \mathrm{E}[Y] = \kappa'(\theta) = \mu, \quad \mathrm{Var}[Y] = \phi \kappa''(\theta) = \phi V(\mu) \]
Với \(V(\mu)\) gọi là hàm biến thiên (variance function), đặc trưng cho phân phối.
Xác định cách phương sai thay đổi theo trung bình \(\mu\), rất quan trọng trong GLM.
Mô hình EDM theo dạng độ lệch (deviance)
Độ lệch đơn vị (unit deviance) dùng để đo sự khác biệt giữa giá trị quan sát \(y\) và giá trị kỳ vọng \(\mu\):
\[ d(y, \mu) = 2 \left[ \ell(y; y) - \ell(y; \mu) \right] \]
\(\ell(\cdot)\) là hàm log-likelihood. Độ lệch này được dùng làm tiêu chí đánh giá mô hình.
Link Function (Hàm liên kết):
Hàm liên kết kết nối trung bình \(\mu\) của biến phản hồi với predictor tuyến tính \(\eta\):
\[ g(\mu_i) = \eta_i = x_i^T \beta \]
\(g(\cdot)\) có thể là logit, log, identity,… tùy mô hình.
Offsets (Thành phần bù trừ): Là phần thêm vào predictor mà không có tham số ước lượng, dùng để điều chỉnh mô hình.
Định nghĩa tổng quát về GLM
GLM là mô hình có 3 thành phần:
Tổng độ lệch (deviance) của mô hình
Độ lệch tổng hợp cho toàn bộ dữ liệu:
\[ D = \sum_{i=1}^n d(y_i, \hat{\mu}_i) \]
Dùng để đánh giá sự phù hợp của mô hình.
Các biến đổi hồi quy xấp xỉ mô hình GLM
Phần này nói về cách các mô hình hồi quy truyền thống có thể được xem
như xấp xỉ GLM thông qua biến đổi dữ liệu.
Chương này tập trung vào việc ước lượng tham số \(\beta\) trong GLM, chủ yếu dựa trên phương
pháp Ước lượng Cực Đại (Maximum Likelihood Estimation - MLE).
Mục tiêu là tìm bộ tham số \(\hat{\beta}\) sao cho mô hình phù hợp tốt
nhất với dữ liệu quan sát.
Hàm log-likelihood tổng quát cho dữ liệu \(y = (y_1, \dots, y_n)\) là:
\[ \ell(\beta) = \sum_{i=1}^n \ell_i(\beta) = \sum_{i=1}^n \log f(y_i; \theta_i, \phi) \]
Trong đó \(\theta_i\) phụ thuộc vào \(\beta\) thông qua predictor tuyến tính.
Đạo hàm bậc nhất của log-likelihood (score function):
\[ U(\beta) = \frac{\partial \ell(\beta)}{\partial \beta} \]
Ma trận Fisher information:
\[ I(\beta) = -\mathbb{E} \left[ \frac{\partial^2 \ell(\beta)}{\partial \beta \partial \beta^T} \right] \]
Tính toán ước lượng \(\hat{\beta}\)
Do phương trình score thường không giải được chính xác, ta dùng phương
pháp lặp như Newton-Raphson hoặc Fisher Scoring để tìm nghiệm gần đúng
của:
\[ U(\beta) = 0 \]
Phương pháp lặp cập nhật tham số:
\[ \beta^{(t+1)} = \beta^{(t)} + \left[ I(\beta^{(t)}) \right]^{-1} U(\beta^{(t)}) \]
Độ lệch dư (Residual Deviance)
Là thước đo sự khác biệt giữa mô hình hiện tại với mô hình bão hòa (mô
hình hoàn hảo):
\[ D = 2 \sum_{i=1}^n \left[ \ell(y_i; y_i) - \ell(y_i; \hat{\mu}_i) \right] \]
Độ lệch dư càng nhỏ thì mô hình càng phù hợp với dữ liệu.
Sai số chuẩn của ước lượng \(\hat{\beta}\)
Được tính từ ma trận thông tin Fisher:
\[ \text{Var}(\hat{\beta}) = I(\hat{\beta})^{-1} \]
Sai số chuẩn cho từng tham số là căn bậc hai các phần tử trên đường chéo của ma trận này.
Ước lượng \(\beta\) dưới
dạng ma trận
Cách trình bày toán học dùng ma trận để thuận tiện tính toán với dữ liệu
lớn:
\[ U(\beta) = X^T W (y - \mu) \]
Trong đó:
- \(X\) là ma trận thiết kế,
- \(W\) là ma trận trọng số,
- \(\mu = g^{-1}(X\beta)\).
Ước lượng GLM tương tự hồi quy tuyến tính cục
bộ
Kỹ thuật ước lượng GLM thực chất là lặp lại các bước hồi quy tuyến tính
với trọng số cập nhật từng vòng, gọi là Iteratively Reweighted Least
Squares (IRLS).
Trong GLM, tham số phân tán \(\phi\) (dispersion parameter) biểu thị mức độ biến động ngoài phần giải thích được bởi mô hình tuyến tính. Với một số phân phối (như Gaussian, Gamma) \(\phi\) là tham số quan trọng cần được ước lượng chính xác.
\(\phi\) là tham số đo độ phân tán (variance) trong gia đình phân phối của GLM, thể hiện mức độ phân tán của dữ liệu quanh giá trị kỳ vọng.
Ước lượng \(\phi\) theo phương pháp MLE
Giả sử có \(n\) quan sát, tham số \(\beta\) đã được ước lượng. Hàm log-likelihood phụ thuộc vào \(\phi\) được dùng để tối đa hóa tìm \(\hat{\phi}\).
Một công thức phổ biến cho \(\hat{\phi}_{\text{MLE}}\) là:
\[ \hat{\phi}_{\text{MLE}} = \frac{1}{n} \sum_{i=1}^n d_i \]
trong đó \(d_i\) là unit deviance (độ lệch đơn vị) của quan sát thứ \(i\), thể hiện khoảng cách giữa quan sát và giá trị kỳ vọng mô hình dự đoán.
Ước lượng dựa trên log-likelihood hiệu chỉnh
Để cải thiện tính ổn định và tính chính xác của ước lượng, người ta
dùng profile likelihood đã chỉnh sửa (modified profile
log-likelihood).
Phương pháp này giảm bias so với MLE.
Công thức cụ thể phức tạp, thường dựa trên việc điều chỉnh hàm log-likelihood theo tham số \(\beta\) đã được ước lượng.
Ước lượng dựa trên độ lệch trung bình
Phương pháp này tính \(\hat{\phi}\) dựa trên độ lệch dư (residual deviance) chia cho bậc tự do (degrees of freedom):
\[ \hat{\phi}_{\text{deviance}} = \frac{D}{n - p} \]
Trong đó:
Ước lượng dựa trên residuals Pearson
Dùng tổng bình phương các residuals chuẩn hóa Pearson chia cho bậc tự do:
\[ \hat{\phi}_{\text{Pearson}} = \frac{1}{n - p} \sum_{i=1}^n \frac{(y_i - \hat{\mu}_i)^2}{V(\hat{\mu}_i)} \]
Trong đó:
So sánh và lựa chọn ước lượng tốt nhất
Lựa chọn phương pháp tùy theo mục đích phân tích và đặc điểm dữ liệu.
Các phương pháp suy luận thống kê trong GLM, bao gồm kiểm định giả thuyết, ước lượng khoảng tin cậy cho hệ số hồi quy và giá trị kỳ vọng, và các phương pháp đánh giá độ phù hợp mô hình.
Khi\(\phi\)đã biết (ví dụ trong mô hình nhị phân hoặc Poisson), các kiểm định suy luận được thực hiện như sau:
Kiểm định Wald cho từng hệ số hồi quy \(\beta_j\):
\[ Z = \frac{\hat{\beta}_j}{SE(\hat{\beta}_j)} \sim N(0,1) \]
Nếu \(|Z| > z_{\alpha/2}\), bác bỏ giả thuyết \(H_0: \beta_j = 0\).
SE là sai số chuẩn của \(\hat{\beta}_j\), lấy từ ma trận phương sai–hiệp phương sai.
Khoảng tin cậy cho \(\beta_j\):
\[ \hat{\beta}_j \pm z_{\alpha/2} \cdot SE(\hat{\beta}_j) \]
Khoảng tin cậy cho \(\mu_i = E[Y_i]\):
Ước lượng khoảng tin cậy cho \(\eta_i = x_i^T \hat{\beta}\)
Sau đó chuyển sang \(\mu_i\) thông qua hàm liên kết nghịch đảo \(g^{-1}(\cdot)\):
\[ g^{-1}\left(\hat{\eta}_i \pm z_{\alpha/2} \cdot SE(\hat{\eta}_i)\right) \]
Kiểm định tỉ số hợp lý:
\[ \Lambda = -2\left[\ell(\hat{\beta}_{\text{reduced}}) - \ell(\hat{\beta}_{\text{full}})\right] \sim \chi^2_{df} \]
Với \(df\) là số tham số bị ràng buộc.
Phân tích phương sai:
\[ \Delta D = D_{\text{reduced}} - D_{\text{full}} \sim \chi^2_{df} \]
Dựa trên đạo hàm bậc nhất của log-likelihood:
\[ U(\beta_0)^T I(\beta_0)^{-1} U(\beta_0) \sim \chi^2_1 \]
Với kích thước mẫu lớn, các ước lượng \(\hat{\beta}\) xấp xỉ phân phối chuẩn, cho phép dùng kiểm định Wald, tỉ số hợp lý và score test.
So sánh mô hình dự đoán với dữ liệu thực, kiểm tra phần còn lại có phải là nhiễu ngẫu nhiên không.
Dựa trên tổng deviance:
\[ D \sim \chi^2_{n - p} \]
Nếu \(D\) quá lớn, mô hình không phù hợp.
Dựa trên thống kê Pearson:
\[ X^2 = \sum_{i=1}^n \frac{(y_i - \hat{\mu}_i)^2}{V(\hat{\mu}_i)} \sim \chi^2_{n - p} \]
Khi \(\phi \rightarrow 0\), GLM xấp xỉ mô hình xác định, residuals nhỏ, kiểm định mạnh hơn.
Điều chỉnh SE bằng \(\hat{\phi}\):
\[ t = \frac{\hat{\beta}_j}{\hat{\phi} \cdot \text{Var}(\hat{\beta}_j)} \sim t_{n - p} \]
\[ \hat{\beta}_j \pm t_{\alpha/2, n - p} \cdot \hat{\phi} \cdot \text{Var}(\hat{\beta}_j) \]
\[ F = \frac{(D_{\text{reduced}} - D_{\text{full}})/q}{\hat{\phi}} \sim F_{q, n - p} \]
Với \(q\) là số bậc tự do thêm vào.
Mô hình GLM mở rộng hồi quy tuyến tính cổ điển để xử lý các dữ liệu có phân phối không chuẩn như nhị phân (binary), đếm (count), tỷ lệ,… Việc chẩn đoán giúp xác định xem mô hình có phù hợp với dữ liệu hay không, từ đó điều chỉnh hoặc cải tiến mô hình.
Dữ liệu \(y_i\) độc lập.
\(y_i\) thuộc họ phân phối hàm mũ (Exponential Family).
Có hàm liên kết:
\[
g(\mu_i) = \eta_i = x_i^T \beta
\]
Phương sai phụ thuộc vào trung bình:
\[
\text{Var}(Y_i) = \phi V(\mu_i)
\]
Trong đó:
- \(\phi\): hệ số phân tán
(dispersion parameter).
- \(V(\mu_i)\): hàm phương sai đặc
trưng cho từng phân phối.
\[ r_i^{(R)} = y_i - \hat{\mu}_i \]
→ Không chuẩn hóa, ít được dùng trong GLMs vì phương sai thay đổi theo \(\mu_i\).
\[
r_i^{(P)} = \frac{y_i - \hat{\mu}_i}{\sqrt{\hat{V}(\hat{\mu}_i)}}
\] Trong đó: - \(y_i\): giá trị
quan sát thực tế.
- \(\hat{\mu}_i\): giá trị dự đoán từ
mô hình.
- \(\hat{V}(\hat{\mu}_i)\): phương sai
dự đoán từ hàm phương sai của GLM.
→ Thích hợp để kiểm tra phương sai và phát hiện quan sát bất thường.
\[ r_i^{(D)} = \text{sign}(y_i - \hat{\mu}_i) \cdot \sqrt{2 \left[ \ell(y_i; y_i) - \ell(y_i; \hat{\mu}_i) \right]} \]
Trong đó \(\ell(y_i; \mu)\) là log-likelihood đơn.
→ Được dùng phổ biến để đánh giá tổng thể độ phù hợp của mô hình.
\[ r_i^{(Q)} = \Phi^{-1} \left( F_{Y_i}(y_i \mid \hat{\mu}_i, \hat{\phi}) \right) \]
→ Nếu mô hình đúng, các phần dư này có phân phối chuẩn.
Leverage tại điểm \(i\) là phần tử đường chéo của ma trận mũ (hat matrix), ký hiệu là \(h_i\).
GLM không có công thức đóng như hồi quy tuyến tính, nhưng nếu tuyến tính hóa mô hình tại bước lặp cuối thì:
\[ H = W^{1/2} X (X^T W X)^{-1} X^T W^{1/2} \]
Trong đó:
\[ W: \text{ma trận trọng số (diagonal) với } w_i = \left( \frac{d\mu_i}{d\eta_i} \right)^2 / V(\mu_i) \]
→ \(h_i = H_{ii}\)
\[ r_{i,\text{std}} = \frac{r_i}{\sqrt{1 - h_i}} \]
→ Dùng để phát hiện ngoại lệ có leverage cao.
| Loại phần dư | Khi nào dùng |
|---|---|
| Pearson | Kiểm tra phương sai, phát hiện bất thường |
| Deviance | Đánh giá tổng thể mô hình |
| Quantile | So sánh với chuẩn, dùng để chẩn đoán trực quan |
| Response | Ít dùng trong GLMs |
Vẽ phần dư theo độ trễ \(r_i\) vs
\(r_{i-1}\).
→ Nếu có mẫu, có thể có hiện tượng tự tương quan.
Vẽ \(r_i\) theo các biến dự báo (predictors) để phát hiện dạng sai hàm liên kết hoặc thiếu biến.
Vẽ phần dư chuẩn hóa vs giá trị dự đoán \(\hat{\mu}_i\).
→ Nếu phân bố hình quạt → có hiện tượng phương sai không đồng nhất.
\[ t_i = \frac{r_i}{\hat{\sigma} \sqrt{1 - h_i}} \]
→ Nếu \(|t_i| > 2\), có thể là ngoại lệ.
Cook’s Distance:
\[ D_i = \frac{r_i^2}{p \cdot \hat{\sigma}^2} \cdot \frac{h_i}{(1 - h_i)^2} \]
→ Nếu \(D_i > 1\) hoặc lớn bất thường so với phần còn lại ⇒ điểm ảnh hưởng mạnh.
Khi phân phối của \(Y\) không thuộc họ exponential nhưng vẫn muốn dùng GLM:
\[ \text{Var}(Y_i) = \phi V(\mu_i) \]
→ Không cần giả định hàm mật độ xác suất cụ thể, nhưng vẫn ước lượng được thông qua phương pháp quasi-likelihood.
Kiểm tra bằng VIF – Variance Inflation Factor:
\[ \text{VIF}_j = \frac{1}{1 - R_j^2} \]
→ Nếu \(\text{VIF} > 5\) hoặc \(> 10\) thì có thể có đa cộng tuyến nghiêm trọng.
Mô hình tỷ lệ là một dạng đặc biệt của GLM khi biến phụ thuộc biểu diễn dữ liệu dưới dạng tỷ số hoặc tỷ lệ, được mô hình hóa bằng phân phối nhị phân (binomial).
Chương này tập trung vào việc mô hình hóa dữ liệu đếm (count data) bằng cách sử dụng Mô hình Tuyến tính Tổng quát (GLMs) với phân phối Poisson và Negative Binomial. Đây là những công cụ mạnh mẽ để phân tích các biến phản hồi rời rạc, chẳng hạn như số lần xảy ra sự kiện trong một khoảng thời gian hoặc không gian nhất định.
Công thức mô hình Poisson:
\[ \log(\mu_i) = \alpha + \beta_1 x_{1i} + \beta_2 x_{2i} + \cdots + \beta_p x_{pi} \]
Công thức mô hình Poisson với biến offset (khi mô hình hóa tỷ lệ): \[ \log(\mu_i) = \alpha + \beta_1 x_{1i} + \cdots + \beta_p x_{pi} + \log(t_i) \]
Trong đó: \(t_i\): Biến offset, thường đại diện cho thời gian quan sát hoặc mức độ phơi nhiễm (exposure) của quan sát thứ \(i\).
Khi dữ liệu đếm liên quan đến các khoảng thời gian hoặc không gian khác nhau, việc sử dụng biến offset giúp điều chỉnh mô hình để phản ánh tỷ lệ xảy ra sự kiện.
Công thức mô hình hóa tỷ lệ:
\[ \log\left(\frac{\mu_i}{t_i}\right) = \alpha + \beta_1 x_{1i} + \cdots + \beta_p x_{pi} \] Trong đó: \(\frac{\mu_i}{t_i}\): Tỷ lệ kỳ vọng của sự kiện trên đơn vị thời gian hoặc không gian.
Mô hình log-linear được sử dụng để phân tích các bảng tần số, nơi tất cả các biến đều là biến phân loại. Trong mô hình này, biến phản hồi là số đếm trong mỗi ô của bảng, và các biến giải thích là các yếu tố phân loại.
Xét bảng tần số hai chiều với các biến phân loại \(A\) và \(B\), số đếm trong ô \((i, j)\) được ký hiệu là \(n_{ij}\). Mô hình log-linear có dạng: \[ \log(\mu_{ij}) = \lambda + \lambda_i^A + \lambda_j^B + \lambda_{ij}^{AB} \] Trong đó:
\(\mu_{ij} : \text{Kỳ vọng của số đếm trong ô } (i, j).\)
\(\lambda : \text{Hằng số chung (intercept).}\)
\(\lambda_i^A : \text{Hiệu ứng chính của mức thứ } i \text{ của biến } A.\)
\(\lambda_j^B : \text{Hiệu ứng chính của mức thứ } j \text{ của biến } B.\)
\(\lambda_{ij}^{AB} : \text{Hiệu ứng tương tác giữa mức } i \text{ của } A \text{ và mức } j \text{ của } B.\)
Nếu \(\lambda_{ij}^{AB} = 0 \quad \text{cho mọi } i, j,\)thì mô hình biểu thị sự độc lập giữa \(A\) và \(B\).
Trong mô hình log-linear, giả định rằng các số đếm \(n_{ij}\) tuân theo phân phối Poisson với kỳ vọng \(\mu_{ij}\):
\[n_{ij} \sim \text{Poisson}(\mu_{ij})\] Điều này cho phép sử dụng mô hình tuyến tính tổng quát (GLM) với hàm liên kết log để ước lượng các tham số.
Khi mở rộng sang bảng ba chiều với các biến A, B, C, mô hình log-linear có thể bao gồm các hiệu ứng chính và tương tác hai chiều, ba chiều:
\[\log(\mu_{ijk}) = \lambda + \lambda_i^A + \lambda_j^B + \lambda_k^C + \lambda_{ij}^{AB} + \lambda_{ik}^{AC} + \lambda_{jk}^{BC} + \lambda_{ijk}^{ABC}\] Trong đó:
\(\mu_{ijk} : \text{Kỳ vọng của số đếm trong ô } (i,j,k).\)
\(\lambda_{ijk}^{ABC} : \text{Hiệu ứng tương tác ba chiều giữa các mức } i, j, k \text{ của các biến } A, B, C.\)
Việc bao gồm hoặc loại bỏ các hiệu ứng tương tác cho phép kiểm tra các giả thuyết về mối quan hệ giữa các biến.
Nghịch lý Simpson xảy ra khi một xu hướng xuất hiện trong từng nhóm con của dữ liệu nhưng biến mất hoặc đảo ngược khi các nhóm được kết hợp. Trong ngữ cảnh mô hình log-linear, điều này nhấn mạnh tầm quan trọng của việc xem xét các tương tác giữa các biến để tránh rút ra kết luận sai lầm từ dữ liệu tổng hợp.
Ví dụ, trong một nghiên cứu về tuyển sinh đại học, có thể thấy rằng tỷ lệ chấp nhận của nam cao hơn nữ tổng thể, nhưng khi phân tích theo từng khoa, tỷ lệ chấp nhận của nữ lại cao hơn trong hầu hết các khoa. Điều này cho thấy sự cần thiết của việc mô hình hóa các tương tác giữa giới tính và khoa để hiểu đúng bản chất của dữ liệu.
Trong một số trường hợp, mô hình log-linear Poisson có thể tương đương với mô hình hồi quy logistic (Binomial GLM), đặc biệt khi phân tích bảng tần số hai chiều. Cụ thể, khi mô hình hóa xác suất thành công trong mỗi ô của bảng, mô hình log-linear với phân phối Poisson và hàm liên kết log có thể cung cấp kết quả tương đương với mô hình logistic với phân phối nhị thức và hàm liên kết logit.
Mô hình log-linear có thể được mở rộng để phân tích các bảng tần số với nhiều hơn ba chiều (bảng bậc cao hơn). Việc xây dựng mô hình bao gồm các hiệu ứng chính và tương tác giữa các biến, tùy thuộc vào giả thuyết nghiên cứu và cấu trúc của dữ liệu.
Trong một số bảng tần số, có thể xuất hiện các ô với số đếm bằng 0 do cấu trúc của dữ liệu hoặc các ràng buộc logic (structural zeros). Khi xây dựng mô hình log-linear, cần xử lý các ô này một cách cẩn thận, thường bằng cách loại trừ chúng khỏi mô hình hoặc áp dụng các kỹ thuật đặc biệt để đảm bảo ước lượng tham số chính xác.
Overdispersion xảy ra khi phương sai của dữ liệu lớn hơn kỳ vọng theo mô hình Poisson, vi phạm giả định \(\mathrm{Var}(Y) = \mu\)
Khi overdispersion xuất hiện, mô hình Poisson có thể không phù hợp, dẫn đến việc đánh giá sai lầm về ý nghĩa thống kê của các hệ số.
Mô hình Negative Binomial thêm một tham số phân tán \(\theta\) để điều chỉnh phương sai:
\[\text{Var}(Y_i) = \mu_i + \theta \mu_i^2\]
Trong đó:\(\theta\) tham số phân tán, điều chỉnh mức độ overdispersion.
Mô hình Quasi-Poisson sử dụng một hệ số phân tán \(\phi\) để điều chỉnh phương sai: \[ \mathrm{Var}(Y_i) = \phi \mu_i \] Trong đó: \(\phi\) là hệ số phân tán
Chương này xem xét các mô hình tuyến tính tổng quát (GLMs) cho các biến phụ thuộc là liên tục và dương (ví dụ: thời gian sống, chi phí, tốc độ). Hai phân phối phổ biến trong nhóm này là Gamma và Inverse Gaussian.
Trong GLMs, ta giả định:
Tring đó:
Phân phối Gamma có hàm mật độ xác suất (PDF):
\[ f(y; \mu, \phi) = \frac{1}{\Gamma(1/\phi)} \left( \frac{1}{\phi \mu} \right)^{1/\phi} y^{1/\phi - 1} \exp\left( -\frac{y}{\phi \mu} \right) \]
Trong đó:
Các hàm liên kết phổ biến:
Phương sai của Gamma:
\[ \text{Var}(Y) = \phi \mu^2 \]
Phân phối Inverse Gaussian có hàm mật độ:
\[ f(y; \mu, \phi) = \left( \frac{1}{2\pi \phi y^3} \right)^{1/2} \exp\left( -\frac{(y - \mu)^2}{2\phi \mu^2 y} \right) \]
Trong đó:
Phương sai của Inverse Gaussian:
\[ \text{Var}(Y) = \phi \mu^3 \]
Giống như các GLMs khác, các hàm liên kết thường được sử dụng:
Lưu ý: Log link thường được ưa chuộng vì luôn đảm bảo \(\mu > 0\) và dễ diễn giải.
GLMs với phân phối Gamma và Inverse Gaussian có tham số phân tán \(\phi\), cần được ước lượng từ dữ liệu.
\[ \hat{\phi} = \frac{1}{n - p} \sum_{i=1}^{n} \left( \frac{y_i - \hat{\mu}_i}{\hat{\mu}_i} \right)^2 \]
Trong đó:
\[ \hat{\phi} = \frac{1}{n - p} \sum_{i=1}^{n} \frac{(y_i - \hat{\mu}_i)^2}{\hat{\mu}_i^3} \]
Trong đó:
Tweedie GLMs là mô hình mở rộng thuộc họ exponential dispersion models (EDMs), có thể xử lý nhiều kiểu dữ liệu khác nhau:
Phù hợp với các trường hợp như: tổn thất bảo hiểm (nhiều giá trị 0 và một số giá trị dương lớn), dữ liệu sinh học,…
Tweedie EDMs là một lớp phân phối xác định bởi:
Hàm phương sai có dạng:
\[ \text{Var}(Y) = \phi \mu^\xi \]
Trong đó
Một số giá trị đặc biệt của \(\xi\):
Hàm mật độ xác suất không có biểu thức đóng, nhưng vẫn thuộc họ EDM nên có dạng:
\[ f(y; \theta, \phi) = a(y, \phi) \exp\left( \frac{y \theta - \kappa(\theta)}{\phi} \right) \]
Trong đó:
Dành cho các trường hợp chỉ có giá trị dương (như dữ liệu chi phí, thời gian, khoảng cách,…). Phân phối mô hình hóa biến dương với tính phân tán cao.
Đây là ứng dụng nổi bật: phân phối Tweedie với \(1 < \xi < 2\) có xác suất khác 0 tại điểm 0 (point mass at zero), nên phù hợp mô hình hóa dữ liệu có nhiều giá trị bằng 0 và phần còn lại là số dương liên tục.
Ta xây dựng GLM với giả định \(Y \sim \text{Tweedie}(\mu, \phi, \xi)\) và:
\[ g(\mu) = \eta = \mathbf{x}^\top \boldsymbol{\beta} \]
Trong đó
Tham số \(\xi\) không được ước lượng trực tiếp bằng MLE trong hàm GLM cơ bản, mà thường dùng:
Mô hình Tweedie thường dùng link hàm log:
\[ \log(\mu_i) = \mathbf{x}_i^\top \boldsymbol{\beta} \]
Ước lượng mô hình bằng các gói phần mềm như:
statmod, tweedie,
cplmpyGAM,
statsmodels (có giới hạn)supermarket <- read.csv2("D:/naaaaaa/PTDLDT/Supermarket Transactions.csv", stringsAsFactors = FALSE, fileEncoding = "UTF-8")
# Xem cấu trúc dữ liệu
str(supermarket)
## 'data.frame': 14059 obs. of 16 variables:
## $ X : int 1 2 3 4 5 6 7 8 9 10 ...
## $ PurchaseDate : chr "18/12/2007" "20/12/2007" "21/12/2007" "21/12/2007" ...
## $ CustomerID : int 7223 7841 8374 9619 1900 6696 9673 354 1293 7938 ...
## $ Gender : chr "F" "M" "F" "M" ...
## $ MaritalStatus : chr "S" "M" "M" "M" ...
## $ Homeowner : chr "Y" "Y" "N" "Y" ...
## $ Children : int 2 5 2 3 3 3 2 2 3 1 ...
## $ AnnualIncome : chr "$30K - $50K" "$70K - $90K" "$50K - $70K" "$30K - $50K" ...
## $ City : chr "Los Angeles" "Los Angeles" "Bremerton" "Portland" ...
## $ StateorProvince : chr "CA" "CA" "WA" "OR" ...
## $ Country : chr "USA" "USA" "USA" "USA" ...
## $ ProductFamily : chr "Food" "Food" "Food" "Food" ...
## $ ProductDepartment: chr "Snack Foods" "Produce" "Snack Foods" "Snacks" ...
## $ ProductCategory : chr "Snack Foods" "Vegetables" "Snack Foods" "Candy" ...
## $ UnitsSold : int 5 5 3 4 4 3 4 6 1 2 ...
## $ Revenue : chr "27.38" "14.9" "5.52" "4.44" ...
# Hiển thị vài dòng đầu
head(supermarket)
## X PurchaseDate CustomerID Gender MaritalStatus Homeowner Children
## 1 1 18/12/2007 7223 F S Y 2
## 2 2 20/12/2007 7841 M M Y 5
## 3 3 21/12/2007 8374 F M N 2
## 4 4 21/12/2007 9619 M M Y 3
## 5 5 22/12/2007 1900 F S Y 3
## 6 6 22/12/2007 6696 F M Y 3
## AnnualIncome City StateorProvince Country ProductFamily
## 1 $30K - $50K Los Angeles CA USA Food
## 2 $70K - $90K Los Angeles CA USA Food
## 3 $50K - $70K Bremerton WA USA Food
## 4 $30K - $50K Portland OR USA Food
## 5 $130K - $150K Beverly Hills CA USA Drink
## 6 $10K - $30K Beverly Hills CA USA Food
## ProductDepartment ProductCategory UnitsSold Revenue
## 1 Snack Foods Snack Foods 5 27.38
## 2 Produce Vegetables 5 14.9
## 3 Snack Foods Snack Foods 3 5.52
## 4 Snacks Candy 4 4.44
## 5 Beverages Carbonated Beverages 4 14
## 6 Deli Side Dishes 3 4.37
Tập dữ liệu “Supermarket Transactions” gồm tổng cộng 14.059 dòng dữ liệu, tương ứng với 14.059 giao dịch mua hàng được ghi nhận tại siêu thị. Mỗi dòng dữ liệu đại diện cho một giao dịch riêng lẻ và bao gồm thông tin chi tiết về khách hàng, sản phẩm, cũng như các đặc điểm liên quan đến hành vi tiêu dùng. Bộ dữ liệu này có tổng cộng 16 biến (cột), bao gồm cả biến định tính và định lượng, phản ánh đầy đủ các yếu tố nhân khẩu học, địa lý và kết quả kinh doanh từ mỗi giao dịch.
# Tạo bảng mô tả các biến
variable_summary <- data.frame(
Variable = names(supermarket), # cột tên biến
DataType = sapply(supermarket, class), # kiểu dữ liệu trong R
UniqueValues = sapply(supermarket, function(x) length(unique(x))),
MissingValues = sapply(supermarket, function(x) sum(is.na(x)))
)
# Gán loại biến theo kiểu định tính / định lượng
variable_summary$VariableType <- ifelse(variable_summary$DataType %in% c("numeric", "integer"),
"Định lượng", "Định tính")
# In ra bảng gọn gàng
print(variable_summary)
## Variable DataType UniqueValues MissingValues
## X X integer 14059 0
## PurchaseDate PurchaseDate character 742 0
## CustomerID CustomerID integer 5404 0
## Gender Gender character 2 0
## MaritalStatus MaritalStatus character 2 0
## Homeowner Homeowner character 2 0
## Children Children integer 6 0
## AnnualIncome AnnualIncome character 8 0
## City City character 23 0
## StateorProvince StateorProvince character 10 0
## Country Country character 3 0
## ProductFamily ProductFamily character 3 0
## ProductDepartment ProductDepartment character 22 0
## ProductCategory ProductCategory character 45 0
## UnitsSold UnitsSold integer 8 0
## Revenue Revenue character 2846 0
## VariableType
## X Định lượng
## PurchaseDate Định tính
## CustomerID Định lượng
## Gender Định tính
## MaritalStatus Định tính
## Homeowner Định tính
## Children Định lượng
## AnnualIncome Định tính
## City Định tính
## StateorProvince Định tính
## Country Định tính
## ProductFamily Định tính
## ProductDepartment Định tính
## ProductCategory Định tính
## UnitsSold Định lượng
## Revenue Định tính
install.packages("knitr")
## Warning: package 'knitr' is in use and will not be installed
library(knitr)
kable(variable_summary, caption = "Bảng mô tả các biến trong bộ dữ liệu Supermarket Transactions")
| Variable | DataType | UniqueValues | MissingValues | VariableType | |
|---|---|---|---|---|---|
| X | X | integer | 14059 | 0 | Định lượng |
| PurchaseDate | PurchaseDate | character | 742 | 0 | Định tính |
| CustomerID | CustomerID | integer | 5404 | 0 | Định lượng |
| Gender | Gender | character | 2 | 0 | Định tính |
| MaritalStatus | MaritalStatus | character | 2 | 0 | Định tính |
| Homeowner | Homeowner | character | 2 | 0 | Định tính |
| Children | Children | integer | 6 | 0 | Định lượng |
| AnnualIncome | AnnualIncome | character | 8 | 0 | Định tính |
| City | City | character | 23 | 0 | Định tính |
| StateorProvince | StateorProvince | character | 10 | 0 | Định tính |
| Country | Country | character | 3 | 0 | Định tính |
| ProductFamily | ProductFamily | character | 3 | 0 | Định tính |
| ProductDepartment | ProductDepartment | character | 22 | 0 | Định tính |
| ProductCategory | ProductCategory | character | 45 | 0 | Định tính |
| UnitsSold | UnitsSold | integer | 8 | 0 | Định lượng |
| Revenue | Revenue | character | 2846 | 0 | Định tính |
Dữ liệu được thu thập từ nhiều khách hàng khác nhau và chứa đa dạng các biến thuộc cả hai loại: biến định tính và biến định lượng.
Cụ thể, các biến định tính bao gồm:
Các biến định lượng bao gồm:
library(knitr)
library(kableExtra)
# Tạo bảng dữ liệu với tên cột tiếng Việt, có check.names = FALSE để cho phép
bien_dinh_tinh <- data.frame(
"Tên biến" = c(
"Gender",
"MaritalStatus",
"Homeowner",
"AnnualIncome",
"City / StateorProvince / Country",
"ProductFamily / ProductDepartment / ProductCategory"
),
"Kiểu dữ liệu" = rep("Chuỗi ký tự", 6),
"Số giá trị khác nhau" = c(2, 2, 2, 8, "Nhiều", "Nhiều"),
"Nhận xét" = c(
"Biến phân loại đơn giản gồm 2 giá trị: Nam và Nữ. Có thể dùng để phân tích hành vi theo giới.",
"Gồm 'Single' và 'Married', phản ánh tình trạng hôn nhân. Có thể ảnh hưởng đến mức chi tiêu.",
"Cho biết khách hàng có sở hữu nhà hay không, có thể liên quan đến thu nhập và chi tiêu.",
"Là biến phân loại theo bậc thu nhập (ví dụ: '$25K-$50K'). Có thể chuyển thành bậc thang số để phân tích.",
"Phân loại địa lý, phù hợp để phân tích theo khu vực, vùng miền.",
"Phân loại sản phẩm — rất quan trọng trong phân tích doanh thu và xu hướng tiêu dùng."
),
check.names = FALSE
)
# In bảng đẹp
kable(bien_dinh_tinh, "html", align = "lccc", caption = "Bảng mô tả các biến định tính") %>%
kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed")) %>%
column_spec(4, width = "30em", extra_css = "text-align: justify;")
| Tên biến | Kiểu dữ liệu | Số giá trị khác nhau | Nhận xét |
|---|---|---|---|
| Gender | Chuỗi ký tự | 2 | Biến phân loại đơn giản gồm 2 giá trị: Nam và Nữ. Có thể dùng để phân tích hành vi theo giới. |
| MaritalStatus | Chuỗi ký tự | 2 | Gồm ‘Single’ và ‘Married’, phản ánh tình trạng hôn nhân. Có thể ảnh hưởng đến mức chi tiêu. |
| Homeowner | Chuỗi ký tự | 2 | Cho biết khách hàng có sở hữu nhà hay không, có thể liên quan đến thu nhập và chi tiêu. |
| AnnualIncome | Chuỗi ký tự | 8 | Là biến phân loại theo bậc thu nhập (ví dụ: ‘$25K-$50K’). Có thể chuyển thành bậc thang số để phân tích. |
| City / StateorProvince / Country | Chuỗi ký tự | Nhiều | Phân loại địa lý, phù hợp để phân tích theo khu vực, vùng miền. |
| ProductFamily / ProductDepartment / ProductCategory | Chuỗi ký tự | Nhiều | Phân loại sản phẩm — rất quan trọng trong phân tích doanh thu và xu hướng tiêu dùng. |
library(knitr)
library(kableExtra)
# === 2. BẢNG BIẾN ĐỊNH LƯỢNG ===
bien_dinh_luong <- data.frame(
"Tên biến" = c( "Children", "UnitsSold", "Revenue"),
"Kiểu dữ liệu" = c( "Số nguyên", "Số thực", "Số thực"),
"Số giá trị khác nhau" = c( 6, "Nhiều", "Nhiều"),
"Nhận xét" = c(
"Số lượng con của khách hàng, có thể phân tích mối quan hệ với chi tiêu.",
"Phản ánh số lượng sản phẩm được bán trong từng giao dịch.",
"Biến mục tiêu chính thể hiện doanh thu – phù hợp để phân tích hiệu quả kinh doanh."
),
check.names = FALSE # Giữ nguyên tiêu đề cột
)
# In bảng
kable(bien_dinh_luong, "html", align = "lccc", caption = "Bảng 2. Mô tả các biến định lượng") %>%
kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed")) %>%
column_spec(4, width = "30em", extra_css = "text-align: justify;")
| Tên biến | Kiểu dữ liệu | Số giá trị khác nhau | Nhận xét |
|---|---|---|---|
| Children | Số nguyên | 6 | Số lượng con của khách hàng, có thể phân tích mối quan hệ với chi tiêu. |
| UnitsSold | Số thực | Nhiều | Phản ánh số lượng sản phẩm được bán trong từng giao dịch. |
| Revenue | Số thực | Nhiều | Biến mục tiêu chính thể hiện doanh thu – phù hợp để phân tích hiệu quả kinh doanh. |
# Tạo bảng tần suất
gender_counts <- table(supermarket$Gender)
print(gender_counts )
##
## F M
## 7170 6889
# Tính phần trăm
gender_percent <- round(prop.table(gender_counts) * 100, 1)
# Gán nhãn với phần trăm
labels <- paste(names(gender_counts), " (", gender_percent, "%)", sep="")
# Vẽ biểu đồ tròn
pie(gender_counts,
labels = labels,
col = c("#ff9999","#66b3ff"),
main = "Tỷ lệ giới tính khách hàng")
Biểu đồ tròn cho thấy cơ cấu giới tính khách hàng tại siêu thị tương đối đồng đều:
Nữ có 7.170 người, chiếm khoảng 51.0% tổng số khách hàng.
Nam có 6.889 người, chiếm khoảng 49.0% tổng số khách hàng.
Tỷ lệ giới tính giữa nam và nữ khá cân bằng, không có sự chênh lệch lớn. Điều này cho thấy siêu thị thu hút được khách hàng ở cả hai giới với mức độ tương đương. Việc trình bày bằng biểu đồ tròn với màu sắc phân biệt và gán nhãn phần trăm rõ ràng giúp người xem dễ dàng nhận diện và so sánh thị phần của từng nhóm giới tính.
# Tạo bảng tần suất tình trạng hôn nhân
marital_counts <- table(supermarket$MaritalStatus)
print(marital_counts)
##
## M S
## 6866 7193
# Tính phần trăm
marital_percent <- round(prop.table(marital_counts) * 100, 1)
# Gán nhãn với phần trăm
labels <- paste(names(marital_counts), " (", marital_percent, "%)", sep="")
# Vẽ biểu đồ tròn
pie(marital_counts,
labels = labels,
col = c("#FF0000", "#00FF00"),
main = "Tình trạng hôn nhân của khách hàng")
Biểu đồ tròn thể hiện cơ cấu tình trạng hôn nhân của khách hàng tại siêu thị. Cụ thể:
Khách hàng độc thân (Single) có 7.193 người, chiếm khoảng 51.2%.
Khách hàng đã kết hôn (Married) có 6.866 người, chiếm khoảng 48.8%.
Tỷ lệ giữa hai nhóm khách hàng là khá cân bằng, tuy nhiên nhóm độc thân có phần chiếm ưu thế nhẹ. Điều này cho thấy siêu thị thu hút được sự quan tâm của cả hai nhóm khách hàng, nhưng có thể cân nhắc thêm các chiến lược tiếp cận riêng biệt cho từng nhóm để tối ưu hiệu quả marketing.
# Tạo bảng tần suất theo tình trạng sở hữu nhà ở
homeowner_counts <- table(supermarket$Homeowner)
print(homeowner_counts)
##
## N Y
## 5615 8444
# Tính phần trăm
homeowner_percent <- round(prop.table(homeowner_counts) * 100, 1)
# Gán nhãn với phần trăm
labels <- paste(names(homeowner_counts), " (", homeowner_percent, "%)", sep="")
# Vẽ biểu đồ tròn
pie(homeowner_counts,
labels = labels,
col = c("#C0C0C0", "#ffcc99"), # Yes - No
main = "Tình trạng sở hữu nhà ở của khách hàng")
Biểu đồ tròn thể hiện tình trạng sở hữu nhà ở của khách hàng tại siêu thị. Cụ thể:
Khách hàng có sở hữu nhà (Yes): 8.444 người, chiếm khoảng 60.0%
Khách hàng không sở hữu nhà (No): 5.615 người, chiếm khoảng 40.0%
Kết quả cho thấy phần lớn khách hàng là người có sở hữu nhà, chiếm tỷ lệ cao hơn đáng kể so với nhóm không sở hữu. Điều này phản ánh đặc điểm nhân khẩu học ổn định về kinh tế – xã hội của phần lớn khách hàng tại siêu thị.
# Tạo bảng tần suất
income_counts <- table(supermarket$AnnualIncome)
print(income_counts)
##
## $10K - $30K $110K - $130K $130K - $150K $150K + $30K - $50K
## 3090 643 760 273 4601
## $50K - $70K $70K - $90K $90K - $110K
## 2370 1709 613
# Tăng margin dưới (tham số thứ 1, 2, 3, 4) – 4 là dưới
par(mar = c(8, 4, 4, 2) + 0.1)
# Lưu vị trí các cột
bar_pos <- barplot(income_counts,
col = c("#C0C0C0","#808080","#800000","#808000","#008000","#800080","#008080","#000080"),
main = "Phân bố thu nhập hàng năm của khách hàng",
xlab = "Nhóm thu nhập",
ylab = "Số lượng khách hàng",
names.arg = FALSE, # Không hiển thị nhãn mặc định
border = NA)
# Vẽ lại nhãn trục X ở vị trí thấp hơn
text(x = bar_pos,
y = -max(income_counts)*0.05, # Dời xuống thấp hơn gốc toạ độ
labels = names(income_counts),
srt = 45, # Xoay nhãn 45 độ
adj = 1, # Căn phải
xpd = TRUE, # Cho phép vẽ ra ngoài plot
cex = 0.8) # Cỡ chữ
Dựa trên dữ liệu từ cột AnnualIncome, ta có thể thấy khách hàng được chia thành 8 nhóm thu nhập, từ dưới 30K đến trên 150K, với số lượng cụ thể như sau:
Nhóm chiếm tỷ lệ cao nhất là 30K - 50K với 4.601 khách hàng, tương đương khoảng 29.9% tổng số.
Nhóm thu nhập từ 10K - 30K cũng có tỷ lệ rất cao, 3.090 người (~20.1%).
Phần lớn khách hàng (khoảng 50%) thuộc hai nhóm thu nhập từ 10K đến 50K, trong đó nhóm 30K - 50K chiếm tỷ lệ cao nhất, gần 1/3 tổng số khách hàng. Điều này cho thấy siêu thị đang thu hút chủ yếu là những người có mức thu nhập trung bình - thấp, có thể là người lao động, công nhân, sinh viên hoặc các hộ gia đình có ngân sách chi tiêu hạn chế.
Nhóm thu nhập từ 50K - 70K có tỷ lệ khá cao với 2,370 người chiếm tỉ lệ 15%.
Nhóm thu nhập từ 70K - 90K có 1,709 (~11%)
Các nhóm từ 50K - 90K có số lượng khách hàng trung bình, chiếm khoảng 26% tổng số khách hàng. Đây có thể là nhóm nhân viên văn phòng, hộ gia đình trẻ có thu nhập ổn định.
Ngược lại, các nhóm thu nhập cao như:
150K+ chỉ có 273 người (~1.8%),
130K - $150K có 760 người (~4.9%),
110K - $130K có 643 người (~4.2%),
Nhóm thu nhập từ 90K trở lên chiếm tỷ lệ khá nhỏ, chỉ khoảng 15% tổng khách hàng, trong đó nhóm cao nhất là 150K+ chỉ có 273 người, tương đương chưa đến 2%. Điều này phản ánh rằng khách hàng có thu nhập cao không phải là đối tượng chính của siêu thị.
# Tạo bảng tần suất
country_counts <- table(supermarket$Country)
print(country_counts)
##
## Canada Mexico USA
## 809 3688 9562
# Tạo nhãn có phần trăm
percent_labels <- round(100 * country_counts / sum(country_counts), 1)
labels_with_pct <- paste(names(country_counts), "\n", percent_labels, "%")
# Vẽ biểu đồ tròn
pie(country_counts,
labels = labels_with_pct,
col = c("#FF9999", "#99CCFF", "#99FF99"), # Màu cho từng country
main = "Tỉ lệ khách hàng theo quốc gia")
USA chiếm tỷ trọng áp đảo: Với hơn 63% tổng số khách hàng, thị trường Mỹ rõ ràng là trọng tâm chính của doanh nghiệp.
Mexico là thị trường tiềm năng thứ hai: Với khoảng 30% khách hàng, đây là một thị trường đáng chú ý, có thể đang trong giai đoạn phát triển tốt.
Canada có số lượng khách hàng thấp nhất: Chỉ chiếm khoảng 6.6%, có thể là do dân số thấp hơn, thói quen tiêu dùng khác, hoặc mức độ thâm nhập thị trường chưa cao.
# Tạo bảng tần suất theo StateorProvince
state_counts <- table(supermarket$StateorProvince)
print(state_counts)
##
## BC CA DF Guerrero Jalisco OR Veracruz WA
## 809 2733 815 383 75 2262 464 4567
## Yucatan Zacatecas
## 654 1297
# Sắp xếp giảm dần để đẹp hơn
state_counts <- sort(state_counts, decreasing = TRUE)
# Vẽ biểu đồ cột ngang
barplot(state_counts,
horiz = TRUE,
las = 1, # Xoay nhãn trục Y cho dễ đọc
col = "#8da0cb",
main = "Số lượng khách hàng theo State/Province",
xlab = "Số lượng khách hàng",
border = NA)
Biểu đồ số lượng khách hàng cho thấy:
WA (Washington) là bang có số lượng khách hàng lớn nhất, chiếm đến 32.5%, cho thấy đây là thị trường trọng điểm.
Hai bang khác của Mỹ là CA (California) và OR (Oregon) cũng có lượng khách hàng rất cao (19.4% và 16.1%), khẳng định Mỹ là khu vực chủ lực về khách hàng.
Các tỉnh thành của Mexico như Zacatecas (9.2%), DF (5.8%), và Yucatan (4.6%) có sự hiện diện đáng kể.
Jalisco có số lượng khách hàng thấp nhất chỉ 0.5%, có thể cân nhắc lại việc tiếp cận hoặc đầu tư ở khu vực này.
Riêng Canada (BC) chiếm 5.8%, cho thấy sự hiện diện vừa phải, không quá nổi bật.
# Tạo bảng tần suất theo thành phố
city_counts <- sort(table(supermarket$City), decreasing = TRUE)
print(city_counts)
##
## Salem Tacoma Los Angeles Seattle Portland
## 1386 1257 926 922 876
## Spokane San Diego Hidalgo Bremerton Beverly Hills
## 875 866 845 834 811
## Merida Vancouver San Andres Orizaba Camacho
## 654 633 621 464 452
## Acapulco Yakima Mexico City Victoria Walla Walla
## 383 376 194 176 160
## Bellingham San Francisco Guadalajara
## 143 130 75
# Tăng lề trái để chứa nhãn
par(mar = c(4, 10, 4, 2) + 0.1)
# Vẽ biểu đồ cột ngang
barplot(city_counts,
horiz = TRUE,
las = 1, # Xoay nhãn trục Y để dễ đọc
col = "skyblue",
main = "Số lượng khách hàng theo Thành phố",
xlab = "Số lượng khách hàng",
border = NA)
Biểu đồ cho thấy phân bố khách hàng không đều: một vài thành phố chiếm phần lớn khách hàng, còn nhiều thành phố khác thì lượng khách thấp, thể hiện tập trung khách hàng vào một số thị trường chính.
Salem nổi bật nhất với cột cao hơn hẳn, chứng tỏ đây là thành phố có lượng khách hàng đông nhất.
Các thành phố lớn như Los Angeles, Portland, Spokane, San Diego cũng có cột cao, thể hiện thị trường khá mạnh.
Ở phía giữa biểu đồ, các thành phố như Merida, Vancouver, San Andres có số lượng khách trung bình, cột thấp hơn nhưng vẫn đáng kể.
Ở đầu biểu đồ, các thành phố như Guadalajara, Bellingham có cột thấp, nghĩa là lượng khách hàng ít, chiếm phần nhỏ trong tổng số.
# Tạo bảng tần suất ProductFamily
product_family_counts <- table(supermarket$ProductFamily)
print(product_family_counts)
##
## Drink Food Non-Consumable
## 1250 10153 2656
# Vẽ biểu đồ tròn
pie(product_family_counts,
main = "Phân bố theo ProductFamily",
col = rainbow(length(product_family_counts)),
cex = 0.8)
# Thêm chú thích ngoài biểu đồ
legend("topright", legend = names(product_family_counts), fill = rainbow(length(product_family_counts)), cex=0.7)
Phân bố theo nhóm sản phẩm (ProductFamily):
Food (Thực phẩm) là nhóm lớn nhất với 10,153 sản phẩm, chiếm khoảng 70% tổng số. Đây là nhóm chủ đạo trong dữ liệu, cho thấy khách hàng mua nhiều nhất các sản phẩm thực phẩm.
Drink (Đồ uống) chiếm khoảng 8.6% với 1,250 sản phẩm. Đây cũng là một nhóm quan trọng nhưng nhỏ hơn nhiều so với thực phẩm.
Non-Consumable (Sản phẩm không tiêu thụ trực tiếp) có 2,656 sản phẩm, chiếm khoảng 18.4%. Nhóm này có thể gồm các vật dụng, dụng cụ hoặc sản phẩm dùng lâu dài, không phải tiêu thụ ngay.
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.3.3
##
## Attaching package: 'dplyr'
## The following object is masked from 'package:kableExtra':
##
## group_rows
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
product_dept_counts <- table(supermarket$ProductDepartment)
df_dept <- as.data.frame(product_dept_counts)
colnames(df_dept) <- c("ProductDepartment", "Count")
df_dept <- df_dept %>%
mutate(Percent = round(Count / sum(Count) * 100, 2)) %>%
arrange(desc(Count))
print(df_dept)
## ProductDepartment Count Percent
## 1 Produce 1994 14.18
## 2 Snack Foods 1600 11.38
## 3 Household 1420 10.10
## 4 Frozen Foods 1382 9.83
## 5 Baking Goods 1072 7.63
## 6 Canned Foods 977 6.95
## 7 Dairy 903 6.42
## 8 Health and Hygiene 893 6.35
## 9 Deli 699 4.97
## 10 Beverages 680 4.84
## 11 Baked Goods 425 3.02
## 12 Alcoholic Beverages 356 2.53
## 13 Snacks 352 2.50
## 14 Starchy Foods 277 1.97
## 15 Periodicals 202 1.44
## 16 Eggs 198 1.41
## 17 Breakfast Foods 188 1.34
## 18 Canned Products 109 0.78
## 19 Seafood 102 0.73
## 20 Meat 89 0.63
## 21 Checkout 82 0.58
## 22 Carousel 59 0.42
Bảng số liệu cho thấy:
Produce (1994), Snack Foods (1600), Household (1420) và Frozen Foods (1382) là các nhóm sản phẩm có số lượng lớn nhất, chiếm phần lớn trong tổng số sản phẩm. Đây có thể là nhóm khách hàng mua nhiều hoặc nhóm hàng chủ lực.
Các nhóm như Baking Goods (1072), Canned Foods (977), Dairy (903), và Health and Hygiene (893) cũng có số lượng khá cao, cho thấy nhu cầu đa dạng.
Một số nhóm như Carousel (59), Checkout (82), Meat (89), và Seafood (102) có số lượng thấp hơn, có thể là nhóm sản phẩm chuyên biệt hoặc ít phổ biến hơn.
Các nhóm còn lại nằm ở mức trung bình, phản ánh sự phân bố khá đa dạng trong các mặt hàng của siêu thị.
library(dplyr)
# Tạo bảng tần suất đếm số lượng theo ProductCategory
product_cat_counts <- supermarket %>%
group_by(ProductCategory) %>%
summarise(Count = n()) %>%
arrange(desc(Count)) %>%
mutate(Percentage = round(Count / sum(Count) * 100, 2))
# In bảng kết quả
print(product_cat_counts)
## # A tibble: 45 × 3
## ProductCategory Count Percentage
## <chr> <int> <dbl>
## 1 Vegetables 1728 12.3
## 2 Snack Foods 1600 11.4
## 3 Dairy 903 6.42
## 4 Fruit 765 5.44
## 5 Meat 761 5.41
## 6 Jams and Jellies 588 4.18
## 7 Baking Goods 484 3.44
## 8 Bread 425 3.02
## 9 Breakfast Foods 417 2.97
## 10 Canned Soup 404 2.87
## # ℹ 35 more rows
Khách hàng tập trung nhiều vào các nhóm thực phẩm tươi sống, đông lạnh, đồ ăn nhẹ, và các sản phẩm gia dụng. Các nhóm nhỏ hơn có thể là các mặt hàng đặc thù hoặc ít phổ biến hơn.
Nhóm có số lượng cao nhất:
Produce (1994) — tức các loại rau củ quả tươi, rất được ưa chuộng.
Frozen Foods (1382) và Household (1420) cũng khá cao, cho thấy nhu cầu dùng thực phẩm đông lạnh và hàng gia dụng lớn.
Snack Foods (1600) và Baking Goods (1072) cũng nổi bật, phản ánh thị trường ăn vặt và làm bánh phát triển.
Nhóm có số lượng thấp nhất:
Carousel (59), Checkout (82), Meat (89) có số lượng ít hơn, có thể do đặc thù sản phẩm hoặc cách phân loại.
Baking Goods thấp hơn nhiều nhóm, nhưng vẫn tương đối.
children_counts <- table(supermarket$Children)
children_counts
##
## 0 1 2 3 4 5
## 1344 2718 2839 2893 2826 1439
children_percent <- prop.table(children_counts) * 100
round(children_percent, 1) # làm tròn 1 chữ số thập phân
##
## 0 1 2 3 4 5
## 9.6 19.3 20.2 20.6 20.1 10.2
barplot(children_counts,
main = "Số lượng con trong gia đình khách hàng",
xlab = "Số con",
ylab = "Số lượng gia đình",
col = "skyblue")
Biểu đồ thể hiện:
Gia đình không có con chiếm 1,344 hộ chiếm khoảng 8% tổng số (tôi sẽ tính % cụ thể bên dưới).
Các gia đình có từ 1 đến 4 con chiếm đa số (chiếm khoảng 80% tổng), và tỷ lệ phân bố khá đồng đều giữa các nhóm này, mỗi nhóm chiếm khoảng 16%-17%.
Gia đình có 5 con trở lên giảm còn 1,439 hộ khoảng 9%.
units_sold_counts <- table(supermarket$UnitsSold)
print(units_sold_counts)
##
## 1 2 3 4 5 6 7 8
## 90 1130 3289 4379 3562 1439 168 2
summary(supermarket$UnitsSold)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.000 3.000 4.000 4.081 5.000 8.000
sd(supermarket$UnitsSold)
## [1] 1.174421
units_counts <- table(supermarket$UnitsSold)
bar_positions <- barplot(
units_counts,
main = "Phân bố số lượng sản phẩm bán theo UnitsSold",
xlab = "Số lượng sản phẩm bán (UnitsSold)",
ylab = "Số lầ",
col = "steelblue",
border = "black"
)
# Thêm nhãn số lên trên mỗi cột
text(
x = bar_positions,
y = units_counts,
labels = units_counts,
pos = 3, # Vị trí trên đầu cột
cex = 0.8, # Kích cỡ chữ
col = "black"
)
Phần lớn khách hàng trong dữ liệu chọn mua từ 3 đến 5 sản phẩm trong mỗi đơn hàng, thể hiện xu hướng mua hàng vừa phải, không quá ít cũng không quá nhiều. Mức mua cực thấp (1 sản phẩm) hoặc rất cao (7-8 sản phẩm) chỉ chiếm phần nhỏ trong tổng số đơn hàng.
Số lượng bán nhiều nhất rơi vào nhóm 4 sản phẩm, với 4379 đơn vị, chiếm tỷ trọng lớn nhất trong tổng phân bố.
Nhóm 3 và 5 sản phẩm cũng rất phổ biến, lần lượt có 3289 và 3562 đơn vị, chỉ thấp hơn nhóm 4 chút.
Nhóm 2 sản phẩm cũng có số lượng khá lớn, 1130 đơn vị.
Số lượng bán ở các nhóm nhỏ (1 sản phẩm) và nhóm lớn (7, 8 sản phẩm) rất ít, đặc biệt nhóm 8 chỉ có 2 đơn vị.
# Chuyển Revenue sang numeric
supermarket$Revenue <- as.numeric(supermarket$Revenue)
# Nếu có NA do chuyển không thành công (ví dụ có ký tự lạ), loại bỏ NA khi tính
revenue_clean <- na.omit(supermarket$Revenue)
# Tính các thống kê
summary(revenue_clean)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.53 6.84 11.25 13.00 17.37 56.70
sd(revenue_clean)
## [1] 8.215543
min(revenue_clean)
## [1] 0.53
max(revenue_clean)
## [1] 56.7
median(revenue_clean)
## [1] 11.25
mean(revenue_clean)
## [1] 13.00451
Min = 0.53: Có khách mua rất ít tiền, chỉ khoảng 53 cent (ví dụ mua món nhỏ, bánh kẹo).
Median = 11.25: Phần lớn giao dịch có giá trị khoảng 11.25 đô la (giá trị trung bình của một lần mua hàng).
Mean = 13.00: Trung bình mỗi lần mua là 13 đô la, có nghĩa có những giao dịch lớn hơn mức trung vị làm tăng trung bình.
Max = 56.7: Có những giao dịch mua khá lớn, có thể mua nhiều món hoặc hàng cao cấp.