0. Đọc dữ liệu

lệnh giúp setwd về thư mục chứa file Rscript mà mình đang làm việc

setwd(dirname(rstudioapi::getActiveDocumentContext()$path))
library(readr) 
data <- read_csv("Sleep_health_and_lifestyle_dataset.csv")
## Rows: 374 Columns: 13
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (5): Gender, Occupation, BMI Category, Blood Pressure, Sleep Disorder
## dbl (8): Person ID, Age, Sleep Duration, Quality of Sleep, Physical Activity...
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

TÓM TẮT FILE DỮ LIỆU

Bộ dữ liệu được sử dụng là data_health_and_lifestyle_dataset.csv, gồm 374 quan sát (374 người)13 biến phản ánh đặc điểm nhân khẩu học, sức khỏe và lối sống.

Danh sách và ý nghĩa các biến

  • Person ID: Mã định danh của người tham gia
  • Gender: Giới tính (Male, Female)
  • Age: Độ tuổi (năm)
  • Occupation: Nghề nghiệp
  • data Duration: Thời lượng ngủ trung bình (giờ/đêm)
  • Quality of data: Điểm chất lượng giấc ngủ
  • Physical Activity Level: Mức độ hoạt động thể chất
  • Stress Level: Mức độ căng thẳng
  • BMI Category: Phân loại BMI
  • Blood Pressure: Huyết áp (tâm thu/tâm trương)
  • Heart Rate: Nhịp tim (nhịp/phút)
  • Daily Steps: Số bước đi trung bình mỗi ngày
  • data Disorder: Rối loạn giấc ngủ (None, Insomnia, data Apnea)

Các biến được chọn phân tích

  • Biến định tính:
    • BMI Category
    • Occupation
  • Biến định lượng:
    • Age
    • Daily Steps

Các biến này đại diện tốt cho tình trạng sức khỏe, lối sống và phù hợp với yêu cầu thống kê mô tả.

Câu 1.Thực hiện thống kê mô tả: các bảng tần số (phân tổ dữ liệu), biểu đồ

1.1.Bảng tần số, tần suất

Bảng tần số của BMI Category

table_bmi <- table(data$`BMI Category`)
data_bmi_freq <- data.frame(
  BMI_Category = names(table_bmi),
  Tần_số = as.vector(table_bmi)
)
data_bmi_freq$Tỷ_lệ_phần_trăm <- round(data_bmi_freq$Tần_số / sum(data_bmi_freq$Tần_số) * 100, 2)

print(data_bmi_freq)
##    BMI_Category Tần_số Tỷ_lệ_phần_trăm
## 1        Normal    195           52.14
## 2 Normal Weight     21            5.61
## 3         Obese     10            2.67
## 4    Overweight    148           39.57

Biểu đồ thanh

barplot(table_bmi, main = "Biểu đồ tần số BMI Category", xlab = "Hạng mục BMI", ylab = "Tần số", col = "skyblue")

Bảng tần số của Occupation

table_occ <- table(data$Occupation)
prop_occ <- prop.table(table_occ) * 100
data_occ <- data.frame(table_occ, Tỷ_lệ = prop_occ)
names(data_occ) <- c("Occupation", "Tần_số", "Tỷ_lệ_phần_trăm")
print("Bảng Tần số Nghề nghiệp:")
## [1] "Bảng Tần số Nghề nghiệp:"
data_occ
##              Occupation Tần_số      Tỷ_lệ_phần_trăm       <NA>
## 1            Accountant     37           Accountant  9.8930481
## 2                Doctor     71               Doctor 18.9839572
## 3              Engineer     63             Engineer 16.8449198
## 4                Lawyer     47               Lawyer 12.5668449
## 5               Manager      1              Manager  0.2673797
## 6                 Nurse     73                Nurse 19.5187166
## 7  Sales Representative      2 Sales Representative  0.5347594
## 8           Salesperson     32          Salesperson  8.5561497
## 9             Scientist      4            Scientist  1.0695187
## 10    Software Engineer      4    Software Engineer  1.0695187
## 11              Teacher     40              Teacher 10.6951872

