Bài tập thực hành (TDTU: 1/2025)

Upload tập tin “birthwt.csv”

You said: Viết lệnh R để tìm xem có bao nhiêu biến số (variable) và quan sát (observation) trong tập tin này?

ChatGPT said: Mình đã nhận được tập tin của bạn, có tên là birthwt.csv. Bây giờ, mình sẽ viết lệnh R giúp bạn kiểm tra số lượng biến số (cột) và quan sát (dòng) trong tập tin này! Dưới đây là lệnh R bạn có thể dùng:

# Đọc dữ liệu từ tập tin CSV
# data <- read.csv("birthwt.csv")
data <- read.csv("C:\\Thach\\VN trips\\2024_4Dec\\TDT Uni\\Datasets\\birthwt.csv")

# Kiểm tra số biến số (cột) và quan sát (dòng)
num_variables <- ncol(data)
num_observations <- nrow(data)

# In kết quả
cat("Số biến số (cột):", num_variables, "\n")
## Số biến số (cột): 11
cat("Số quan sát (dòng):", num_observations, "\n")
## Số quan sát (dòng): 189

Giải thích: • read.csv() để đọc tập tin CSV. • ncol() trả về số lượng cột (biến số). • nrow() trả về số lượng hàng (quan sát). • cat() dùng để in kết quả ra màn hình.

You said: Viết lệnh R để liệt kê 6 quan sát đầu tiên

ChatGPT said: Đây là lệnh R để liệt kê 6 quan sát đầu tiên trong tập dữ liệu của bạn:

# Đọc dữ liệu từ tập tin CSV
# data <- read.csv("birthwt.csv")

# Liệt kê 6 quan sát đầu tiên
head(data, 6)
##   id low age lwt race smoke ptl ht ui ftv  bwt
## 1 85   0  19 182    2     0   0  0  1   0 2523
## 2 86   0  33 155    3     0   0  0  0   3 2551
## 3 87   0  20 105    1     1   0  0  0   1 2557
## 4 88   0  21 108    1     1   0  0  1   2 2594
## 5 89   0  18 107    1     1   0  0  1   0 2600
## 6 91   0  21 124    3     0   0  0  0   0 2622

You said: Tạo biến số mới ethnicity là biến factor với điều kiện sau: Nếu race = 1 thì ethnicity = “White” Nếu race = 2 thì ethnicity = “Black” Nếu race = 3 thì ethnicity = “Other”

ChatGPT said: Đây là lệnh R để tạo biến ethnicity theo điều kiện bạn yêu cầu:

# Đọc dữ liệu từ tập tin CSV
# data <- read.csv("birthwt.csv")

# Tạo biến 'ethnicity' từ 'race'
data$ethnicity <- factor(ifelse(data$race == 1, "White",
                         ifelse(data$race == 2, "Black", "Other")))

# Kiểm tra kết quả
table(data$ethnicity)
## 
## Black Other White 
##    26    67    96

Giải thích: • ifelse() giúp gán giá trị theo điều kiện. • factor() biến đổi thành biến phân loại (categorical variable). • table() kiểm tra tần số các giá trị trong biến ethnicity.

You said: Viết lệnh R để tạo 1 tập dữ liệu bw1 chỉ gồm 3 biến số id, low và bwt. Có bao nhiêu biến số và quan sát trong tập dữ liệu này?

ChatGPT said: Dưới đây là lệnh R để tạo tập dữ liệu bw1 chỉ gồm 3 biến số id, low và bwt:

# Đọc dữ liệu từ tập tin CSV
# data <- read.csv("birthwt.csv")

# Tạo tập dữ liệu bw1 với 3 biến số id, low và bwt
bw1 <- data[, c("id", "low", "bwt")]

# Kiểm tra số biến số và quan sát trong bw1
num_variables_bw1 <- ncol(bw1)
num_observations_bw1 <- nrow(bw1)

# In kết quả
cat("Số biến số (cột) trong bw1:", num_variables_bw1, "\n")
## Số biến số (cột) trong bw1: 3
cat("Số quan sát (dòng) trong bw1:", num_observations_bw1, "\n")
## Số quan sát (dòng) trong bw1: 189

You said: Viết lệnh R trong gói Table1 để mô tả đặc điểm tuổi của mẹ (age), cân nặng của mẹ (lwt) và cân nặng của con (bwt) theo tình trạng trẻ thiếu cân (low)

ChatGPT said: Dưới đây là lệnh R sử dụng gói table1 để mô tả các đặc điểm tuổi của mẹ (age), cân nặng của mẹ (lwt), và cân nặng của con (bwt) theo tình trạng trẻ thiếu cân (low):

