Professional Documents
Culture Documents
giải thích code
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
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
√𝑛
- 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 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 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
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
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)
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