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 phần của sê-ri Springer Texts in Statistics. Sách được chuẩn bị bằng ngôn ngữ LaTeX và sử dụng phiên bản R 3.4.3 trong toàn bộ ví dụ và phân tích. Peter K. Dunn là giảng viên tại Khoa Khoa học, Sức khỏe, Giáo dục và Kỹ thuật thuộc Đại học Sunshine Coast (Úc), trong khi Gordon K. Smyth công tác tại Ban Tin sinh học của Viện Nghiên cứu Y khoa Walter và Eliza Hall (Úc).
Mục tiêu chính của cuốn sách là cung cấp một cách tiếp cận toàn diện đối với Mô hình Tuyến tính Tổng quát (GLMs), kết hợp giữa lý thuyết sâu sắc và ứng dụng thực tiễn thông qua phân mềm thống kê R. Tác giả mong muốn người học không chỉ hiểu được mặt kỹ thuật mà còn nắm rõ nội dung đằng sau mô hình trong phân tích dữ liệu.
Sách giả định độc giả có nền tảng cơ bản về thống kê, giả thiết và kiểm định giả thuyết. Tuy nhiên, sách vẫn cung cấp phần giới thiệu đầy đủ cho người đọc bắt đầu như hồi quy tuyến tính, giúp độc giả dễ dàng tiếp cận mô hình cho khoa học thống kê hiện đại và ứng dụng.
Ngoài ra, sách còn mở rộng phạm vi bằng cách đưa ra hướng dẫn mô hình nâng cao và xây dựng mô hình toàn diện gồm các bước từ chuẩn bị dữ liệu, khám phá dữ liệu, xây dựng mô hình, kiểm định giả thiết, và cả cách nhìn nhận kết quả từ góc độ thực tiễn phân tích trong nghiên cứu và ứng dụng thực tế.
Ngôn ngữ lập trình R được sử dụng xuyên suốt cuốn sách, không chỉ như một công cụ tính toán mà còn là phương tiện để minh họa lý thuyết bằng thực hành. Cuốn sách bao gồm phần giới thiệu độc lập về R (Phụ lục A), cùng với các đoạn mã hoàn chỉnh kèm hướng dẫn cụ thể trong từng chương. Điều này giúp người đọc áp dụng trực tiếp các mô hình thống kê vào dữ liệu thực tế một cách linh hoạt và hiệu quả.
Chương 1 giới thiệu tổng quan về mô hình thống kê, tập trung đặc biệt vào các mô hình hồi quy. Nội dung chính bao gồm:
Khái quát về mô hình hồi quy và cách mô tả dữ liệu qua các quy ước chuẩn.
Sử dụng biểu đồ để khám phá và đánh giá mối quan hệ giữa các biến, ví dụ như biểu đồ FEV (dung tích thở ra gắng sức) với tuổi và chiều cao, giúp xác định tính hợp lý của mối quan hệ tuyến tính.
Giới thiệu cách mã hóa biến phân loại thành biến giả (dummy variables), đặc biệt là mã hóa điều trị (treatment coding) để giải thích hệ số dễ dàng hơn.
Phân tích cấu trúc của mô hình thống kê, bao gồm thành phần ngẫu nhiên và thành phần hệ thống.
Định nghĩa và ký hiệu trong mô hình hồi quy tuyến tính theo tham số, giải thích các tham số hồi quy và vai trò của biến hằng số (intercept).
Triết lý về mô hình thống kê: “Tất cả mô hình đều sai nhưng một số hữu ích.”
Thảo luận về mục đích xây dựng mô hình, cân bằng giữa độ chính xác và sự đơn giản, cũng như phân biệt giữa nghiên cứu thực nghiệm và quan sát.
Giới thiệu sơ lược về phần mềm R trong xây dựng và phân tích mô hình thống kê.
Chương 2 tập trung phân tích chi tiết mô hình hồi quy tuyến tính, bao gồm:
Định nghĩa mô hình hồi quy tuyến tính với thành phần hệ thống là hàm tuyến tính của các biến giải thích và thành phần ngẫu nhiên giả định phân phối chuẩn với phương sai không đổi.
Phương pháp ước lượng tham số hồi quy𝛽, trong đó ước lượng 𝛽^là không chệch và phương sai của nó được xác định qua ma trận thiết kế.
Ước lượng giá trị trung bình của biến đáp ứng tại các điểm cụ thể, kèm theo tính sai số chuẩn.
Đánh giá mô hình thông qua Phân tích Phương sai (ANOVA), phân chia tổng phương sai thành phần do mô hình giải thích và phần dư, dùng thống kê F để kiểm định ý nghĩa tổng thể của mô hình.
So sánh các mô hình lồng nhau bằng ANOVA, với nguyên tắc giữ số hạng chính khi có số hạng tương tác.
Diễn giải ý nghĩa các hệ số hồi quy, đặc biệt với biến phân loại, và ảnh hưởng của biến giải thích khác hoặc biến đổi biến đáp ứng đến cách hiểu hệ số.
Chương 3 tập trung vào đánh giá (chẩn đoán) mô hình hồi quy tuyến tính và các kỹ thuật để cải thiện mô hình, gồm:
Chương 4 giới thiệu phương pháp ước lượng hợp lý cực đại (MLE) như một cách tiếp cận tổng quát cho các mô hình không phù hợp với hồi quy tuyến tính chuẩn:
Giới thiệu mô hình tuyến tính tổng quát (GLMs) như mở rộng của hồi quy tuyến tính.
GLMs khác hồi quy tuyến tính ở chỗ không chỉ giả định phương sai không đổi mà còn cho phép thành phần ngẫu nhiên từ họ phân phối tổng quát hơn (họ phân phối mũ - EDM).
GLMs gồm 2 thành phần chính:
Hàm xác suất tổng quát của EDM: \(P(y; \theta, \phi) = a(y, \phi) \exp\left\{\frac{y\theta - \kappa(\theta)}{\phi}\right\}\), trong đó \(\phi\) là tham số phân tán.
Tham số offset (biến biết trước, không ước lượng) có thể xuất hiện trong thành phần hệ thống.
Cấu trúc GLM được ký hiệu:
glm(edm; link function).
Độ lệch tổng (Total Deviance) \(D(y, \mu) = \sum w_i d(y_i, \mu_i)\), dùng để đo sai khác giữa dữ liệu và mô hình.
Tập trung ước lượng tham số hồi quy (\(\beta\)) và tham số phân tán (\(\phi\)) trong GLMs.
Dựa trên giả định phân phối EDM, sử dụng phương pháp ước lượng hợp lý cực đại (MLE).
Phương trình điểm (Score equations) và thông tin Fisher được phát triển để xây dựng thuật toán ước lượng.
Độ lệch dư (Residual Deviance) dùng để đo biến thiên chưa được giải thích sau khi fitted mô hình.
Sai số chuẩn (Standard errors) của tham số được tính toán qua công thức ma trận.
Thuật toán ước lượng GLM tương tự hồi quy tuyến tính với tính chất cục bộ.
Ước lượng tham số phân tán \(\phi\) có nhiều cách: MLE, log-likelihood biên sửa đổi, trung bình độ lệch, Pearson.
Ứng dụng R:
glm() dùng để fitted GLMs.family xác định họ phân phối EDM (gaussian,
binomial, poisson, Gamma, inverse.gaussian).tweedie() trong gói statmod cho phép
fitted GLMs Tweedie.Áp dụng ba phương pháp suy luận trên lý thuyết hợp lý cực đại: Wald, Score, Likelihood Ratio Test (LRT) trong GLMs.
Khi tham số phân tán φ đã biết:
Kết quả phân phối các thống kê dựa trên xấp xỉ mẫu lớn (Large Sample Asymptotics).
Kiểm định độ phù hợp (Goodness-of-Fit Tests) để kiểm tra bộ dự báo tuyến tính mô tả đầy đủ xu hướng dữ liệu không, dựa trên phân phối phân tán nhỏ (Small Dispersion Asymptotics).
Khi tham số phân tán φ chưa biết:
So sánh 3 bài kiểm tra Wald, Score và LRT.
Lựa chọn giữa các GLMs không lồng nhau dùng AIC và BIC.
Các phương pháp tự động lựa chọn mô hình được giới thiệu.
Ứng dụng trong R:
summary() để xem kết quả kiểm định Wald.glm.scoretest() (gói statmod) cho kiểm
định Score.anova() để so sánh các mô hình lồng nhau bằng
quasi-likelihood, cho kết quả F-tests khi φ được ước lượng.Chương này thảo luận các phương pháp để đánh giá tính hợp lệ của các giả định trong GLMs.
Các giả định chính của GLMs bao gồm:
Phần dư (Residuals) cho GLMs:
Phần dư phản hồi (Response Residuals) không đủ để chẩn đoán trong GLMs.
Các loại phần dư hữu ích hơn:
Đòn bẩy (Leverages) trong GLMs:
Phần dư chuẩn hóa theo đòn bẩy (Leverage Standardized Residuals) cho GLMs được trình bày.
Hướng dẫn lựa chọn loại phần dư phù hợp để sử dụng trong chẩn đoán.
Việc kiểm tra các giả định mô hình được thực hiện bằng cách sử dụng các công cụ chẩn đoán này, thường qua các biểu đồ phần dư.
Các mô hình Quasi-Poisson
(quasipoisson()) và Quasi-binomial
(quasibinomial()) được đề cập lại như lựa chọn cho dữ liệu
quá phân tán.
Suy luận cho các mô hình quasi này sử dụng các hàm R tương tự
GLMs thông thường (summary(), glm.scoretest(),
anova()), nhưng với F-tests dựa trên độ
lệch.
Tập trung vào GLM nhị thức dùng để mô hình hóa tỷ lệ (số thành công trên tổng số thử nghiệm).
Phân phối Binomial thuộc họ phân phối mũ (EDM).
Các hàm liên kết phổ biến:
Diễn giải ý nghĩa ngưỡng của hàm liên kết.
Giải thích kết quả qua odds và odds ratios với hàm logit.
Ứng dụng trong ước lượng liều hiệu quả trung bình ED50.
Vấn đề quá phân tán và xử lý bằng quasi-binomial models.
Cảnh báo về Hauck-Donner effect khi dùng Wald tests.
Kiểm định Goodness-of-Fit không thích hợp với dữ liệu nhị phân.
Sử dụng R qua glm(family = binomial()).
family = poisson()).Giới thiệu các mô hình cho dữ liệu liên tục dương, thường là đo lường các đại lượng vật lý luôn dương.
Hai GLMs phổ biến: dựa trên phân phối Gamma và Inverse Gaussian thuộc họ EDM.
Phân phối Gamma:
Phân phối Inverse Gaussian:
Các hàm liên kết sử dụng: inverse, identity, log.
Hàm liên kết chính tắc của Inverse Gaussian là 1/μ².
Sử dụng R để fit mô hình:
glm(family = Gamma()) và
glm(family = inverse.gaussian()).Liệt kê các hàm liên kết có thể dùng cho từng phân phối.
Cung cấp ví dụ bảng phân tích độ lệch từ mô hình Gamma GLM.
Giới thiệu GLMs dựa trên họ phân phối Tweedie (EDMs tổng quát hơn).
Tweedie bao gồm các phân phối đặc biệt như:
Hàm phương sai của Tweedie: \(V(\mu) = \mu^\xi\) với ξ là tham số chỉ số (index parameter), không thuộc khoảng (0,1).
Ứng dụng Tweedie trong dữ liệu liên tục dương và dữ liệu liên tục dương có giá trị 0 chính xác.
Ước lượng tham số ξ và cách fit mô hình Tweedie GLMs.
Nghiên cứu trường hợp minh họa diễn giải các phân phối Poisson và
Gamma qua hàm tweedie.convert() trong R (gói
tweedie).
Sử dụng R với hàm tweedie() trong gói
statmod để fit Tweedie GLMs.
Trình bày độ lệch đơn vị và độ lệch dư phù hợp với phân phối χ².
Tải dữ liệu
library("csv")
## Warning: package 'csv' was built under R version 4.3.3
library(data.table)
## Warning: package 'data.table' was built under R version 4.3.3
data <- read.csv("D:/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
names(data)
## [1] "X" "PurchaseDate" "CustomerID"
## [4] "Gender" "MaritalStatus" "Homeowner"
## [7] "Children" "AnnualIncome" "City"
## [10] "StateorProvince" "Country" "ProductFamily"
## [13] "ProductDepartment" "ProductCategory" "UnitsSold"
## [16] "Revenue"
Bộ dữ liệu Supermarket Transactions bao gồm thông tin giao dịch của khách hàng tại siêu thị, với 14,059 quan sát và 16 biến.
Dữ liệu chứa các thông tin đa dạng như:
Thông tin khách hàng: giới tính, tình trạng hôn nhân, thu nhập, con cái, quyền sở hữu nhà
Thông tin địa lý: thành phố, bang, quốc gia
Thông tin sản phẩm: nhóm sản phẩm, loại, doanh thu, số lượng bán
Giải thích các biến
library(knitr)
## Warning: package 'knitr' was built under R version 4.3.3
df <- data.frame(
`Tên biến` = c("PurchaseDate", "CustomerID", "Gender", "MaritalStatus", "Homeowner", "Children",
"AnnualIncome", "City", "StateorProvince", "Country", "ProductFamily",
"ProductDepartment", "ProductCategory", "UnitsSold", "Revenue"),
`Giải thích` = c("Ngày mua hàng", "Mã định danh khách hàng", "Giới tính khách hàng (`M`, `F`)",
"Tình trạng hôn nhân (`S`, `M`)", "Có sở hữu nhà hay không (`Y`, `N`)",
"Số lượng con", "Thu nhập hàng năm theo khoảng", "Thành phố cư trú",
"Bang hoặc tỉnh", "Quốc gia", "Nhóm sản phẩm lớn", "Bộ phận sản phẩm cụ thể",
"Loại sản phẩm chi tiết", "Số lượng sản phẩm đã bán",
"Doanh thu từ giao dịch (đơn vị không xác định)")
)
kable(df, format = "markdown")
| Tên.biến | Giải.thích |
|---|---|
| PurchaseDate | Ngày mua hàng |
| CustomerID | Mã định danh khách hàng |
| Gender | Giới tính khách hàng (M,
F) |
| MaritalStatus | Tình trạng hôn nhân (S,
M) |
| Homeowner | Có sở hữu nhà hay không (Y,
N) |
| Children | Số lượng con |
| AnnualIncome | Thu nhập hàng năm theo khoảng |
| City | Thành phố cư trú |
| StateorProvince | Bang hoặc tỉnh |
| Country | Quốc gia |
| ProductFamily | Nhóm sản phẩm lớn |
| ProductDepartment | Bộ phận sản phẩm cụ thể |
| ProductCategory | Loại sản phẩm chi tiết |
| UnitsSold | Số lượng sản phẩm đã bán |
| Revenue | Doanh thu từ giao dịch (đơn vị không xác định) |
Lập bảng tần số và tần suất
# Bảng tần số
gender_freq <- table(data$Gender)
# Bảng tần suất
gender_prop <- prop.table(gender_freq)
# Gộp tần số và tần suất vào một bảng
gender_table <- data.frame(
Gender = names(gender_freq),
Frequency = as.vector(gender_freq),
Proportion = round(as.vector(gender_prop), 3)
)
# Hiển thị bảng với kable
knitr::kable(gender_table, caption = "Bảng tần số và tần suất của biến Gender")
| Gender | Frequency | Proportion |
|---|---|---|
| F | 7170 | 0.51 |
| M | 6889 | 0.49 |
Nhận xét Dựa vào bảng tần số và tần suất của biến Gender, ta có:
Số lượng khách hàng nữ (F) là 7170,
chiếm 51% tổng số quan sát.
Số lượng khách hàng nam (M) là
6889, chiếm 49% tổng số quan
sát.
Tỷ lệ giới tính giữa nam và nữ gần như cân bằng, với nữ chiếm tỷ lệ nhỉnh hơn một chút.
Vẽ đồ thị
library(ggplot2)
## Warning: package 'ggplot2' 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: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 %>%
count(Gender) %>%
ggplot(aes(x = Gender, y = n, fill = Gender)) +
geom_col(show.legend = FALSE) +
geom_text(aes(label = n), vjust = -0.5, color = "black") +
scale_fill_manual(values = c("F" = "#F4A7B9", "M" = "#89CFF0")) +
labs(
title = "Biểu đồ tần số theo giới tính",
x = "Giới tính",
y = "Số lượng"
) +
theme_bw()
Biểu đồ tần số cho biến Gender cho thấy số lượng khách hàng nam và nữ là tương đương nhau, với khách hàng nữ chiếm tỷ lệ nhỉnh hơn. Điều này phù hợp với bảng tần số ở trên và xác nhận rằng tập dữ liệu không có sự mất cân bằng giới tính nghiêm trọng.
Lập bảng tần số và tần suất
# Bảng tần số
marital_freq <- table(data$MaritalStatus)
# Bảng tần suất
marital_prop <- prop.table(marital_freq)
# Gộp tần số và tần suất vào một bảng
marital_table <- data.frame(
MaritalStatus = names(marital_freq),
Frequency = as.vector(marital_freq),
Proportion = round(as.vector(marital_prop), 3)
)
# Hiển thị bảng với kable
knitr::kable(marital_table, caption = "Bảng tần số và tần suất của biến MaritalStatus")
| MaritalStatus | Frequency | Proportion |
|---|---|---|
| M | 6866 | 0.488 |
| S | 7193 | 0.512 |
Nhận xét: Dựa vào bảng tần số và tần suất của biến MaritalStatus, ta thấy:
Số lượng khách hàng độc thân (S) là
7193, chiếm 51.2% tổng số quan
sát.
Số lượng khách hàng đã kết hôn (M)
là 6866, chiếm 48.8% tổng số quan
sát.
Tỷ lệ giữa hai nhóm khá cân bằng, trong đó nhóm độc thân chiếm ưu thế nhẹ.
Điều này cho thấy tập dữ liệu có sự phân bố tương đối đồng đều giữa hai trạng thái hôn nhân. Vẽ đồ thị
data %>%
count(MaritalStatus) %>%
ggplot(aes(x = MaritalStatus, y = n, fill = MaritalStatus)) +
geom_col(show.legend = FALSE) +
geom_text(aes(label = n), vjust = -0.5, color = "black") +
scale_fill_manual(values = c("S" = "#FF9999", "M" = "#9999FF")) +
labs(
title = "Biểu đồ tần số theo tình trạng hôn nhân",
x = "Tình trạng hôn nhân",
y = "Số lượng"
) +
theme_bw()
Lập bảng tần số và tần suất
# Bảng tần số
homeowner_freq <- table(data$Homeowner)
# Bảng tần suất
homeowner_prop <- prop.table(homeowner_freq)
# Gộp tần số và tần suất vào một bảng
homeowner_table <- data.frame(
Homeowner = names(homeowner_freq),
Frequency = as.vector(homeowner_freq),
Proportion = round(as.vector(homeowner_prop), 3)
)
# Hiển thị bảng với kable
knitr::kable(homeowner_table, caption = "Bảng tần số và tần suất của biến Homeowner")
| Homeowner | Frequency | Proportion |
|---|---|---|
| N | 5615 | 0.399 |
| Y | 8444 | 0.601 |
Nhận xét: Dựa vào bảng tần số và tần suất biến Homeowner, ta thấy:
Số lượng khách hàng không sở hữu nhà
(N) là 5615, chiếm 39.9% tổng số quan sát.
Số lượng khách hàng sở hữu nhà (Y)
là 8444, chiếm 60.1% tổng số quan sát.
Tỷ lệ giữa hai nhóm không cân bằng, trong đó nhóm sở hữu nhà chiếm ưu thế rõ rệ*. Điều này phản ánh rằng phần lớn khách hàng trong tập dữ liệu là những người đã sở hữu nhà. Vẽ đồ thị
data %>%
count(Homeowner) %>%
ggplot(aes(x = Homeowner, y = n, fill = Homeowner)) +
geom_col(show.legend = FALSE) +
geom_text(aes(label = n), vjust = -0.5, color = "black") +
scale_fill_manual(values = c("N" = "#FF9999", "Y" = "#9999FF")) +
labs(
title = "Biểu đồ tần số theo biến Homeowner",
x = "Sở hữu nhà",
y = "Số lượng"
) +
theme_bw()
Lập bảng tần số và tần suất
# Bảng tần số
annualincome_freq <- table(data$AnnualIncome)
# Bảng tần suất
annualincome_prop <- prop.table(annualincome_freq)
# Gộp tần số và tần suất vào một bảng
annualincome_table <- data.frame(
AnnualIncome = names(annualincome_freq),
Frequency = as.vector(annualincome_freq),
Proportion = round(as.vector(annualincome_prop), 3)
)
# Hiển thị bảng với kable
knitr::kable(annualincome_table, caption = "Bảng tần số và tần suất của biến AnnualIncome")
| AnnualIncome | Frequency | Proportion |
|---|---|---|
| $10K - $30K | 3090 | 0.220 |
| $110K - $130K | 643 | 0.046 |
| $130K - $150K | 760 | 0.054 |
| $150K + | 273 | 0.019 |
| $30K - $50K | 4601 | 0.327 |
| $50K - $70K | 2370 | 0.169 |
| $70K - $90K | 1709 | 0.122 |
| $90K - $110K | 613 | 0.044 |
Nhận xét: Dựa vào bảng tần số và tần suất biến AnnualIncome, ta thấy:
Nhóm ($10K - $30K) có 3090 khách hàng, chiếm 22.0% tổng số, là nhóm có thu nhập thấp nhưng số lượng khá lớn trong tập dữ liệu.
Nhóm ($30K - $50K) chiếm tỷ lệ cao nhất với 4601 khách hàng, tương đương 32.7%, cho thấy đây là mức thu nhập phổ biến nhất.
Nhóm ($50K - $70K) có 2370 khách hàng, chiếm 16.9%, là nhóm thu nhập trung bình thấp với số lượng đáng kể.
Nhóm ($70K - $90K) chiếm 12.2% với 1709 khách hàng, phản ánh mức thu nhập trung bình khá.
Nhóm ($90K - $110K) có 613 khách hàng, chiếm 4.4%, giảm rõ rệt so với nhóm thấp hơn.
Nhóm thu nhập cao hơn ($110K - $130K) chiếm 4.6% với 643 khách hàng.
Nhóm ($130K - $150K) có 760 khách hàng, chiếm 5.4%, thể hiện số lượng khách hàng thu nhập khá cao nhưng không nhiều.
Nhóm ($150K +) là nhóm thu nhập cao nhất, chỉ chiếm 1.9% với 273 khách hàng, là nhóm nhỏ nhất trong tập dữ liệu.
Tỷ lệ giữa các nhóm thu nhập không cân bằng, trong đó các nhóm thu
nhập thấp và trung bình chiếm ưu thế rõ rệt.
Điều này phản ánh rằng phần lớn khách hàng trong tập dữ liệu có mức thu
nhập chủ yếu ở mức trung bình và thấp.
Vẽ đồ thị
data %>%
count(AnnualIncome) %>%
ggplot(aes(x = AnnualIncome, y = n, fill = AnnualIncome)) +
geom_col(show.legend = FALSE) +
geom_text(aes(label = n), vjust = -0.5, color = "black", size = 3) +
scale_fill_brewer(palette = "Pastel1") +
labs(
title = "Biểu đồ tần số theo biến AnnualIncome",
x = "Thu nhập hằng năm",
y = "Số lượng"
) +
theme_bw() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Lập bảng tần số và tần suất
# Bảng tần số
city_freq <- table(data$City)
# Bảng tần suất
city_prop <- prop.table(city_freq)
# Gộp tần số và tần suất vào một bảng
city_table <- data.frame(
City = names(city_freq),
Frequency = as.vector(city_freq),
Proportion = round(as.vector(city_prop), 3)
)
# Hiển thị bảng với kable
knitr::kable(city_table, caption = "Bảng tần số và tần suất của biến City")
| City | Frequency | Proportion |
|---|---|---|
| Acapulco | 383 | 0.027 |
| Bellingham | 143 | 0.010 |
| Beverly Hills | 811 | 0.058 |
| Bremerton | 834 | 0.059 |
| Camacho | 452 | 0.032 |
| Guadalajara | 75 | 0.005 |
| Hidalgo | 845 | 0.060 |
| Los Angeles | 926 | 0.066 |
| Merida | 654 | 0.047 |
| Mexico City | 194 | 0.014 |
| Orizaba | 464 | 0.033 |
| Portland | 876 | 0.062 |
| Salem | 1386 | 0.099 |
| San Andres | 621 | 0.044 |
| San Diego | 866 | 0.062 |
| San Francisco | 130 | 0.009 |
| Seattle | 922 | 0.066 |
| Spokane | 875 | 0.062 |
| Tacoma | 1257 | 0.089 |
| Vancouver | 633 | 0.045 |
| Victoria | 176 | 0.013 |
| Walla Walla | 160 | 0.011 |
| Yakima | 376 | 0.027 |
Nhận xét: Dựa vào bảng tần số và tần suất của biến City, ta thấy:
Các thành phố có số lượng khách hàng cao nhất gồm:
Salem: 1386 khách hàng (9.9%)
Tacoma: 1257 khách hàng (8.9%)
Los Angeles: 926 khách hàng (6.6%)
Seattle: 922 khách hàng (6.6%)
Portland: 876 khách hàng (6.2%)
San Diego: 866 khách hàng (6.2%)
Spokane: 875 khách hàng (6.2%)
Hidalgo: 845 khách hàng (6.0%)
Bremerton: 834 khách hàng (5.9%)
Một số thành phố có tỷ lệ khách hàng thấp, đáng chú ý:
Guadalajara: 75 khách hàng (0.5%)
San Francisco: 130 khách hàng (0.9%)
Bellingham: 143 khách hàng (1.0%)
Walla Walla: 160 khách hàng (1.1%)
Victoria: 176 khách hàng (1.3%)
Tỷ lệ phân bố khách hàng theo thành phố là không đồng
đều. Các thành phố như Salem và
Tacoma chiếm tỷ lệ lớn trong khi nhiều thành phố khác
có số lượng khách hàng rất nhỏ.
Điều này cho thấy dữ liệu có sự tập trung khách hàng theo khu
vực địa lý, có thể ảnh hưởng đến phân tích nếu không điều chỉnh
hợp lý theo địa phương.
Vẽ đồ thị
library(ggplot2)
library(dplyr)
library(patchwork)
## Warning: package 'patchwork' was built under R version 4.3.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 = "#FF9999", 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 = "#FF9999", 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
Lập bảng tần số và tần suất
# Bảng tần số
state_freq <- table(data$StateorProvince)
# Bảng tần suất
state_prop <- prop.table(state_freq)
# Gộp tần số và tần suất vào một bảng
state_table <- data.frame(
StateorProvince = names(state_freq),
Frequency = as.vector(state_freq),
Proportion = round(as.vector(state_prop), 3)
)
# Hiển thị bảng với kable
knitr::kable(state_table, caption = "Bảng tần số và tần suất của biến StateorProvince")
| StateorProvince | Frequency | Proportion |
|---|---|---|
| BC | 809 | 0.058 |
| CA | 2733 | 0.194 |
| DF | 815 | 0.058 |
| Guerrero | 383 | 0.027 |
| Jalisco | 75 | 0.005 |
| OR | 2262 | 0.161 |
| Veracruz | 464 | 0.033 |
| WA | 4567 | 0.325 |
| Yucatan | 654 | 0.047 |
| Zacatecas | 1297 | 0.092 |
Nhận xét Dựa vào bảng tần số và tần suất của biến StateorProvince, ta thấy:
Bang WA (Washington) có số lượng khách hàng nhiều nhất với 4567 người, chiếm 32.5% tổng số quan sát. Đây là bang chiếm ưu thế rõ rệt trong tập dữ liệu.
CA (California) xếp thứ hai với 2733 người, chiếm 19.4%, cho thấy đây cũng là khu vực tập trung nhiều khách hàng.
OR (Oregon) có 2262 khách hàng, tương ứng 16.1%, là nhóm lớn tiếp theo.
Zacatecas có 1297 khách hàng, chiếm 9.2%, là bang ở Mexico có số lượng khách hàng tương đối lớn.
Các bang BC, DF, và Yucatan có số lượng khách hàng dao động từ 800–850, chiếm khoảng 5.8% mỗi bang.
Các bang còn lại như Veracruz, Guerrero, Jalisco có số lượng khách hàng thấp hơn nhiều, trong đó Jalisco là ít nhất với chỉ 75 khách hàng, chiếm 0.5% tổng số.
Tổng thể, dữ liệu khách hàng tập trung chủ yếu ở các bang của Hoa Kỳ (WA, CA, OR), trong khi một số bang của Mexico có tỷ lệ thấp hơn đáng kể.
Vẽ đồ thị
data %>%
count(StateorProvince) %>%
ggplot(aes(x = StateorProvince, y = n, fill = StateorProvince)) +
geom_col(show.legend = FALSE) +
geom_text(aes(label = n), vjust = -0.5, color = "black", size = 3) +
scale_fill_brewer(palette = "Set3") +
labs(
title = "Biểu đồ tần số theo biến StateorProvince",
x = "Bang/Tỉnh",
y = "Số lượng"
) +
theme_bw() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Lập bảng tần số và tần suất
# Bảng tần số
country_freq <- table(data$Country)
# Bảng tần suất
country_prop <- prop.table(country_freq)
# Gộp tần số và tần suất vào một bảng
country_table <- data.frame(
Country = names(country_freq),
Frequency = as.vector(country_freq),
Proportion = round(as.vector(country_prop), 3)
)
# Hiển thị bảng với kable
knitr::kable(country_table, caption = "Bảng tần số và tần suất của biến Country")
| Country | Frequency | Proportion |
|---|---|---|
| Canada | 809 | 0.058 |
| Mexico | 3688 | 0.262 |
| USA | 9562 | 0.680 |
Nhận xét: Dựa vào bảng tần số và tần suất của biến Country, ta thấy:
USA là quốc gia chiếm ưu thế lớn nhất với 9562 giao dịch, tương đương 68.0% tổng số quan sát. Đây là nhóm giao dịch chiếm đa số trong tập dữ liệu.
Mexico đứng thứ hai với 3688 giao dịch, chiếm 26.2%, là nhóm giao dịch lớn thứ hai.
Canada có số lượng giao dịch ít nhất với 809 người, chiếm 5.8% tổng số, là nhóm nhỏ nhất trong ba quốc gia.
Như vậy, phần lớn giao dịch trong tập dữ liệu đến từ Hoa Kỳ (USA), tiếp theo là Mexico và một phần nhỏ hơn đến từ Canada.
Vẽ đồ thị
data %>%
count(Country) %>%
ggplot(aes(x = Country, y = n, fill = Country)) +
geom_col(show.legend = FALSE) +
geom_text(aes(label = n), vjust = -0.5, color = "black", size = 4) +
scale_fill_brewer(palette = "Set2") +
labs(
title = "Biểu đồ tần số theo biến Country",
x = "Quốc gia",
y = "Số lượng khách hàng"
) +
theme_bw()
Lập bảng tần số và tần suất
# Bảng tần số
productfamily_freq <- table(data$ProductFamily)
# Bảng tần suất
productfamily_prop <- prop.table(productfamily_freq)
# Gộp tần số và tần suất vào một bảng
productfamily_table <- data.frame(
ProductFamily = names(productfamily_freq),
Frequency = as.vector(productfamily_freq),
Proportion = round(as.vector(productfamily_prop), 3)
)
# Hiển thị bảng với kable
knitr::kable(productfamily_table, caption = "Bảng tần số và tần suất của biến ProductFamily")
| ProductFamily | Frequency | Proportion |
|---|---|---|
| Drink | 1250 | 0.089 |
| Food | 10153 | 0.722 |
| Non-Consumable | 2656 | 0.189 |
Nhận xét:
Dựa vào bảng tần số và tần suất của biến ProductFamily, ta thấy:
Nhóm Food chiếm đa số với 10153 khách hàng, tương đương 72.2% tổng số quan sát. Đây là nhóm sản phẩm phổ biến nhất trong tập dữ liệu.
Nhóm Non-Consumable có 2656 khách hàng, chiếm 18.9%, là nhóm sản phẩm không tiêu thụ chiếm tỷ lệ đáng kể.
Nhóm Drink chiếm tỷ lệ nhỏ nhất với 1250 khách hàng, chỉ chiếm 8.9% tổng số, phản ánh số lượng khách hàng sử dụng nhóm sản phẩm đồ uống ít hơn so với hai nhóm còn lại.
Tổng thể, khách hàng chủ yếu tập trung vào nhóm sản phẩm Food, trong khi nhóm Drink có sự tham gia thấp nhất.
Vẽ đồ thị
data %>%
count(ProductFamily) %>%
ggplot(aes(x = ProductFamily, y = n, fill = ProductFamily)) +
geom_col(show.legend = FALSE) +
geom_text(aes(label = n), vjust = -0.5, color = "black", size = 4) +
scale_fill_brewer(palette = "Pastel2") +
labs(
title = "Biểu đồ tần số theo biến ProductFamily",
x = "Nhóm sản phẩm",
y = "Số lượng khách hàng"
) +
theme_bw()
Lập bảng tần số và tần suất
# Bảng tần số
productdepartment_freq <- table(data$ProductDepartment)
# Bảng tần suất
productdepartment_prop <- prop.table(productdepartment_freq)
# Gộp tần số và tần suất vào một bảng
productdepartment_table <- data.frame(
ProductDepartment = names(productdepartment_freq),
Frequency = as.vector(productdepartment_freq),
Proportion = round(as.vector(productdepartment_prop), 3)
)
# Hiển thị bảng với kable
knitr::kable(productdepartment_table, caption = "Bảng tần số và tần suất của biến ProductDepartment")
| ProductDepartment | Frequency | Proportion |
|---|---|---|
| Alcoholic Beverages | 356 | 0.025 |
| Baked Goods | 425 | 0.030 |
| Baking Goods | 1072 | 0.076 |
| Beverages | 680 | 0.048 |
| Breakfast Foods | 188 | 0.013 |
| Canned Foods | 977 | 0.069 |
| Canned Products | 109 | 0.008 |
| Carousel | 59 | 0.004 |
| Checkout | 82 | 0.006 |
| Dairy | 903 | 0.064 |
| Deli | 699 | 0.050 |
| Eggs | 198 | 0.014 |
| Frozen Foods | 1382 | 0.098 |
| Health and Hygiene | 893 | 0.064 |
| Household | 1420 | 0.101 |
| Meat | 89 | 0.006 |
| Periodicals | 202 | 0.014 |
| Produce | 1994 | 0.142 |
| Seafood | 102 | 0.007 |
| Snack Foods | 1600 | 0.114 |
| Snacks | 352 | 0.025 |
| Starchy Foods | 277 | 0.020 |
Nhận xét:
Dựa vào bảng tần số và tần suất của biến ProductDepartment, ta thấy:
Nhóm Produce chiếm tỷ lệ cao nhất với 1994 khách hàng, tương đương 14.2% tổng số, cho thấy đây là nhóm sản phẩm phổ biến nhất.
Nhóm Snack Foods và Household lần lượt có 1600 (11.4%) và 1420 (10.1%) khách hàng, là những nhóm có số lượng khách hàng lớn tiếp theo.
Nhóm Frozen Foods cũng có số lượng đáng kể với 1382 khách hàng (9.8%).
Các nhóm như Baking Goods (7.6%), Canned Foods (6.9%), Dairy (6.4%), và Health and Hygiene (6.4%) chiếm tỷ lệ trung bình khá trong tập dữ liệu.
Một số nhóm có số lượng khách hàng rất thấp dưới 1% như Carousel (0.4%), Checkout (0.6%), Meat (0.6%), và Seafood (0.7%).
Nhìn chung, tỷ lệ phân bổ khách hàng theo các nhóm sản phẩm khá đa dạng, với một số nhóm sản phẩm chính chiếm ưu thế rõ rệt trong tập dữ liệu.
Vẽ đồ thị
# 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
Lập bảng tần số và tần suất
# Bảng tần số
productcategory_freq <- table(data$ProductCategory)
# Bảng tần suất
productcategory_prop <- prop.table(productcategory_freq)
# Gộp tần số và tần suất vào một bảng
productcategory_table <- data.frame(
ProductCategory = names(productcategory_freq),
Frequency = as.vector(productcategory_freq),
Proportion = round(as.vector(productcategory_prop), 3)
)
# Hiển thị bảng với kable
knitr::kable(productcategory_table, caption = "Bảng tần số và tần suất của biến ProductCategory")
| ProductCategory | Frequency | Proportion |
|---|---|---|
| Baking Goods | 484 | 0.034 |
| Bathroom Products | 365 | 0.026 |
| Beer and Wine | 356 | 0.025 |
| Bread | 425 | 0.030 |
| Breakfast Foods | 417 | 0.030 |
| Candles | 45 | 0.003 |
| Candy | 352 | 0.025 |
| Canned Anchovies | 44 | 0.003 |
| Canned Clams | 53 | 0.004 |
| Canned Oysters | 35 | 0.002 |
| Canned Sardines | 40 | 0.003 |
| Canned Shrimp | 38 | 0.003 |
| Canned Soup | 404 | 0.029 |
| Canned Tuna | 87 | 0.006 |
| Carbonated Beverages | 154 | 0.011 |
| Cleaning Supplies | 189 | 0.013 |
| Cold Remedies | 93 | 0.007 |
| Dairy | 903 | 0.064 |
| Decongestants | 85 | 0.006 |
| Drinks | 135 | 0.010 |
| Eggs | 198 | 0.014 |
| Electrical | 355 | 0.025 |
| Frozen Desserts | 323 | 0.023 |
| Frozen Entrees | 118 | 0.008 |
| Fruit | 765 | 0.054 |
| Hardware | 129 | 0.009 |
| Hot Beverages | 226 | 0.016 |
| Hygiene | 197 | 0.014 |
| Jams and Jellies | 588 | 0.042 |
| Kitchen Products | 217 | 0.015 |
| Magazines | 202 | 0.014 |
| Meat | 761 | 0.054 |
| Miscellaneous | 42 | 0.003 |
| Packaged Vegetables | 48 | 0.003 |
| Pain Relievers | 192 | 0.014 |
| Paper Products | 345 | 0.025 |
| Pizza | 194 | 0.014 |
| Plastic Products | 141 | 0.010 |
| Pure Juice Beverages | 165 | 0.012 |
| Seafood | 102 | 0.007 |
| Side Dishes | 153 | 0.011 |
| Snack Foods | 1600 | 0.114 |
| Specialty | 289 | 0.021 |
| Starchy Foods | 277 | 0.020 |
| Vegetables | 1728 | 0.123 |
Nhận xét: Dựa vào bảng tần số và tần suất của biến ProductCategory, ta thấy:
Nhóm Snack Foods có số lượng khách hàng lớn nhất với 1600 khách hàng, chiếm 11.4% tổng số, phản ánh đây là nhóm sản phẩm phổ biến nhất.
Nhóm Vegetables đứng thứ hai với 1728 khách hàng (12.3%), cho thấy đây cũng là nhóm sản phẩm có sức tiêu thụ cao.
Nhóm Dairy chiếm tỷ lệ đáng kể với 903 khách hàng (6.4%), tiếp theo là các nhóm Fruit (5.4%) và Meat (5.4%).
Các nhóm sản phẩm như Jams and Jellies (4.2%), Baking Goods (3.4%), Canned Soup (2.9%), và Bread (3.0%) cũng có số lượng khách hàng trung bình.
Một số nhóm có tỷ lệ rất thấp dưới 1% như Candles (0.3%), Canned Anchovies (0.3%), Canned Oysters (0.2%), và Miscellaneous (0.3%).
Nhìn chung, tỷ lệ phân bố khách hàng theo các nhóm sản phẩm rất đa dạng, trong đó một số nhóm chính chiếm ưu thế rõ rệt, phản ánh sự đa dạng trong lựa chọn sản phẩm của khách hàng.
Vẽ đồ thị
# 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 = "#8DA0CB", 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 = "#8DA0CB", 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
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
Nhận xét: Dựa vào kết quả thống kê mô tả biến Children, ta thấy:
Số con tối thiểu là 0, cho thấy có những khách hàng không có con.
Số con tối đa là 5, phản ánh khách hàng có số con nhiều nhất là 5.
Giá trị trung vị (Median) là 3, biểu thị phân bố số con tập trung quanh mức 3 con.
Giá trị trung bình (Mean) là 2.53, hơi thấp hơn trung vị, cho thấy số con trung bình khoảng 2 đến 3 con.
Phân vị thứ nhất (1st Qu.) là 1 và phân vị thứ ba (3rd Qu.) là 4, nghĩa là 25% khách hàng có từ 0 đến 1 con, 50% có từ 1 đến 4 con, và 25% có từ 4 đến 5 con.
Như vậy, phần lớn khách hàng có số con dao động từ 1 đến 4, với mức trung bình khoảng 2-3 con.
Vẽ đồ thị
ggplot(data, aes(x = factor(Children))) +
geom_bar(fill = "pink", 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)
## 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.
Thống kê mô tả biến UnitsSold
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
Nhận xét: Kết quả thống kê mô tả biến UnitsSold cho thấy:
Số đơn vị bán tối thiểu là 1, cho thấy có những giao dịch bán tối thiểu 1 sản phẩm.
Số đơn vị bán tối đa là 8, phản ánh có giao dịch bán nhiều nhất lên đến 8 sản phẩm.
Giá trị trung vị (Median) là 4, biểu thị phân bố số lượng bán tập trung ở mức 4 đơn vị.
Giá trị trung bình (Mean) là 4.081, gần với giá trị trung vị, cho thấy phân phối số lượng bán khá cân bằng xung quanh 4 sản phẩm.
Phân vị thứ nhất (1st Qu.) là 3 và phân vị thứ ba (3rd Qu.) là 5, tức 25% các giao dịch bán dưới hoặc bằng 3 đơn vị, 50% giao dịch bán từ 3 đến 5 đơn vị, và 25% còn lại bán trên 5 đơn vị.
Như vậy, phần lớn các giao dịch bán trong dữ liệu nằm trong khoảng từ 3 đến 5 đơn vị sản phẩm, với mức trung bình gần 4 đơn vị.
Vẽ đồ thị
ggplot(data, aes(x = factor(UnitsSold))) +
geom_bar(fill = "yellow", 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ố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
Nhận xét: Kết quả thống kê mô tả biến Revenue cho thấy:
Giá trị doanh thu thấp nhất (Min.) là 0.53, cho thấy có những giao dịch mang lại doanh thu rất nhỏ.
Giá trị doanh thu cao nhất (Max.) là 56.70, phản ánh có giao dịch mang lại doanh thu lớn nhất trong tập dữ liệu.
Giá trị trung vị (Median) là 11.25, cho thấy một nửa các giao dịch có doanh thu dưới hoặc bằng mức này.
Giá trị trung bình (Mean) là 13.00, cao hơn trung vị, điều này cho thấy phân phối doanh thu có thể bị lệch phải (có một số giá trị lớn kéo trung bình lên).
Phân vị thứ nhất (1st Qu.) là 6.84 và phân vị thứ ba (3rd Qu.) là 17.37, tức 25% giao dịch có doanh thu dưới hoặc bằng 6.84, 50% giao dịch có doanh thu trong khoảng từ 6.84 đến 17.37, và 25% còn lại có doanh thu trên 17.37.
Như vậy, doanh thu các giao dịch có sự phân bố rộng với xu hướng lệch phải, phần lớn doanh thu tập trung ở mức vừa phải nhưng có một số giao dịch doanh thu rất cao kéo giá trị trung bình lên.
Vẽ đồ thị
ggplot(data, aes(x = Revenue)) +
geom_histogram(binwidth = 1,
fill = "lightgreen",
color = "black") +
labs(
x = "Doanh thu (USD)",
y = "Số lượng giao dịch") +
theme_bw()