Biểu đồ thanh

barplot(table_occ, 
        main = "Biểu đồ tần số Nghề nghiệp",
        xlab = "Nghề nghiệp", 
        ylab = "Tần số", 
        col = "lightgreen",
        las = 2, # Xoay nhãn trục x để dễ đọc
        mar = c(10, 4, 4, 2) + 0.1)

Biến Định lượng Age Vẽ Histogram (Phân tổ dữ liệu)

hist(data$Age, 
     main = "Histogram của Age", 
     xlab = "Tuổi", 
     ylab = "Tần số", 
     col = "salmon", 
     breaks = 10)

Vẽ Biểu đồ hộp

boxplot(data$Age, 
        main = "Boxplot của Age", 
        ylab = "Tuổi", 
        col = "salmon")

Biến Định lượng Daily Steps Vẽ Histogram (Phân tổ dữ liệu)

hist(data$Age, 
     main = "Histogram của Age", 
     xlab = "Tuổi", 
     ylab = "Tần số", 
     col = "salmon", 
     breaks = 10)

Vẽ Biểu đồ hộp (Boxplot)

boxplot(data$`Daily Steps`, 
        main = "Boxplot của Daily Steps", 
        ylab = "Số bước chân hàng ngày", 
        col = "gold")

Câu 2: THỐNG KÊ MÔ TẢ CHO 2 BIẾN ĐỊNH LƯỢNG

Phân tích biến Age

Các đại lượng thống kê mô tả

min(data$Age)
## [1] 27
max(data$Age)
## [1] 59
range(data$Age)
## [1] 27 59
quantile(data$Age, 0.25)
##   25% 
## 35.25
quantile(data$Age, 0.50)
## 50% 
##  43
quantile(data$Age, 0.75)
## 75% 
##  50
IQR(data$Age)
## [1] 14.75
sd(data$Age)
## [1] 8.673133
var(data$Age)
## [1] 75.22324

Nhận xét Độ tuổi dao động từ 27 đến 59. Phần lớn tập trung trong nhóm 35–50 tuổi. Độ phân tán ở mức vừa phải, không xuất hiện ngoại biên

Biểu đồ histogram – Age

hist(data$Age)

Nhận xét: Dữ liệu không phân phối đều, có xu hướng tập trung vào nhóm 35–45 tuổi. Phân phối hơi nghiêng sang phải right–skewed), vì có một số giá trị ở nhóm tuổi cao hơn. Mật độ dày nhất nằm gần trung vị 40–45 tuổi.

Biểu đồ Boxplot – Age

boxplot(data$Age, horizontal = TRUE)

Nhận xét: Không xuất hiện giá trị ngoại biên (outlier). Độ trải giữa phân vị rộng (IQR = 14.75) → mẫu có độ phân tán tuổi tương đối cao. Phân phối hơi lệch phải do phần đuôi trên dài hơn.

Phân tích biến Daily Steps

Các đại lượng thống kê mô tả

min(data$`Daily Steps`)
## [1] 3000
max(data$`Daily Steps`)
## [1] 10000
range(data$`Daily Steps`)
## [1]  3000 10000
quantile(data$`Daily Steps`, 0.25)
##  25% 
## 5600
quantile(data$`Daily Steps`, 0.50)
##  50% 
## 7000
quantile(data$`Daily Steps`, 0.75)
##  75% 
## 8000
IQR(data$`Daily Steps`)
## [1] 2400
sd(data$`Daily Steps`)
## [1] 1617.916
var(data$`Daily Steps`)
## [1] 2617651

Nhận xét Số bước dao động từ 3.000 đến 10.000 bước/ngày. Trung vị khoảng 7.000 bước/ngày. Phần lớn người tham gia có mức vận động trung bình đến khá.

