Câu 1

Số cuộc gọi đến tổng đài trong 1 phút tuân theo phân phối Poisson với trung bình 3 cuộc gọi/phút.
• Xác suất có đúng 5 cuộc gọi trong một phút là bao nhiêu?
• Kiểm tra kết quả trên bằng hàm dpois trong R.

1. Thông số bài toán

• Trung bình (kỳ vọng): \(\lambda = 3\) cuộc gọi/phút
• Số cuộc gọi cần tính xác suất: \(k = 5\)
• Công thức phân phối Poisson: \(P(X = k) = \frac{e^{-\lambda} \cdot \lambda^k}{k!}\)

2. Cách làm thủ công

Bước 1: Thay số vào công thức trên

\[P(X = 5) = \frac{e^{-3} \cdot 3^5}{5!}\]

Bước 2: Tính các giá trị thành phần

\(e^{-3} \approx 0.049787\)
\(3^5 = 243\)
\(5! = 120\)

Bước 3: Kết quả

\[P(X = 5) = \frac{0.049787 \cdot 243}{120} \approx 0.1008188\]

3. Cách làm bằng R

Tính xác suất có đúng 5 cuộc gọi với lambda = 3. Hàm dpois(x, lambda) được dùng để tính xác suất tại một điểm \(x\) của phân phối

ket_qua <- dpois(5, lambda = 3)
print(ket_qua)
## [1] 0.1008188

Câu 2

Sử dụng tập dữ liệu iris trong R để:
• Xây dựng mô hình hồi quy logistic để phân loại hoa SetosaVersicolor dựa vào Petal.Length, Petal.Width, và Sepal.Length.
• Tính ma trận nhầm lẫn và độ chính xác của mô hình.

1. Lý thuyết hồi quy Logistic (Logistic Regression)

a. Khái niệm

Hồi quy Logistic là một thuật toán thống kê được sử dụng để dự đoán xác suất của một biến mục tiêu rời rạc (thường là nhị phân 0 hoặc 1, Đúng hoặc Sai).

b. Hàm Sigmoid (hàm logistic)

Trong hồi quy tuyến tính, kết quả đầu ra có thể là bất kỳ giá trị nào từ \(-\infty\) đến \(+\infty\). Tuy nhiên, trong phân loại, chúng ta cần một giá trị xác suất nằm trong khoảng \([0, 1]\). Để làm được điều này, hồi quy Logistic sử dụng hàm Sigmoid:
\[f(z) = \frac{1}{1 + e^{-z}}\] Trong đó, \(z\) là phương trình đường thẳng (tương tự hồi quy tuyến tính):
\[z = \beta_0 + \beta_1x_1 + \beta_2x_2 + ... + \beta_nx_n\]

c. Cơ chế hoạt động

• Mô hình tính toán giá trị \(z\) dựa trên các biến đầu vào (\(x_1, x_2, x_3\) tương ứng với Petal.Length, Petal.Width, Sepal.Length).
• Giá trị \(z\) được đưa qua hàm Sigmoid để chuyển thành xác suất \(P\).
• Ngưỡng quyết định (Decision Boundary): Thông thường, nếu \(P \geq 0.5\), mô hình sẽ phân loại vào nhóm 1 (ví dụ: Versicolor), và nếu \(P < 0.5\) sẽ thuộc nhóm 0 (ví dụ: Setosa).

2. Lý thuyết về đánh giá mô hình

Để biết mô hình hoạt động tốt đến đâu, chúng ta sử dụng hai công cụ chính

Công cụ 1: Ma trận nhầm lẫn (Confusion Matrix)

                | Dự đoán: Lớp 0 | Dự đoán: Lớp 1
------------------------------------------------
Thực tế: Lớp 0 |    Đúng (TN)     | Sai (FP)
------------------------------------------------
Thực tế: Lớp 1 |    Sai (FN)      | Đúng (TP)

• TP (True Positive): Thực tế là lớp 1, dự đoán đúng là lớp 1.
• TN (True Negative): Thực tế là lớp 0, dự đoán đúng là lớp 0.
• FP (False Positive): Thực tế là lớp 0, nhưng dự đoán sai là lớp 1.
• FN (False Negative): Thực tế là lớp 1, nhưng dự đoán sai là lớp 0.

Công cụ 2: Độ chính xác (Accuracy)

Là tỉ lệ giữa số lượng điểm dữ liệu được dự đoán đúng trên tổng số điểm dữ liệu:
\[\text{Accuracy} = \frac{TP + TN}{TP + TN + FP + FN}\]

3. Code R

Bước 1: Chuẩn bị dữ liệu

Hồi quy Logistic nhị phân chỉ dùng cho 2 lớp. Ta lọc lấy loài SetosaVersicolor

data_iris <- subset(iris, Species %in% c("setosa", "versicolor"))
data_iris$Species <- factor(data_iris$Species) # Cập nhật lại các level của factor

Bước 2: Xây dựng mô hình

• Sử dụng hàm glm (Generalized Linear Models).
• formula: Species phụ thuộc vào 3 biến Petal.Length, Petal.Width, Sepal.Length.

model <- glm(Species ~ Petal.Length + Petal.Width + Sepal.Length,
             data = data_iris,
             family = binomial)
## Warning: glm.fit: algorithm did not converge
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred

Bước 3: Dự đoán

# type = "response" để lấy giá trị xác suất từ 0 đến 1
prob <- predict(model, type = "response")

# Chuyển xác suất sang nhãn lớp: nếu > 0.5 là versicolor, ngược lại là setosa
predict_labels <- ifelse(prob > 0.5, "versicolor", "setosa")

Bước 4: Tính ma trận nhầm lẫn và độ chính xác

conf_matrix <- table(Actual = data_iris$Species, Predicted = predict_labels)
print("Ma trận nhầm lẫn:")
## [1] "Ma trận nhầm lẫn:"
print(conf_matrix)
##             Predicted
## Actual       setosa versicolor
##   setosa         50          0
##   versicolor      0         50
accuracy <- sum(diag(conf_matrix)) / sum(conf_matrix)
cat("Độ chính xác của mô hình:", accuracy * 100, "%\n")
## Độ chính xác của mô hình: 100 %

Bước 5: Chạy kiểm định Hosmer-Lemeshow

# 1. Gọi thư viện
library(ResourceSelection)
## Warning: package 'ResourceSelection' was built under R version 4.5.3
## ResourceSelection 0.3-6   2023-06-27
# Chuyển Species thực tế sang dạng số 0 và 1 để làm kiểm định
# setosa thành 0, versicolor thành 1
actual_values <- as.numeric(data_iris$Species) - 1

# 2. Chạy kiểm định
# y: Giá trị thực tế (0, 1)
# fitted: Xác suất dự đoán
# g = 10 là số nhóm mặc định thường dùng
homeless_lemmesegs <- hoslem.test(actual_values, fitted(model), g = 10)
## Warning in hoslem.test(actual_values, fitted(model), g = 10): The data did not
## allow for the requested number of bins.
print(homeless_lemmesegs)
## 
##  Hosmer and Lemeshow goodness of fit (GOF) test
## 
## data:  actual_values, fitted(model)
## X-squared = 7.4857e-10, df = 1, p-value = 1