’)
Cuốn sách bắt đầu bằng việc giới thiệu về mô hình thống kê và lý do cần sử dụng chúng cho phân tích dữ liệu. Nó trình bày các quy ước để mô tả dữ liệu và các kỹ thuật vẽ biểu đồ dữ liệu để khám phá mối quan hệ giữa các biến, ví dụ như biểu đồ FEV (forced expiratory volume) so với tuổi và chiều cao sử dụng dữ liệu lungcap. Cách mã hóa các biến yếu tố (factors) cũng được đề cập. Quan trọng là, mô hình thống kê được mô tả bao gồm cả thành phần ngẫu nhiên và hệ thống.
Cuốn sách xem xét LRMs như một trường hợp đặc biệt hoặc nền tảng cho GLMs. Mô hình hồi quy tuyến tính đơn giản được giới thiệu. Các quy ước ký hiệu được định nghĩa, bao gồm p là số biến giải thích và p’ là số tham số hồi quy. Nếu mô hình bao gồm hệ số chặn (constant term β0), thì p’ = p + 1. Dữ liệu lungcap được sử dụng làm ví dụ, trong đó một mô hình có thể có p=4 biến giải thích và p’=5 tham số hồi quy.
GLMs mở rộng LRMs bằng cách cho phép biến phản hồi có phân phối khác ngoài phân phối Chuẩn và sử dụng hàm liên kết (link function) để liên hệ trung bình của biến phản hồi với tổ hợp tuyến tính của các biến giải thích.
Cuốn sách cung cấp một bảng tóm tắt chi tiết về các EDMs phổ biến được sử dụng trong GLMs:
Bảng cũng liệt kê hàm tích lũy κ(θ), tham số chính tắc θ, độ lệch đơn vị (unit deviance) d(y,μ), miền hỗ trợ S, miền cho μ (Ω) và miền cho θ (Θ) cho từng phân phối. Độ lệch đơn vị d(y,μ) được giải thích là một thước đo khoảng cách giữa giá trị quan sát y và giá trị trung bình μ.
Cuốn sách thảo luận về việc ước lượng các tham số hồi quy β và tham số phân tán φ trong GLMs. Ước lượng Hợp lý Tối đa (Maximum Likelihood) là phương pháp chính. Các phương pháp khác để ước lượng φ cũng được đề cập như độ lệch trung bình (Mean Deviance) và ước lượng Pearson.
Cuốn sách thảo luận về các phương pháp kiểm định giả thuyết về các tham số hồi quy. - Kiểm định t: Dùng để kiểm định giả thuyết về một tham số đơn lẻ βj (thường là H0: βj = 0), sử dụng thống kê T = (β̂j - β0j) / se(β̂j). Dưới H0, T có phân phối t với n - p’ bậc tự do (khi phương sai σ² không biết). - Kiểm định Wald (Wald test): Dựa trên khoảng cách giữa ước lượng tham số β̂ và giá trị giả thuyết β0, sử dụng kết quả tiệm cận mẫu lớn. Có thể dùng cho kiểm định toàn cầu (global test) cho nhiều tham số cùng lúc. - Kiểm định Score (Score test): Một phương pháp kiểm định tiệm cận khác, dựa trên đạo hàm của hàm log-likelihood tại giá trị giả thuyết. - Cách diễn giải hệ số hồi quy trong mô hình với hàm liên kết khác hàm đồng nhất (identity link) cũng được minh họa, ví dụ, trong mô hình log(DMFT) hoặc log(Số lượng vệ tinh), các hệ số trên thang đo log được diễn giải thành các yếu tố nhân (multiplicative factors) trên thang đo gốc bằng cách lấy lũy thừa tự nhiên (exponentiating).
Dữ liệu lungcap: Dung tích phổi của thanh thiếu niên.
Dữ liệu dmft: Sâu răng liên quan đến tiêu thụ đường.
Dữ liệu hcrabs: Cua móng ngựa, số lượng cua vệ tinh.
Dữ liệu tobacco budworm: Tỷ lệ bướm đêm thuốc lá bị chết theo liều thuốc trừ sâu.
Dữ liệu cosmetic companies: Doanh thu và sử dụng polythene.
Dữ liệu gopher tortoise: Kích thước ổ trứng.
Dữ liệu ratliver: Lượng thuốc còn lại trong gan chuột.
Dữ liệu ct: Thời gian và liều bức xạ trong chụp CT.
Dữ liệu turbine: Tỷ lệ tuabin bị nứt.
Dữ liệu lime: Cây anh đào lá nhỏ.
Dữ liệu poison: Thời gian sống của động vật theo loại thuốc độc và xử lý.
Việc sử dụng phần mềm thống kê R được tích hợp xuyên suốt cuốn sách. Mã R được cung cấp để thực hiện các phân tích, từ đọc và vẽ dữ liệu đến phù hợp mô hình (lm, glm), chẩn đoán (plot, rstandard, cooks.distance, qqnorm), so sánh mô hình (anova, extractAIC), và tính toán thống kê kiểm định. Các chức năng R phổ biến được liệt kê trong mục lục, nhấn mạnh tính thực hành của cuốn sách.
a <- read.csv("C:/Users/Admin/Downloads/Supermarket Transactions.csv",
header = TRUE, sep = ",")
# Kích thước dữ liệu
dim(a)
## [1] 14059 16
# Tên biến
names(a)
## [1] "X" "PurchaseDate" "CustomerID"
## [4] "Gender" "MaritalStatus" "Homeowner"
## [7] "Children" "AnnualIncome" "City"
## [10] "StateorProvince" "Country" "ProductFamily"
## [13] "ProductDepartment" "ProductCategory" "UnitsSold"
## [16] "Revenue"
# Cấu trúc dữ liệu
str(a)
## '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 ...
# Tóm tắt toàn bộ dataset
summary(a)
## X PurchaseDate CustomerID Gender
## Min. : 1 Length:14059 Min. : 3 Length:14059
## 1st Qu.: 3516 Class :character 1st Qu.: 2549 Class :character
## Median : 7030 Mode :character Median : 5060 Mode :character
## Mean : 7030 Mean : 5117
## 3rd Qu.:10544 3rd Qu.: 7633
## Max. :14059 Max. :10280
## MaritalStatus Homeowner Children AnnualIncome
## Length:14059 Length:14059 Min. :0.00 Length:14059
## Class :character Class :character 1st Qu.:1.00 Class :character
## Mode :character Mode :character Median :3.00 Mode :character
## Mean :2.53
## 3rd Qu.:4.00
## Max. :5.00
## City StateorProvince Country ProductFamily
## Length:14059 Length:14059 Length:14059 Length:14059
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
## ProductDepartment ProductCategory UnitsSold Revenue
## Length:14059 Length:14059 Min. :1.000 Min. : 0.53
## Class :character Class :character 1st Qu.:3.000 1st Qu.: 6.84
## Mode :character Mode :character Median :4.000 Median :11.25
## Mean :4.081 Mean :13.00
## 3rd Qu.:5.000 3rd Qu.:17.37
## Max. :8.000 Max. :56.70
# Thống kê mô tả cho biến định lượng
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.4.3
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.4.3
## Warning: package 'ggplot2' was built under R version 4.4.3
## Warning: package 'tidyr' was built under R version 4.4.1
## Warning: package 'readr' was built under R version 4.4.3
## Warning: package 'purrr' was built under R version 4.4.1
## Warning: package 'forcats' was built under R version 4.4.3
## Warning: package 'lubridate' was built under R version 4.4.1
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats 1.0.0 ✔ readr 2.1.5
## ✔ ggplot2 3.5.2 ✔ stringr 1.5.1
## ✔ lubridate 1.9.3 ✔ tibble 3.2.1
## ✔ purrr 1.0.2 ✔ tidyr 1.3.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(knitr)
library(kableExtra)
## Warning: package 'kableExtra' was built under R version 4.4.3
##
## Attaching package: 'kableExtra'
##
## The following object is masked from 'package:dplyr':
##
## group_rows
quant_vars <- c("Children", "UnitsSold", "Revenue")
summary_stats_quant <- a %>%
select(all_of(quant_vars)) %>%
summarise_all(list(
Mean = ~mean(., na.rm = TRUE),
StdDev = ~sd(., na.rm = TRUE),
Min = ~min(., na.rm = TRUE),
Max = ~max(., na.rm = TRUE),
Q1 = ~quantile(., 0.25, na.rm = TRUE),
Median = ~quantile(., 0.5, na.rm = TRUE),
Q3 = ~quantile(., 0.75, na.rm = TRUE)
))
# Chuyển đổi dữ liệu để trình bày bảng
stats_table <- data.frame(
Variable = rep(quant_vars, each = 7),
Statistic = rep(c("Mean", "StdDev", "Min", "Max", "Q1", "Median", "Q3"), times = length(quant_vars)),
Value = c(
summary_stats_quant$Children_Mean, summary_stats_quant$Children_StdDev, summary_stats_quant$Children_Min,
summary_stats_quant$Children_Max, summary_stats_quant$Children_Q1, summary_stats_quant$Children_Median,
summary_stats_quant$Children_Q3,
summary_stats_quant$UnitsSold_Mean, summary_stats_quant$UnitsSold_StdDev, summary_stats_quant$UnitsSold_Min,
summary_stats_quant$UnitsSold_Max, summary_stats_quant$UnitsSold_Q1, summary_stats_quant$UnitsSold_Median,
summary_stats_quant$UnitsSold_Q3,
summary_stats_quant$Revenue_Mean, summary_stats_quant$Revenue_StdDev, summary_stats_quant$Revenue_Min,
summary_stats_quant$Revenue_Max, summary_stats_quant$Revenue_Q1, summary_stats_quant$Revenue_Median,
summary_stats_quant$Revenue_Q3
)
)
# Định dạng số (2 chữ số thập phân)
stats_table$Value <- round(stats_table$Value, 2)
# Tạo bảng HTML
kable(stats_table, format = "html", caption = "Thống kê mô tả cho các biến định lượng") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE) %>%
group_rows("Children", 1, 7) %>%
group_rows("UnitsSold", 8, 14) %>%
group_rows("Revenue", 15, 21)
| Variable | Statistic | Value |
|---|---|---|
| Children | ||
| Children | Mean | 2.53 |
| Children | StdDev | 1.49 |
| Children | Min | 0.00 |
| Children | Max | 5.00 |
| Children | Q1 | 1.00 |
| Children | Median | 3.00 |
| Children | Q3 | 4.00 |
| UnitsSold | ||
| UnitsSold | Mean | 4.08 |
| UnitsSold | StdDev | 1.17 |
| UnitsSold | Min | 1.00 |
| UnitsSold | Max | 8.00 |
| UnitsSold | Q1 | 3.00 |
| UnitsSold | Median | 4.00 |
| UnitsSold | Q3 | 5.00 |
| Revenue | ||
| Revenue | Mean | 13.00 |
| Revenue | StdDev | 8.22 |
| Revenue | Min | 0.53 |
| Revenue | Max | 56.70 |
| Revenue | Q1 | 6.84 |
| Revenue | Median | 11.25 |
| Revenue | Q3 | 17.37 |
qual_vars <- c("Gender", "MaritalStatus", "Homeowner", "AnnualIncome",
"City", "StateorProvince", "Country", "ProductFamily",
"ProductDepartment", "ProductCategory")
for (var in qual_vars) {
cat("\nThống kê cho biến", var, ":\n")
freq_table <- table(a[[var]])
prop_table <- prop.table(freq_table) * 100
print(cbind(Frequency = freq_table, Percentage = round(prop_table, 1)))
cat("Số danh mục:", length(freq_table), "\n")
}
##
## Thống kê cho biến Gender :
## Frequency Percentage
## F 7170 51
## M 6889 49
## Số danh mục: 2
##
## Thống kê cho biến MaritalStatus :
## Frequency Percentage
## M 6866 48.8
## S 7193 51.2
## Số danh mục: 2
##
## Thống kê cho biến Homeowner :
## Frequency Percentage
## N 5615 39.9
## Y 8444 60.1
## Số danh mục: 2
##
## Thống kê cho biến AnnualIncome :
## Frequency Percentage
## $10K - $30K 3090 22.0
## $110K - $130K 643 4.6
## $130K - $150K 760 5.4
## $150K + 273 1.9
## $30K - $50K 4601 32.7
## $50K - $70K 2370 16.9
## $70K - $90K 1709 12.2
## $90K - $110K 613 4.4
## Số danh mục: 8
##
## Thống kê cho biến City :
## Frequency Percentage
## Acapulco 383 2.7
## Bellingham 143 1.0
## Beverly Hills 811 5.8
## Bremerton 834 5.9
## Camacho 452 3.2
## Guadalajara 75 0.5
## Hidalgo 845 6.0
## Los Angeles 926 6.6
## Merida 654 4.7
## Mexico City 194 1.4
## Orizaba 464 3.3
## Portland 876 6.2
## Salem 1386 9.9
## San Andres 621 4.4
## San Diego 866 6.2
## San Francisco 130 0.9
## Seattle 922 6.6
## Spokane 875 6.2
## Tacoma 1257 8.9
## Vancouver 633 4.5
## Victoria 176 1.3
## Walla Walla 160 1.1
## Yakima 376 2.7
## Số danh mục: 23
##
## Thống kê cho biến StateorProvince :
## Frequency Percentage
## BC 809 5.8
## CA 2733 19.4
## DF 815 5.8
## Guerrero 383 2.7
## Jalisco 75 0.5
## OR 2262 16.1
## Veracruz 464 3.3
## WA 4567 32.5
## Yucatan 654 4.7
## Zacatecas 1297 9.2
## Số danh mục: 10
##
## Thống kê cho biến Country :
## Frequency Percentage
## Canada 809 5.8
## Mexico 3688 26.2
## USA 9562 68.0
## Số danh mục: 3
##
## Thống kê cho biến ProductFamily :
## Frequency Percentage
## Drink 1250 8.9
## Food 10153 72.2
## Non-Consumable 2656 18.9
## Số danh mục: 3
##
## Thống kê cho biến ProductDepartment :
## Frequency Percentage
## Alcoholic Beverages 356 2.5
## Baked Goods 425 3.0
## Baking Goods 1072 7.6
## Beverages 680 4.8
## Breakfast Foods 188 1.3
## Canned Foods 977 6.9
## Canned Products 109 0.8
## Carousel 59 0.4
## Checkout 82 0.6
## Dairy 903 6.4
## Deli 699 5.0
## Eggs 198 1.4
## Frozen Foods 1382 9.8
## Health and Hygiene 893 6.4
## Household 1420 10.1
## Meat 89 0.6
## Periodicals 202 1.4
## Produce 1994 14.2
## Seafood 102 0.7
## Snack Foods 1600 11.4
## Snacks 352 2.5
## Starchy Foods 277 2.0
## Số danh mục: 22
##
## Thống kê cho biến ProductCategory :
## Frequency Percentage
## Baking Goods 484 3.4
## Bathroom Products 365 2.6
## Beer and Wine 356 2.5
## Bread 425 3.0
## Breakfast Foods 417 3.0
## Candles 45 0.3
## Candy 352 2.5
## Canned Anchovies 44 0.3
## Canned Clams 53 0.4
## Canned Oysters 35 0.2
## Canned Sardines 40 0.3
## Canned Shrimp 38 0.3
## Canned Soup 404 2.9
## Canned Tuna 87 0.6
## Carbonated Beverages 154 1.1
## Cleaning Supplies 189 1.3
## Cold Remedies 93 0.7
## Dairy 903 6.4
## Decongestants 85 0.6
## Drinks 135 1.0
## Eggs 198 1.4
## Electrical 355 2.5
## Frozen Desserts 323 2.3
## Frozen Entrees 118 0.8
## Fruit 765 5.4
## Hardware 129 0.9
## Hot Beverages 226 1.6
## Hygiene 197 1.4
## Jams and Jellies 588 4.2
## Kitchen Products 217 1.5
## Magazines 202 1.4
## Meat 761 5.4
## Miscellaneous 42 0.3
## Packaged Vegetables 48 0.3
## Pain Relievers 192 1.4
## Paper Products 345 2.5
## Pizza 194 1.4
## Plastic Products 141 1.0
## Pure Juice Beverages 165 1.2
## Seafood 102 0.7
## Side Dishes 153 1.1
## Snack Foods 1600 11.4
## Specialty 289 2.1
## Starchy Foods 277 2.0
## Vegetables 1728 12.3
## Số danh mục: 45
# Thống kê số lượng và tỷ lệ phần trăm
gender_freq <- table(a$Gender)
gender_percent <- round(prop.table(gender_freq) * 100, 2)
# Kết hợp thành bảng tổng hợp
summary_gender <- data.frame(
Category = names(gender_freq),
Count = as.vector(gender_freq),
Percentage = as.vector(gender_percent)
)
categorical_vars <- c("Gender", "MaritalStatus", "Homeowner", "AnnualIncome")
# Tạo danh sách màu cho từng biến
color_list <- list(
Gender = c("#f5f5f5", "#73c6b6"),
MaritalStatus = c("#ff9999", "#66b2ff", "#99ff99"),
Homeowner = c("#ffcc99", "#66cc99"),
AnnualIncome = c("#a6cee3", "#1f78b4", "#b2df8a", "#33a02c")
)
for (var in categorical_vars) {
freq <- table(a[[var]])
percent <- round(prop.table(freq) * 100, 2)
pie(
freq,
labels = paste0(names(freq), ": ", percent, "%"),
main = paste("Biểu đồ tròn thể hiện tỷ lệ phần trăm các quan sát của biến", var),
col = color_list[[var]][1:length(freq)]
)
}
library(tidyverse)
freq_table <- table(a$Gender)
prop_table <- prop.table(freq_table) * 100
plot_data <- data.frame(
Category = names(freq_table),
Percentage = as.numeric(prop_table)
)
p <- ggplot(plot_data, aes(x = Category, y = Percentage, fill = Category)) +
geom_bar(stat = "identity") +
labs(title = "Phân phối của Gender", x = "Gender", y = "Tỷ lệ (%)") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1), legend.position = "none") +
scale_fill_brewer(palette = "Set2")
print(p)