Biểu đồ histogram - Daily Steps

hist(data$`Daily Steps`)

Nhận xét: Dữ liệu có hai vùng tập trung chính: khoảng 5000–6000 bước và 7000–8000 bước. Phân phối tương đối đều, không lệch mạnh sang trái hoặc phải. Nhóm bước cao (≥ 8000) vẫn xuất hiện nhiều → thể hiện mức độ vận động tốt của phần lớn mẫu.

Biểu đồ Boxplot – Daily Steps

boxplot(data$`Daily Steps`, horizontal = TRUE)

Nhận xét: Không có ngoại biên → dữ liệu khá ổn định. Trung vị ở mức 7000 bước cho thấy phần lớn người tham gia vận động ở mức trung bình – cao. IQR = 2400 cho thấy số bước có độ phân tán vừa phải.

KẾT LUẬN TỔNG QUAN

Bộ dữ liệu có phân bố hợp lý, phản ánh đặc điểm của nhóm người trưởng thành đang làm việc.

BMI Category chủ yếu tập trung ở nhóm Normal/Normal Weight, tiếp theo là Overweight; nhóm Obese chiếm tỷ lệ nhỏ. Occupation phân bố không đồng đều, trong đó các nhóm Doctor, Nurse, Engineer, TeacherLawyer xuất hiện nhiều nhất. Age dao động từ 27 đến 59 tuổi, tập trung chủ yếu trong nhóm 35–50 tuổi, với mức độ phân tán tương đối thấp. Daily Steps có giá trị trung bình khoảng 6.800 bước/ngày, phần lớn nằm trong khoảng 5.600–8.000 bước/ngày, cho thấy mức độ vận động từ trung bình đến khá. Daily Steps có độ phân tán lớn hơn Age, phản ánh sự khác biệt rõ rệt về mức độ hoạt động thể chất giữa các cá nhân. Cả hai biến định lượng không xuất hiện ngoại biên, cho thấy dữ liệu có chất lượng tốt và phù hợp cho các phân tích tiếp theo.

Câu 3: Các bài toán ước lượng điểm, ước lượng khoảng: trung bình, tỉ lệ, phương sai

3.1. Ước lượng điểm

Bài toán 1: Tìm ước lượng điểm cho số bước chân trung bình hàng ngày

mean(data$`Daily Steps`)
## [1] 6816.845

Kết quả:

[1] 6816.845

Kết luận: Ước lượng điểm cho số bước chân trung bình hàng ngày là 6816.845 bước.


Bài toán 2: Tìm ước lượng điểm cho tỉ lệ số người có số bước chân hàng ngày >= 6000

Lời giải:

x <- subset(data, data$`Daily Steps` >= 6000)
vector1 <- nrow(x) 
vector2 <- nrow(data) 
prop.test(vector1, vector2, conf.level = 0.95, correct = FALSE)
## 
##  1-sample proportions test without continuity correction
## 
## data:  vector1 out of vector2, null probability 0.5
## X-squared = 90.524, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.6995252 0.7874516
## sample estimates:
##         p 
## 0.7459893

Kết quả:

1-sample proportions test without continuity correction

data:  vector1 out of vector2, null probability 0.5
X-squared = 90.524, df = 1, p-value < 2.2e-16
alternative hypothesis: true p is not equal to 0.5
95 percent confidence interval:
 0.6995252 0.7874516
sample estimates:
        p 
0.7459893

Kết luận: Ước lượng điểm cho tỉ lệ số người có số bước chân hàng ngày >= 6000 là 74.59%.


Bài toán 3: Tìm ước lượng điểm cho phương sai của số bước chân hàng ngày

Lời giải:

var(data$`Daily Steps`)
## [1] 2617651

Kết quả:

[1] 2617651

Kết luận: Ước lượng điểm cho phương sai của số bước chân hàng ngày là 2617651 (bước²).


3.2. Ước lượng khoảng