# Cài đặt và tải gói table1 nếu chưa có
# if (!require("table1")) install.packages("table1")
library(table1)
## 
## Attaching package: 'table1'
## The following objects are masked from 'package:base':
## 
##     units, units<-
# Đọc dữ liệu từ tập tin CSV
# data <- read.csv("birthwt.csv")

# Chuyển biến 'low' thành dạng factor để sử dụng trong table1
data$low <- factor(data$low, labels = c("Không thiếu cân", "Thiếu cân"))

# Tạo bảng mô tả đặc điểm age, lwt và bwt theo low
table1(~ age + lwt + bwt | low, data = data)
Không thiếu cân
(N=130)
Thiếu cân
(N=59)
Overall
(N=189)
age
Mean (SD) 23.7 (5.58) 22.3 (4.51) 23.2 (5.30)
Median [Min, Max] 23.0 [14.0, 45.0] 22.0 [14.0, 34.0] 23.0 [14.0, 45.0]
lwt
Mean (SD) 133 (31.7) 122 (26.6) 130 (30.6)
Median [Min, Max] 124 [85.0, 250] 120 [80.0, 200] 121 [80.0, 250]
bwt
Mean (SD) 3330 (478) 2100 (391) 2940 (729)
Median [Min, Max] 3270 [2520, 4990] 2210 [709, 2500] 2980 [709, 4990]

Giải thích: • if (!require(“table1”)) install.packages(“table1”): Cài đặt và nạp gói table1 nếu chưa có. • factor(): Chuyển đổi biến low thành dạng phân loại (factor) với nhãn dễ hiểu. • table1(~ age + lwt + bwt | low, data = data): Tạo bảng tóm tắt các biến theo nhóm được phân loại bởi low. Bảng sẽ hiển thị số liệu thống kê (trung bình, độ lệch chuẩn,…) cho các biến age, lwt, và bwt theo từng nhóm Không thiếu cân và Thiếu cân.

You said: Viết lệnh R trong gói ggplot2 để thể hiện phân bố của cân nặng của con (bwt)

ChatGPT said: Dưới đây là lệnh R sử dụng gói ggplot2 để vẽ biểu đồ phân bố của cân nặng của con (bwt):

# Cài đặt và tải gói ggplot2 nếu chưa có
# if (!require("ggplot2")) install.packages("ggplot2")
library(ggplot2)

# Đọc dữ liệu từ tập tin CSV
# data <- read.csv("birthwt.csv")

# Vẽ biểu đồ phân bố của bwt (cân nặng của con)
ggplot(data, aes(x = bwt)) +
  geom_histogram(binwidth = 250, fill = "skyblue", color = "black") +
  labs(title = "Phân bố cân nặng của trẻ sơ sinh",
       x = "Cân nặng (gram)",
       y = "Tần suất") +
  theme_minimal()

You said: Viết lệnh R trong gói ggplot2 để thể hiện phân bố của cân nặng của con (bwt) theo tình trạng trẻ nhẹ cân (low)

ChatGPT said: Dưới đây là lệnh R dùng ggplot2 để vẽ phân bố cân nặng của con (bwt) theo tình trạng trẻ nhẹ cân (low):

# Cài đặt và tải gói ggplot2 nếu chưa có
# if (!require("ggplot2")) install.packages("ggplot2")
library(ggplot2)

# Đọc dữ liệu từ tập tin CSV
# data <- read.csv("birthwt.csv")

# Chuyển biến 'low' thành factor để ggplot phân biệt các nhóm
data$low <- factor(data$low, labels = c("Không thiếu cân", "Thiếu cân"))

# Vẽ biểu đồ phân bố bwt theo low (histogram xếp lớp)
ggplot(data, aes(x = bwt, fill = low)) +
  geom_histogram(binwidth = 250, alpha = 0.6, position = "dodge", color = "black") +
  labs(title = "Phân bố cân nặng của trẻ sơ sinh theo tình trạng thiếu cân",
       x = "Cân nặng (gram)",
       y = "Tần suất",
       fill = "Tình trạng thiếu cân") +
  theme_minimal()

Giải thích: • factor(): Chuyển biến low thành dạng phân loại để ggplot hiểu nhóm. • aes(x = bwt, fill = low): Màu sắc biểu thị nhóm thiếu cân và không thiếu cân. • geom_histogram(position = “dodge”): Các histogram của hai nhóm được đặt cạnh nhau để dễ so sánh. • binwidth = 250: Điều chỉnh độ rộng của mỗi bin, có thể chỉnh cho phù hợp hơn với dữ liệu của bạn. • alpha = 0.6: Làm trong suốt các thanh màu để không bị che nhau hoàn toàn. Gợi ý: Nếu bạn muốn vẽ thêm boxplot hoặc density plot để thấy rõ hơn sự khác biệt, mình có thể thêm vào!

