Cuốn sách Generalized Linear Models With Examples in R do Peter K. Dunn và Gordon K. Smyth đồng tác giả là một tài liệu giảng dạy và tham khảo toàn diện về các mô hình thống kê, tập trung đặc biệt vào mô hình hồi quy tuyến tính và mô hình tuyến tính tổng quát (GLMs). Với cách tiếp cận thực tiễn, cuốn sách kết hợp hài hòa giữa lý thuyết thống kê, các phương pháp suy luận hiện đại, và minh họa bằng dữ liệu thực tế cùng các ứng dụng trong phần mềm R. Với triết lý “Tất cả các mô hình đều sai, nhưng một số mô hình có ích”, cuốn sách không chỉ cung cấp kiến thức thống kê kỹ thuật, mà còn định hướng người học phát triển năng lực tư duy phản biện và đánh giá mô hình một cách thực tế và linh hoạt.
Mục tiêu chính của sách là giúp người học phát triển tư duy mô hình hóa thống kê: từ việc hiểu cấu trúc và vai trò của mô hình, cách diễn giải các hệ số mô hình, đến việc kiểm tra giả định, chẩn đoán mô hình, lựa chọn mô hình phù hợp và đánh giá hiệu suất. Cuốn sách được trình bày theo lối dẫn dắt trực quan, thường xuyên sử dụng các biểu đồ minh họa và bài toán thực hành để khuyến khích người học tương tác với dữ liệu.
Bắt đầu từ những nền tảng cơ bản như trực quan hóa dữ liệu, mô hình hồi quy đơn giản, cho đến các chủ đề nâng cao như lý thuyết tiệm cận, mô hình phân tán hàm mũ, và ứng dụng GLMs cho dữ liệu nhị phân, dữ liệu đếm và dữ liệu liên tục dương, sách cung cấp một lộ trình học tập đầy đủ và mạch lạc.Ngoài ra, một điểm nổi bật của tài liệu là việc chú trọng đến việc chẩn đoán mô hình – một kỹ năng thiết yếu nhưng thường bị xem nhẹ – thông qua việc phân tích phần dư, khoảng cách Cook, biểu đồ Q-Q và nhiều công cụ đánh giá khác.
Cuốn sách đặc biệt phù hợp cho sinh viên và học viên các ngành kinh tế, y sinh, khoa học xã hội, kỹ thuật; các nhà phân tích dữ liệu, nhà nghiên cứu hoặc giảng viên cần một tài liệu bài bản và có chiều sâu và những người sử dụng R như một công cụ chính để xử lý và mô hình hóa dữ liệu.
Chương đầu tiên đóng vai trò định hướng cho toàn bộ nội dung của môn học và cung cấp nền tảng tri thức về cách hiểu và xử lý dữ liệu trong bối cảnh thống kê hiện đại. Thông qua việc giới thiệu khái niệm mô hình hồi quy, chương này không chỉ xây dựng kiến thức căn bản mà còn làm rõ tư duy thống kê cần thiết khi phân tích dữ liệu thực tế. Người đọc được dẫn dắt vào cách tiếp cận thực hành, nơi dữ liệu luôn phức tạp và không tuân theo các giả định lý tưởng. Do đó, chương 1 đặt nền móng về triết lý mô hình hóa, tầm quan trọng của mục tiêu phân tích, cũng như sự đánh đổi giữa tính chính xác và tính đơn giản trong việc xây dựng mô hình.
Chương này bao gồm các nội dung trọng tâm sau:
Giới thiệu về mô hình hồi quy
Diễn giải mô hình
Mục tiêu phân tích định hình mô hình
Cân bằng giữa độ chính xác và tính tiết kiệm
Thực nghiệm và quan sát
Nghiên cứu thực nghiệm:
Nghiên cứu quan sát:
Chương 1 giới thiệu dữ liệu ví dụ lungcap và các khái niệm thống kê cơ bản. Đồng thời, chương hướng dẫn sử dụng R để khám phá dữ liệu ban đầu với các thao tác như:
library(GLMsData)
và
data(lungcap)
.names()
), cấu trúc và mã hóa biến
yếu tố (head()
, contrasts()
).length()
, sum()
,
mean()
, median()
, sd()
,
var()
).plot()
,
ifelse()
, pch
, legend
.Chương sử dụng rộng rãi các hàm cơ bản của R trong môi trường base R,
kết hợp với gói GLMsData
để tải dữ liệu, nhằm hỗ trợ người
đọc làm quen với thao tác phân tích dữ liệu ban đầu.
Chương này mở đầu bằng việc giới thiệu mô hình hồi quy tuyến tính như một công cụ để mô tả mối quan hệ giữa một biến phụ thuộc (biến phản hồi) và một hoặc nhiều biến độc lập (biến giải thích). Ý tưởng cốt lõi là mô hình hóa giá trị trung bình của biến phản hồi dưới dạng một tổ hợp tuyến tính của các biến giải thích. Sai số (sự khác biệt giữa quan sát và giá trị dự báo) được giả định là ngẫu nhiên, có phân phối chuẩn và phương sai không đổi.
Nội dung chính của chương bao gồm:
Hồi quy tuyến tính đơn giản
Mô hình hồi quy tuyến tính đơn giản mô tả mối quan hệ giữa một biến phụ thuộc \(Y\) và một biến độc lập \(X\):
\[ Y_i = \beta_0 + \beta_1 X_i + \varepsilon_i \]
Trong đó:
Các hệ số được ước lượng bằng phương pháp bình phương tối thiểu (OLS) nhằm tối thiểu hóa:
\[ \sum_{i=1}^n (Y_i - \hat{Y}_i)^2 \]
Hồi quy tuyến tính đa biến
Khi có nhiều biến giải thích, mô hình được mở rộng và biểu diễn dưới dạng ma trận:
\[ \mathbf{Y} = \mathbf{X} \boldsymbol{\beta} + \boldsymbol{\varepsilon} \]
Trong đó:
Công thức ước lượng hệ số hồi quy:
\[ \hat{\boldsymbol{\beta}} = (\mathbf{X}^\top \mathbf{X})^{-1} \mathbf{X}^\top \mathbf{Y} \]
Ước lượng sai số và đánh giá mô hình
Một số đại lượng thống kê quan trọng:
Phân tích phương sai (ANOVA)
Phân tích phương sai giúp đánh giá mô hình:
Mục tiêu là kiểm định xem mô hình có giải thích được phương sai tốt hơn mô hình không biến hay không.
So sánh mô hình và các nguyên tắc
Mô hình lồng nhau: So sánh mô hình đơn giản với mô hình mở rộng
ANOVA tuần tự: Xác định xem việc thêm biến có cải thiện đáng kể hay không
Nguyên tắc xây dựng mô hình hợp lý:
Chương 2 giới thiệu cách sử dụng phần mềm R để xây dựng và phân tích mô hình hồi quy tuyến tính.
lm()
dùng để ước lượng mô hình.summary()
hiển thị hệ số hồi quy, sai số chuẩn,
\(R^2\) và các thống kê quan
trọng.anova()
thực hiện phân tích phương sai,
kiểm tra sự cải thiện khi thêm biến giải thích.resid()
, rstandard()
lấy phần dư
và phần dư chuẩn hóa.plot()
, qqnorm()
,
qqline()
giúp đánh giá giả định mô hình và phát hiện điểm
ngoại lệ.AIC()
tính tiêu chí Akaike để so sánh mô hình dựa
trên độ phức tạp và độ phù hợp.step()
hỗ trợ chọn biến tự động dựa trên tiêu chí
AIC.Chương 3 mở rộng kiến thức về mô hình hồi quy tuyến tính bằng cách tập trung vào công tác chẩn đoán mô hình, đánh giá mức độ phù hợp của mô hình với dữ liệu và xác định các vấn đề có thể ảnh hưởng đến độ chính xác hoặc ý nghĩa thống kê. Các công cụ phân tích phần dư, leverage, và biểu đồ chẩn đoán giúp xác định các điểm bất thường, sự vi phạm giả định và đưa ra giải pháp điều chỉnh. Ngoài ra, chương cũng trình bày các ứng dụng thực tế để minh họa rõ cách sử dụng mô hình hồi quy trong các tình huống cụ thể.
Nội dung chính bao gồm:
Thang đo dữ liệu: Tác động của kiểu thang đo (tỷ lệ, thứ bậc, danh mục) tới việc xây dựng và giải thích mô hình.
Phép xấp xỉ trong mô hình hóa: Các đơn giản hóa có chủ đích trong thống kê và nguy cơ sai lệch.
Leverage: Đại lượng đo lường mức độ ảnh hưởng của điểm quan sát tới giá trị dự báo, cùng với công thức đại số ma trận. Công thức ma trận để tính leverage:
\[ h_i = \mathbf{x}_i^\top (\mathbf{X}^\top \mathbf{X})^{-1} \mathbf{x}_i \]
Giá trị leverage cao cảnh báo điểm ngoại lai tiềm năng.
Phần dư và biểu đồ chẩn đoán:
Phân biệt phần dư
Phần dư chuẩn hóa và phần dư student hóa khác nhau ở cách điều chỉnh phương sai. Tránh nhầm lẫn để đưa ra đánh giá chính xác hơn về quan sát bất thường.
Biện pháp khắc phục khi vi phạm giả định Các phương pháp thường dùng bao gồm:
Chương sử dụng phần mềm R để minh họa các kỹ thuật chẩn đoán và xây dựng mô hình hồi quy tuyến tính như sau:
Các hàm R tiêu chuẩn:
lm()
để ước lượng mô hình hồi quy.summary()
để xem kết quả ước lượng chi tiết.anova()
thực hiện phân tích phương sai và so sánh mô
hình lồng nhau.rstandard()
,
cooks.distance()
, covratio()
,
dffits()
, dfbetas()
.qqnorm()
và
qqline()
.cor()
để tính ma trận tương quan.plot()
,
interaction.plot()
.extractAIC()
, drop1()
,
add1()
, step()
để chọn mô hình dựa trên AIC và
BIC.splines
.poly()
, ns()
,
bs()
để tạo cơ sở spline, giúp mô hình hóa quan hệ phi
tuyến.Chương 4 tập trung giới thiệu và phân tích phương pháp ước lượng khả năng lớn nhất (Maximum Likelihood Estimation - MLE) trong khuôn khổ Mô hình Hồi quy Tổng quát (Generalized Linear Models - GLMs).
Các nội dung chính bao gồm:
Tổng quan về MLE:
MLE tìm bộ tham số \(\boldsymbol{\beta}\) sao cho hàm khả năng
\(L(\boldsymbol{\beta}) = P(\text{dữ liệu}
\mid \boldsymbol{\beta})\) đạt cực đại.
Công thức:
\[
\hat{\boldsymbol{\beta}} = \arg \max_{\boldsymbol{\beta}}
L(\boldsymbol{\beta}) = \arg \max_{\boldsymbol{\beta}} \prod_{i=1}^n
f(y_i \mid \boldsymbol{\beta})
\] hoặc trong thực tế thường dùng log-likelihood:
\[
\ell(\boldsymbol{\beta}) = \sum_{i=1}^n \log f(y_i \mid
\boldsymbol{\beta})
\]
Tính chất của ước lượng MLE:
Mở rộng sang đa tham số:
Với mô hình có nhiều biến giải thích, ta tối ưu hàm khả năng đa biến
theo \(\boldsymbol{\beta} = (\beta_1, \beta_2,
\ldots, \beta_p)\).
Kiểm định giả thuyết dựa trên MLE:
Xây dựng khoảng tin cậy:
Khoảng tin cậy cho \(\beta_j\) thường
dựa trên phân phối chuẩn tiệm cận:
\[
\hat{\beta}_j \pm z_{\alpha/2} \cdot \text{SE}(\hat{\beta}_j)
\]
Tiêu chí lựa chọn mô hình:
Chương 4 là nền tảng lý thuyết quan trọng, mở rộng từ hồi quy tuyến tính sang các mô hình phức tạp hơn thông qua MLE.
Mặc dù Chương 4 không trình bày chi tiết mã R hay các gói R, việc ứng dụng các kỹ thuật và mô hình trong chương này được thực hiện phổ biến trong R thông qua:
Hàm glm()
trong base R: Đây là hàm
chính để ước lượng các Mô hình Hồi quy Tổng quát (GLMs), bao gồm các mô
hình sử dụng phương pháp MLE. Không cần cài thêm gói ngoài khi sử dụng
các mô hình GLM cơ bản.
Các gói R bổ trợ cho GLMs nâng cao: Ví dụ, trong
các chương sau (như Chương 9, Chương 10), gói MASS
được
dùng để phân tích các mô hình GLM cụ thể như GLM Nhị thức (binomial) và
GLM Nhị thức âm (negative binomial) với hàm glm.nb()
và các
công cụ hỗ trợ như dose.p()
.
Tóm lại, Chương 4 đóng vai trò giới thiệu cơ sở lý thuyết của phương
pháp MLE trong GLMs, còn việc thực hành và triển khai các mô hình dựa
trên MLE trong R được thể hiện trong các chương tiếp theo với hàm
glm()
và các gói chuyên dụng.
Chương 5 tập trung giới thiệu các Mô hình Phân tán Theo Hàm Mũ (Exponential Dispersion Models - EDMs), nền tảng lý thuyết quan trọng cho Mô hình Tuyến tính Tổng quát (Generalized Linear Models - GLMs).
Nội dung chính của chương bao gồm
Định nghĩa các phân phối EDM (Exponential Dispersion
Models):
Chương mô tả các phân phối phổ biến như Chuẩn, Nhị thức, Nhị thức Âm,
Poisson, Gamma, Inverse Gaussian, Tweedie. Mỗi phân phối được đặc trưng
bởi các thành phần quan trọng sau:
Độ lệch (Deviance):
Là thước đo dùng để đánh giá mức độ phù hợp của mô hình với dữ liệu quan
sát, điều chỉnh theo đặc điểm từng phân phối trong GLMs.
Độ lệch đơn vị (Unit Deviance):
Đo sự khác biệt giữa giá trị quan sát \(y\) và giá trị dự báo \(\mu\), với công thức chung tùy thuộc phân
phối. Ví dụ, trong phân phối Gamma, độ lệch có dạng:
\[
d(y, \mu) = 2 \left( \frac{y - \mu}{\mu} - \log\frac{y}{\mu} \right)
\]
Ước lượng xấp xỉ Saddlepoint:
Kỹ thuật toán học được sử dụng để xấp xỉ phân phối của các thống kê phức
tạp trong GLMs, giúp nâng cao độ chính xác của kiểm định và ước
lượng.
Thành phần hệ thống trong GLMs:
Offset:
Biến giải thích đặc biệt có hệ số cố định bằng 1, dùng để điều chỉnh mô
hình cho các biến quy mô hoặc thời gian mà không làm tăng số tham số cần
ước lượng.
Mặc dù Chương 5 chủ yếu trình bày lý thuyết nền tảng, việc ứng dụng các mô hình EDM cho GLMs trong thực tế được thực hiện qua các công cụ và gói R như sau:
Hàm glm()
trong base R: Là công cụ
chính để fit các mô hình GLM với nhiều phân phối khác nhau được giới
thiệu trong chương, thông qua đối số family
. Hàm này không
yêu cầu cài đặt thêm gói bên ngoài.
Các gói R bổ sung: Để mở rộng khả năng phân tích, một số gói được sử dụng trong các chương sau:
MASS
: Dùng cho GLM nhị thức (ví dụ Chương 9) với hàm
dose.p()
để tính ED50, và cho GLM nhị thức âm (Chương 10)
với hàm glm.nb()
.statmod
: Hỗ trợ fit GLM Tweedie (Chương 12) bằng cách
sử dụng family = tweedie()
trong glm()
.Tóm lại, lý thuyết từ Chương 5 là nền tảng quan trọng, còn việc thực thi các mô hình GLM dựa trên EDM được triển khai hiệu quả nhờ các hàm và gói R đã được chuẩn bị sẵn.
Chương 6 tập trung vào quá trình ước lượng các tham số trong mô hình tuyến tính tổng quát (GLMs), đặc biệt là hệ số hồi quy \(\beta\) và tham số phân tán \(\phi\).
Nội dung chính của chương bao gồm:
Ước lượng hệ số hồi quy \(\boldsymbol{\beta}\):
Quá trình ước lượng \(\boldsymbol{\beta}\) được trình bày dưới
dạng công thức ma trận, tương tự như hồi quy tuyến tính thông thường,
qua đó thể hiện sự tương đồng trong các bước ước lượng cục bộ.
Công thức ước lượng \(\boldsymbol{\beta}\) thường được biểu diễn
là:
\[
\hat{\boldsymbol{\beta}} = (\mathbf{X}^\top \mathbf{W}
\mathbf{X})^{-1} \mathbf{X}^\top \mathbf{W} \mathbf{z}
\]
trong đó \(\mathbf{W}\) là ma trận
trọng số và \(\mathbf{z}\) là biến phụ
thuộc giả lập trong thuật toán IRLS (Iteratively Reweighted Least
Squares).
Ước lượng tham số phân tán \(\phi\):
Tham số phân tán \(\phi\) có vai trò
quan trọng trong việc đánh giá độ chính xác của mô hình và các kiểm định
giả thuyết.
Có nhiều phương pháp ước lượng \(\phi\), ví dụ:
\[
\hat{\phi} = \frac{1}{n - p} \sum_{i=1}^n \frac{(y_i -
\hat{\mu}_i)^2}{V(\hat{\mu}_i)}
\]
trong đó \(n\) là số quan sát, \(p\) số biến giải thích, và \(V(\hat{\mu}_i)\) là hàm phương sai ứng với
giá trị dự báo \(\hat{\mu}_i\).
Tầm quan trọng của thứ tự đưa biến giải thích vào mô hình:
Khi phân tích bảng deviance, thứ tự các biến được đưa vào mô hình ảnh hưởng tới cách diễn giải vai trò của từng biến và quyết định lựa chọn biến quan trọng trong mô hình. Do đó, việc cân nhắc thứ tự biến là cần thiết để xây dựng mô hình chính xác và ý nghĩa.
Chương 6 cung cấp cái nhìn sâu sắc về quá trình ước lượng trong GLMs, liên hệ chặt chẽ với hồi quy tuyến tính qua công thức ma trận, đồng thời làm rõ vai trò và phương pháp ước lượng tham số phân tán \(\phi\). Bên cạnh đó, việc nhấn mạnh thứ tự biến trong phân tích deviance giúp người phân tích xây dựng và hiểu mô hình chính xác hơn. Đây là nền tảng vững chắc để áp dụng GLMs trong nghiên cứu thực tế và phát triển các kỹ thuật phân tích nâng cao.
Việc ước lượng các mô hình GLMs trong R chủ yếu được thực hiện qua
hàm glm()
trong base R mà không cần các gói bổ sung:
glm()
cho phép ước lượng hệ số hồi quy \(\beta\) và xử lý các phân phối phổ biến như
binomial, poisson, gaussian, quasibinomial, quasipoisson, Gamma,
inverse.gaussian, quasi,…glm()
mà không cần tải thêm gói ngoài.Chương 7 tập trung vào suy luận thống kê cho các tham số hồi quy trong mô hình tuyến tính tổng quát (GLMs), đặc biệt là các hệ số \(\beta\). Suy luận thống kê ở đây bao gồm việc kiểm định giả thuyết về các hệ số, ước lượng sai số chuẩn, xây dựng khoảng tin cậy, và đánh giá mức độ phù hợp của mô hình thông qua các bảng phân tích deviance. Trong GLMs, tham số phân tán \(\phi\) thể hiện sự biến thiên của dữ liệu so với mô hình. Nếu \(\phi\) được biết hoặc giả định cố định (ví dụ trong phân phối Poisson \(\phi = 1\)), các kiểm định thống kê thường dựa trên phân phối \(\chi^2\). Nếu \(\phi\) chưa biết, ta phải ước lượng nó, và các kiểm định có thể dựa trên phân phối F thay vì \(\chi^2\).
Nội dung chính chương này bao gồm:
Bảng phân tích deviance (Analysis of Deviance):
Deviance đo lường sự khác biệt giữa mô hình hiện tại và mô hình đầy đủ hoặc mô hình null, là công cụ quan trọng để đánh giá vai trò của các biến giải thích trong GLM.
Kiểm định Tỷ số Khả năng xảy ra (Likelihood Ratio Test - LRT):
Dùng để so sánh hai mô hình lồng nhau (nested), thống kê LRT dựa trên
chênh lệch deviance giữa hai mô hình:
\[
\Lambda = -2 \log \frac{L(\text{mô hình nhỏ})}{L(\text{mô hình lớn})}
= D_{\text{nhỏ}} - D_{\text{lớn}}
\]
với \(\Lambda \sim \chi^2_{\Delta
df}\), trong đó \(\Delta df\) là
sự chênh lệch bậc tự do giữa hai mô hình.
Ước lượng tham số và sai số chuẩn:
Các hệ số hồi quy \(\hat{\boldsymbol{\beta}}\) được ước lượng thông qua thuật toán IRLS. Sai số chuẩn \(SE(\hat{\beta}_j)\) phản ánh độ chính xác của các ước lượng này và được dùng trong kiểm định Wald.
Kiểm định Wald và khoảng tin cậy:
Tham số phân tán \(\phi\):
Nếu \(\phi\) biết hoặc giả định cố định (ví dụ Poisson \(\phi=1\)), các kiểm định dựa trên phân phối \(\chi^2\). Nếu \(\phi\) chưa biết và được ước lượng, kiểm định có thể sử dụng phân phối F thay vì \(\chi^2\).
Chương 7 sử dụng chủ yếu các hàm có sẵn trong R cơ bản (base R) để thực hiện suy luận thống kê cho GLMs:
Hàm glm()
(được giới thiệu ở Chương
6) để fit mô hình GLM.
Phân tích độ lệch (Analysis of Deviance):
Dùng hàm anova(model, test = "Chisq")
để tạo bảng phân tích
deviance và tính giá trị \(p\) dựa trên
phân phối \(\chi^2\).
Kiểm định Likelihood Ratio Test (LRT):
Tính giá trị \(p\) với hàm
pchisq()
.
Kiểm định Wald và tính khoảng tin cậy:
Sử dụng các hàm pnorm()
, qnorm()
để tính giá
trị \(p\) và xây dựng khoảng tin cậy
cho các tham số.
Tóm lại, Chương 7 minh họa việc sử dụng các hàm cơ bản của R để thực hiện suy luận thống kê trong GLMs một cách hiệu quả và rõ ràng, không cần đến gói bổ sung nào trong nội dung này.
Chương này tập trung vào việc đánh giá độ phù hợp và chất lượng của mô hình GLM thông qua các kỹ thuật chẩn đoán.
Nội dung chính của chương bao gồm:
Phần dư trong GLMs:
Phần dư thông thường \(r_i = y_i - \hat{\mu}_i\) không đủ để đánh giá chính xác do phương sai phụ thuộc vào giá trị dự báo \(\hat{\mu}_i\). Vì vậy, sử dụng các loại phần dư đặc biệt như:
Phần dư deviance chuẩn hóa:
\[
r_i^{(D)} = \frac{d_i}{\sqrt{\hat{\phi} (1 - h_{ii})}}
\]
trong đó \(d_i\) là độ lệch deviance,
\(\hat{\phi}\) là tham số phân tán, và
\(h_{ii}\) là leverage.
Phần dư quantile: Giúp đánh giá tính đầy đủ của mô hình
và phân phối sai số.
Đồ thị chẩn đoán:
Các đồ thị như phần dư deviance chuẩn hóa, phần dư làm việc (working
residuals), và phần dư từng phần (partial residuals) được dùng để trực
quan hóa sự phù hợp của mô hình, phát hiện vi phạm giả định hoặc quan
sát bất thường.
Nhận diện quan sát gây ảnh hưởng:
Một số quan sát có thể ảnh hưởng lớn đến kết quả ước lượng hệ số. Các
chỉ số sau được sử dụng để xác định:
Chương 8 sử dụng chủ yếu các hàm có sẵn trong R cơ bản (base R) để thực hiện các phân tích chẩn đoán mô hình GLM:
Vẽ đồ thị chẩn đoán: Dùng hàm
plot(model)
để tạo các biểu đồ phần dư và kiểm tra sự phù
hợp của mô hình.
Biểu đồ Q-Q cho phần dư: Sử dụng
qqnorm(residuals(model, type = "deviance"))
kết hợp với
qqline(residuals(model, type = "deviance"))
để kiểm tra
phân phối của phần dư deviance.
Phần dư chuẩn hóa: Tính bằng hàm
rstandard(model)
để xác định các quan sát có phần dư bất
thường.
Chỉ số ảnh hưởng (influence measures): Sử dụng
cooks.distance(model)
để đo độ ảnh hưởng của từng quan sát.
Dùng influence.measures(model)
để nhận diện các quan sát có
ảnh hưởng lớn dựa trên nhiều chỉ số.
Fit lại mô hình khi loại bỏ quan sát có ảnh
hưởng: Sử dụng hàm
update(model, subset = -c(index_points))
.
Trích xuất hệ số hồi quy: Dùng
coef(model)
để lấy các hệ số ước lượng của mô
hình.
Bố trí đồ thị: Dùng
par(mfrow = c(2, 2))
để tạo nhiều biểu đồ trên một cửa sổ
đồ họa.
Chương 9 tập trung vào mô hình hóa dữ liệu dạng tỷ lệ hoặc số lần thành công trên tổng số lần thử bằng mô hình tuyến tính tổng quát với phân phối nhị thức (binomial GLM). Đây là dạng dữ liệu phổ biến trong nhiều lĩnh vực như sinh học, y học, kỹ thuật và khoa học xã hội.
Nội dung chính chương này bao gồm:
Dữ liệu và mô hình:
Suy luận thống kê:
Việc suy luận cho các tham số \(\boldsymbol{\beta}\) được thực hiện thông
qua các kiểm định như:
Chẩn đoán mô hình:
Các phần dư được sử dụng để kiểm tra sự phù hợp của mô hình bao gồm:
Ước lượng mô hình: Việc fit mô hình GLM nhị thức
chủ yếu dựa vào hàm glm()
trong R cơ bản (base R), không
yêu cầu cài đặt gói bổ sung cho phần chính của mô hình.
Các gói bổ sung
Gói GLMsData được sử dụng để tải các bộ dữ liệu minh họa trong các ví dụ, ví dụ:
Gói MASS (đi kèm với R nhưng cần gọi
library(MASS)
) được dùng cho các hàm chuyên biệt như
dose.p()
để tính toán liều hiệu quả trung bình
(ED50).
Các hàm R chính trong Chương 9
glm()
để fit mô hình GLM nhị thức.anova()
với đối số test = "Chisq"
để phân
tích deviance và kiểm định mô hình.plot()
, qqnorm()
,
rstandard()
, cooks.distance()
để đánh giá và
kiểm tra mô hình, thuộc R cơ bản hoặc các gói mặc định.library()
để tải các gói bổ trợ khi cần.Tóm lại, Chương 9 cung cấp nền tảng lý thuyết và thực hành cho việc xây dựng, suy luận và chẩn đoán mô hình GLM nhị thức, đồng thời hướng dẫn cách sử dụng các công cụ trong R để thực hiện các phân tích này hiệu quả.
Chương 10 trình bày cách mô hình hóa dữ liệu đếm thông qua các mô hình tuyến tính tổng quát với phân phối Poisson hoặc Nhị thức âm (Negative Binomial). Dữ liệu đếm rất phổ biến trong thực nghiệm và quan sát, như số ca bệnh, số sự kiện xảy ra hay số lượng cá thể.
Nội dung chính của chương bao gồm:
Mô hình Poisson GLM:
Mô hình Poisson thường được sử dụng khi biến phản hồi là số lượng đếm
với giả định phương sai bằng trung bình (equidispersion):
\[
Y_i \sim \text{Poisson}(\mu_i), \quad \text{với } \mathrm{E}[Y_i] =
\mathrm{Var}(Y_i) = \mu_i
\]
Hàm liên kết log được dùng phổ biến:
\[
\log(\mu_i) = \mathbf{x}_i^\top \boldsymbol{\beta}
\]
Hệ số hồi quy \(\beta_j\) được diễn
giải như tỷ lệ thay đổi trung bình khi biến giải thích tăng một đơn
vị:
\[
e^{\beta_j}
\]
Ví dụ, \(\beta_j = 1.05\) tương đương
tăng số lượng trung bình lên khoảng \(e^{1.05}
\approx 2.86\) lần.
Xử lý overdispersion:
Trong thực tế, dữ liệu đếm thường có phương sai lớn hơn trung bình
(overdispersion), làm cho mô hình Poisson không còn phù hợp. Các phương
pháp phổ biến để xử lý bao gồm:
Mô hình hóa bảng tần số:
Khi làm việc với bảng tần số, mô hình log-linear được dùng để kiểm tra
sự phụ thuộc giữa các biến thay vì chỉ quan tâm đến tổng biên. Ví dụ:
phân tích dữ liệu về thực phẩm biến đổi gen để kiểm tra tương tác giữa
thu nhập và thái độ người tiêu dùng.
Suy luận và chẩn đoán:
Ước lượng mô hình Poisson: Hàm
glm()
với đối số family = poisson
trong R cơ
bản (base R) được dùng để fit các mô hình Poisson GLM.
Mô hình Negative Binomial: Để fit mô hình
Negative Binomial, cần sử dụng gói MASS (đi kèm với R
nhưng phải gọi library(MASS)
).
Chương này mở rộng khuôn khổ GLM để xử lý các biến phản hồi là dữ liệu liên tục, dương với đặc điểm phương sai tăng theo trung bình. Các mô hình chính tập trung vào phân phối Gamma, Inverse Gaussian và một số trường hợp của phân phối Tweedie, thuộc họ Mô hình Phân tán Lũy thừa (Exponential Dispersion Models - EDM).
Mô hình Gamma GLM:
Kỹ thuật chẩn đoán mô hình:
Chương này cung cấp nền tảng vững chắc để phân tích các biến liên tục dương có phương sai tăng, mở rộng đáng kể phạm vi ứng dụng GLM trong thực tế thống kê với sự linh hoạt của các hàm liên kết và công cụ chẩn đoán quen thuộc.
Các hàm R chính trong Chương 11
glm()
để fit mô hình GLM với phân phối Gamma
(family = Gamma(link = "log")
) hoặc Inverse Gaussian
(family = inverse.gaussian(link = "log")
).summary()
để xem tóm tắt mô hình, bao gồm hệ số, sai số
chuẩn và kiểm định ý nghĩa.coef()
để trích xuất các hệ số từ mô hình.printCoefmat()
để hiển thị bảng hệ số có định dạng rõ
ràng.data()
để tải các tập dữ liệu ví dụ như
lime
, perm
, hoặc rrates
từ gói
GLMsData
.boxplot()
, plot()
để trực quan hóa dữ liệu
và kết quả mô hình.influence.measures()
để phân tích ảnh hưởng của các
điểm dữ liệu, bao gồm Cook’s distance (cook.d
).Chương này mở rộng mô hình GLM để xử lý biến phản hồi là dữ liệu liên tục dương, bao gồm cả trường hợp có giá trị bằng 0, bằng cách sử dụng phân phối Tweedie — một họ phân phối linh hoạt thuộc họ Mô hình Phân tán Lũy thừa (EDM).
Nội dung chính của chương bao gồm:
Phân phối Tweedie:
Phân phối Tweedie được đặc trưng bởi hàm phương sai:
\[
V(\mu) = \mu^\xi
\] với tham số chỉ mục \(\xi\)
(Tweedie index parameter).
Ý nghĩa các giá trị \(\xi\):
Mô hình GLM Tweedie:
Mô hình được xây dựng theo khuôn khổ GLM với:
\[
g(\mu_i) = \mathbf{x}_i^\top \boldsymbol{\beta}
\] trong đó \(g(\cdot)\) là hàm
liên kết phù hợp (thường là log).
Ước lượng tham số:
glm()
với tham số
family = tweedie()
(cần gói statmod
).var.power
.Chẩn đoán mô hình:
Chương này cho phép áp dụng GLM vào các tập dữ liệu thực tế phức tạp hơn, đặc biệt trong các lĩnh vực có dữ liệu dương kèm nhiều giá trị 0 như bảo hiểm, sinh học, và nghiên cứu tiêu dùng.
Các gói và hàm R chính trong Chương 12
glm()
kết hợp với family = tweedie()
để
fit mô hình GLM Tweedie. Hàm tweedie()
được cung cấp bởi
gói statmod
.tweedie.profile()
từ gói tweedie
để ước
lượng chỉ số Tweedie (ξ).data()
để tải các tập dữ liệu ví dụ như
breakdown
, poison
, polythene
,
gpsleep
, rrates
, perm
,
lime
, và quilpie
từ gói
GLMsData
.Cuốn sách này cung cấp một nền tảng vững chắc cả về lý thuyết và ứng dụng cho việc phân tích mô hình hồi quy tuyến tính và tuyến tính tổng quát bằng R. Với định hướng phát triển tư duy mô hình hóa, kỹ năng chẩn đoán và phản biện thống kê, đây là tài liệu lý tưởng cho những ai làm việc trong lĩnh vực phân tích dữ liệu thực nghiệm.
Tải dữ liệu
library("csv")
## Warning: package 'csv' was built under R version 4.4.3
library(data.table)
## Warning: package 'data.table' was built under R version 4.4.3
data <- read.csv("C:/Users/Admin/Downloads/Supermarket Transactions.csv", header = T)
data.table(data)
## X PurchaseDate CustomerID Gender MaritalStatus Homeowner Children
## <int> <char> <int> <char> <char> <char> <int>
## 1: 1 2007-12-18 7223 F S Y 2
## 2: 2 2007-12-20 7841 M M Y 5
## 3: 3 2007-12-21 8374 F M N 2
## 4: 4 2007-12-21 9619 M M Y 3
## 5: 5 2007-12-22 1900 F S Y 3
## ---
## 14055: 14055 2009-12-29 9102 F M Y 2
## 14056: 14056 2009-12-29 4822 F M Y 3
## 14057: 14057 2009-12-31 250 M S Y 1
## 14058: 14058 2009-12-31 6153 F S N 4
## 14059: 14059 2009-12-31 3656 M S N 3
## AnnualIncome City StateorProvince Country ProductFamily
## <char> <char> <char> <char> <char>
## 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
## ---
## 14055: $10K - $30K Bremerton WA USA Food
## 14056: $10K - $30K Walla Walla WA USA Food
## 14057: $30K - $50K Portland OR USA Drink
## 14058: $50K - $70K Spokane WA USA Drink
## 14059: $50K - $70K Portland OR USA Non-Consumable
## ProductDepartment ProductCategory UnitsSold Revenue
## <char> <char> <int> <num>
## 1: Snack Foods Snack Foods 5 27.38
## 2: Produce Vegetables 5 14.90
## 3: Snack Foods Snack Foods 3 5.52
## 4: Snacks Candy 4 4.44
## 5: Beverages Carbonated Beverages 4 14.00
## ---
## 14055: Baking Goods Baking Goods 3 9.64
## 14056: Frozen Foods Vegetables 3 7.45
## 14057: Beverages Pure Juice Beverages 4 3.24
## 14058: Dairy Dairy 2 4.00
## 14059: Household Electrical 5 25.53
Giải thích các biến
Bộ dữ liệu ghi lại thông tin về các giao dịch mua hàng của khách hàng, bao gồm thông tin nhân khẩu học, thông tin sản phẩm, số lượng bán ra và doanh thu. Dữ liệu bao gồm 14059 quan sát và 16 biến. Dưới đây là mô tả chi tiết các biến có trong bộ dữ liệu:
Tên Biến | Ý Nghĩa |
---|---|
PurchaseDate | Ngày giao dịch mua hàng diễn ra (định dạng ngày/tháng/năm). |
CustomerID | Mã định danh duy nhất cho mỗi khách hàng. |
Gender | Giới tính của khách hàng: M (Nam), F (Nữ). |
MaritalStatus | Tình trạng hôn nhân: S (Độc thân), M (Đã kết hôn). |
Homeowner | Tình trạng sở hữu nhà: Y (Có), N (Không). |
Children | Số lượng con cái của khách hàng. |
AnnualIncome | Mức thu nhập hàng năm theo khoảng (Ví dụ: $30K - $50K). |
City | Thành phố nơi khách hàng thực hiện giao dịch. |
StateorProvince | Bang hoặc tỉnh (ví dụ: CA cho California, OR cho Oregon). |
Country | Quốc gia. |
ProductFamily | Nhóm sản phẩm chính: Food (Thực phẩm), Drink (Đồ uống), Non-Consumable (Không tiêu dùng). |
ProductDepartment | Bộ phận sản phẩm như Snack Foods, Frozen Foods, v.v. |
ProductCategory | Danh mục sản phẩm cụ thể hơn, ví dụ: Candy, Beer and Wine. |
UnitsSold | Số lượng đơn vị sản phẩm đã bán trong giao dịch đó. |
Revenue | Doanh thu từ giao dịch (tính theo USD). |
Trước khi tiến hành thống kê mô tả các biến trong bộ dữ liệu, ta tiến hành phân loại dữ liệu thành 2 nhóm bao gồm: dữ liệu định tính và dữ liệu định lượng như sau:
Phân loại biến theo kiểu dữ liệu:
Dữ liệu Định tính:
Tên Biến | Ý Nghĩa |
---|---|
Gender | Giới tính của khách hàng: M (Nam), F (Nữ). |
MaritalStatus | Tình trạng hôn nhân: S (Độc thân), M (Đã kết hôn). |
Homeowner | Tình trạng sở hữu nhà: Y (Có), N (Không). |
AnnualIncome | Mức thu nhập hàng năm theo khoảng (Ví dụ: $30K - $50K). |
City | Thành phố nơi khách hàng thực hiện giao dịch. |
StateorProvince | Bang hoặc tỉnh (ví dụ: CA cho California, OR cho Oregon). |
Country | Quốc gia. |
ProductFamily | Nhóm sản phẩm chính: Food (Thực phẩm), Drink (Đồ uống), Non-Consumable (Không tiêu dùng). |
ProductDepartment | Bộ phận sản phẩm như Snack Foods, Frozen Foods, v.v. |
ProductCategory | Danh mục sản phẩm cụ thể hơn, ví dụ: Candy, Beer and Wine. |
Dữ liệu Định lượng:
Tên Biến | Ý Nghĩa |
---|---|
Children | Số lượng con cái của khách hàng. |
UnitsSold | Số lượng đơn vị sản phẩm đã bán trong giao dịch đó. |
Revenue | Doanh thu từ giao dịch (tính theo USD). |
Lập bảng tần số và tần suất
#Bảng tần số
table(data$Gender)
##
## F M
## 7170 6889
#Bảng tần suất
table(data$Gender)/sum(table(data$Gender))
##
## F M
## 0.5099936 0.4900064
Vẽ đồ thị
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.4.3
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.4.3
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:data.table':
##
## between, first, last
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
data %>%
group_by(Gender) %>%
summarise(n = n()) %>%
ggplot(aes(x = Gender, y = n)) +
geom_col(fill = "#89CFF0") +
geom_text(aes(label = n), vjust = -0.5, color = "black") +
theme_bw() +
labs(y = "Number")
Nhận xét: Dựa vào bảng tần số, tần suất và biểu đồ ta thấy được
Lập bảng tần số và tần suất
#Bảng tần số
table(data$MaritalStatus)
##
## M S
## 6866 7193
#Bảng tần suất
table(data$MaritalStatus)/sum(table(data$MaritalStatus))
##
## M S
## 0.4883704 0.5116296
Vẽ đồ thị
data %>%
group_by(MaritalStatus) %>%
summarise(n = n()) %>%
ggplot(aes(x = MaritalStatus, y = n)) +
geom_col(fill = "#FFDAB9", color = "black") +
geom_text(aes(label = n), vjust = -0.5, color = "black") +
labs( x = "Marital Status", y = "Number") +
theme_bw()
Nhận xét: Dựa vào bảng tần số, tần suất và biểu đồ ta thấy được
Lập bảng tần số và tần suất
#Bảng tần số
table(data$Homeowner)
##
## N Y
## 5615 8444
#Bảng tần suất
table(data$Homeowner)/sum(table(data$Homeowner))
##
## N Y
## 0.3993883 0.6006117
Vẽ đồ thị
data %>%
group_by(Homeowner) %>%
summarise(n = n()) %>%
ggplot(aes(x = Homeowner, y = n)) +
geom_col(fill = "#F08080", color = "black") +
geom_text(aes(label = n), vjust = -0.5, color = "black") +
labs( x = "Homeowner", y = "Number") +
theme_bw()
Nhận xét: Dựa vào bảng tần số, tần suất và biểu đồ ta thấy được
Lập bảng tần số và tần suất
#Bảng tần số
table(data$AnnualIncome)
##
## $10K - $30K $110K - $130K $130K - $150K $150K + $30K - $50K
## 3090 643 760 273 4601
## $50K - $70K $70K - $90K $90K - $110K
## 2370 1709 613
#Bảng tần suất
table(data$AnnualIncome)/sum(table(data$AnnualIncome))
##
## $10K - $30K $110K - $130K $130K - $150K $150K + $30K - $50K
## 0.21978804 0.04573583 0.05405790 0.01941817 0.32726367
## $50K - $70K $70K - $90K $90K - $110K
## 0.16857529 0.12155914 0.04360196
Vẽ đồ thị
data %>%
group_by(AnnualIncome) %>%
summarise(n = n()) %>%
ggplot(aes(x = AnnualIncome, y = n)) +
geom_col(fill = "#F08080", color = "black") +
geom_text(aes(label = n), vjust = -0.5, color = "black") +
labs( x = "AnnualIncome", y = "Number") +
theme_bw()
Nhận xét: Dựa vào bảng tần số, tần suất và biểu đồ ta thấy được
Nhóm thu nhập thấp nhất: Khoảng $10K - $30K chiếm tỷ lệ đáng kể với 3090 khách hàng, tương đương khoảng 21.98% tổng số khách hàng. Đây là nhóm thu nhập thấp nhất được ghi nhận và chiếm hơn một phần năm tổng số khách hàng.
Nhóm thu nhập thấp trung bình: Tiếp theo là khoảng $30K - $50K, đây là nhóm có số lượng khách hàng lớn nhất với 4601 người, chiếm khoảng 32.73%. Điều này cho thấy đây là mức thu nhập phổ biến nhất trong tập khách hàng.
Nhóm thu nhập trung bình: Khoảng $50K - $70K có 2370 khách hàng, chiếm khoảng 16.86%. Đây là nhóm thu nhập trung bình, thấp hơn đáng kể so với hai nhóm thu nhập thấp hơn.
Các nhóm thu nhập trung bình cao:
Nhóm thu nhập cao: Khoảng $130K - $150K có 760 khách hàng, chiếm khoảng 5.41%. Số lượng khách hàng ở nhóm thu nhập này có sự tăng nhẹ so với khoảng $110K - $130K.
Nhóm thu nhập cao nhất: Cuối cùng, khoảng thu nhập $150K+ chỉ có 273 khách hàng, chiếm tỷ lệ rất nhỏ, khoảng 1.94%. Đây là nhóm khách hàng có thu nhập cao nhất nhưng lại chiếm phần trăm ít nhất trong tập dữ liệu.
Tổng quan:
Phân bố thu nhập của tập khách hàng này cho thấy sự tập trung đáng kể ở các mức thu nhập thấp và trung bình ($10K - $50K), chiếm hơn một nửa tổng số khách hàng. Khi mức thu nhập tăng dần, số lượng và tỷ lệ khách hàng có xu hướng giảm, đặc biệt là ở các khoảng thu nhập trên $90K. Nhóm khách hàng có thu nhập cao nhất ($150K+) chỉ chiếm một phần rất nhỏ.
Lập bảng tần số và tần suất
#Bảng tần số
table(data$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
#Bảng tần suất
table(data$City)/sum(table(data$City))
##
## Acapulco Bellingham Beverly Hills Bremerton Camacho
## 0.027242336 0.010171420 0.057685468 0.059321431 0.032150224
## Guadalajara Hidalgo Los Angeles Merida Mexico City
## 0.005334661 0.060103848 0.065865282 0.046518245 0.013798990
## Orizaba Portland Salem San Andres San Diego
## 0.033003770 0.062308841 0.098584537 0.044170994 0.061597553
## San Francisco Seattle Spokane Tacoma Vancouver
## 0.009246746 0.065580767 0.062237712 0.089408920 0.045024539
## Victoria Walla Walla Yakima
## 0.012518671 0.011380610 0.026744434
Vẽ đồ thị
library(ggplot2)
library(dplyr)
library(patchwork)
## Warning: package 'patchwork' was built under R version 4.4.3
# Giả sử 'data' là data frame của bạn
city_counts <- data %>%
group_by(City) %>%
summarise(n = n()) %>%
arrange(desc(n)) # Sắp xếp theo số lượng giảm dần
n_cities <- nrow(city_counts)
mid_point <- ceiling(n_cities / 2)
# Dữ liệu cho biểu đồ thứ nhất (nửa trên theo số lượng)
top_half_cities <- head(city_counts, mid_point)
plot1_city_count <- ggplot(top_half_cities, aes(x = City, y = n)) +
geom_col(fill = "#DB7093", color = "black") +
geom_text(aes(label = n), vjust = -0.5, color = "black", size = 2.5) +
labs(x = "City", y = "Number") +
theme_bw() +
theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 8))
# Dữ liệu cho biểu đồ thứ hai (nửa dưới theo số lượng)
bottom_half_cities <- tail(city_counts, n_cities - mid_point)
plot2_city_count <- ggplot(bottom_half_cities, aes(x = City, y = n)) +
geom_col(fill = "#DB7093", color = "black") +
geom_text(aes(label = n), vjust = -0.5, color = "black", size = 2.5) +
labs(x = "City", y = "Number") +
theme_bw() +
theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 8))
# Kết hợp hai biểu đồ lại với nhau
plot1_city_count + plot2_city_count
Nhận xét: Dựa vào bảng tần số, tần suất và biểu đồ ta thấy được
Các thành phố có số lượng giao dịch lớn:
Các thành phố có số lượng giao dịch trung bình:
Các thành phố có số lượng giao dịch thấp:
Tổng quan:
Phân tích cho thấy sự phân bố giao dịch không đồng đều giữa các thành phố. Một số thành phố như Vancouver và Tacoma chiếm tỷ lệ giao dịch cao nhất, cho thấy đây có thể là các thị trường quan trọng hoặc có lượng khách hàng hoạt động lớn hơn. Ngược lại, một số thành phố khác như Guadalajara và Victoria có số lượng giao dịch rất thấp.
Lập bảng tần số và tần suất
#Bảng tần số
table(data$StateorProvince)
##
## BC CA DF Guerrero Jalisco OR Veracruz WA
## 809 2733 815 383 75 2262 464 4567
## Yucatan Zacatecas
## 654 1297
#Bảng tần suất
table(data$StateorProvince)/sum(table(data$StateorProvince))
##
## BC CA DF Guerrero Jalisco OR
## 0.057543211 0.194395049 0.057969984 0.027242336 0.005334661 0.160893378
## Veracruz WA Yucatan Zacatecas
## 0.033003770 0.324845295 0.046518245 0.092254072
Vẽ đồ thị
data %>%
group_by(StateorProvince) %>%
summarise(n = n()) %>%
ggplot(aes(x = StateorProvince, y = n)) +
geom_col(fill = "#F08080", color = "black") +
geom_text(aes(label = n), vjust = -0.5, color = "black") +
labs( x = "StateorProvince", y = "Number") +
theme_bw()
Nhận xét Dựa vào bảng tần số, tần suất và biểu đồ ta thấy được
Các Bang/Tỉnh có số lượng giao dịch lớn:
Các Bang/Tỉnh có số lượng giao dịch trung bình:
Các Bang/Tỉnh có số lượng giao dịch thấp:
Tổng quan:
Phân tích cho thấy sự tập trung giao dịch rất lớn ở ba bang/tỉnh là Washington (WA), California (CA), và Oregon (OR), chiếm phần lớn tổng số giao dịch. Zacatecas cũng đóng góp một lượng giao dịch đáng kể. Các khu vực còn lại có số lượng giao dịch ít hơn nhiều, đặc biệt là Jalisco.
Lập bảng tần số và tần suất
#Bảng tần số
table(data$Country)
##
## Canada Mexico USA
## 809 3688 9562
#Bảng tần suất
table(data$Country)/sum(table(data$Country))
##
## Canada Mexico USA
## 0.05754321 0.26232307 0.68013372
Vẽ đồ thị
data %>%
group_by(Country) %>%
summarise(n = n()) %>%
ggplot(aes(x = Country, y = n)) +
geom_col(fill = "#6495ED", color = "black") +
geom_text(aes(label = n), vjust = -0.5, color = "black") +
labs( x = "Country", y = "Number") +
theme_bw()
Nhận xét: Dựa vào bảng tần số, tần suất và biểu đồ ta thấy được
Phân bố giao dịch theo quốc gia:
Tổng quan:
Phân tích cho thấy sự tập trung giao dịch chủ yếu ở Hoa Kỳ, chiếm hơn hai phần ba tổng số giao dịch. Mexico là thị trường quan trọng thứ hai, đóng góp hơn một phần tư tổng số giao dịch. Canada có số lượng giao dịch thấp hơn đáng kể so với hai quốc gia còn lại. Thông tin này cho thấy Hoa Kỳ là thị trường mục tiêu chính, tiếp theo là Mexico, và Canada có thể là một thị trường nhỏ hơn hoặc có tiềm năng phát triển khác biệt.
Lập bảng tần số và tần suất
#Bảng tần số
table(data$ProductFamily)
##
## Drink Food Non-Consumable
## 1250 10153 2656
#Bảng tần suất
table(data$ProductFamily)/sum(table(data$ProductFamily))
##
## Drink Food Non-Consumable
## 0.08891102 0.72217085 0.18891813
Vẽ đồ thị
data %>%
group_by(ProductFamily) %>%
summarise(n = n()) %>%
ggplot(aes(x = ProductFamily, y = n)) +
geom_col(fill = "#4682B4", color = "black") +
geom_text(aes(label = n), vjust = -0.5, color = "black") +
labs( x = "Product Family", y = "Number") +
theme_bw()
Nhận xét: Dựa vào bảng tần số, tần suất và biểu đồ ta thấy được
Phân bố giao dịch theo nhóm sản phẩm:
Tổng quan:
Phân tích cho thấy nhóm sản phẩm Thực phẩm chiếm ưu thế tuyệt đối về số lượng giao dịch, chiếm gần ba phần tư tổng số giao dịch. Nhóm sản phẩm Không tiêu dùng đứng thứ hai, đóng góp gần một phần năm tổng số giao dịch. Nhóm Đồ uống có số lượng giao dịch thấp hơn đáng kể so với hai nhóm còn lại.
Lập bảng tần số và tần suất
#Bảng tần số
table(data$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
#Bảng tần suất
table(data$ProductDepartment)/sum(table(data$ProductDepartment))
##
## Alcoholic Beverages Baked Goods Baking Goods Beverages
## 0.025321858 0.030229746 0.076250089 0.048367594
## Breakfast Foods Canned Foods Canned Products Carousel
## 0.013372217 0.069492852 0.007753041 0.004196600
## Checkout Dairy Deli Eggs
## 0.005832563 0.064229319 0.049719041 0.014083505
## Frozen Foods Health and Hygiene Household Meat
## 0.098300021 0.063518031 0.101002916 0.006330464
## Periodicals Produce Seafood Snack Foods
## 0.014368020 0.141830856 0.007255139 0.113806103
## Snacks Starchy Foods
## 0.025037343 0.019702682
Vẽ đồ thị
library(ggplot2)
library(dplyr)
library(patchwork)
# Giả sử 'data' là data frame của bạn
dept_counts <- data %>%
group_by(ProductDepartment) %>%
summarise(n = n()) %>%
arrange(n) # Sắp xếp theo số lượng để chia
n_depts <- nrow(dept_counts)
mid_point <- ceiling(n_depts / 2)
# Dữ liệu cho biểu đồ thứ nhất (nửa đầu)
dept_counts_1 <- head(dept_counts, mid_point)
plot1 <- ggplot(dept_counts_1, aes(x = ProductDepartment, y = n)) +
geom_col(fill = "#4169E1", color = "black") +
geom_text(aes(label = n), vjust = -0.5, color = "black", size = 2.5) +
labs(x = "Product Department", y = "Number") +
theme_bw() +
theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 8))
# Dữ liệu cho biểu đồ thứ hai (nửa sau)
dept_counts_2 <- tail(dept_counts, n_depts - mid_point)
plot2 <- ggplot(dept_counts_2, aes(x = ProductDepartment, y = n)) +
geom_col(fill = "#4169E1", color = "black") +
geom_text(aes(label = n), vjust = -0.5, color = "black", size = 2.5) +
labs(x = "Product Department", y = "Number") +
theme_bw() +
theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 8))
# Kết hợp hai biểu đồ lại với nhau
plot1 + plot2
Nhận xét: Dựa vào bảng tần số, tần suất và biểu đồ ta thấy được là:
Các bộ phận sản phẩm có số lượng giao dịch lớn:
Các bộ phận sản phẩm có số lượng giao dịch trung bình:
Các bộ phận sản phẩm có số lượng giao dịch thấp:
Tổng quan:
Phân tích cho thấy sự phân bố giao dịch khá đa dạng giữa các bộ phận sản phẩm. Bộ phận Produce có số lượng giao dịch cao nhất, theo sau là Snack Foods và Household. Một số bộ phận khác như Frozen Foods, Baking Goods, và Canned Foods cũng có lượng giao dịch đáng kể. Ngược lại, các bộ phận như Carousel, Checkout, và Meat có số lượng giao dịch thấp hơn nhiều.
Lập bảng tần số và tần suất
#Bảng tần số
table(data$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
#Bảng tần suất
table(data$ProductCategory)/sum(table(data$ProductCategory))
##
## Baking Goods Bathroom Products Beer and Wine
## 0.034426346 0.025962017 0.025321858
## Bread Breakfast Foods Candles
## 0.030229746 0.029660716 0.003200797
## Candy Canned Anchovies Canned Clams
## 0.025037343 0.003129668 0.003769827
## Canned Oysters Canned Sardines Canned Shrimp
## 0.002489508 0.002845153 0.002702895
## Canned Soup Canned Tuna Carbonated Beverages
## 0.028736041 0.006188207 0.010953837
## Cleaning Supplies Cold Remedies Dairy
## 0.013443346 0.006614980 0.064229319
## Decongestants Drinks Eggs
## 0.006045949 0.009602390 0.014083505
## Electrical Frozen Desserts Frozen Entrees
## 0.025250729 0.022974607 0.008393200
## Fruit Hardware Hot Beverages
## 0.054413543 0.009175617 0.016075112
## Hygiene Jams and Jellies Kitchen Products
## 0.014012376 0.041823743 0.015434953
## Magazines Meat Miscellaneous
## 0.014368020 0.054129028 0.002987410
## Packaged Vegetables Pain Relievers Paper Products
## 0.003414183 0.013656732 0.024539441
## Pizza Plastic Products Pure Juice Beverages
## 0.013798990 0.010029163 0.011736254
## Seafood Side Dishes Snack Foods
## 0.007255139 0.010882709 0.113806103
## Specialty Starchy Foods Vegetables
## 0.020556227 0.019702682 0.122910591
Vẽ đồ thị
library(ggplot2)
library(dplyr)
library(patchwork)
# Giả sử 'data' là data frame của bạn
category_counts <- data %>%
group_by(ProductCategory) %>%
summarise(n = n()) %>%
arrange(n) # Sắp xếp theo số lượng để chia
n_categories <- nrow(category_counts)
mid_point <- ceiling(n_categories / 2)
# Dữ liệu cho biểu đồ thứ nhất (nửa đầu theo số lượng)
category_counts_1 <- head(category_counts, mid_point)
plot1_cat <- ggplot(category_counts_1, aes(x = ProductCategory, y = n)) +
geom_col(fill = "#FFA07A", color = "black") +
geom_text(aes(label = n), vjust = -0.5, color = "black", size = 2.5) +
labs(x = "Product Category", y = "Number") +
theme_bw() +
theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 6))
# Dữ liệu cho biểu đồ thứ hai (nửa sau theo số lượng)
category_counts_2 <- tail(category_counts, n_categories - mid_point)
plot2_cat <- ggplot(category_counts_2, aes(x = ProductCategory, y = n)) +
geom_col(fill = "#FFA07A", color = "black") +
geom_text(aes(label = n), vjust = -0.5, color = "black", size = 2.5) +
labs(x = "Product Category", y = "Number") +
theme_bw() +
theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 6))
# Kết hợp hai biểu đồ lại với nhau
plot1_cat + plot2_cat
Nhận xét: Dựa vào bảng tần số, tần suất và biểu đồ ta thấy được là:
Các danh mục sản phẩm có số lượng giao dịch rất lớn:
Các danh mục sản phẩm có số lượng giao dịch trung bình:
Các danh mục sản phẩm có số lượng giao dịch thấp:
Tổng quan:
Phân tích cho thấy sự phân bố giao dịch rất khác nhau giữa các danh mục sản phẩm. Các danh mục như Produce, Vegetables, Snack Foods, Household, và Frozen Foods có số lượng giao dịch cao nhất, cho thấy đây là những nhóm sản phẩm phổ biến nhất. Ngược lại, nhiều danh mục khác có số lượng giao dịch thấp hơn đáng kể, cho thấy mức độ quan tâm hoặc nhu cầu khác nhau từ phía khách hàng.
Thống kê mô tả biến Children
Children <- summary(data$Children)
print(Children)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 1.00 3.00 2.53 4.00 5.00
Vẽ đồ thị
library(ggplot2)
ggplot(data, aes(x = factor(Children))) + # Chuyển sang factor để vẽ rời rạc
geom_bar(fill = "skyblue", color = "black") +
labs(
x = "Số lượng con cái",
y = "Số lượng khách hàng") +
theme_bw() +
geom_text(stat='count', aes(label=..count..), vjust=-0.5) # Thêm số lượng trên cột
## Warning: The dot-dot notation (`..count..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(count)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Dựa vào bảng thống kê mô tả cho và đồ thị ta có nhận xét như sau:
Tóm lại:
Phân bố số lượng con cái của khách hàng tập trung chủ yếu trong khoảng từ 0 đến 4, với giá trị trung vị là 3. Giá trị trung bình (2.53) thấp hơn trung vị cho thấy sự hiện diện của nhiều khách hàng có ít con. Số lượng con cái dao động từ 0 đến 5 trong tập dữ liệu này.
Thống kê mô tả biến Units Sold
UnitsSold <- summary(data$UnitsSold)
print(UnitsSold)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.000 3.000 4.000 4.081 5.000 8.000
Vẽ đồ thị
library(ggplot2)
ggplot(data, aes(x = factor(UnitsSold))) + # Chuyển sang factor để vẽ rời rạc
geom_bar(fill = "lightcoral", color = "black") +
labs(
x = "Số lượng đơn vị sản phẩm",
y = "Số lượng giao dịch") +
theme_bw() +
geom_text(stat='count', aes(label=..count..), vjust=-0.5) # Thêm số lượng giao dịch trên cột
Dựa vào bảng thống kê mô tả cho và đồ thị ta có nhận xét như sau:
Tóm lại:
Phân bố số lượng đơn vị sản phẩm bán ra trong các giao dịch tập trung chủ yếu trong khoảng từ 1 đến 5, với giá trị trung vị là 4. Giá trị trung bình (4.081) cao hơn một chút so với trung vị cho thấy có một vài giao dịch với số lượng lớn sản phẩm. Số lượng đơn vị sản phẩm bán ra dao động từ 1 đến 8 trong tập dữ liệu này.
Thống kê mô tả biến Revenue
Revenue <- summary(data$Revenue)
print(Revenue)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.53 6.84 11.25 13.00 17.37 56.70
Vẽ đồ thị
ggplot(data, aes(x = Revenue)) +
geom_histogram(binwidth = 1,
fill = "steelblue",
color = "black") +
labs(
x = "Doanh thu (USD)",
y = "Số lượng giao dịch") +
theme_bw()
Dựa vào bảng thống kê mô tả cho và đồ thị ta có nhận xét như sau:
Tóm lại:
Phân bố doanh thu từ các giao dịch tập trung chủ yếu trong khoảng từ 0.53 USD đến 17.37 USD, với mức doanh thu trung bình là 13.00 USD và giá trị trung vị là 11.25 USD. Sự khác biệt giữa giá trị trung bình và trung vị cho thấy có sự hiện diện của một số giao dịch có doanh thu cao hơn đáng kể. Doanh thu dao động từ 0.53 USD đến 56.70 USD trong tập dữ liệu này.