Bài toán 1: Xây dựng khoảng tin cậy 95% cho tuổi trung bình

Một công ty muốn biết khoảng giá trị ước lượng trung bình độ tuổi trong tập dữ liệu. Hãy xây dựng khoảng tin cậy 95% cho tuổi trung bình trong mẫu dữ liệu trên.

t.test(data$Age, conf.level = 0.95)
## 
##  One Sample t-test
## 
## data:  data$Age
## t = 94.062, df = 373, p-value < 2.2e-16
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  41.30263 43.06635
## sample estimates:
## mean of x 
##  42.18449

Kết quả:

One Sample t-test

data:  data$Age
t = 94.062, df = 373, p-value < 2.2e-16
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
 41.30263 43.06635
sample estimates:
mean of x 
 42.18449

Nhận xét: Ước lượng khoảng 95% cho trung bình độ tuổi là [41.30263, 43.06635].


Bài toán 2: Xây dựng khoảng tin cậy 99% cho tỷ lệ người có chỉ số BMI bình thường

Một công ty muốn biết khoảng ước lượng tỷ lệ người có chỉ số BMI bình thường (Normal). Hãy xây dựng khoảng tin cậy 99% cho tỷ lệ này.

t.test(data$`BMI Category` == "Normal", conf.level = 0.99)
## 
##  One Sample t-test
## 
## data:  data$`BMI Category` == "Normal"
## t = 20.158, df = 373, p-value < 2.2e-16
## alternative hypothesis: true mean is not equal to 0
## 99 percent confidence interval:
##  0.4544232 0.5883576
## sample estimates:
## mean of x 
## 0.5213904

Kết quả:

One Sample t-test

data:  data$`BMI Category` == "Normal"
t = 20.158, df = 373, p-value < 2.2e-16
alternative hypothesis: true mean is not equal to 0
99 percent confidence interval:
 0.4544232 0.5883576
sample estimates:
mean of x 
0.5213904

Nhận xét: Ước lượng khoảng 99% cho tỷ lệ người có chỉ số BMI bình thường là [0.4544232, 0.5883576] (tương đương 45.44% - 58.84%).


Bài toán 3: Xây dựng khoảng tin cậy 95% cho phương sai của số bước chân hàng ngày

Một công ty muốn biết khoảng tin cậy 95% cho phương sai của số bước chân hàng ngày. Hãy xây dựng khoảng tin cậy 95% cho phương sai này.

n <- length(data$`Daily Steps`) 
s2 <- var(data$`Daily Steps`) 
alpha <- 0.05 
lower <- (n - 1) * s2 / qchisq(1 - alpha/2, df = n - 1) 
upper <- (n - 1) * s2 / qchisq(alpha/2, df = n - 1)
c(lower, upper)
## [1] 2279136 3038039

Kết luận: Khoảng tin cậy 95% cho phương sai của số bước chân hàng ngày là (2279136, 3038039).


Tổng kết

Bài tập này đã thực hiện các phân tích thống kê cơ bản trên tập dữ liệu về sức khỏe và lối sống, bao gồm:

  • Ước lượng điểm: Tính toán giá trị ước lượng trung bình, tỷ lệ và phương sai
  • Ước lượng khoảng: Xây dựng khoảng tin cậy với các mức độ tin cậy khác nhau (95%, 99%)

Các kết quả cho thấy: - Số bước chân trung bình hàng ngày: ~6817 bước - 74.59% người có số bước chân >= 6000 - Độ tuổi trung bình: ~42 tuổi (khoảng tin cậy 95%: 41.3 - 43.1) - Tỷ lệ BMI bình thường: ~52% (khoảng tin cậy 99%: 45.4% - 58.8%)

