You are on page 1of 9

GIẢI THÍCH CODE

1. Đọc dữ liệu
 water_potability <- read.csv("C:/Users/giaha/OneDrive/Máy tính/BTL
XSTK/water_potability.csv")
Dùng hàm read.csv() đọc dữ liệu từ tệp csv có đường dẫn “C:/Users/giaha/OneDrive/Máy
Tính/BTL XSTK/water_potability.csv” và đặt tên bộ dữ liệu là “water_potability”

 head(water_potability,10)
Dùng hàm head() để xem 10 dòng đầu tiên của dữ liệu

 str(water_potability)
Dùng hàm str() để hiển thị cấu trúc của bộ dữ liệu cần phân tích (gồm kiểu dữ liệu và cấu trúc
của các cột trong dữ liệu)
2. Kiểm tra dữ liệu khuyết trong tệp tin
 colSum(is.na(water_potability))
Dùng hàm colSum() để tính tổng số giá trị bị thiếu NA có trong từng cột dữ liệu.

 new_data<-water_potability[complete.cases(water_potability),]
Dùng hàm complete.cases() để lọc các hàng không chứa NA từ bộ dữ liệu water_potability và
tạo một tệp dữ liệu mới chứa các dữ liệu sau khi lọc và đặt tên là “new_data”
3. Thống kê mô tả
- Tính thống kê mô tả cho các biến liên tục trong tệp tin new_data:
 new_function <- function(x)
{c(n=length(x),xtb=mean(x),med=median(x),sd=sd(x),min=min(x),max=max(x))}
apply(new_data[,1:9],2,new_function)
Tạo một hàm tùy ý có tên “new_fuction”. Sau đó áp dụng hàm này cho các cột(biến) của tập dữ
liệu new_data bằng hàm apply()
 new_function <- function(x)
{c(n=length(x),xtb=mean(x),med=median(x),sd=sd(x),min=min(x),max=max(x))}
Định nghĩa hàm tùy ý “new_function”
Hàm nhận một đối số là x
n: hàm được thêm vào vecto với tên “n” và giá trị của nó là tổng số các biến của vecto x
xtb: hàm được thêm vào vecto với tên “xtb” và giá trị của nó là trung bình của vecto x
median: hàm được thêm vào vecto với tên “med” và giá trị của nó là trung vị của vecto x
sd: hàm được thêm vào vecto với tên “sd” và giá trị của nó là độ lệch chuẩn của vecto x
min: hàm được thêm vào vecto với tên “min” và là giá trị nhỏ nhất của vecto x
max: hàm được thêm vào vecto với tên “max” và là giá trị lớn nhất của vecto x

 apply(new_data[,1:9],2,new_function): Dùng hàm apply() để áp dụng hàm


new_function từ cột 1 đến cột 9 trong tập dữ liệu new_data
New_data[,1:9]: chọn các cột từ 1 đến 9 của tệp new_data
2: đối số MARGIN trong hàm apply và chỉ áp dụng hàm new_function cho từng cột
Kết quả: ta có một ma trận với mỗi cột là đại diện một biến của tệp dữ liệu và mỗi hàng là các
thông tin thống kê cơ bản (length, mean, meadian, độ lệch chuẩn, min, max) của từng biến.

- Lập bảng tần số cho biến Potability


 table(new_data$Potability)
Dùng hàm table() để lập bảng tần số của biến Potability

- Vẽ đồ thị hist thể hiện phân phối chuẩn


 par(mfrow=c(1,3))
hist(new_data$ph,xlab="pH",main="Histogram of pH",labels=T,
col=cm.colors(9),ylim=c(0,550))
hist(new_data$Hardness,xlab="Hardness",main="Histogram of
Hardness",labels=T, col=cm.colors(9),ylim=c(0,550))
hist(new_data$Solids,xlab="Solids",main="Histogram of Solids",labels=T,
col=cm.colors(9),ylim=c(0,500))
 par(mfrow=c(1,3))
hist(new_data$Chloramines,xlab="Chloramines",main="Histogram of
Chloramines",labels=T, col=cm.colors(9),ylim=c(0,550))
hist(new_data$Sulfate,xlab="Sulfate",main="Histogram of Sulfate",labels=T,
col=cm.colors(9),ylim=c(0,1000))
hist(new_data$Conductivity,xlab="Conductivity",main="Histogram of
Conductivity",labels=T, col=cm.colors(9),ylim=c(0,500))
 par(mfrow=c(1,3))
hist(new_data$Organic_carbon,xlab="Organic_carbon",main="Histogram of
Organic_carbon",labels=T, col=cm.colors(9),ylim=c(0,500))
hist(new_data$Trihalomethanes,xlab="Trihalomethanes",main="Histogram of
Trihalomethanes",labels=T, col=cm.colors(9),ylim=c(0,550))
hist(new_data$Turbidity,xlab="Turbidity",main="Histogram of
Turbidity",labels=T, col=cm.colors(9),ylim=c(0,500))

par(mfrow=c(1,3)): tạo một lưới 1×3 (1 hàng và 3 cột) để vẽ ba biểu đồ trên cùng 1 hàng
Sau đó dùng hàm hist() để vẽ biểu đồ histogram cho từng biến:
 hist(new_data$ph,..): vẽ biểu đồ histogram cho biến ph của tệp dữ liệu new_data
 xlab = “ph”: đặt tên cho trục x là ph
 main = “Histogram of ph”: đặt tên cho biểu đồ là “Histogram of ph”
 labels = T: hiển thị nhản trục x và y
 col = cm.colors(9): đặt màu sác cho các cột trong biểu đồ
 ylim = c(0,500): xác định giới hạn trục y để biểu đồ hiển thị trong khoảng từ 0 đến 500
Làm tương tự với các biến còn lại
Kết quả: ta được dãy các biểu đồ Histogram cho các biến của tệp dữ liệu new_data, giúp xem
xét phân phối của từng biến

- Vẽ đồ thị boxplot thể hiện phân phối của các biến ở 2 mẫu nước uống được/không uống được:
 par(mfrow=c(1,3))
boxplot(ph~Potability,data=new_data,xlab="Potability",ylab="pH",col=heat.col
ors(2))
boxplot(Hardness~Potability,data=new_data,xlab="Potability",ylab="Hardness",
col=heat.colors(2))
boxplot(Solids~Potability,data=new_data,xlab="Potability",ylab="Solids",col=
heat.colors(2))
 par(mfrow=c(1,3))
boxplot(Chloramines~Potability,data=new_data,xlab="Potability",ylab="Chloram
ines",col=heat.colors(2))
boxplot(Sulfate~Potability,data=new_data,xlab="Potability",ylab="Sulfate",co
l=heat.colors(2))
boxplot(Conductivity~Potability,data=new_data,xlab="Potability",ylab="Conduc
tivity",col=heat.colors(2))
 par(mfrow=c(1,3))
boxplot(Organic_carbon~Potability,data=new_data,xlab="Potability",ylab="Orga
nic_carbon",col=heat.colors(2))
boxplot(Trihalomethanes~Potability,data=new_data,xlab="Potability",ylab="Tri
halomethanes",col=heat.colors(2))
boxplot(Turbidity~Potability,data=new_data,xlab="Potability",ylab="Turbidity
",col=heat.colors(2))
par(mfrow=c(1,3)): tạo một lưới 1×3 (1 hàng và 3 cột) để vẽ ba biểu đồ trên cùng 1 hàng
Sau đó dùng hàm boxplot() vẽ biểu đồ hộp để so sánh phân phối giá trị của cột “ph” trong tập dữ
liệu “new_data” giữa các nhóm dự trên cột “Potability”
 Xlab=”Potability”: đặt nhãn cho trục x là “Potability:
 Ylab=”ph”: đặt nhãn cho trục y là “ph”
 Col=heat.colors(2): đặt màu sắc cho 2 hộp của biểu đồ
Làm tương tự với các biến còn lại
Kết quả: ta được dãy các biểu đồ hộp với mỗi biểu đồ gồm 2 hộp, một là cho nhóm
“Potability=0” và một là cho nhóm “Potability=1”
4. Thống kê suy diễn
4.1 Tìm Khoảng tin cậy 95% cho giá trị pH trung bình của các mẫu uống được:
 Potability_1 <- subset(new_data,Potability == 1)
Dùng hàm subset() để tách riêng dữ liệu “các mẫu uống được” từ tệp new_data để phân tích và
đặt tên là Potability_1

- Tính các đặc trựng mẫu


 n <- length(Potability_1$ph)
xtb <- mean(Potability_1$ph)
s <- sd(potability_1$ph)
data.frame(n,xtb,s)
n: dùng hàm length() tính tổng các phần tử của biến ph của mẫu nước uống được và đặt là “n”
xtb: dùng hàm mean() tính trung bình ph của các mẫu nước uống được và đặt là xtb
s: dùng hàm sd tính độ lệch chuẩn giá trị ph của mẫu nước uống được và đặt là s
data.frame(n,xtb,x): tạo một khung dữ liệu data frame với các cột là 3 vecto trên

- Tính ngưỡng Z_alpha/2:


 qnorm(p=.05/2, lower.tail=FALSE)
Dùng hàm qnorm tính Z của phân phối chuẩn với phân vị a/2

- Tính sai số:


 epsilon <- qnorm(p=.05/2, lower.tail=FALSE)*s/sqrt(n)
𝑧𝛼 × 𝑠
Sai số được đặt tên là epsilon và được tính bởi công thức 2

√𝑛
- Khoảng tin cậy hai phía với độ tin cậy 95% cho giá trị pH trung bình của các mẫu uống được:
 Data.frame(a1 = xtb-epsilon,a2 = xtb+epsilon)
Tạo một khung dữ liệu data frame với các cột là 2 vecto a1 và a2
Kết quả: ta được khoảng tin cậy cho giá trị pH trung bình của các mẫu uống được (7,014848 ;
7,212733)

4.2 Tìm khoảng tin cậy 96% cho tỷ lệ mẫu nước uống được
- Tính các đặc trung mẫu
 n <- length(new_data$Potability)
f <- length(Potobility_1$Potability)/length(new_data$Potability)
data.frame(n,f)
n: dùng hàm length() tính số phần tử của biến Potability trong tệp tin new_data và đặt là “n”
f: tỉ lệ giữa mẫu nước uống được trong tổng số mẫu của biến Potability của tệp new_data
Tạo một khung dữ liệu data.frame với các cột là 2 vecto n và f

- Tính ngưỡng Z_alpha/2:


 qnorm(p=.05/2, lower.tail=FALSE)
Dùng hàm qnorm() tính giá trị Z của phân phối chuẫn với phân vị a/2

- Tính sai số
 epsilon <- qnorm(p=.05/2, lower.tail=FALSE)*sqrt(f*(1-f)/n)

Sai số được đặt tên là epsilon và được tính bởi công thức 𝑧 𝛼 ×
2 √ 𝑓 ( 1− 𝑓 )
𝑛

- Khoảng tin cậy hai phía với độ tin cậy 95% cho tỷ lệ mẫu nước uống được:
 data.frame(f1 = f-epsilon, f2 = f+epsilon)
Tạo một khung dữ liệu data frame với 2 vecto f1 và f2
Kết quả: ta có khoảng tin cậy 2 phía cho tỷ lệ mẫu nước uống được là (0,3818416 ; 0,4247223)

4.3 Khoảng tin cậy 95% cho chênh lệch ph trung bình của mẫu nước không uống được và
uống được
 Potability_0 <- subset(new_data,Potability == 0)
Dùng hàm sbubset() để tách riêng dữ liệu “các mẫu không uống được” từ tệp new_data để phân
tích và đặt tên là Potability_0

- Tính các đặt trưng mẫu:


 n1 <- length(Potability_0$ph)
n2 <- length(Potability_1$ph)
xtb1 <- mean(Potability_0$ph)
xtb2 <- mean(Potability_1$ph)
s1 <- sd(Potability_0$ph)
s2 <- sd(Potability_1$ph)
data.frame(n1,n2,xtb1,xtb2,s1,s2)
n1: dùng hàm length() tính tổng các phần tử của biến ph của mẫu nước không uống được và đặt
là “n1”
n2: dùng hàm length() tính tổng các phần tử của biến ph của mẫu nước uống được và đặt là “n2”
xtb1: dùng hàm mean() tính trung bình ph của các mẫu nước không uống được và đặt là “xtb1”
xtb2: dùng hàm mean() tính trung bình ph của các mẫu nước uống được và đặt là “xtb2”
s1: dùng hàm sd tính độ lệch chuẩn giá trị ph của mẫu nước không uống được và đặt là “s1”
s2: dùng hàm sd tính độ lệch chuẩn giá trị ph của mẫu nước uống được và đặt là “s2”
data.frame(n1,n2,xtb1,xtb2,s1,s2): tạo một khung dữ liệu data frame với các cột là 6 vecto trên

- Tính ngưỡng Z_alpha/2


 qnorm(p=.05/2, lower.tail=FALSE)
Dùng hàm qnorm() tính giá trị Z của phân phối chuẩn với phân vị a/2

- Tính sai số
 epsilon <- qnorm(p=.05/2, lower.tail=FALSE)*sqrt(s1^2/n1+s2^2/n2)

Sai số được đặt tên là epsilon và được tính bởi công thức 𝑧 𝛼 ×
2 √ 𝑠 12 𝑠 22
+
𝑛1 𝑛2

- Khoảng tin cậy hai phía với độ tin cậy 95% cho chênh lệch ph trung bình của mẫu nước không
uống được và uống được:
 Data.frame(a1 = xtb1-xtb2-epsilon, a2 = xtb1-xtb2+epsilon)
Tạo một khung dữ liệu data frame với các cột là 2 vecto a1 và a2
Kết quả: Ta có khoảng tin cậy hai phía cho chênh lệch ph trung bình của mẫu nước không uống
được và uống được là (-0,1829767 ; 0,08979699)

4.4 Với mức ý nghĩa 5%, hãy kiểm định xem pH trung bình của mẫu không uống được có
dưới 7
- Tính các đặc trưng mẫu:
 n <- length(Potability_0$ph)
xtb <- mean(Potability_0$ph)
s <- sd(Potability_0$ph)
data.frame(n,xtb,s)
n: dùng hàm length() tính số phần tử của biến ph của mẫu không uống được
xtb: dùng hàm mean() tính trung bình ph của các mẫu nước không uống được và đặt là xtb
s: dùng hàm sd tính độ lệch chuẩn giá trị ph của mẫu nước không uống được và đặt là s
data.frame(n,xtb,x): tạo một data frame chứa 3 vecto trên

- Tính thống kê kiểm định:


 z.test = (xtb-7)/s*sqrt(n)
𝑥 −𝜇 0 𝑥𝑡𝑏−7
Tính giá trị kiểm định z = × √ 𝑛= × √𝑛
𝑠 𝑠

- Tính ngưỡng Z_alpha:


 qnorm(p=.05, lower.tail=FALSE)
Dùng hàm qnorm() tính giá trị Z của phân phối chuẩn với phân vị a/2

Kết quả: 𝑧 0 =1,403112>− 𝑧 𝛼 =−1,6449 nên ta chưa bác bỏ được giả thuyết H0

4.5 So sánh trung bình pH ở 2 nhóm nước uống được và không uống được
CÁCH 1:
- Tính giá trị thống kê kiểm định
 x1 <- subset(new_data$ph,new_data$Potability==0)
x2 <- subset(new_data$ph,new_data$Potability==1)
z.test =
function(x1,x2){(mean(x1)-mean(x2))/(sqrt(var(x1)/length(x1)+var(x2)/
length(x2)))}
z.test(x1,x2)
x1: Dùng hàm sbubset() để tách riêng dữ liệu pH của các mẫu không uống được từ tệp new_data
để phân tích và đặt tên là x1
x2: Dùng hàm sbubset() để tách riêng dữ liệu pH của các mẫu uống được từ tệp new_data để
phân tích và đặt tên là x2

- Giá trị kiểm định z là một hàm theo x1,x2:


 mean(x1), mean(x2): giá trị trung bình của x1, x2
 var(x1), var(x2): phương sai của x1,x2
 length(x1), length(x2): tổng các phần tử có trong x1 và x2
𝑥1 − 𝑥2
𝑧=


2 2
𝜎1 𝜎 2
+
𝑚 𝑛

- Tính ngưỡng Z_alpha:


 qnorm(p=.05, lower.tail=FALSE)
Dùng hàm qnorm() tính giá trị Z của phân phối chuẩn với phân vị a/2

Kết quả: 𝑧 0 =−0,6695253>− 𝑧 𝛼 =− 1,6449 nên chưa bác bỏ được giả thuyết H0
CÁCH 2: Sử dụng công cụ t-test
 t.test(new_data$ph~new_data$Potability,alternative="less")
t.test(new_data$ph~new_data$Potability,..): thực hiện kiểm định ph trung bình ở 2 nhóm nước
uống được và không uống trong tệp new_data
alternative=“less”: kiểm định 1 phía lệch trái (𝜇 1<𝜇 2)

Kết quả: Ta có được giá trị p-value là 0,2516


4.6 So sánh phương sai pH ở 2 nhóm nước uống được và không uống được
 var.test(x=x1, y=x2, alternative = "greater")
Var.test(x=x1,y=x2,..): thực hiện so sánh phương sai 2 nhóm x1 (ph của các mẫu không uống
được) và x2 (ph của các mẫu uống được)
alternative = “greater”: kiểm dịnh một phía bên phải
Kết quả: ta được giá trị pvalue của kiểm định

4.7 Anova một nhân tố: Đánh giá sự ảnh hưởng của ph đến độ cứng của nước
 new_data$new_ph <- ifelse(new_data$ph < 7, "Acid_group", ifelse(new_data$ph
> 8,"Alkaline_group","neutral_group"))
Dùng hàm ifelse() chia các phần tử của biến ph thành 3 nhóm:
 Ph<7: thì thay bằng “Acid_group” và gán vào vecto new_ph của tệp new_data
 Ph>8: thì thay bằng “Alkaline_group” và gán vào vecto new_ph của tệp new_data
 Còn lại: thì thay bằng “neutral_group” và gán vào vecto new_ph của tệp
new_data

- Vẽ đồ thị boxplot so sánh độ nhám ở 3 nhóm độ mũi in


 boxplot(Hardness~new_ph,data=new_data)
Dùng hàm bosplot() để vẽ đồ thị hộp:
 Boxplot(Hardness~new_ph,..): vẽ biểu đồ hộp thể hiện độ cứng dựa của cột new_ph
 Data=new_data: dữ liệu lấy từ tệp new_data

- Thực hiện kiểm tra giả định 1:


 Đối với nhóm 1 (Acid_group):
 Acid_group <- subset(new_data,new_ph == "Acid_group")
qqnorm(Acid_group$Hardness)
qqline(Acid_group$Hardness)
Dùng hàm subset() để tách riêng dữ liệu “Acid_group” của cột new_ph từ tệp new_data
Dùng hàm qqnorm() để vẽ biểu đồ phân phối chuẩn của cột độ cứng nhóm Acid_group.
Dung hàm qqline() vẽ đường thẳng kì vọng phân phối chuẩn của độ cứng nhóm Acid_group
Kết quả: Ta kiểm định định được độ cứng của nhóm Acid_group không tuân theo phân phối
chuẩn
 shapiro.test(Acid_group$Hardness)
Để kiểm định lại dữ liệu tuân theo luật phân phối chuẩn hay không, chúng ta có thể dùng kiểm
định Shapiro qua hàm shapiro.test()
Kết quả: ta tính được giá trị pvalue < mức ý nghĩa 5% nên độ cứng của nhóm Acid_group
không theo phân phối chuẩn

 Đối với nhóm 2 (Alkaline_group):


 Alkaline_group <- subset(new_data,new_ph == "Alkaline_group")
qqnorm(Alkaline_group$Hardness)
qqline(Alkaline_group$Hardness)
Dùng hàm subset() để tách riêng dữ liệu “Alkaline_group” của cột new_ph từ tệp new_data
Dùng hàm qqnorm() để vẽ biểu đồ phân phối chuẩn của cột độ cứng nhóm Alkalin_group.
Dung hàm qqline() vẽ đường thẳng kì vọng phân phối chuẩn của độ cứng nhóm Alkalin_group
Kết quả: Ta kiểm định định được độ cứng của nhóm Alkalin_group không tuân theo phân phối
chuẩn
 shapiro.test(Alkaline_group$Hardness)
Để kiểm định lại dữ liệu tuân theo luật phân phối chuẩn hay không, chúng ta có thể dùng kiểm
định Shapiro qua hàm shapiro.test()
Kết quả: ta tính được giá trị pvalue của kiểm định Shapiro

 Đối với nhóm 3 (Neutral_group):


 neutral_group <- subset(new_data,new_ph == "neutral_group")
qqnorm(neutral_group$Hardness)
qqline(neutral_group$Hardness)
Dùng hàm subset() để tách riêng dữ liệu “neutral_group” của cột new_ph từ tệp new_data
Dùng hàm qqnorm() để vẽ biểu đồ phân phối chuẩn của cột độ cứng nhóm neutral_group.
Dung hàm qqline() vẽ đường thẳng kì vọng phân phối chuẩn của độ cứng nhóm neutral_group
Kết quả: Ta kiểm định định được độ cứng của nhóm neutral_group không tuân theo phân phối
chuẩn
 shapiro.test(neutral_group$Hardness)
Để kiểm định lại dữ liệu tuân theo luật phân phối chuẩn hay không, chúng ta có thể dùng kiểm
định Shapiro qua hàm shapiro.test()
Kết quả: ta tính được giá trị pvalue < mức ý nghĩa 5% nên độ cứng của nhóm neutral_group
không theo phân phối chuẩn

- Thực hiện kiểm tra giả định 2:


 library(car)
 leveneTest(Hardness~as.factor(new_ph),data=new_data)
Library(car): tải thư viện “car”
Kiểm định leneve: dùng hàm leneveTest() để kiểm định phương sai độ cứng ở 3 nhóm ph
Kết quả: ta được giá trị pvalue < mức ý nghĩa 5% nên bác bỏ giả thuyết H0: các phương sai độ
cứng ở 3 nhóm ph bằng nhau

- Thực hiện avova 1 nhân tố


 ANOVA_model<-aov(Hardness~new_ph,data=new_data)
summary(ANOVA_model)
 Dùng hàm aov() để phân tích phương sai độ cứng trung bình ở 3 nhóm ph trong new_ph
từ tệp new_data và đặt là vecto ANOVA_mole1
 summary(ANOVA_mole1): hàm này sẽ trả về bảng tóm tắt thống kê cơ bảng của vecto
ANOVA_mole1 gồm Sum Sq (tổng bình phương), Mean Sq (bình phương trung bình), F
value (giá trị tỷ số F) và Pr(>F) (giá trị p của bài toán).

- Thực hiện so sánh bội


 TukeyHSD(ANOVA_model)
Dùng hàm Tukey() để so sánh trung bình giữa các nhóm trong vecto ANOVA_model
Kết quả: ta được một bảng các thông tin:
 các cặp trung bình được sao sánh
 diff: chênh lệch giữa các trung bình mẫu,
 lwr và upr: cận dưới và cận trên của khoảng tin cậy cho hiệu số từng cặp trung bình
 P adj: p-value của bài toán kiểm định

 plot(TukeyHSD(ANOVA_model)): vẽ đồ thị so sánh trung bình giữa các nh

You might also like