You said: Viết lệnh R trong gói ggplot2 để vẽ biểu đồ hộp so sánh cân nặng của con (bwt) theo tình trạng trẻ nhẹ cân (low)

ChatGPT said: Dưới đây là lệnh R sử dụng ggplot2 để vẽ biểu đồ hộp (boxplot) so sánh cân nặng của con (bwt) theo tình trạng trẻ nhẹ cân (low):

# Cài đặt và tải gói ggplot2 nếu chưa có
# if (!require("ggplot2")) install.packages("ggplot2")
library(ggplot2)

# Đọc dữ liệu từ tập tin CSV
# data <- read.csv("birthwt.csv")

# Chuyển 'low' thành factor để ggplot phân biệt nhóm
data$low <- factor(data$low, labels = c("Không thiếu cân", "Thiếu cân"))

# Vẽ boxplot so sánh bwt theo low
ggplot(data, aes(x = low, y = bwt, fill = low)) +
  geom_boxplot() +
  labs(title = "So sánh cân nặng trẻ sơ sinh theo tình trạng thiếu cân",
       x = "Tình trạng thiếu cân",
       y = "Cân nặng (gram)") +
  scale_fill_manual(values = c("skyblue", "salmon")) +
  theme_minimal()

Giải thích: • aes(x = low, y = bwt, fill = low): Trục hoành là tình trạng nhẹ cân, trục tung là cân nặng. • geom_boxplot(): Tạo biểu đồ hộp. • scale_fill_manual(): Tùy chỉnh màu sắc cho hai nhóm. • theme_minimal(): Giao diện đơn giản, gọn gàng. Gợi ý thêm: Nếu bạn muốn vẽ thêm các điểm dữ liệu lên biểu đồ hộp (jitter plot) để trực quan hơn, mình có thể thêm vào!

You said: Viết lệnh R trong gói ggplot2 để vẽ biểu đồ tán xạ thể hiện mối liên quan giữa tuổi mẹ (age) và cân nặng của con (bwt) theo tình trạng trẻ nhẹ cân (low). Vẽ đường thể hiện mối liên quan này theo mô hình bậc 2

ChatGPT said: Dưới đây là lệnh R sử dụng ggplot2 để vẽ biểu đồ tán xạ (scatter plot) thể hiện mối liên quan giữa tuổi mẹ (age) và cân nặng của con (bwt) theo tình trạng trẻ nhẹ cân (low) — kèm theo đường hồi quy bậc 2:

# Cài đặt và tải gói ggplot2 nếu chưa có
# if (!require("ggplot2")) install.packages("ggplot2")
library(ggplot2)

# Đọc dữ liệu từ tập tin CSV
# data <- read.csv("birthwt.csv")

# Chuyển 'low' thành factor để ggplot phân biệt nhóm
data$low <- factor(data$low, labels = c("Không thiếu cân", "Thiếu cân"))

# Vẽ scatter plot với đường hồi quy bậc 2
ggplot(data, aes(x = age, y = bwt, color = low)) +
  geom_point(size = 2, alpha = 0.7) + # Điểm tán xạ
  geom_smooth(method = "lm", formula = y ~ poly(x, 2), se = TRUE) + # Đường hồi quy bậc 2
  labs(
    title = "Mối liên quan giữa tuổi mẹ và cân nặng của trẻ sơ sinh",
    x = "Tuổi của mẹ",
    y = "Cân nặng của con (gram)",
    color = "Tình trạng thiếu cân"
  ) +
  theme_minimal()

Giải thích: • aes(x = age, y = bwt, color = low): Xác định trục và phân biệt nhóm theo low. • geom_point(): Vẽ các điểm tán xạ, chỉnh kích thước và độ trong suốt bằng size và alpha. • geom_smooth(method = “lm”, formula = y ~ poly(x, 2), se = TRUE): o method = “lm”: Hồi quy tuyến tính. o formula = y ~ poly(x, 2): Hồi quy bậc 2. o se = TRUE: Hiển thị khoảng tin cậy. • theme_minimal(): Tạo giao diện đơn giản, gọn gàng. Nếu bạn muốn thêm các giá trị R², p-value lên biểu đồ hoặc tinh chỉnh gì thêm, mình có thể giúp!