Định tính: BMI và Occupation Định lượng: Age và Daily steps # Câu 4: Các bài toán kiểm định tham số một tổng thể: trung bình, tỉ lệ ## 4.1 Kiểm định trung bình một tổng thể ### Bài toán 1: Kiểm định BMI normal Một công ty cho rằng số bước chân trung bình là 7000 bước.Hãy kiểm định giả thuyết tại mức ý nghĩa 5%.

Thiết lập giả thuyết H₀: μ = 7000 (số bước chân trung bình là 7000) H₁: μ ≠ 7000 (số bước chân trung bình khác 7000) Mức ý nghĩa: α = 0.05 Đây là kiểm định hai phía

t.test(data$`Daily Steps`,mu=7000,alternative="two.sided")
## 
##  One Sample t-test
## 
## data:  data$`Daily Steps`
## t = -2.1893, df = 373, p-value = 0.0292
## alternative hypothesis: true mean is not equal to 7000
## 95 percent confidence interval:
##  6652.34 6981.35
## sample estimates:
## mean of x 
##  6816.845

p-value = 0.0292 < 0.05 Bác bỏ H₀ Kết luận: Tại mức ý nghĩa 5%, không có đủ bằng chứng thống kê để kết luận rằng số bước chân trung bình là 7000 bước.

4.2 Kiểm định tỷ lệ một tổng thể

Bài toán 2: Kiểm định tỉ lệ BMI

Một công ty cho rằng tỉ lệ BMI normal không quá là 50%.Hãy kiểm định giả thuyết tại mức ý nghĩa 5%.

Thiết lập giả thuyết H₀: p ≤ 0.5 (tỉ lệ BMI normal tối đa là 50%) H₁: p > 0.5 (tỉ lệ BMI normal trên 50%) Mức ý nghĩa: α = 0.05 Đây là kiểm định hai phía

x <- sum(data$`BMI Category` == "Normal")
n <- nrow(data)
prop.test(x, n, p=0.5,alt="g",correct = F)
## 
##  1-sample proportions test without continuity correction
## 
## data:  x out of n, null probability 0.5
## X-squared = 0.68449, df = 1, p-value = 0.204
## alternative hypothesis: true p is greater than 0.5
## 95 percent confidence interval:
##  0.4789016 1.0000000
## sample estimates:
##         p 
## 0.5213904

p-value = 0.204 > 0.05 Không bác bỏ H₀ Kết luận: Tại mức ý nghĩa 5%, Chưa có đủ bằng chứng để kết luận tỉ lệ BMI normal khác 50%

Câu 5: Các bài toán kiểm định tham số hai tổng thể: trung bình, tỉ lệ, phương sai

5.1 Kiểm định trung bình hai tổng thể

Bài toán 1: Kiểm định mức độ stress

Một công ty muốn so sánh mức độ stress trung bình giữa hai nghề: Doctor và Software Engineer. Hãy kiểm định xem có sự khác biệt hay không tại mức ý nghĩa 5%.

Gọi μ₁: Mức độ stress trung bình của Doctor Gọi μ₂: Mức độ stress trung bình của Software Engineer

H₀: μ₁ = μ₂ (mức độ stress của hai nghề bằng nhau) H₁: μ₁ ≠ μ₂ (mức độ stress của hai nghề khác nhau)

Mức ý nghĩa: α = 0.05 → Kiểm định hai phía

doctor_stress <- data$`Stress Level`[data$Occupation == "Doctor"]
engineer_stress <- data$`Stress Level`[data$Occupation == "Software Engineer"]
t.test(doctor_stress, engineer_stress, 
                      alternative = "two.sided",
                      var.equal = FALSE)
## 
##  Welch Two Sample t-test
## 
## data:  doctor_stress and engineer_stress
## t = 1.0093, df = 3.3266, p-value = 0.3805
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -1.453794  2.918583
## sample estimates:
## mean of x mean of y 
##  6.732394  6.000000

p-value = 0.3805 ≥ 0.05 Không bác bỏ H₀ Chưa có đủ bằng chứng để kết luận mức độ stress trung bình của hai nghề khác nhau

