NHIỆM VỤ TUẦN 1
Phần 1. Tóm tắt cuốn sách: 2019_Generalized Linear Models With Examples in R
Phần 2. Thực hiện thống kê mô tả cho các biến trong file: Supermarket Transactions
Thuộc tính | Chi tiết |
---|---|
Tên sách | Generalized Linear Models With Examples in R |
Tác giả | Peter K. Dunn (Queensland Uni. of Technology) & Gordon K. Smyth (Walter + Eliza Hall Institute) |
Ấn bản trích dẫn | Springer Texts in Statistics, 2nd edition 2018 (ấn bản in 2019) |
Chủ đề | Mô hình thống kê ứng dụng; • Hồi quy tuyến tính (Linear Regression) • Mô hình tuyến tính tổng quát (GLM) và họ Phân tán Hàm mũ (EDM) • Thực hành bằng ngôn ngữ R |
glm()
, anova()
,
tweedie.profile()
), gói GLMsData.Sách thường được dùng kèm các học phần “Regression Analysis”, “Applied GLM”, “R for Statistics”.
Chương này giới thiệu khái niệm cơ bản về mô hình thống kê như một cách để mô tả cả các đặc điểm ngẫu nhiên và có hệ thống của dữ liệu. Nó nhấn mạnh tầm quan trọng của việc sử dụng các mô hình để phân tích dữ liệu (“Data analysis: The need for models?” - Reese, 1986).
Mô tả dữ liệu Ví dụ minh họa với bộ dữ liệu FEV (dung tích phổi):
Biến | Mô tả | Kiểu |
---|---|---|
Age | Tuổi (năm) | Liên tục |
FEV | Dung tích thở ra (lít) | Liên tục |
Ht | Chiều cao (cm) | Liên tục |
Gender | Giới tính (F/M) | Phân loại |
Smoke | Hút thuốc (0/1) | Phân loại |
Vẽ biểu đồ (scatter plot, boxplot) cho nhìn xu hướng, phát hiện quan hệ phi tuyến, thay đổi phương sai, điểm ngoại lai (outlier) và tương tác giữa các biến. Ví dụ: FEV tăng theo tuổi và chiều cao, phân bố khác biệt nhẹ theo giới tính, người hút thuốc thường lớn tuổi hơn nên có FEV trung bình cao hơn dù quan hệ nhân quả chưa được khẳng định.
Để đưa biến phân loại vào mô hình, ta mã hóa thành biến giả (dummy variable):
relevel()
trong R.Mô hình thống kê luôn gồm:
Thành phần hệ thống – mô tả kỳ vọng:
\[ \mu_i = \mathbb{E}[y_i] = f(\beta_0 + \beta_1 x_{1i} + \cdots + \beta_p x_{pi}) \]
Thành phần ngẫu nhiên – mô tả sai số: \(\operatorname{Var}(y_i)\) quy định dạng phân phối (normal, binomial, …).
Trình bày khung hồi quy tuyến tính và khái niệm “hồi quy
tuyến tính trong tham số” (linear in
parameters).
Hai họ mô hình cốt lõi:
Mô hình là giản lược; giá trị của nó phụ thuộc mục
đích và tính đúng đắn tương đối.
Luôn kiểm tra giả định và chấp nhận sai số.
Mục tiêu quyết định cách chọn biến và mức độ phức tạp.
Nguyên lý Occam: mô hình phải cân bằng giữa
độ khớp và đơn giản.
- Mô hình quá đơn giản → bỏ lỡ tín hiệu.
- Mô hình quá phức tạp → overfitting.
Mô hình hồi quy tuyến tính là loại phổ biến nhất trong tất cả các mô hình hồi quy.
Đây là một trường hợp đặc biệt của mô hình tuyến tính tổng quát (GLM).
Chương này giới thiệu:
Khái niệm và ký hiệu của mô hình.
Ước lượng bình phương tối thiểu (OLS).
Hồi quy đơn và hồi quy bội.
Diễn giải hệ số hồi quy.
Suy luận thống kê.
Phân tích phương sai (ANOVA).
So sánh mô hình lồng và không lồng.
Chọn mô hình tốt nhất
Thành phần | Biểu thức / ký hiệu | Giải thích | Giả định chính |
---|---|---|---|
Ngẫu nhiên | \(\text{Var}(y_i\mid x) = \sigma^{2} / w_i\) (\(w_i = 1\) → ordinary LR) | Đặt biến, quan sát độc lập | Sai số có kỳ vọng 0 và phương sai \(\sigma^{2}\). |
Hệ thống | \(\mu_i = \beta_0 + \sum_{j=1}^{p}\beta_j x_{ij}\) | Quan hệ tuyến tính giữa \(y\) & \(x_{ij}\) | Hồi quy tuyến tính (linear in parameters). |
Trường hợp đặc biệt: simple (\(p = 1\)), multiple (\(p > 1\)), weighted, normal (thêm giả định \(y_i \sim \mathcal N\)).
Hàm mục tiêu
\[
\text{RSS} = \sum_{i=1}^{n} w_i (y_i - \mu_i)^2.
\]
Simple LR: có công thức đóng \(\hat\beta_1, \hat\beta_0\).
Multiple LR (ma trận):
\[
\hat{\boldsymbol\beta} = (X^\top W X)^{-1} X^\top W\boldsymbol
y,\qquad
\widehat{\mu}_i = \hat\beta_0 + \sum_{j=1}^{p}\hat\beta_j x_{ij}.
\]
Ước lượng phương sai
\[
\hat\sigma^{2} = \frac{\text{RSS}}{\,n-p\,}.
\]
Sai số chuẩn
\[
\operatorname{se}(\hat\beta_j)=\sqrt{\hat\sigma^{2}\big[(X^\top
X)^{-1}\big]_{jj}}.
\]
Khoảng tin cậy \(100(1-\alpha)\%\):
\(\hat\beta_j \pm
t_{n-p;\,1-\alpha/2}\,\operatorname{se}(\hat\beta_j)\).
Kiểm định \(H_0:\beta_j=0\) dùng thống kê \(t\) (hoặc kiểm định \(F\) cho toàn mô hình).
Tình huống | Thước đo | Công thức/Luận điểm |
---|---|---|
Nested (mô hình rút gọn ⊂ mô hình đầy đủ) | \(F = \dfrac{(\text{RSS}_r - \text{RSS}_f)/(p_r-p_f)}{\text{RSS}_f/(n-p_f)}\) | \(F\) ~ \(F_{p_r-p_f,\;n-p_f}\); \(F\) lớn ⇒ mô hình đầy đủ tốt hơn |
Non-nested | AIC =\(-2\log\mathcal L +
2k\) BIC =\(-2\log\mathcal L + k\log n\) |
Giá trị nhỏ hơn ⇒ mô hình ưu tiên |
Sau khi xây dựng một mô hình hồi quy tuyến tính, công việc không kết thúc ở việc ước lượng các hệ số hồi quy và kiểm định ý nghĩa thống kê. Một bước quan trọng không thể thiếu là chẩn đoán mô hình – tức là đánh giá xem mô hình đã được xây dựng có thực sự phù hợp với dữ liệu hay không.
Chẩn đoán mô hình hồi quy là một phần thiết yếu trong phân tích dữ liệu vì nó giúp ta:
Xác minh các giả định cơ bản của mô hình hồi quy tuyến tính có được thỏa mãn hay không (ví dụ như quan hệ tuyến tính, phương sai không đổi, phân phối chuẩn…).
Phát hiện những quan sát bất thường như điểm ngoại lai (outliers) hoặc điểm có ảnh hưởng lớn (influential observations) – những điểm có thể bóp méo kết quả ước lượng hoặc kiểm định.
Đánh giá độ tin cậy của các hệ số ước lượng.
Đề xuất cách cải thiện mô hình, ví dụ: biến đổi biến, thêm hoặc bớt biến giải thích, sử dụng mô hình phi tuyến hoặc tổng quát (GLM) thay thế.
Nếu bỏ qua bước này, người phân tích dễ rơi vào bẫy của việc “phù hợp quá mức” (overfitting), hiểu sai mối quan hệ giữa các biến, hoặc dự đoán sai lệch trong thực tế. Do đó, chẩn đoán mô hình không phải là tùy chọn – mà là một phần bắt buộc trong phân tích hồi quy nghiêm túc.
Trong chương này, chúng ta sẽ học cách:
Kiểm tra các giả định của mô hình hồi quy.
Sử dụng phần dư (residuals) để kiểm tra độ phù hợp.
Phát hiện và xử lý các điểm ảnh hưởng lớn.
Đo lường hiện tượng đa cộng tuyến và cách giảm thiểu.
Giả định | Vi phạm thường gặp | Công cụ phát hiện |
---|---|---|
Tuyến tính | Xu hướng cong | Residual vs Fitted |
Phương sai đồng nhất | “Hình nón” của phần dư | Scale-Location plot |
Độc lập | Tự tương quan | ACF phần dư, DW test |
Chuẩn hoá sai số | Đuôi dày/lệch | Q-Q plot |
Residual vs Fitted, Normal Q-Q, Scale-Location, Residuals vs Leverage – hỗ trợ phát hiện vi phạm giả định & điểm ảnh hưởng.
Thước đo | Ý nghĩa | Ngưỡng gợi ý |
---|---|---|
\(t_i\) | Phần dư Studentized | \(|t_i| \gtrsim 2\) (thường dùng) |
Leverage \(h_i\) | Khoảng cách \(x_i\) đến trung tâm | \(h_i > 2p/n\) |
Cook’s D | Kết hợp residual & leverage | \(>0.5\) xem xét, \(>1\) ảnh hưởng lớn |
dffits, dfbetas, CovRatio | Ảnh hưởng lên \(\hat y_i\) hoặc \(\hat\beta_j\) | — |
Bảng influence.measures()
trong R gắn dấu ()
cho quan sát vi phạm các chuẩn trên.*
Phương pháp bình phương tối thiểu (OLS) chỉ hoạt động hiệu quả khi dữ liệu thỏa mãn các giả định như phân phối chuẩn, phương sai không đổi, và biến phản hồi liên tục. Tuy nhiên, nhiều loại dữ liệu thực tế không tuân theo những điều kiện đó – ví dụ: dữ liệu nhị phân, đếm, hoặc dương liên tục. Khi đó, Maximum Likelihood Estimation (MLE) là phương pháp mạnh mẽ hơn, dùng để ước lượng các tham số trong mô hình tổng quát.
MLE là nền tảng cho mô hình tuyến tính tổng quát (GLM), vốn là trung tâm của phần còn lại trong sách.
Cho mẫu \(y_1,\dots,y_n\) độc lập với mật độ \(f(y_i;\theta)\):
\[ L(\theta)=\prod_{i=1}^{n}f(y_i;\theta),\qquad \ell(\theta)=\log L(\theta)=\sum_{i=1}^{n}\log f(y_i;\theta). \]
\[ \hat{\theta}=\arg\max_{\theta}\,\ell(\theta) \quad\Longrightarrow\quad \frac{\partial\ell}{\partial\theta}=0 \ \text{(phương trình score)}. \]
Khái niệm | Công thức / tính chất | Ý nghĩa |
---|---|---|
Score \(S(\theta)\) | \(S(\theta)=\partial\ell/\partial\theta\) ; \(\mathbb E\big[S(\theta)\big]=0\) | Đạo hàm log-likelihood |
Fisher information \(I(\theta)\) | \(I(\theta)=-\mathbb E\!\big[\partial^{2}\!\ell/\partial\theta^{2}\big]\) | Độ chính xác tối đa có thể |
Phương sai ước lượng | \(\operatorname{Var}(\hat\theta)\approx I(\hat\theta)^{-1}\) | Sai số chuẩn \(\text{se}(\hat\theta)=\sqrt{I(\hat\theta)^{-1}}\) |
Tên | Công thức kiểm định | Phân phối (large \(n\)) |
---|---|---|
Wald | \(Z=\dfrac{\hat\theta-\theta_0}{\text{se}(\hat\theta)}\) | \(Z\sim\mathcal N(0,1)\) ⇒ \(Z^{2}\sim\chi^{2}_{1}\) |
Likelihood-Ratio | \(\text{LR}=2\bigl[\ell(\hat\theta)-\ell(\theta_0)\bigr]\) | \(\chi^{2}_{\text{df}}\) (df = số tham số giam) |
Score (LM) | \(S=\dfrac{\,S(\theta_0)^{2}}{I(\theta_0)}\) | \(\chi^{2}_{\text{df}}\) |
Mô hình có AIC / BIC thấp hơn đượ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\) | Số lần xảy ra sự kiện |
Dương liên tục | Gamma / Inverse-Gaussian | \(\log \mu\) hoặc \(\sqrt{\mu}\) | Chi phí, thời gian, khoảng cách … |
Mô hình tuyến tính tổng quát (GLM) là một khuôn khổ mạnh mẽ cho việc mô hình hóa các loại dữ liệu khác nhau – không chỉ dữ liệu liên tục có phân phối chuẩn như trong hồi quy tuyến tính. GLM bao gồm hồi quy logistic, hồi quy Poisson, hồi quy Gamma… và mở rộng khả năng phân tích đến dữ liệu nhị phân, đếm, tỷ lệ và dương liên tục.
Mỗi GLM được xây dựng trên cùng một nguyên lý chung gồm ba thành phần chính: phân phối xác suất, hàm liên kết, và thành phần tuyến tính.
1. Thành phần ngẫu nhiên (Random component)
Biến phản hồi \(y_i\) được giả định phân phối theo một phân phối thuộc họ hàm mũ một tham số (One-Parameter Exponential Family):
\[ f(y_i; \theta_i, \phi) = \exp \left\{ \frac{y_i \theta_i - b(\theta_i)}{\phi} + c(y_i, \phi) \right\} \]
Ý nghĩa các ký hiệu:
→ Họ hàm mũ bao gồm Normal, Poisson, Binomial, Gamma,…
2. Thành phần hệ thống (Systematic component)
Giống như hồi quy tuyến tính, GLM vẫn dùng một predictor tuyến tính:
\[ \eta_i = x_i^T \beta = \beta_0 + \beta_1 x_{i1} + \cdots + \beta_p x_{ip} \]
Ý nghĩa:
Đây là thành phần chứa ảnh hưởng của các biến độc lập lên mô hình.
3. Hàm liên kết (Link function)
GLM dùng một hàm liên kết \(g(\cdot)\) để kết nối trung bình \(\mu_i = E[y_i]\) với predictor tuyến tính \(\eta_i\):
\[ g(\mu_i) = \eta_i \quad \text{hay} \quad \mu_i = g^{-1}(\eta_i) \]
→ Cho phép mô hình hóa các biến phản hồi có đặc tính phi tuyến, không âm, giới hạn trong khoảng (0,1),…
Hàm liên kết thường dùng:
Phân phối | \(\mu_i = E[y_i]\) | Link function \(g(\mu)\) | Ghi chú |
---|---|---|---|
Normal | \(\mu \in \mathbb{R}\) | \(g(\mu) = \mu\) (identity) | Hồi quy tuyến tính chuẩn |
Binomial | \(\mu \in (0,1)\) | \(g(\mu) = \log \frac{\mu}{1-\mu}\) | Logistic regression |
Poisson | \(\mu > 0\) | \(g(\mu) = \log(\mu)\) | Hồi quy đếm |
Gamma | \(\mu > 0\) | \(g(\mu) = \log(\mu)\) hoặc \(g(\mu) = \frac{1}{\mu}\) | Mô hình dữ liệu dương |
1. Hồi quy Logistic (nhị phân)
\[ y_i \sim \text{Bernoulli}(\pi_i) \]
\[ g(\pi_i) = \log \left(\frac{\pi_i}{1-\pi_i}\right) = \eta_i \]
\[ \pi_i = P(y_i = 1 \mid x_i) \]
2. Hồi quy Poisson (đếm)
\[ y_i \sim \text{Poisson}(\mu_i) \]
\[ \log(\mu_i) = x_i^T \beta \]
\(\mu_i\): số sự kiện kỳ vọng xảy ra.
Dùng cho dữ liệu: số ca bệnh, số lần vi phạm, số giao dịch…
3. Hồi quy Gamma (dương liên tục)
\[ y_i \sim \text{Gamma}(\alpha, \mu_i) \]
Hàm liên kết:
\[ g(\mu_i) = \log(\mu_i) \quad \text{hoặc} \quad g(\mu_i) = \frac{1}{\mu_i} \]
Trong GLM, phương sai của \(y_i\) không cần bằng nhau mà được mô hình hóa như hàm của \(\mu_i\):
\[ \text{Var}(y_i) = \phi \cdot V(\mu_i) \]
Trong đó:
Hàm \(V(\mu)\) tùy theo phân phối như sau:
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ư trên giúp xử lý được hiện tượng phương sai thay đổi (heteroscedasticity), vốn là một giả định bị vi phạm trong phương pháp OLS (Hồi quy tuyến tính thông thường).
Canonical Link Function là hàm liên kết sao cho predictor tuyến tính chính là tham số tự nhiên \(\theta\) trong phân phối họ hàm mũ:
\[ \theta_i = \eta_i = x_i^T \beta \]
Ví dụ về hàm liên kết chuẩn (canonical link):
Phân phối | Hàm liên kết (Link function) |
---|---|
Binomial | logit: \(\log\frac{\mu}{1-\mu}\) |
Poisson | log: \(\log(\mu)\) |
Normal | identity: \(\mu\) |
Lưu ý: Dù GLM gọi là “tuyến tính”, nhưng mối quan hệ giữa \(y\) và \(x\) có thể phi tuyến do sử dụng hàm liên kết (link function).
Sau khi xác định được cấu trúc của một GLM (gồm phân phối xác suất, 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ố hồi quy \(\beta\) trong mô hình.
Khác với hồi quy tuyến tính cổ điển – nơi ta dùng phương pháp bình phương tối thiểu (OLS) – trong GLM, các hệ số được ước lượng bằng phương pháp hợp lý tối đa (Maximum Likelihood Estimation - MLE) thông qua một thuật toán gọi là Iteratively Reweighted Least Squares (IRLS).
Phương pháp IRLS thực hiện việc cập nhật các ước lượng \(\beta\) lặp đi lặp lại, mỗi lần dựa trên trọng số được điều chỉnh sao cho phù hợp với phân phối của dữ liệu và hàm liên kết được chọn.
Cho dữ liệu gồm:
Biến phản hồi: \(y_1, y_2, \ldots, y_n\) có thể là biến đếm, nhị phân hoặc liên tục dương…
Biến giải thích: \(x_{i1}, \ldots, x_{ip}\) với \(i=1, \ldots, n\).
Mô hình GLM được biểu diễn như sau:
\[ g(\mu_i) = \eta_i = \mathbf{x}_i^T \boldsymbol{\beta} \]
với
\[ \mu_i = E[y_i] = g^{-1}(\mathbf{x}_i^T \boldsymbol{\beta}) \]
Mục tiêu là tìm ước lượng \(\hat{\boldsymbol{\beta}}\) sao cho hàm log-likelihood đạt cực đại:
\[ \ell(\boldsymbol{\beta}) = \sum_{i=1}^n \log f(y_i; \theta_i) \]
trong đó:
\(f(y_i; \theta_i)\) là hàm mật độ xác suất (hoặc hàm khối xác suất) của biến \(y_i\),
\(\theta_i\) là tham số tự nhiên trong phân phối thuộc họ hàm mũ,
\(\theta_i\) có quan hệ với \(\mu_i\), từ đó liên hệ với \(\boldsymbol{\beta}\).
Việc ước lượng này thường được thực hiện bằng phương pháp hợp lý tối đa (MLE), sử dụng thuật toán Iteratively Reweighted Least Squares (IRLS).
1. Thuật toán IRLS (Iteratively Reweighted Least Squares):
GLM sử dụng thuật toán IRLS để tìm ước lượng \(\hat{\boldsymbol{\beta}}\). Thuật toán dựa trên việc lặp lại các bước hồi quy tuyến tính có trọng số.
2. Ý tưởng cơ bản:
Ở mỗi vòng lặp, mô hình GLM được xấp xỉ bằng một hồi quy tuyến tính với trọng số.
Biến giả (working response) \(\mathbf{z}\) và ma trận trọng số \(\mathbf{W}\) được cập nhật liên tục ở mỗi bước.
3. Hệ phương trình IRLS:
\[ \mathbf{X}^T \mathbf{W} \mathbf{X} \hat{\boldsymbol{\beta}} = \mathbf{X}^T \mathbf{W} \mathbf{z} \]
Trong đó:
\(\mathbf{X}\) là ma trận thiết kế,
\(\mathbf{W}\) là ma trận trọng số kích thước \(n \times n\),
\(\mathbf{z}\) là vector biến giả \(n \times 1\), tính theo công thức:
\[ z_i = \eta_i + \frac{y_i - \mu_i}{\frac{d \mu_i}{d \eta_i}} \]
\[ W_i = \left(\frac{d \mu_i}{d \eta_i}\right)^2 \Big/ \mathrm{Var}(y_i) \]
Quá trình này được lặp lại cho đến khi các ước lượng \(\boldsymbol{\beta}\) hội tụ.
Hàm điểm (Score Function)
Hàm điểm là đạo hàm của log-likelihood theo vector hệ số \(\boldsymbol{\beta}\):
\[ U(\boldsymbol{\beta}) = \frac{\partial \ell(\boldsymbol{\beta})}{\partial \boldsymbol{\beta}} \]
Đây là hệ phương trình mà khi giải \(U(\boldsymbol{\beta}) = 0\), ta thu được ước lượng cực đại \(\hat{\boldsymbol{\beta}}\).
Ma trận thông tin Fisher
Ma trận thông tin Fisher là kỳ vọng âm của đạo hàm bậc hai của log-likelihood:
\[ \mathcal{I}(\boldsymbol{\beta}) = - \mathbb{E} \left[ \frac{\partial^2 \ell(\boldsymbol{\beta})}{\partial \boldsymbol{\beta} \, \partial \boldsymbol{\beta}^T} \right] \]
Ma trận này đóng vai trò như một thước đo độ “sắc nét” của log-likelihood tại điểm cực đại và được dùng để đánh giá độ chính xác của ước lượng.
Phương sai của \(\hat{\boldsymbol{\beta}}\)
Khi đã có ma trận thông tin Fisher, phương sai hiệp phương sai của vector hệ số ước lượng được tính là:
\[ \mathrm{Var}(\hat{\boldsymbol{\beta}}) = \mathcal{I}(\hat{\boldsymbol{\beta}})^{-1} \]
Nếu sử dụng thuật toán IRLS, ma trận thông tin Fisher được xấp xỉ bởi:
\[ \mathrm{Var}(\hat{\boldsymbol{\beta}}) = (\mathbf{X}^T \mathbf{W} \mathbf{X})^{-1} \]
Trong đó:
\(\mathbf{X}\): ma trận thiết kế,
\(\mathbf{W}\): ma trận trọng số tại nghiệm hội tụ,
Công thức này xuất hiện tự nhiên từ bước giải hệ phương trình IRLS.
Ghi chú
Công thức phương sai trên rất quan trọng để tính khoảng tin cậy và kiểm định giả thuyết trong GLM.
Với các mô hình lớn, ma trận \((\mathbf{X}^T \mathbf{W} \mathbf{X})^{-1}\) thường được tính thông qua giải hệ phương trình thay vì đảo trực tiếp để tránh sai số số học.
Sai số chuẩn (Standard Error)
Sau khi có được ước lượng \(\hat{\boldsymbol{\beta}}\) và ma trận phương sai hiệp phương sai \(\mathrm{Var}(\hat{\boldsymbol{\beta}})\), ta tính sai số chuẩn cho từng hệ số \(\hat{\beta}_j\) như sau:
\[ \mathrm{SE}(\hat{\beta}_j) = \sqrt{[\mathrm{Var}(\hat{\boldsymbol{\beta}})]_{jj}} \]
Trong đó, \([\cdot]_{jj}\) là phần tử hàng \(j\), cột \(j\) trong ma trận phương sai.
Khoảng tin cậy \(100(1 - \alpha)\%\)
Khoảng tin cậy cho hệ số \(\hat{\beta}_j\) được tính bằng công thức:
\[ \hat{\beta}_j \pm z_{\alpha/2} \cdot \mathrm{SE}(\hat{\beta}_j) \]
Trong đó:
\(z_{\alpha/2}\) là bách phân vị \(1 - \alpha/2\) của phân phối chuẩn chuẩn hóa (thường tra từ bảng Z),
Ví dụ: với \(\alpha = 0.05\), \(z_{0.025} \approx 1.96\) (tương ứng khoảng tin cậy 95%).
Kiểm định Wald
Kiểm định Wald giúp đánh giá giả thuyết:
\[ H_0: \beta_j = 0 \quad \text{vs} \quad H_1: \beta_j \neq 0 \]
Thống kê kiểm định:
\[ Z = \frac{\hat{\beta}_j}{\mathrm{SE}(\hat{\beta}_j)} \sim \mathcal{N}(0, 1) \]
Dựa vào giá trị \(Z\), ta có thể tính p-value và đưa ra kết luận thống kê.
Ghi chú
Kiểm định Wald được dùng phổ biến do tính đơn giản và có thể thực hiện ngay sau khi có ước lượng và phương sai.
Nếu \(|Z| > z_{\alpha/2}\), bác bỏ \(H_0\), tức là hệ số \(\beta_j\) có ý nghĩa thống kê.
Trong một số mô hình GLM, đặc biệt là khi phân phối thuộc họ phân phối mũ (exponential family) không chuẩn hóa, ta cần ước lượng tham số phân tán \(\phi\).
Công thức ước lượng:
\[ \hat{\phi} = \frac{1}{n - p} \sum_{i=1}^{n} \frac{(y_i - \hat{\mu}_i)^2}{V(\hat{\mu}_i)} \]
Trong đó:
\(n\): số quan sát
\(p\): số tham số trong mô hình (bao gồm hệ số chặn nếu có)
\(\hat{\mu}_i = \mathbb{E}[y_i] = g^{-1}(\eta_i)\): giá trị kỳ vọng được ước lượng
\(V(\hat{\mu}_i)\): hàm phương sai, phụ thuộc vào phân phối:
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 các tham số \(\beta\) trong GLM, bước tiếp theo là đánh giá xem mô hình có phù hợp với dữ liệu không, và nếu có nhiều mô hình cạnh tranh, thì nên chọn mô hình nào là tốt nhất.
Các công cụ đánh giá bao gồm:
Deviance (độ lệch)
Kiểm định \(\chi^2\)
AIC, BIC
So sánh mô hình lồng và không lồng
Đồ thị phần dư và điểm ảnh hưởng
Định nghĩa:
Deviance là đại lượng đo sự khác biệt giữa mô hình hiện tại và mô hình đầy đủ (saturated model) – tức mô hình khớp hoàn toàn với dữ liệu.
\[ D(y; \hat{\mu}) = 2 \left[ \ell(y; y) - \ell(\hat{\mu}; y) \right] \]
Giải thích ký hiệu:
\(\ell(y; y)\): log-likelihood của mô hình bão hòa (saturated model)
\(\ell(\hat{\mu}; y)\): log-likelihood của mô hình đang xét
\(\Rightarrow\) Deviance càng nhỏ → mô hình càng gần với mô hình bão hòa → phù hợp hơn.
Khi hai mô hình lồng nhau, ta có thể so sánh bằng kiểm định sai biệt deviance:
Công thức kiểm định:
\[ \Delta D = D_{\text{reduced}} - D_{\text{full}} \sim \chi^2_{df} \]
Trong đó:
\(\Rightarrow\) Nếu \(\Delta D\) lớn và p-value nhỏ → mô hình đầy đủ tốt hơn.
Khi các mô hình không lồng nhau, ta dùng tiêu chí thông tin để so sánh:
AIC (Akaike Information Criterion):
\[ AIC = -2\ell + 2k \]
\(\ell\): log-likelihood
\(k\): số tham số trong mô hình
BIC (Bayesian Information Criterion):
\[ BIC = -2\ell + \log(n) \cdot k \]
\(\Rightarrow\) Chọn mô hình có AIC/BIC thấp hơn.
\(\Rightarrow\) BIC phạt các mô hình phức tạp nhiều hơn so với AIC.
Phần dư (residuals):
\[ e_i = y_i - \hat{\mu}_i \]
\[ r_i = \frac{y_i - \hat{\mu}_i}{\sqrt{V(\hat{\mu}_i)}} \]
\[ d_i = \text{sign}(y_i - \hat{\mu}_i) \cdot \sqrt{2\left[\ell(y_i; y_i) - \ell(\hat{\mu}_i; y_i)\right]} \]
Biểu đồ kiểm tra mô hình (Diagnostic plots):
Residuals vs Fitted
Normal Q-Q (nếu mô hình gần phân phối chuẩn)
Scale-Location plot
Cook’s distance vs Leverage
Các biểu đồ này giúp phát hiện điểm ngoại lai và điểm ảnh hưởng mạnh đến mô hình.
Phép kiểm định Pearson đo sự khác biệt giữa dữ liệu quan sát và giá trị kỳ vọng từ mô hình:
\[ 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 mức kỳ vọng theo phân phối \(\chi^2_{df}\) → mô hình có thể không phù hợp với dữ liệu.
Một số mô hình GLM như Poisson hoặc Binomial giả định hệ số phân tán là:
\[ \phi = 1 \]
Tuy nhiên, trong thực tế, nếu phương sai quan sát lớn hơn phương sai lý thuyết, ta gọi là overdispersion (quá phân tán).
Kiểm tra overdispersion:
Hệ số phân tán ước lượng được tính theo công thức:
\[ \hat{\phi} = \frac{\text{Deviance}}{n - p} \]
\(n\): số quan sát
\(p\): số tham số trong mô hình
\(\Rightarrow\) Nếu:
\[ \hat{\phi} > 1.5 \]
→ Mô hình có thể bị overdispersed (quá phân tán)
\(\Rightarrow\) Trong trường hợp này, cần điều chỉnh mô hình, ví dụ:
Sử dụng quasi-Poisson
Hoặc Negative Binomial
Hồi quy logistic là một trong những mô hình phổ biến nhất thuộc họ GLM, được dùng để mô hình hóa dữ liệu nhị phân (binary), tức khi biến phản hồi
\[ y \in \{0,1\} \]
Ví dụ: bệnh/không bệnh, mua/không mua, đạt/không đạt.
Đặc điểm:
\[
\mu_i = E[y_i] = P(y_i=1) \in (0,1)
\]
Sử dụng hàm liên kết logit:
\[
g(\mu_i) = \log\left(\frac{\mu_i}{1-\mu_i}\right) = \eta_i = x_i^T \beta
\]
Biến phản hồi
\[
y_i \in \{0,1\}
\]
phân phối theo:
\[ y_i \sim \text{Bernoulli}(\pi_i) \]
Trong đó:
\[
\pi_i = P(y_i=1)
\]
và:
\[
\log\left(\frac{\pi_i}{1-\pi_i}\right) = x_i^T \beta
\]
Log-likelihood cho toàn bộ mẫu:
\[
\ell(\beta) = \sum_{i=1}^n \left[ y_i \log(\pi_i) + (1 - y_i)
\log(1-\pi_i) \right]
\]
Không có nghiệm giải tường minh → dùng IRLS để tìm \(\hat{\beta}\).
Khi dùng logit link:
\[
\eta_i = \log\left(\frac{\pi_i}{1-\pi_i}\right) = x_i^T \beta
\]
→ \(\beta_j\) đại diện cho log odds
ratio:
\[
\text{Odds ratio} = \exp(\beta_j)
\]
Nếu \(\beta_j > 0\): biến \(x_j\) làm tăng khả năng \(y=1\)
Nếu \(\beta_j < 0\): biến \(x_j\) làm giảm khả năng \(y=1\)
Sau khi ước lượng \(\hat{\beta}\), ta kiểm định từng hệ số:
Kiểm định Wald:
\[
Z_j = \frac{\hat{\beta}_j}{SE(\hat{\beta}_j)} \sim N(0,1)
\]
Khoảng tin cậy 95%:
\[
\hat{\beta}_j \pm z_{0.975} \cdot SE(\hat{\beta}_j)
\]
Chuyển sang odds ratio bằng
\[
\exp(\hat{\beta}_j)
\]
Deviance:
\[
D = -2 \left[ \ell(\hat{\beta}) - \ell_{\text{saturated}} \right]
\]
Kiểm định deviance giữa mô hình đầy đủ và mô hình rút gọn.
Pseudo-\(R^2\):
\[
R^2 = 1 - \frac{D_{\text{model}}}{D_{\text{null}}}
\]
Có thể mở rộng logistic regression để bao gồm nhiều biến giải thích:
\[ \log\left(\frac{\pi_i}{1-\pi_i}\right) = \beta_0 + \beta_1 x_{i1} + \cdots + \beta_p x_{ip} \]
→ Mô hình đa biến logistic.
Khi dữ liệu không phải từng quan sát riêng lẻ, mà là tổng hợp
\[
\frac{y_i}{n_i}
\]
ta dùng:
\[
y_i \sim \text{Binomial}(n_i, \pi_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 là một mô hình thuộc họ GLM, được sử dụng để mô hình hóa các biến phản hồi là số lượng sự kiện đếm được trên một đơn vị quan sát, chẳng hạn như:
Số lần nhập viện
Số vụ tai nạn giao thông
Số lỗi phần mềm phát sinh
Đặc biệt phù hợp khi:
Biến phản hồi \(y \in \{0, 1, 2, \ldots \}\)
Dữ liệu không âm, rời rạc
Mục tiêu là ước lượng số sự kiện trung bình theo các đặc tính \(x\)
Hàm xác suất:
\[
P(y_i) = \frac{e^{-\mu_i} \mu_i^{y_i}}{y_i!}, \quad y_i = 0, 1, 2,
\ldots
\]
Trong đó:
\[ \mu_i = E[y_i] : \text{số sự kiện kỳ vọng của quan sát thứ } i \]
\[ \text{Var}(y_i) = \mu_i \quad : \text{đặc điểm then chốt} \]
Hàm liên kết (canonical):
\[ \eta_i = \log(\mu_i) = x_i^T \beta \implies \mu_i = e^{x_i^T \beta} \]
Hàm log đảm bảo:
\[ \mu_i > 0 \]
Mối quan hệ tuyến tính trên log-scale.
Log-likelihood của mô hình:
\[ \ell(\beta) = \sum_{i=1}^n \left[ y_i \log(\mu_i) - \mu_i - \log(y_i!) \right] \]
Thay \(\mu_i = e^{x_i^T \beta}\), ta được:
\[ \ell(\beta) = \sum_{i=1}^n \left[ y_i x_i^T \beta - e^{x_i^T \beta} - \log(y_i!) \right] \]
Score function (đạo hàm log-likelihood):
\[ U(\beta) = \sum_{i=1}^n x_i (y_i - \mu_i) \]
Giải phương trình \(U(\beta) = 0\) → tìm \(\hat{\beta}\) bằng IRLS.
Trong hồi quy Poisson:
Mỗi \(\beta_j\) là tác động log tuyến tính đến số sự kiện trung bình.
\(e^{\beta_j}\) là tỷ lệ thay đổi kỳ vọng \(\mu\) khi \(x_j\) tăng 1 đơn vị, giữ các biến khác không đổi.
Ví dụ:
\(\beta_j = 0.693 \Rightarrow e^{0.693} = 2\): số sự kiện kỳ vọng gấp đôi khi \(x_j\) tăng 1 đơn vị.
\(\beta_j = -0.223\) → giảm khoảng 20%.
Offset là gì?
Khi quan sát không đồng nhất về thời gian/phạm vi, cần điều chỉnh bằng
offset.
Ví dụ:
Quan sát 1: 5 tai nạn trong 10 ngày
Quan sát 2: 2 tai nạn trong 2 ngày
Không thể so sánh số tuyệt đối → dùng tỷ lệ:
\[
\frac{\mu_i}{t_i} \implies \log(\mu_i) = \log(t_i) + x_i^T \beta
\]
Trong đó \(\log(t_i)\) là offset – không có hệ số, nhưng được đưa vào mô hình.
Trong lý thuyết:
\[ \mathrm{Var}(y_i) = \mu_i \]
Nhưng thực tế thường thấy:
\[ \mathrm{Var}(y_i) > \mu_i \quad \Rightarrow \quad \text{overdispersion} \]
Nguyên nhân do bỏ sót biến quan trọng, quá nhiều giá trị 0, hoặc biến động ngẫu nhiên vượt mức.
Hệ số phân tán:
\[ \hat{\phi} = \frac{\text{Deviance}}{n - p} \]
Nếu \(\hat{\phi} > 1.5\) thì đáng lo ngại.
Cách xử lý:
Sử dụng quasi-Poisson: điều chỉnh phương sai mà không thay đổi kỳ vọng.
Dùng Negative Binomial: thêm tham số \(\alpha\) để điều chỉnh phương sai.
Deviance: kiểm tra mức độ phù hợp của mô hình.
AIC: chọn mô hình tốt nhất.
Kiểm định deviance: so sánh hai mô hình lồng nhau.
Biểu đồ phần dư:
Residuals vs fitted
Deviance residuals
Cook’s distance
Kiểm định Pearson chi-square:
\[ X^2 = \sum_{i=1}^n \frac{(y_i - \mu_i)^2}{\mu_i} \quad \Rightarrow \quad X^2 \sim \chi^2_{n-p} \]
Mô hình | Khi nào dùng |
---|---|
Poisson | Dữ liệu đếm, phương sai gần bằng kỳ vọng (\(\mathrm{Var}(y) \approx E(y)\)) |
Quasi-Poisson | Khi có overdispersion nhẹ, giữ cùng hàm liên kết (link function) |
Negative Binomial | Khi overdispersion nặng hoặc dữ liệu có quá nhiều giá trị 0 |
Hồi quy Gamma là một mô hình thuộc họ GLM dùng để mô hình hóa các biến phản hồi dương liên tục có phương sai tăng theo giá trị trung bình.
Ví dụ ứng dụng:
Chi phí y tế
Thời gian sống (survival time)
Lượng tiêu thụ năng lượng
Giả định biến ngẫu nhiên \(y_i\) phân phối Gamma với tham số:
\[ y_i \sim Gamma(\alpha, \mu_i) \]
Trong đó:
\(\mu_i = E[y_i]\) là kỳ vọng.
Phương sai:
\[
Var(y_i) = \frac{\mu_i^2}{\alpha} = \phi \mu_i^2
\]
Phương sai tỷ lệ với bình phương kỳ vọng, phù hợp khi biến thiên tỷ lệ không đổi.
Hàm mật độ xác suất:
\[ f(y; \mu, \phi) = \frac{1}{\Gamma(1/\phi)} \left(\frac{1}{\phi \mu}\right)^{1/\phi} y^{\frac{1}{\phi}-1} \exp\left(-\frac{y}{\phi \mu}\right) \]
Hàm này thuộc họ hàm mũ (exponential family), với:
\[ \theta = -\frac{1}{\mu} \]
\[ b(\theta) = -\log(-\theta) \]
Hàm phương sai:
\[ V(\mu) = \mu^2 \]
\(\phi\) là tham số phân tán.
Mặc định trong GLM:
\[ g(\mu_i) = \log(\mu_i) = \eta_i = x_i^T \beta \]
Các tùy chọn khác:
Identity: \(g(\mu) = \mu\)
Inverse: \(g(\mu) = \frac{1}{\mu}\)
Link log được dùng phổ biến nhất vì đảm bảo \(\mu > 0\).
Ước lượng tham số \(\beta\) bằng phương pháp hợp lý tối đa (MLE) qua thuật toán IRLS.
Hàm log-likelihood:
\[ \ell(\beta) = \sum_{i=1}^n \left[-\log(\mu_i) - \frac{y_i}{\mu_i} \right] + \text{hằng số} \]
với:
\[ \mu_i = e^{x_i^T \beta} \]
Phương trình điểm:
\[ \frac{\partial \ell}{\partial \beta} = \sum_{i=1}^n x_i \left( y_i - \frac{\mu_i}{\mu_i^2} \cdot \frac{d\mu_i}{d\eta_i} \right) = 0 \]
Dùng IRLS để giải phương trình và tìm nghiệm \(\hat{\beta}\).
Với link log:
\[ \log(\mu_i) = \beta_0 + \beta_1 x_{i1} + \cdots + \beta_p x_{ip} \implies \mu_i = e^{x_i^T \beta} \]
Mỗi hệ số \(\beta_j\) được hiểu là tác động trên log-scale, nghĩa là ảnh hưởng đến log của kỳ vọng trung bình.
\[ e^{\beta_j} \]
tức là hệ số tỷ lệ thay đổi của \(\mu\).
\[ Z_j = \frac{\hat{\beta}_j}{SE(\hat{\beta}_j)} \sim \mathcal{N}(0,1) \]
\[ \hat{\beta}_j \pm z_{\alpha/2} \cdot SE(\hat{\beta}_j) \]
\[ \left(e^{\hat{\beta}_j - z_{\alpha/2} SE(\hat{\beta}_j)}, \quad e^{\hat{\beta}_j + z_{\alpha/2} SE(\hat{\beta}_j)} \right) \]
\[ D = 2 \sum_{i=1}^n \left[ \frac{y_i - \mu_i}{\mu_i} - \log\left(\frac{y_i}{\mu_i}\right) \right] \]
\[ X^2 = \sum_{i=1}^n \left( \frac{y_i - \mu_i}{\mu_i} \right)^2 \]
Hai chỉ số này dùng để đánh giá độ phù hợp của mô hình và phát hiện hiện tượng overdispersion nếu có.
Mô hình | Khi dùng |
---|---|
Hồi quy tuyến tính | Khi dữ liệu phân phối chuẩn, phương sai không đổi |
Hồi quy Gamma | Khi 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(y)\) phân phối chuẩn (sau biến đổi log) |
Dữ liệu nhị phân dạng 0/1 được mô hình hóa bằng hồi quy logistic. Tuy nhiên, nếu dữ liệu có dạng tổng hợp (grouped) hoặc thể hiện dưới dạng tỷ lệ, ví dụ:
20 thành công trong 30 thử nghiệm → \(y = 20, n = 30\)
Tỷ lệ mắc bệnh ở mỗi quận
Tỷ lệ sinh viên đậu trong từng lớp
→ Cần dùng GLM dạng nhị thức tổng quát (binomial GLM), áp dụng cho số lần thành công trên số lần thử.
Với \(y_i \sim \text{Binomial}(n_i, \pi_i)\), ta mô hình hóa:
\[ \log \left(\frac{\pi_i}{1 - \pi_i}\right) = \eta_i = x_i^T \beta \implies \pi_i = \frac{e^{x_i^T \beta}}{1 + e^{x_i^T \beta}} \]
Trong đó:
\(y_i\): số thành công trong nhóm \(i\)
\(n_i\): tổng số thử nghiệm trong nhóm \(i\)
\(\pi_i\): xác suất thành công
\(\mu_i = E[y_i] = n_i \pi_i\)
\(\text{Var}(y_i) = n_i \pi_i (1 - \pi_i)\)
→ Phù hợp cho dữ liệu dạng “n trials, k successes”.
Hàm log-likelihood:
\[ \ell(\beta) = \sum_{i=1}^n \left[ y_i \log(\pi_i) + (n_i - y_i) \log(1 - \pi_i) \right] \]
Tối đa hóa log-likelihood bằng IRLS (như logistic), nhưng có thêm yếu tố \(n_i\).
Biến giả và trọng số:
\[ w_i = n_i \pi_i (1 - \pi_i) \]
\[ z_i = \eta_i + \frac{y_i - n_i \pi_i}{n_i \pi_i (1 - \pi_i)} \]
Dạng dữ liệu | Mô hình tương ứng | Ghi chú |
---|---|---|
0/1 từng cá nhân | Hồi quy logistic | \(y_i \sim \text{Bernoulli}(\pi_i)\) |
Nhóm nhiều cá nhân | Binomial GLM với \(y_i / n_i\) | \(y_i \sim \text{Binomial}(n_i, \pi_i)\) |
→ Mô hình nhóm cho kết quả ước lượng chính xác hơn vì dùng nhiều thông tin hơn trên mỗi quan sát.
Nếu \(y_i / n_i\) được ghi dưới dạng tỷ lệ (0 < tỷ lệ < 1), ta vẫn dùng mô hình:
\[ \log \left(\frac{y_i / n_i}{1 - y_i / n_i}\right) = x_i^T \beta \]
→ Nhưng phải chỉ rõ số lần thử \(n_i\) để tính đúng phương sai.
Wald test cho các hệ số
Kiểm định deviance giữa mô hình đầy đủ và rút gọn
AIC/BIC để chọn mô hình
Phần dư Pearson / deviance để phát hiện điểm bất thường
Giống hồi quy logistic, mô hình binomial giả định:
\[ \text{Var}(y_i) = n_i \pi_i (1 - \pi_i) \]
Nếu thấy phương sai quan sát lớn hơn → overdispersion.
Kiểm tra:
\[ \hat{\phi} = \frac{\text{Deviance}}{n - p} \]
→ Nếu \(\hat{\phi} > 1.5\): cần chuyển sang mô hình quasi-binomial
Mô hình Tweedie GLM mở rộng họ hàm mũ bằng cách cho phép phân phối có đặc điểm trung gian giữa các phân phối quen thuộc như:
Gaussian
Poisson
Gamma
Inverse Gaussian
Mô hình Tweedie phù hợp với các loại dữ liệu có đặc điểm:
Liên tục dương + rất nhiều giá trị 0
(ví dụ: dữ liệu chi phí, có người không tiêu dùng)
Phân tán quá mức (overdispersion)
Có cả phần rời rạc (0, 1, 2, …) lẫn liên tục dương
→ Ứng dụng rộng rãi trong bảo hiểm, tài chính, y tế, và các bài toán zero-inflated data.
Tweedie là một lớp phân phối thuộc họ hàm mũ (exponential family), với hàm phương sai có dạng:
\[ \text{Var}(Y) = \phi \mu^p \]
Trong đó:
\(\mu = \mathbb{E}[Y]\): kỳ vọng
\(\phi > 0\): hệ số phân tán
\(p\): chỉ số sức mạnh (power index)
\(p\) | Phân phối tương ứng |
---|---|
0 | Gaussian (Normal) |
1 | Poisson |
\((1, 2)\) | Tweedie hỗn hợp (0 + dương liên tục) |
2 | Gamma |
3 | Inverse Gaussian |
→ Với \(1 < p < 2\), mô hình Tweedie hỗn hợp có thể:
Tái hiện được số lượng lớn giá trị 0
Mô hình hóa được giá trị dương liên tục
Rất phù hợp cho các bài toán như chi phí bảo hiểm, tổn thất, dữ liệu có số 0 và giá trị tiền tệ.
Tệp Supermarket Transactions ở định dạng CSV, ta lưu toàn bộ dữ liệu vào biến data. Nhờ vậy, ta có thể dễ dàng sử dụng data để xử lý và phân tích sau này.
library(readr)
## Warning: package 'readr' was built under R version 4.3.3
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.3.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
library(skimr)
library(psych)
## Warning: package 'psych' was built under R version 4.3.3
library(csv)
## Warning: package 'csv' was built under R version 4.3.3
library(dplyr)
library(ggplot2)
##
## Attaching package: 'ggplot2'
## The following objects are masked from 'package:psych':
##
## %+%, alpha
library(summarytools)
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.3.3
## Warning: package 'lubridate' was built under R version 4.3.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ lubridate 1.9.3 ✔ tibble 3.2.1
## ✔ purrr 1.0.2 ✔ tidyr 1.3.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ ggplot2::%+%() masks psych::%+%()
## ✖ ggplot2::alpha() masks psych::alpha()
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ✖ tibble::view() masks summarytools::view()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(lubridate)
library(scales)
##
## Attaching package: 'scales'
##
## The following object is masked from 'package:purrr':
##
## discard
##
## The following objects are masked from 'package:psych':
##
## alpha, rescale
##
## The following object is masked from 'package:readr':
##
## col_factor
data <- read.csv("C:/Users/ASUS/Downloads/Supermarket Transactions.csv", header = T)
Bộ dữ liệu Supermarket Transactions ghi lại các giao dịch mua hàng tại một hệ thống siêu thị, kèm theo thông tin khách hàng, địa lý, và chi tiết sản phẩm.
Nó có thể dùng để phân tích hành vi mua sắm, phân khúc khách hàng, hoặc hiệu suất kinh doanh theo sản phẩm, khu vực, nhân khẩu học.
Tên của các biến trong bộ dữ liệu sẽ bao gồm:
names(data)
## [1] "X" "PurchaseDate" "CustomerID"
## [4] "Gender" "MaritalStatus" "Homeowner"
## [7] "Children" "AnnualIncome" "City"
## [10] "StateorProvince" "Country" "ProductFamily"
## [13] "ProductDepartment" "ProductCategory" "UnitsSold"
## [16] "Revenue"
Cụ thể từng các biến và quan sát có ý nghĩa như sau:
variable_description <- data.frame(
Variable = c(
"Unnamed: 0", "PurchaseDate", "CustomerID", "Gender", "MaritalStatus",
"Homeowner", "Children", "AnnualIncome", "City", "StateorProvince",
"Country", "ProductFamily", "ProductDepartment", "ProductCategory",
"UnitsSold", "Revenue"
),
Description = c(
"Ma dong (co the bo qua)",
"Ngay mua hang",
"ID khach hang",
"Gioi tinh (F: nu, M: nam)",
"Tinh trang hon nhan (S: doc than, M: da ket hon)",
"So huu nha (Y: co, N: khong)",
"So con trong gia dinh",
"Thu nhap hang nam (theo nhom)",
"Thanh pho sinh song",
"Bang / tinh",
"Quoc gia",
"Nhom san pham chinh (Food, Drink, ...)",
"Phong ban san pham (Snacks, Produce, ...)",
"Danh muc san pham cu the",
"So luong san pham da ban",
"Doanh thu tu giao dich (USD)"
),
stringsAsFactors = FALSE
)
library(knitr)
kable(variable_description, col.names = c("Bien", "Mo ta"))
Bien | Mo ta |
---|---|
Unnamed: 0 | Ma dong (co the bo qua) |
PurchaseDate | Ngay mua hang |
CustomerID | ID khach hang |
Gender | Gioi tinh (F: nu, M: nam) |
MaritalStatus | Tinh trang hon nhan (S: doc than, M: da ket hon) |
Homeowner | So huu nha (Y: co, N: khong) |
Children | So con trong gia dinh |
AnnualIncome | Thu nhap hang nam (theo nhom) |
City | Thanh pho sinh song |
StateorProvince | Bang / tinh |
Country | Quoc gia |
ProductFamily | Nhom san pham chinh (Food, Drink, …) |
ProductDepartment | Phong ban san pham (Snacks, Produce, …) |
ProductCategory | Danh muc san pham cu the |
UnitsSold | So luong san pham da ban |
Revenue | Doanh thu tu giao dich (USD) |
dim(data)
## [1] 14059 16
Để có cái nhìn tổng quát hơn về cấu trúc tổng thể của bộ dữ liệu, ta thực hiện việc kiểm tra các thành phần cơ bản như số lượng biến, kiểu dữ liệu của từng biến, cũng như một số thông tin tổng quan khác.
str(data)
## 'data.frame': 14059 obs. of 16 variables:
## $ X : int 1 2 3 4 5 6 7 8 9 10 ...
## $ PurchaseDate : chr "2007-12-18" "2007-12-20" "2007-12-21" "2007-12-21" ...
## $ 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 : num 27.38 14.9 5.52 4.44 14 ...
Bộ dữ liệu bao gồm cả biến định tính như thông tin định danh và phân loại khách hàng, không thể sử dụng trực tiếp trong các phép tính số học như biến định lượng (doanh thu, số lượng…). Vì vậy, khi thực hiện thống kê mô tả, cần phân biệt rõ hai loại biến để áp dụng phương pháp xử lý phù hợp và chính xác.
library(psych)
library(dplyr)
describe(select(data, UnitsSold, Revenue, Children))
## vars n mean sd median trimmed mad min max range skew
## UnitsSold 1 14059 4.08 1.17 4.00 4.08 1.48 1.00 8.0 7.00 0.01
## Revenue 2 14059 13.00 8.22 11.25 12.05 7.40 0.53 56.7 56.17 1.13
## Children 3 14059 2.53 1.49 3.00 2.53 1.48 0.00 5.0 5.00 -0.02
## kurtosis se
## UnitsSold -0.44 0.01
## Revenue 1.39 0.07
## Children -1.03 0.01
Nhận xét
UnitsSold: Mỗi giao dịch thường gồm khoảng 4 món; giá trị thấp nhất là 1, cao nhất là 8, nên lượng hàng mua khá ổn định và gần cân đối giữa các hóa đơn.
Revenue: Trung bình một hóa đơn vào khoảng 13 USD nhưng dao động khá rộng (từ chưa tới 1 USD đến gần 57 USD). Điều này cho thấy có nhiều hóa đơn nhỏ trong khi một số ít giao dịch có giá trị rất cao, làm phân bố lệch về phía phải.
Children: Khách hàng trung bình có khoảng 2–3 con; dữ liệu trải từ 0 đến 5 con và tương đối đối xứng, không xuất hiện giá trị cực đoan.
# Lấy tên các biến định tính
categorical_vars <- c(
"Gender", "MaritalStatus", "Homeowner", "AnnualIncome",
"City", "StateorProvince", "Country",
"ProductFamily", "ProductDepartment", "ProductCategory"
)
# Tạo bảng tần số cho từng biến
for (var in categorical_vars) {
cat("\n###", var, "\n")
print(table(data[[var]]))
cat("\n")
}
##
## ### Gender
##
## F M
## 7170 6889
##
##
## ### MaritalStatus
##
## M S
## 6866 7193
##
##
## ### Homeowner
##
## N Y
## 5615 8444
##
##
## ### AnnualIncome
##
## $10K - $30K $110K - $130K $130K - $150K $150K + $30K - $50K
## 3090 643 760 273 4601
## $50K - $70K $70K - $90K $90K - $110K
## 2370 1709 613
##
##
## ### 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
##
##
## ### StateorProvince
##
## BC CA DF Guerrero Jalisco OR Veracruz WA
## 809 2733 815 383 75 2262 464 4567
## Yucatan Zacatecas
## 654 1297
##
##
## ### Country
##
## Canada Mexico USA
## 809 3688 9562
##
##
## ### ProductFamily
##
## Drink Food Non-Consumable
## 1250 10153 2656
##
##
## ### 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
##
##
## ### 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ần suất và biểu đồ giới tính
gender_freq <- data %>% count(Gender)
gender_freq
## Gender n
## 1 F 7170
## 2 M 6889
# Biểu đồ
ggplot(gender_freq, aes(x = Gender, y = n, fill = Gender)) +
geom_col() +
labs(title = "Phân phối giới tính", x = "Giới tính", y = "Số lượng") +
theme_minimal()
Nhận xét
Tỷ lệ nam–nữ khá cân bằng; nữ chỉ nhỉnh hơn nam khoảng 2 %.
marital_freq <- data %>% count(MaritalStatus)
marital_freq
## MaritalStatus n
## 1 M 6866
## 2 S 7193
ggplot(marital_freq, aes(x = MaritalStatus, y = n, fill = MaritalStatus)) +
geom_col() +
labs(title = "Tình trạng hôn nhân", x = "Tình trạng", y = "Số lượng") +
theme_minimal()
Nhận xét
Người chưa kết hôn (S) hơi nhiều hơn người đã kết hôn (M); chênh lệch dưới 3 %.
homeowner_freq <- data %>% count(Homeowner)
homeowner_freq
## Homeowner n
## 1 N 5615
## 2 Y 8444
ggplot(homeowner_freq, aes(x = Homeowner, y = n, fill = Homeowner)) +
geom_col() +
labs(title = "Khách hàng có sở hữu nhà không?", x = "Homeowner", y = "Số lượng") +
theme_minimal()
Nhận xét
Đa số (≈ 60 %) là chủ sở hữu nhà; nhóm không sở hữu chiếm khoảng 40 %.
# Làm sạch biến AnnualIncome nếu cần
data$AnnualIncome <- gsub("\\$", "", data$AnnualIncome)
data$AnnualIncome <- gsub("\u2013", "-", data$AnnualIncome)
data$AnnualIncome <- trimws(data$AnnualIncome)
data$AnnualIncome <- as.factor(data$AnnualIncome)
# Tính tần suất và tỷ lệ phần trăm
income_table <- table(data$AnnualIncome)
income_prop <- prop.table(income_table)
# Kết hợp thành bảng
income_df <- data.frame(
Muc = names(income_table),
So_luong = as.vector(income_table),
Ty_le = round(100 * as.vector(income_prop), 2)
)
# Hiển thị bảng đẹp
kable(income_df, col.names = c("Mức thu nhập", "Số lượng", "Tỷ lệ (%)"))
Mức thu nhập | Số lượng | Tỷ lệ (%) |
---|---|---|
10K - 30K | 3090 | 21.98 |
110K - 130K | 643 | 4.57 |
130K - 150K | 760 | 5.41 |
150K + | 273 | 1.94 |
30K - 50K | 4601 | 32.73 |
50K - 70K | 2370 | 16.86 |
70K - 90K | 1709 | 12.16 |
90K - 110K | 613 | 4.36 |
Nhận xét
Phân bố lệch trái (skew về mức thu nhập thấp–trung bình): khoảng 55 % quan sát tập trung trong hai nhóm 10 K – 50 K.
Tỷ lệ giảm dần rõ rệt khi thu nhập vượt 70 K; nhóm 150 K + chỉ chiếm ~2 %.
Không có nhóm nào quá nhỏ tới mức < 1 %, nên biến vẫn đủ thông tin để phân tích; tuy vậy có thể cân nhắc gộp các nhóm thu nhập cao để đảm bảo kích thước mẫu nếu cần mô hình hoá chi tiết.
# Nếu muốn, có thể bỏ khoảng trắng dư và ép factor
data$City <- trimws(data$City)
data$City <- as.factor(data$City)
# Tính tần suất & tỷ lệ phần trăm
city_table <- table(data$City)
city_prop <- prop.table(city_table)
# Ghép thành data‑frame
city_df <- data.frame(
City = names(city_table),
So_luong = as.vector(city_table),
Ty_le = round(100 * as.vector(city_prop), 2),
row.names = NULL
)
# Hiển thị bảng đẹp
kable(city_df,
col.names = c("Thành phố", "Số lượng", "Tỷ lệ (%)"))
Thành phố | Số lượng | Tỷ lệ (%) |
---|---|---|
Acapulco | 383 | 2.72 |
Bellingham | 143 | 1.02 |
Beverly Hills | 811 | 5.77 |
Bremerton | 834 | 5.93 |
Camacho | 452 | 3.22 |
Guadalajara | 75 | 0.53 |
Hidalgo | 845 | 6.01 |
Los Angeles | 926 | 6.59 |
Merida | 654 | 4.65 |
Mexico City | 194 | 1.38 |
Orizaba | 464 | 3.30 |
Portland | 876 | 6.23 |
Salem | 1386 | 9.86 |
San Andres | 621 | 4.42 |
San Diego | 866 | 6.16 |
San Francisco | 130 | 0.92 |
Seattle | 922 | 6.56 |
Spokane | 875 | 6.22 |
Tacoma | 1257 | 8.94 |
Vancouver | 633 | 4.50 |
Victoria | 176 | 1.25 |
Walla Walla | 160 | 1.14 |
Yakima | 376 | 2.67 |
Nhận xét
Phân bố khá đa dạng: 6 / 20 thành phố chiếm > 40 % dữ liệu, nhưng không có thành phố nào vượt xa 10 %.
Salem và Tacoma nổi bật nhất; cụm 6 thành phố quanh mức ~6 % tạo mặt cắt thứ hai.
Nhiều thành phố có tỷ lệ rất nhỏ (< 1 %) → nếu mô hình hóa, nên cân nhắc gộp nhóm hoặc giữ dưới dạng “khác” để tránh hệ số không ổn định.
# Làm sạch nhẹ (bỏ khoảng trắng thừa) rồi ép factor
data$StateorProvince <- trimws(data$StateorProvince)
data$StateorProvince <- as.factor(data$StateorProvince)
# Tần suất & tỷ lệ
state_tab <- table(data$StateorProvince)
state_prop <- prop.table(state_tab)
# Kết hợp thành bảng
state_df <- data.frame(
Bang_Tinh = names(state_tab),
So_luong = as.vector(state_tab),
Ty_le = round(100 * as.vector(state_prop), 2),
row.names = NULL
)
# Hiển thị
kable(state_df,
col.names = c("Bang/Tỉnh", "Số lượng", "Tỷ lệ (%)"))
Bang/Tỉnh | Số lượng | Tỷ lệ (%) |
---|---|---|
BC | 809 | 5.75 |
CA | 2733 | 19.44 |
DF | 815 | 5.80 |
Guerrero | 383 | 2.72 |
Jalisco | 75 | 0.53 |
OR | 2262 | 16.09 |
Veracruz | 464 | 3.30 |
WA | 4567 | 32.48 |
Yucatan | 654 | 4.65 |
Zacatecas | 1297 | 9.23 |
Nhận xét
Phân bố dữ liệu không đều: ba bang WA, CA, OR chiếm gần 70 % mẫu (riêng WA đã hơn 1/3), trong khi các bang Mexico và Canada chỉ góp phần nhỏ. Một số bang như Jalisco xuất hiện rất ít (< 1 %), nên nếu mô hình hóa cần cân nhắc gộp vào nhóm “khác” để tránh độ tin cậy kém.
country_freq <- data %>% count(Country, sort = TRUE)
country_freq
## Country n
## 1 USA 9562
## 2 Mexico 3688
## 3 Canada 809
ggplot(country_freq, aes(x = reorder(Country, n), y = n)) +
geom_col(fill = "orange") +
coord_flip() +
labs(title = "Phân phối khách hàng theo quốc gia", x = "Quốc gia", y = "Số lượng") +
theme_minimal()
Nhận xét
USA chiếm tỷ trọng lớn nhất – khoảng 68 % mẫu ⇒ dữ liệu thiên mạnh về Hoa Kỳ.
Mexico đứng thứ hai, khoảng 26 %, đủ lớn để phân tích riêng.
Canada chỉ khoảng 6 % – nhóm nhỏ nhất nhưng vẫn > 5 %, có thể giữ nguyên hoặc gộp với “khác” tùy mục đích mô hình.
family_freq <- data %>% count(ProductFamily, sort = TRUE)
family_freq
## ProductFamily n
## 1 Food 10153
## 2 Non-Consumable 2656
## 3 Drink 1250
ggplot(family_freq, aes(x = reorder(ProductFamily, n), y = n)) +
geom_col(fill = "blue") +
coord_flip() +
labs(title = "Phân phối theo nhóm sản phẩm", x = "Nhóm sản phẩm", y = "Số lượng") +
theme_minimal()
Nhận xét
Food chiếm áp đảo – khoảng 72 % tổng số giao dịch, cho thấy danh mục thực phẩm là mảng kinh doanh chính.
Non-Consumable đứng thứ hai với ≈ 19 %; nhóm hàng phi tiêu dùng có quy mô đáng kể nhưng vẫn kém xa Food.
Drink chỉ ≈ 9 %, là phân khúc nhỏ nhất trong ba nhóm. → Phân bố khá lệch, tập trung mạnh vào sản phẩm thực phẩm; nếu cần phân tích chi tiết, nên kiểm tra thêm độ đa dạng và biên lợi nhuận giữa ba nhóm.
dept_freq <- data %>% count(ProductDepartment, sort = TRUE)
dept_freq
## ProductDepartment n
## 1 Produce 1994
## 2 Snack Foods 1600
## 3 Household 1420
## 4 Frozen Foods 1382
## 5 Baking Goods 1072
## 6 Canned Foods 977
## 7 Dairy 903
## 8 Health and Hygiene 893
## 9 Deli 699
## 10 Beverages 680
## 11 Baked Goods 425
## 12 Alcoholic Beverages 356
## 13 Snacks 352
## 14 Starchy Foods 277
## 15 Periodicals 202
## 16 Eggs 198
## 17 Breakfast Foods 188
## 18 Canned Products 109
## 19 Seafood 102
## 20 Meat 89
## 21 Checkout 82
## 22 Carousel 59
ggplot(dept_freq, aes(x = reorder(ProductDepartment, n), y = n)) +
geom_col(fill = "red") +
coord_flip() +
labs(title = "Phân phối theo phòng ban sản phẩm", x = "Phòng ban", y = "Số lượng") +
theme_minimal()
Nhận xét
Produce (rau tươi) chiếm nhiều nhất (~14%) → khách chuộng thực phẩm tươi.
Snack Foods & Frozen Foods đứng kế → món nhanh, tiện dụng rất hút khách.
Household > 10% → đồ dùng thiết yếu, thích hợp bán kèm.
Meat, Seafood, Periodicals… tỷ trọng nhỏ → chưa phải ưu tiên.
# Làm sạch biến ProductCategory nếu cần
data$ProductCategory <- trimws(data$ProductCategory)
data$ProductCategory <- as.factor(data$ProductCategory)
# Tính tần suất và tỷ lệ phần trăm
pc_table <- table(data$ProductCategory)
pc_prop <- prop.table(pc_table)
# Kết hợp thành bảng
pc_df <- data.frame(
ProductCategory = names(pc_table),
So_luong = as.vector(pc_table),
Ty_le = round(100 * as.vector(pc_prop), 2),
row.names = NULL
)
# Hiển thị bảng đẹp
kable(pc_df,
col.names = c("Danh mục sản phẩm", "Số lượng", "Tỷ lệ (%)"))
Danh mục sản phẩm | Số lượng | Tỷ lệ (%) |
---|---|---|
Baking Goods | 484 | 3.44 |
Bathroom Products | 365 | 2.60 |
Beer and Wine | 356 | 2.53 |
Bread | 425 | 3.02 |
Breakfast Foods | 417 | 2.97 |
Candles | 45 | 0.32 |
Candy | 352 | 2.50 |
Canned Anchovies | 44 | 0.31 |
Canned Clams | 53 | 0.38 |
Canned Oysters | 35 | 0.25 |
Canned Sardines | 40 | 0.28 |
Canned Shrimp | 38 | 0.27 |
Canned Soup | 404 | 2.87 |
Canned Tuna | 87 | 0.62 |
Carbonated Beverages | 154 | 1.10 |
Cleaning Supplies | 189 | 1.34 |
Cold Remedies | 93 | 0.66 |
Dairy | 903 | 6.42 |
Decongestants | 85 | 0.60 |
Drinks | 135 | 0.96 |
Eggs | 198 | 1.41 |
Electrical | 355 | 2.53 |
Frozen Desserts | 323 | 2.30 |
Frozen Entrees | 118 | 0.84 |
Fruit | 765 | 5.44 |
Hardware | 129 | 0.92 |
Hot Beverages | 226 | 1.61 |
Hygiene | 197 | 1.40 |
Jams and Jellies | 588 | 4.18 |
Kitchen Products | 217 | 1.54 |
Magazines | 202 | 1.44 |
Meat | 761 | 5.41 |
Miscellaneous | 42 | 0.30 |
Packaged Vegetables | 48 | 0.34 |
Pain Relievers | 192 | 1.37 |
Paper Products | 345 | 2.45 |
Pizza | 194 | 1.38 |
Plastic Products | 141 | 1.00 |
Pure Juice Beverages | 165 | 1.17 |
Seafood | 102 | 0.73 |
Side Dishes | 153 | 1.09 |
Snack Foods | 1600 | 11.38 |
Specialty | 289 | 2.06 |
Starchy Foods | 277 | 1.97 |
Vegetables | 1728 | 12.29 |
Nhận xét
Vegetables dẫn đầu (≈ 12 %) → khách rất chuộng thực phẩm tươi.
Snack Foods bám sát → nhu cầu đồ ăn nhanh, tiện lợi cao.
Dairy, Fruit, Meat cũng bán mạnh vì là hàng thiết yếu hằng ngày.
Canned Seafood và các nhóm lẻ (< 1 %) ít được mua.
# Danh sách các biến định tính
cat_vars <- c("Gender", "MaritalStatus", "Homeowner", "AnnualIncome",
"City", "StateorProvince", "Country",
"ProductFamily", "ProductDepartment", "ProductCategory")
# Hàm xử lý từng biến
cat_summary <- function(df, var) {
v <- trimws(df[[var]]) # loại bỏ khoảng trắng
v <- as.factor(v) # ép kiểu factor nếu chưa
tbl <- table(v, useNA = "ifany")
prop <- prop.table(tbl)
data.frame(
Bien = var,
Muc = names(tbl),
So_luong = as.vector(tbl),
Ty_le = round(100 * as.vector(prop), 2),
row.names = NULL,
stringsAsFactors = FALSE
)
}
# Áp dụng cho tất cả biến và nối thành 1 bảng lớn
big_tbl <- bind_rows(lapply(cat_vars, function(x) cat_summary(data, x)))
# (Tùy chọn) Sắp xếp theo biến rồi giảm dần số lượng
big_tbl <- big_tbl %>%
arrange(Bien, desc(So_luong))
# Hiển thị bảng thống kê
kable(big_tbl,
col.names = c("Biến", "Mức", "Số lượng", "Tỷ lệ (%)"),
caption = "Bảng thống kê mô tả cho tất cả biến định tính")
Biến | Mức | Số lượng | Tỷ lệ (%) |
---|---|---|---|
AnnualIncome | 30K - 50K | 4601 | 32.73 |
AnnualIncome | 10K - 30K | 3090 | 21.98 |
AnnualIncome | 50K - 70K | 2370 | 16.86 |
AnnualIncome | 70K - 90K | 1709 | 12.16 |
AnnualIncome | 130K - 150K | 760 | 5.41 |
AnnualIncome | 110K - 130K | 643 | 4.57 |
AnnualIncome | 90K - 110K | 613 | 4.36 |
AnnualIncome | 150K + | 273 | 1.94 |
City | Salem | 1386 | 9.86 |
City | Tacoma | 1257 | 8.94 |
City | Los Angeles | 926 | 6.59 |
City | Seattle | 922 | 6.56 |
City | Portland | 876 | 6.23 |
City | Spokane | 875 | 6.22 |
City | San Diego | 866 | 6.16 |
City | Hidalgo | 845 | 6.01 |
City | Bremerton | 834 | 5.93 |
City | Beverly Hills | 811 | 5.77 |
City | Merida | 654 | 4.65 |
City | Vancouver | 633 | 4.50 |
City | San Andres | 621 | 4.42 |
City | Orizaba | 464 | 3.30 |
City | Camacho | 452 | 3.22 |
City | Acapulco | 383 | 2.72 |
City | Yakima | 376 | 2.67 |
City | Mexico City | 194 | 1.38 |
City | Victoria | 176 | 1.25 |
City | Walla Walla | 160 | 1.14 |
City | Bellingham | 143 | 1.02 |
City | San Francisco | 130 | 0.92 |
City | Guadalajara | 75 | 0.53 |
Country | USA | 9562 | 68.01 |
Country | Mexico | 3688 | 26.23 |
Country | Canada | 809 | 5.75 |
Gender | F | 7170 | 51.00 |
Gender | M | 6889 | 49.00 |
Homeowner | Y | 8444 | 60.06 |
Homeowner | N | 5615 | 39.94 |
MaritalStatus | S | 7193 | 51.16 |
MaritalStatus | M | 6866 | 48.84 |
ProductCategory | Vegetables | 1728 | 12.29 |
ProductCategory | Snack Foods | 1600 | 11.38 |
ProductCategory | Dairy | 903 | 6.42 |
ProductCategory | Fruit | 765 | 5.44 |
ProductCategory | Meat | 761 | 5.41 |
ProductCategory | Jams and Jellies | 588 | 4.18 |
ProductCategory | Baking Goods | 484 | 3.44 |
ProductCategory | Bread | 425 | 3.02 |
ProductCategory | Breakfast Foods | 417 | 2.97 |
ProductCategory | Canned Soup | 404 | 2.87 |
ProductCategory | Bathroom Products | 365 | 2.60 |
ProductCategory | Beer and Wine | 356 | 2.53 |
ProductCategory | Electrical | 355 | 2.53 |
ProductCategory | Candy | 352 | 2.50 |
ProductCategory | Paper Products | 345 | 2.45 |
ProductCategory | Frozen Desserts | 323 | 2.30 |
ProductCategory | Specialty | 289 | 2.06 |
ProductCategory | Starchy Foods | 277 | 1.97 |
ProductCategory | Hot Beverages | 226 | 1.61 |
ProductCategory | Kitchen Products | 217 | 1.54 |
ProductCategory | Magazines | 202 | 1.44 |
ProductCategory | Eggs | 198 | 1.41 |
ProductCategory | Hygiene | 197 | 1.40 |
ProductCategory | Pizza | 194 | 1.38 |
ProductCategory | Pain Relievers | 192 | 1.37 |
ProductCategory | Cleaning Supplies | 189 | 1.34 |
ProductCategory | Pure Juice Beverages | 165 | 1.17 |
ProductCategory | Carbonated Beverages | 154 | 1.10 |
ProductCategory | Side Dishes | 153 | 1.09 |
ProductCategory | Plastic Products | 141 | 1.00 |
ProductCategory | Drinks | 135 | 0.96 |
ProductCategory | Hardware | 129 | 0.92 |
ProductCategory | Frozen Entrees | 118 | 0.84 |
ProductCategory | Seafood | 102 | 0.73 |
ProductCategory | Cold Remedies | 93 | 0.66 |
ProductCategory | Canned Tuna | 87 | 0.62 |
ProductCategory | Decongestants | 85 | 0.60 |
ProductCategory | Canned Clams | 53 | 0.38 |
ProductCategory | Packaged Vegetables | 48 | 0.34 |
ProductCategory | Candles | 45 | 0.32 |
ProductCategory | Canned Anchovies | 44 | 0.31 |
ProductCategory | Miscellaneous | 42 | 0.30 |
ProductCategory | Canned Sardines | 40 | 0.28 |
ProductCategory | Canned Shrimp | 38 | 0.27 |
ProductCategory | Canned Oysters | 35 | 0.25 |
ProductDepartment | Produce | 1994 | 14.18 |
ProductDepartment | Snack Foods | 1600 | 11.38 |
ProductDepartment | Household | 1420 | 10.10 |
ProductDepartment | Frozen Foods | 1382 | 9.83 |
ProductDepartment | Baking Goods | 1072 | 7.63 |
ProductDepartment | Canned Foods | 977 | 6.95 |
ProductDepartment | Dairy | 903 | 6.42 |
ProductDepartment | Health and Hygiene | 893 | 6.35 |
ProductDepartment | Deli | 699 | 4.97 |
ProductDepartment | Beverages | 680 | 4.84 |
ProductDepartment | Baked Goods | 425 | 3.02 |
ProductDepartment | Alcoholic Beverages | 356 | 2.53 |
ProductDepartment | Snacks | 352 | 2.50 |
ProductDepartment | Starchy Foods | 277 | 1.97 |
ProductDepartment | Periodicals | 202 | 1.44 |
ProductDepartment | Eggs | 198 | 1.41 |
ProductDepartment | Breakfast Foods | 188 | 1.34 |
ProductDepartment | Canned Products | 109 | 0.78 |
ProductDepartment | Seafood | 102 | 0.73 |
ProductDepartment | Meat | 89 | 0.63 |
ProductDepartment | Checkout | 82 | 0.58 |
ProductDepartment | Carousel | 59 | 0.42 |
ProductFamily | Food | 10153 | 72.22 |
ProductFamily | Non-Consumable | 2656 | 18.89 |
ProductFamily | Drink | 1250 | 8.89 |
StateorProvince | WA | 4567 | 32.48 |
StateorProvince | CA | 2733 | 19.44 |
StateorProvince | OR | 2262 | 16.09 |
StateorProvince | Zacatecas | 1297 | 9.23 |
StateorProvince | DF | 815 | 5.80 |
StateorProvince | BC | 809 | 5.75 |
StateorProvince | Yucatan | 654 | 4.65 |
StateorProvince | Veracruz | 464 | 3.30 |
StateorProvince | Guerrero | 383 | 2.72 |
StateorProvince | Jalisco | 75 | 0.53 |
# Tính thống kê mô tả đầy đủ theo từng biến định tính
descriptive_stats_full <- big_tbl %>%
group_by(Bien) %>%
summarise(
Mean = mean(So_luong, na.rm = TRUE),
StdDev = sd(So_luong, na.rm = TRUE),
Min = min(So_luong, na.rm = TRUE),
Q1 = quantile(So_luong, 0.25, na.rm = TRUE),
Median = quantile(So_luong, 0.5, na.rm = TRUE),
Q3 = quantile(So_luong, 0.75, na.rm = TRUE),
Max = max(So_luong, na.rm = TRUE))
# Hiển thị bảng đẹp
kable(descriptive_stats_full,
digits = 2,
col.names = c("Biến", "Trung bình", "Độ lệch chuẩn", "Min", "Q1", "Trung vị", "Q3", "Max"),
caption = "Thống kê mô tả đầy đủ số lượng các mức theo từng biến định tính")
Biến | Trung bình | Độ lệch chuẩn | Min | Q1 | Trung vị | Q3 | Max |
---|---|---|---|---|---|---|---|
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 |
Nhận xét
Annual Income hiện được ghi dưới dạng khoảng thu nhập (không phải con số USD thật), vì vậy những thống kê “mean = 1 757, sd = 1 511” thực ra là số lượt khách trong từng dải thu nhập. Bức tranh chính: khách tập trung nhiều nhất ở ngưỡng 30–50 k USD, kế đến là 10–30 k USD; nhóm ≥ 110 k USD chỉ chiếm tỷ trọng nhỏ.
City / State or Province / Country: lượng giao dịch phân bố rất không đều – vài thành phố/bang (Los Angeles, Seattle, Washington, California…) và quốc gia Hoa Kỳ chiếm phần lớn; các địa phương khác chỉ đóng góp rải rác.
Gender, Homeowner, Marital Status: hai nhóm trong mỗi biến gần như 50/50 → dữ liệu khá cân bằng giữa nam–nữ, độc thân–kết hôn, thuê nhà–sở hữu nhà.
Product Family / Department / Category: sự chênh lệch lớn: nhóm “Food” áp đảo, kế đến “Snack Foods”, “Dairy”, “Fruit”, “Meat”. Nhiều danh mục nhỏ (Candles, Electrical, Canned Clams…) < 1 % → không phải trọng tâm doanh thu.