5.2 Kiểm định tỉ lệ hai tổng thể

Bài toán 2: Kiểm định tỉ lệ rối loạn giấc ngủ

Một nghiên cứu muốn kiểm tra xem tỉ lệ người có rối loạn giấc ngủ (Sleep Disorder khác “None”) trong nhóm BMI Obese có CAO HƠN nhóm BMI Normal hay không. Hãy kiểm định giả thuyết tại mức ý nghĩa 5%.

Gọi p₁: Tỉ lệ người có rối loạn giấc ngủ trong nhóm Obese Gọi p₂: Tỉ lệ người có rối loạn giấc ngủ trong nhóm Normal

H₀: p₁ ≤ p₂ (tỉ lệ rối loạn ở nhóm Obese không cao hơn Normal) H₁: p₁ > p₂ (tỉ lệ rối loạn ở nhóm Obese cao hơn Normal)

Mức ý nghĩa: α = 0.05 → Kiểm định một phía phải

# Lọc dữ liệu
obese_data <- data[data$`BMI Category` == "Obese", ]
normal_data <- data[data$`BMI Category` == "Normal", ]

# Đếm số người có rối loạn
x1 <- sum(obese_data$`Sleep Disorder` != "None")  # Obese có rối loạn
n1 <- nrow(obese_data)  # Tổng số người Obese

x2 <- sum(normal_data$`Sleep Disorder` != "None")  # Normal có rối loạn
n2 <- nrow(normal_data)  # Tổng số người Normal

# Kiểm định (p1 > p2)
prop.test(c(x1, x2), c(n1, n2), 
                         alternative = "greater",
                         correct = FALSE)
## Warning in prop.test(c(x1, x2), c(n1, n2), alternative = "greater", correct =
## FALSE): Chi-squared approximation may be incorrect
## 
##  2-sample test for equality of proportions without continuity correction
## 
## data:  c(x1, x2) out of c(n1, n2)
## X-squared = 87.448, df = 1, p-value < 2.2e-16
## alternative hypothesis: greater
## 95 percent confidence interval:
##  0.9101547 1.0000000
## sample estimates:
##     prop 1     prop 2 
## 1.00000000 0.06153846

p-value < 2.2e-16 < 0.05 Bác bỏ H₀ Có đủ bằng chứng để kết luận tỉ lệ rối loạn giấc ngủ ở nhóm Obese cao hơn nhóm Normal.

5.3 Kiểm định tỉ phương sai hai tổng thể

Bài toán 2: Kiểm định phương sai mức độ stress

Một công ty muốn so sánh độ đồng đều (phương sai) của mức độ stress giữa nghề Doctor và Teacher. Hãy kiểm định xem có sự khác biệt hay không tại mức ý nghĩa 5%.

Gọi σ₁²: Phương sai mức độ stress của Doctor Gọi σ₂²: Phương sai mức độ stress của Teacher

H₀: σ₁² = σ₂² (phương sai của hai nghề bằng nhau) H₁: σ₁² ≠ σ₂² (phương sai của hai nghề khác nhau)

Mức ý nghĩa: α = 0.05 → Kiểm định hai phía

# Lọc dữ liệu
doctor_stress <- data$`Stress Level`[data$Occupation == "Doctor"]
teacher_stress <- data$`Stress Level`[data$Occupation == "Teacher"]

var.test(doctor_stress, teacher_stress, 
                        alternative = "two.sided")
## 
##  F test to compare two variances
## 
## data:  doctor_stress and teacher_stress
## F = 1.6713, num df = 70, denom df = 39, p-value = 0.08346
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
##  0.9328414 2.8623603
## sample estimates:
## ratio of variances 
##           1.671308

p-value = 0.08346 ≥ 0.05 Không bác bỏ H₀ Chưa có đủ bằng chứng để kết luận phương sai mức độ stress của hai nghề khác nhau. → Mức độ biến động stress tương đương.