You are on page 1of 87

Bài 1.

Giới thiệu về R (phần 1)


1. R là gì?

R là một phần mềm thống kê được sử dụng để phân tích dữ liệu. Nó chứa một lượng lớn các
thủ tục thống kê chẳng hạn t-test, chi-square test, các mô hình hồi quy chuẩn, ước lượng các
biến công cụ, hồi quy đa thức địa phương,… Nó cũng cung cấp khả năng đồ họa cấp cao. Có
một số điểm tương đồng giữa ngôn ngữ lập trình C và R, nhưng cả hai đều có cách vận hành
khác nhau.

2. Nguồn gốc lịch sử

R là một ngôn ngữ lập trình và môi trường phần mềm cho phân tích thống kê, trình bày đồ thị
và viết báo cáo. R được tạo ra bởi Ross Ihaka và Robert Gentleman tại Đại Học Auckland,
New Zealand, và hiện tại được phát triển bởi “R Development Core Team”.

R xuất hiện lần đầu vào năm 1993. Khi đó một nhóm lớn các cá nhân đã đóng góp vào R
bằng việc gửi code và báo cáo lỗi. Từ giữa 1997, có một nhóm trụ cột (“R Development Core
Team” là những người có thể chỉnh sửa trên kho lưu trữ mã nguồn R.

Ngôn ngữ này được đặt tên R, dựa trên ký tự đầu của tên của hai tác giả R (Robert
Gentleman và Ross Ihaka), và một phần theo cách đặt tên của Ngôn ngữ S của Bell Labs.

3. R làm được và không làm được gì?


3.1 Ưu điểm:
1. R là phần mềm miễn phí. R là một dự án GNU chính thức và được phân phối dưới “Free
Software Foundation General Public License (GPL)”
2. R là một gói phân tích dữ liệu mạnh mẽ với nhiều chức năng thống kê tiên tiến và quy
chuẩn. Xem the Comprehensive R Archive Network (CRAN)'s Task Views để thấy được
những gì ta có thể làm với R.
3. R được sử dụng rộng rãi trong các nghành khoa học chính trị, thống kê, kinh tế lượng,
khoa học bảo hiểm, xã hội học, tài chính, v.v…
4. R là một ngôn ngữ lập trình, vì vậy các khả năng của nó có thể được mở rộng một cách dễ
dàng thông qua việc sử dụng các hàm do người dùng định nghĩa. Một tập hợp lớn các hàm và
gói lệnh được đóng góp từ người dùng có thể tìm thấy trên CRAN's Contributed Packages.
5. Chạy trên mọi nền tảng máy tính - UNIX (Linux), Windows, và Macintosh,
6. R là ngôn ngữ hướng đối tượng. Hầu như bất cứ điều gì (chẳng hạn, các cấu trúc dữ liệu
phức tạp) có thể được lưu giữ như một đối tượng R.
7. R là ngôn ngữ ma trận.
8. R tạo ra những biểu đồ với chất lượng cao (chuẩn bài báo khoa học).
9. R có khả năng lưu trữ và xử lý dữ liệu hiệu quả,
10. R cung cấp một bộ các phép toán để tính toán trên các mảng, danh sách, vector, và ma
trận,

3.2 Khuyết điểm:


1. Không dễ để bắt đầu các phân tích với R – cần thiết phải học các kiến thức cơ bản về cú
pháp và các lệnh cơ bản,
2. Hầu như không có giao diện đồ họa người dùng (GUI) mà chỉ có dòng lệnh,
3. Ta cần phải tìm kiếm các lệnh khả thi tốt nhất trong nhiều gói lệnh (package),
4. Mọi bảng và đồ thị phải được “lập trình” – không được tạo ra bằng cách click chuột,

4. Cài đặt và làm quen với R

4.1 Cài đặt

Để cài đặt R trên máy tính của bạn, vào trang chủ của R: http://www.r-project.org/ và làm các
bước sau (giả sử bạn dùng hệ điều hành Windows):
- Nhấp vào download CRAN ở thanh bên trái
- Chọn một download site
- Chọn Windows như là hệ điều hành mục tiêu
- Nhấp base
- Chọn Download R 3.x.x for Windows và chọn các câu trả lời mặc định cho mọi
câu hỏi.

4.2 Chạy lần đầu

Cửa sổ chương trình R khi mở lên. Ta thấy nó xuất hiện cửa sổ chính là RGUI (32bit) và
một cửa sổ con trong đó là R Console (Bảng điểu khiển lệnh). Các lệnh trong R được thực
hiện qua cửa sổ R Console này.
5. Trợ giúp trong R

- Lệnh help(tên hàm), hoặc ?tên hàm : xem trang thông tin về một hàm bất kỳ trong
R
- Lệnh help.search("chủ đề") có thể giúp ích khi bạn không biết tên của một hàm.
- Lệnh help.start() sẽ mở một trình duyệt chỉ đến các thông tin được lưu trên máy về
R.
- Lệnh example(tên hàm) : chạy minh họa các ví dụ của một hàm (nếu có)
Ví dụ:
Chạy thử các lệnh sau:
example(plot)
example(hist)
example(boxplot)

- Lệnh demo(): Minh họa tổng quan về các chức năng của R

6. Cấu trúc dữ liệu

Các kiểu đối tượng (các cấu trúc nguyên tử)


integer các số nguyên (15, 23, 8, 42, 4, 16)
numeric các số thực (double precision: 3.14, 0.0002, 6.022E23)
character chuỗi ký tự (“Hello World”, “ROFLMAO”, “A”)
logical TRUE/FALSE hoặc T/F

Các lớp đối tượng


vector đối tượng với kiểu nguyên tử
factor đối tượng vector với các nhóm rời rạc (có thứ tự/không thứ tự)
array mảng nhiều chiều
matrix mảng hai chiều
list vector các thành phần
data.frame "tựa matrix" danh sách các biến với cùng số hàng

Các giá trị đặc biệt


NULL đối tượng có chiều dài 0, kiểm tra với lệnh is.null(x)
NA Not Available / giá trị khuyết, kiểm tra với lệnh is.na(x)
NaN Not a number, kiểm tra với lệnh is.nan(x) (e.g. 0/0, log(-1))
Inf, -Inf Positive/negative infinity, kiểm tra với lệnh is.infinite(x) (e.g. 1/0)

Thông tin đối tượng


summary(x) tóm tắt chung về đối tượng
str(x) hiển thị cấu trúc đối tượng
mode(x) nhận hoặc thiết lập kiểu lưu trữ
class(x) tên của lớp đối tượng
is.<mode>(x) kiểm tra kiểu của đối tượng (is.numeric, is.logical, v.v.)
attr(x, which) nhận hoặc thiết lập thuộc tính của một đối tượng
attributes(x) nhận hoặc thiết lập mọi thuộc tính của một đối tượng

7. Vector, Factor, Ma trận, Mảng, Data frame, Danh sách

7.1. Vector

Ta có thể tạo một vector bằng cách dùng lệnh c() để nối các phần tử lại với nhau. Ta có thể
tạo một dãy bằng cách dùng lệnh symbol hoặc seq(). Ví dụ, 1:5 cho mọi số giữa 1 và 5.
Lệnh seq() cho phép ta xác định khoảng giữa các số liên tiếp. Ta cũng có thể lặp lại một
khuôn mẫu bằng cách dùng lệnh rep(). Ta cũng có thể tạo một vector số gồm các giá trị
trống bằng cách dùng numeric(), một vector ký tự các giá trị trống bằng cách dùng
character() và một vector logical các giá trị trống (tức là FALSE) bằng cách
logical()
> c(1,2,3,4,5)
[1] 1 2 3 4 5
> c("a","b","c","d","e")
[1] "a" "b" "c" "d" "e"
> c(T,F,T,F)
[1] TRUE FALSE TRUE FALSE

> 1:5
[1] 1 2 3 4 5
> 5:1
[1] 5 4 3 2 1
> seq(1,5)
[1] 1 2 3 4 5
> seq(1,5,by=.5)
[1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0
> rep(1,5)
[1] 1 1 1 1 1
> rep(1:2,5)
[1] 1 2 1 2 1 2 1 2 1 2
> numeric(5)
[1] 0 0 0 0 0
> logical(5)
[1] FALSE FALSE FALSE FALSE FALSE
> character(5)
[1] "" "" "" "" ""
Lệnh length() tính chiều dài của vector. last() (sfsmisc) trả về phần tử cuối cùng
của một vector nhưng điều này cũng có thể thực hiện một cách đơn giản mà không cần gói
lệnh thêm nào.
x <- seq(1,5,by=.5) # Tạo một dãy số
x # Hiển thị đối tượng này
[1] 1.0 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0
> length(x) # Nhận chiều dài của đối tượng x
[1] 9
> library(sfsmisc)
> last(x) # Chọn phần tử cuối cùng của x
[1] 5.0
> x[length(x)] # Chọn phần tử cuối cùng mà không cần gói
lệnh thêm nào.
[1] 5.0

7.2. Factor

factor() chuyển đổi một vector thành một factor. Một factor cũng có thể được sắp thứ tự
với tùy chọn ordered=T hoặc lệnh ordered(). levels() trả về các mức của một factor.
gl() sinh ra các factor. n là số mức, k là số lần lặp lại của mỗi factor và length là tổng
chiều dài của factor. labels là tùy chọn và cho các nhãn của mỗi mức.
Các factor có thể được xem như các biến định danh. Một hàm quan trọng cho phân tích factor
là hàm table(). Khi xét các loại dữ liệu thống kê (định danh, thứ bậc, khoảng và tỷ lệ), các
factor có thể là định danh, thứ bậc, hoặc khoảng. Các factor định danh là các tên danh mục, ví
dụ đó có thể là tên các quốc gia kết hợp với một số thông tin khác. Một ví dụ về factor thứ
bậc là tập các lần đua của một vận động viên nào đó kèm theo vị trí hoàn thành của vận động
viên này (nhất, nhì, …). Cuối cùng, ví dụ về các factor khoảng sẽ là các khoảng tuổi như "20
- 29", "30 - 39", v.v. Nói chung, R có thể sắp thứ tự một cách tự động các số được lưu một
cách phù hợp nhưng chúng ta có thể sử dụng các kỹ thuật với loại dữ liệu này để sắp thứ bậc
theo kiểu phù hợp nhất với dữ liệu của ta.
Xem thêm is.factor(), as.factor(), is.ordered() và as.ordered().

factor(c("yes","no","yes","maybe","maybe","no","maybe","no","no"))
[1] yes no yes maybe maybe no maybe no no
Levels: maybe no yes

factor(c("yes","no","yes","maybe","maybe","no","maybe","no","no"),
ordered = T)
[1] yes no yes maybe maybe no maybe no no
Levels: maybe < no < yes

ordered(c("yes","no","yes","maybe","maybe","no","maybe","no","no"))
[1] yes no yes maybe maybe no maybe no no
Levels: maybe < no < yes

ordered(as.factor(c("First","Third","Second","Fifth","First","First"
,"Third")),levels = c("First","Second","Third","Fourth","Fifth"))
[1] First Third Second Fifth First First Third
Levels: First < Second < Third < Fourth < Fifth
gl(n=2, k=2, length=10, labels = c("Male", "Female")) # generate
factor levels
[1] Male Male Female Female Male Male Female Female Male
Male
Levels: Male Female

7.3. Ma trận

Nếu ta muốn tạo một ma trận mới, một cách là sử dụng hàm matrix(). Ta phải nhập một
vector dữ liệu, số hàng và/hoặc cột và cuối cùng ta có thể xác định xem ta muốn R đọc vector
theo hàng hay theo cột (tùy chọn mặc định). Dưới đây là hai ví dụ.
matrix(data = NA, nrow = 5, ncol = 5, byrow = T)
[,1] [,2] [,3] [,4] [,5]
[1,] NA NA NA NA NA
[2,] NA NA NA NA NA
[3,] NA NA NA NA NA
[4,] NA NA NA NA NA
[5,] NA NA NA NA NA

matrix(data = 1:15, nrow = 5, ncol = 5, byrow = T)


[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 4 5
[2,] 6 7 8 9 10
[3,] 11 12 13 14 15
[4,] 1 2 3 4 5
[5,] 6 7 8 9 10

Các hàm cbind() và rbind() kết hợp các vector thành ma trận theo cột hoặc theo hàng:
v1 <- 1:5
v2 <- 5:1
v2
[1] 5 4 3 2 1
cbind(v1,v2)
v1 v2
[1,] 1 5
[2,] 2 4
[3,] 3 3
[4,] 4 2
[5,] 5 1

rbind(v1,v2)
[,1] [,2] [,3] [,4] [,5]
v1 1 2 3 4 5
v2 5 4 3 2 1

Chiều của một ma trận có thể đạt được bằng cách dùng hàm dim(). Một cách khác là
nrow() và ncol() trả về số hàng và cột của ma trận:

X<-matrix(data = 1:15, nrow = 5, ncol = 5, byrow = T)


dim(X)
[1] 5 5
nrow(X)
[1] 5
ncol(X)
[1] 5

Hàm t() chuyển vị một ma trận:


t(X)
[,1] [,2] [,3] [,4] [,5]
[1,] 1 6 11 1 6
[2,] 2 7 12 2 7
[3,] 3 8 13 3 8
[4,] 4 9 14 4 9
[5,] 5 10 15 5 10

Không giống data frame, các ma trận phải có dạng số hoặc ký tự:
a=matrix(2,2,2)
a
[,1] [,2]
[1,] 2 2
[2,] 2 2
a = rbind(a,c("A","A"))
a
[,1] [,2]
[1,] "2" "2"
[2,] "2" "2"
[3,] "A" "A"

7.4. Mảng

Một mảng gồm n chiều với mỗi chiều là một vector về các đối tượng R cùng loại. Một mảng
một chiều một phần tử có thể được xây dựng như sau.
x = array(c(T,F),dim=c(1))
print(x)
[1] TRUE

Mảng x được tạo với một chiều (dim=c(1)) được rút từ vector các giá trị có thể c(T,F). Một
cách tương tự, y, có thể được tạo với một chiều và hai giá trị.
y = array(c(T,F),dim=c(2))
print(y)
[1] TRUE FALSE

Một mảng ba chiều – 3x3x3 – có thể được tạo như sau.


z = array(1:27,dim=c(3,3,3))
dim(z)
[1] 3 3 3
print(z)
, , 1

[,1] [,2] [,3]


[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9

, , 2
[,1] [,2] [,3]
[1,] 10 13 16
[2,] 11 14 17
[3,] 12 15 18

, , 3

[,1] [,2] [,3]


[1,] 19 22 25
[2,] 20 23 26
[3,] 21 24 27

Các mảng R được truy xuất theo cách tương tự các mảng trong các ngôn ngữ khác: theo chỉ
số nguyên, bắt đầu là 1 (không phải 0). Đoạn mã sau đây cho ta thấy cách mà chiều thứ ba
của mảng 3x3x3 có thể được truy xuất như thế nào.

z[,,3]
[,1] [,2] [,3]
[1,] 19 22 25
[2,] 20 23 26
[3,] 21 24 27

Xác định cụ thể hai trong ba chiều sẽ trả về một mảng một chiều.
z[,3,3]
[1] 25 26 27

Xác định cụ thể ba trong ba chiều sẽ trả về một phần tử của mảng 3x3x3.
z[3,3,3]
[1] 27

Ta có thể phân hoạch mảng phức tạp hơn.


z[,c(2,3),c(2,3)]
, , 1

[,1] [,2]
[1,] 13 16
[2,] 14 17
[3,] 15 18

, , 2

[,1] [,2]
[1,] 22 25
[2,] 23 26
[3,] 24 27

Các mảng không cần đối xứng theo mọi chiều. Đoạn code sau tạo một cặp các mảng 3x3.
w = array(1:18,dim=c(3,3,2))
print(w)
, , 1

[,1] [,2] [,3]


[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9

, , 2

[,1] [,2] [,3]


[1,] 10 13 16
[2,] 11 14 17
[3,] 12 15 18

Các đối tượng của các vector tạo nên mảng phải cùng loại, nhưng chúng không cần phải là
số.
u = array(c(T,F),dim=c(3,3,2))
print(u)
, , 1

[,1] [,2] [,3]


[1,] TRUE FALSE TRUE
[2,] FALSE TRUE FALSE
[3,] TRUE FALSE TRUE

, , 2

[,1] [,2] [,3]


[1,] FALSE TRUE FALSE
[2,] TRUE FALSE TRUE
[3,] FALSE TRUE FALSE

7.5. Danh sách

Một danh sách là một tập các đối tượng R. list() tạo một danh sách. unlist() chuyển
đổi một danh sách thành một vector. Các đối tượng trong một danh sách không phải cùng loại
hoặc chiều dài.
x <- c(1:4)
y <- FALSE
z <- matrix(c(1:4),nrow=2,ncol=2)
myList <- list(x,y,z)
myList
[[1]]
[1] 1 2 3 4

[[2]]
[1] FALSE

[[3]]
[,1] [,2]
[1,] 1 2
[2,] 3 4

Các danh sách có các phương pháp rất linh hoạt để tham chiếu
Theo chỉ số:
a = list()
a
list()
a[[1]] = "A"
a
[[1]]
[1] "A"

a[[2]]="B"
a
[[1]]
[1] "A"

[[2]]
[1] "B"
Theo tên:
a
list()
a$fruit = "Apple"
a
$fruit
[1] "Apple"

a$color = "green"
a
$fruit
[1] "Apple"

$color
[1] "green"

Điều này cũng có thể được đệ quy và kết hợp


a = list()
a[[1]] = "house"
a$park = "green's park"
a
[[1]]
[1] "house"

$park
[1] "green's park"

a$park = "green's park"


a[[1]]$address = "1 main st."

a
[[1]]
[[1]][[1]]
[1] "house"

[[1]]$address
[1] "1 main st."

$park
[1] "green's park"
Sử dụng các quy tắc phạm vi trong R người ta cũng có thể đặt tên động và tạo các phần tử
danh sách
a = list()
n = 1:10
fruit = paste("number of coconuts in bin",n)
my.number = paste("I have",10:1,"coconuts")
for (i in 1:10)a[fruit[i]] = my.number[i]
a$'number of coconuts in bin 7'
[1] "I have 4 coconuts"

7.6. Data frame

Một data frame có thể được xem như “một danh sách các biến/vector có cùng chiều dài”.
Trong ví dụ sau, một data frame có hai vector được tạo, mỗi vector có năm phần tử. Vector
đầu, v1, là một dãy các số nguyên từ 1 đến 5. Vector thứ hai, v2, là 5 giá trị logical được rút
từ loại T và F. Data frame sau đó được tạo từ các vector này. Các cột của data frame có thể
được truy xuất bằng cách dùng cách chỉ số nguyên hoặc tên cột kèm ký hiệu $.
v1 = 1:5
v2 = c(T,T,F,F,T)
df = data.frame(v1,v2)
print(df)
v1 v2
1 1 TRUE
2 2 TRUE
3 3 FALSE
4 4 FALSE
5 5 TRUE
df[,1]
[1] 1 2 3 4 5
df$v2
[1] TRUE TRUE FALSE FALSE TRUE
Data frame có thể được tạo một cách trực tiếp. Trong đoạn code sau, data frame được tạo
bằng cách đặt tên mỗi vector tạo nên data frame như kiểu nó là input của lệnh data.frame.
df = data.frame(foo=1:5,bar=c(T,T,F,F,T))
print(df)
foo bar
1 1 TRUE
2 2 TRUE
3 3 FALSE
4 4 FALSE
5 5 TRUE

8. Bài tập

Bài 1
Định nghĩa
> x<-c(4,2,6)
> y<-c(1,0,-1)
Đoán kết quả của các lệnh sau đây:
(a) length(x)
(b) sum(x)
(c) sum(x^2)
(d) x+y
(e) x*y
(f) x-2
(g) x^2
Dùng R để kiểm tra kết quả.

Bài 2
Đoán các dãy sau đây và dùng R để kiểm tra lại:
(a) 7:11
(b) seq(2,9)
(c) seq(4,10,by=2)
(d) seq(3,30,length=10)
(e) seq(6,-4,by=-2)

Bài 3
Xác định các kết quả của các biểu thức R sau đây, và sau đó sử dụng R để kiểm tra:
(a) rep(2,4)
(b) rep(c(1,2),4)
(c) rep(c(1,2),c(4,4))
(d) rep(1:4,4)
(e) rep(1:4,rep(3,4))

Bài 4

Sử dụng hàm rep để xác định các vector sau trong R.


(a) 6,6,6,6,6,6
(b) 5,8,5,8,5,8,5,8
(c) 5,5,5,5,8,8,8,8

Bài 5

Nếu x<- c(5,9,2,3,4,6,7,0,8,12,2,9) xác định biểu thức sau là gì và sử dụng R


để kiểm tra lại:
(a) x[2]
(b) x[2:4]
(c) x[c(2,3,6)]
(d) x[c(1:5,10:12)]
(e) x[-(10:12)]

Bài 6

Dữ liệu y<-c(33,44,29,16,25,45,33,19,54,22,21,49,11,24,56) chứa


doanh thu bán sữa theo lít trong 5 ngày trong ba cửa hàng khác nhau (3 giá trị đầu là cho cửa
hàng 1, 2 và 3 vào Thứ Hai, v.v.) Tạo một tóm lược thống kê về doanh thu cho từng ngày
trong tuần và cũng vậy cho mỗi cửa hàng.
(HD: dùng lệnh summary(y[1:3],…)
Bài 7
Tạo trong R các ma trận
 3 2
x 
 1 1 

1 4 0 
y 
0 1 1
Tính biểu thức sau và kiểm tra kết quả trong R:
(a) 2*x
(b) x*x
(c) x%*%x
(d) x%*%y
(e) t(y)
(f) solve(x)

Bài 8
(Sử dụng Bài 7)
Với x và y như trên, tính tác động của các phép toán subscript sau và kiểm tra trong R.
(a) x[1,]
(b) x[2,]
(c) x[,2]
(d) y[1,2]
(e) y[,2:3]

Bài 9

1. Attach dataset quakes và tạo một tóm lược thống kê về các biến depth và mag.
2. Attach dataset mtcars và tìm trọng lượng trung bình và mức tiêu thụ nhiên liệu trung
bình cho các xe trong dataset (gõ help(mtcars) để xem mô tả của các biến có sẵn).
Bài 2.
Giới thiệu về R (phần 2)
Lập trình cơ bản trong R

1. Các hàm toán học thường dùng trong R:

log(x) : logarti cơ số e
log10(x), log(x,n): logarit cơ số n
exp(x): e^x
sqrt(x): căn bậc 2 của x
factorial(x): x!
choose(n,k): tổ hợp n chập k
floor(x): giá trị nguyên <x (sàn của x)
ceiling(x): giá trị nguyên > x (trần của x)
trunc(x): làm tron tới giá trị nguyên gần nhất giữa x và 0.
round(x, digits=n): làm tròn x đến n chữ số
signif(x, digits=n): hiển thị x dưới dạn dấu chấm thập phân, n tổng chữ số hiển thị
sin(x), cos(x), tan(x)
abs(x): |x|
x %/% y: lấy phần nguyên của phép chia x/y
x %% y: lấy phần dư của phép chia x/y
2. Lệnh điều kiện:
Các phép toán so sánh: == (equal), != (not equal), >, <, >=, <=.
Các phép toán logic: & (and), | (or), ! (not), && (AND with IF), || (OR with IF).
2.1 Lệnh if-esle:
Cú pháp:
if (logical expr) {group cmd}
if (logical expr) {group cmd1} else {group cmd2}
Thường sử dụng && và || trong biểu thức điều kiện của IF.
Ví dụ:
1.
x <- c(2,4,4,5,6)
if (all(x>0)) y <- sqrt(x)
y
2.
M <- matrix(rpois(12,3),nrow=3) #Tạo ngẫu nhiên ma trận
d <- dim(M) #Tìm số hàng/số cột của ma trận
{if (d[1] == d[2])
{ cat('M is a squared matrix\n')
cat('The determinant of M is', det(M),'\n')
}
else
cat('M is not a squared matrix\n')
}
3.
#Gia he phuong trinh bac hai ax^2 + bx + c = 0 voi a≠0
delta <- b^2 - 4*a*c
if (delta < 0){
cat('Phuong trinh vo nghiem\n')
}else{
cat('Phuong trinh co nghiem:\n');
sol <- c(-b + sqrt(delta), -b + sqrt(delta))/(2*a)
}
sol
2.2 Lệnh ifelse:
Cú pháp: ifelse(test, true_value, false_value)
Ví dụ:
x <- 1:10
ifelse(x<5 | x>8,x,0)
3. Vòng lặp: Các vòng lặp thường được dùng là ‘for’ và ‘while’, ‘apply’; ít thông dụng là
vòng lặp ‘repeat’. Lệnh ‘break’ dùng để ngắt vòng lặp, ‘next’ dùng để nhảy sang bước lặp kế
tiếp.
3.1. Vòng lặp For:
Cú pháp:
for (variable in sequence) {
statements
}
Ví dụ:
1.
#Calculate and print the first 6 elements of the Fibonacci series
fib <- numeric(6)
fib[1] <- 1; fib[2] <- 1
cat('The 1st Fibonacci number is:',fib[1],'\n')
cat('The 2nd Fibonacci number is:',fib[2],'\n')
for(i in 3:6){
fib[i] <- fib[i-1] + fib[i-2]
cat('The ',i,'th Fibonacci number is:',fib[i],'\n')
}
2.
#Tinh n!
n = 10; fac <- 1
for(i in 1:n){
fac <- fac*i
}
fac
3.
#stop on condition and print error message
x <- 1:10; z <- NULL
for(i in x) {
if (x[i]<5) { z <- c(z,x[i]-1) } else { stop("values need to be <5") }
}
z
3.2. Vòng lặp While:
Cú pháp:
while (condition) statements
Vòng lặp ngừng khi điều kiện trả về giá trị FALSE.
Ví dụ:
1.
z<- 0
while (z<5) {
z <- z+2
print(z)
}
2.
#Toss a die untill a 6 is obtained
#toss <- ceiling(6*runif(1)) #ceiling function
toss <- sample(1:6,1,rep=T) #sample function
count <- 1
while (toss != 6){
#toss <- ceiling(6*runif(1))
toss <- sample(1:6,1,rep=T)
cat('Toss', count,' was a', toss,'\n')
count <- count + 1
}
cat('There was ',count-2,' tosses before the firs 6\n')

3.3. Lệnh Apply:


Cú pháp:
apply(X, MARGIN, FUN, ARGs)
X: mảng, ma trận hoặc data.frame
MARGIN: 1 đối với hàng, 2 đối với cột, c(1,2) cho cả hai.
FUN: hàm cần thực thi lên X.
ARGs: các tham số có thể có của hàm FUN.
Kết quả trả về của lệnh ‘apply’ sẽ là một véc-tơ hay ma trận.
Ví dụ:
1.
X <- matrix(1:24,nrow=4)
apply(X,1,sum) #Tinh tong hang
apply(X,2,sum) #Tinh tong cot
2.
# create a matrix of 10 rows x 2 columns
m <- matrix(c(1:10, 11:20), nrow = 10, ncol = 2)
# mean of the rows
apply(m, 1, mean)
# mean of the columns
apply(m, 2, mean)
# divide all values by 2
apply(m, c(1,2), function(x) x/2)

4. Script và hàm:
4.1. Script:
- Tập hợp các dòng lệnh.
- Tạo script: vào File -> New script; lưu file dưới định dạng ‘*.R’.
- Gọi lại script: > source(‘ten_script.R’) hoặc File -> Source R code rồi chọn script cần gọi.
4.2. Hàm:
- R cho phép người dùng tự viết hàm; những hàm này sử dụng tương tự như các hàm có sẵn của R
(sum, mean, var, …)
Cú pháp:
myfct <- function(arg1, arg2, …) { function_body }
myfct: tên hàm, do người dùng đặt, không đặt tên trùng với tên hàm đã có,
arg1, arg2, … : các tham số của hàm,
function_body: thân hàm, gồm các lệnh xử lý.
Giá trị trả về của 1 hàm thường là giá trị của biểu thức lệnh đặt ở cuối thân hàm, hoặc dùng lệnh
return().
Để hàm có hiệu lực, cần biên dịch hàm 1 lần trước khi sử dụng. (chọn toàn bộ hàm, chọn Run line
or selection/Ctrl + R hoặc dùn lệnh source(‘file.name.R’) trong đó file.name.R là file mà chứa hàm
bên trong).
Ví dụ:
1. Viết hàm tính sai số chuẩn,
stderr <- function(x) {# x: vecto du lieu
se <- sd(x)/length(x);
se # hoac return(se)
}
Sử dụng: trong console của R
> x <- round(rnorm(50,20,4),digit=0) #Nhap x bat ky
> stderr(x)
2. Viết hàm chuyển 1 số hệ thập phân sang nhị phân
binary <-function(x){
i<-0
string<-numeric(32)
while(x>0){
string[32-i]<-x%%2
x<-x%/% 2
i<-i+1
}
first<-match(1,string)
string[first:32]
}
Sử dụng:
#Chuyen so 59 sang dang nhi phan, gan cho bien x
> x <- binary(59)
4.3. Hàm với switch: cho phép thực hiện lệnh với nhiều lựa chọn
central<-function(y, measure){
switch(measure,
Mean = mean(y),
Geometric = exp(mean(log(y))),
Harmonic = 1/mean(1/y),
Median = median(y),
stop("Measure not included"))
}
central(rnorm(100,10,2),"Harmonic")
central(rnorm(100,10,2),4)

5. Bài tập:
1. Tạo một vec-tơ X chứa n phần tử (n: tự cho). Viết hàm tính tổng tích lũy đến vị trí thứ i của
X.

2. Thể tích hình cầu với bán kính r là: V = 4r3/3. Hãy viết hàm xây dựng 1 dataframe để tính
thể tích hình cầu với bán kính tương ứng là 3,4,5,…,20. Cột radius lưu bán kính và cột
volume lưu thể tích.
3. Trong file data01.xls, dùng lệnh if và vòng lặp for để tạo biến Index theo yêu cầu sau:
Nếu Age <=60 thì Index = 0; 60 < Age <=70 thì Index = 1; 70< Age<=80 thì Index = 2 và
Age >80 thì Index = 3.

4. File data11.xls chứa số liệu về chiều cao của 1 loại cây trồng theo bảng tần số dạng
khoảng. Thực hiện các bước sau:
a. Đọc số liệu từ data11.xls và gán vào 1 dataframe.
b. Viết một hàm tính tham số là các biến trong dataframe vừa nhập, xuất ra các giá trị sau:
chiều cao bé nhất, lớn nhất của cây, trung bình mẫu, phương sai mẫu hiệu chỉnh.

5. Cho vec-tơ X chứa n giá trị quan sát, phân vị thứ p được xác định như sau
- Sắp xếp dữ liệu theo thứ tự tăng dần (từ nhỏ đến lớn).
- Tính chỉ số i:

 p 
i n
 100 
- Nếu i không phải là số nguyên, làm tròn i. Phân vị thứ p chính là giá trị nằm ở vị trí thứ
i đã được làm tròn.
Nếu i nguyên, phân vị thứ i chính là giá trị trung bình của 2 giá trị nằm ở vị trí thứ i và
thứ i + 1.
Hãy viết hàm phanvi(X, P) cho kết quả là phân vị thứ p từ vec-tơ X.

6. Phương pháp Capture-Recapture thường được dùng để ước lượng kích cở cùa quần thể (Ví
dụ: Số cá trong một hồ). Phương pháp này được trình bày ngắn gọn như sau :

c1 R
N c2
Nên ta có thể dùng N* để ước tính kích thước quần thể :
c1c2
N* 
R
Để tăng tính chính xác thì ta điều chỉnh công thức trên , để N* trở thành một ước lượng
không chệch của N
(c1  1)(c2  1)
N*  1
R 1
(c1  1)(c2  1)(c1  R)(c2  R)
var( N * ) 
( R  1)2 ( R  2)
Vậy khoảng tin cậy 95% của kích cở quần thể là

 N 1.96
*
var( N * ) , N *  1.96 var( N * ) 
Hãy viết hàm mô phỏng phương pháp trên, hàm nay có:
Input : Kích cỡ thât sự của quần thê , số cá thể lấy lần 1 , số cá thể lấy lần 2
Output: Kích cở quần thể được ước tính bằng phương pháp C-R, Khoảng tin cậy 95%
Bài 3.
Biến ngẫu nhiên
1. Tính toán
Ví dụ 1

a) Với k  0,1,,8 , tính các xác suất P( X  k )  C8k 0.3k 0.78k .


b) Cho biến ngẫu nhiên X có hàm mật độ như sau:
(x  )2
1 
f (x)  ,   x  
e 2 2

2 2

với  và   0 là hai tham số. Viết hàm pdf của X để tính giá trị f(x) tại một điểm bất kỳ.
Giải:
a)
k = 0:8;
p = function(k) choose(8,k) * 0.3^k * 0.7^(8-k);
p(k)
[1] 0.05764801 0.19765032 0.29647548 0.25412184 0.13613670
0.04667544
[7] 0.01000188 0.00122472 0.00006561

Ta có thể kiểm tra lại rằng tổng các xác suất bằng 1 với lệnh
sum(p(k))
[1] 1

b)
f = function(x, mu=0, sigma=1){
1/sqrt(2*pi*sigma^2) * exp(-(x-mu)^2/(2*sigma^2))
}

Kiểm tra tích phân có bằng 1?


integrate(function(x) f(x,0,1),lower=-Inf,upper=Inf)
1 with absolute error < 9.4e-05
Tính tại điểm x  0 :
f(0)
[1] 0.3989423

2. Biểu diễn bằng đồ thị


Ví dụ 2

a) Vẽ đồ thị hàm xác suất trong Ví dụ 1a): P( X  k )  C8k 0.3k 0.78k với k  0,1,,8 .
(x  )2
1 
b) Vẽ hàm mật độ xác suất trong Ví dụ 1b): f (x)  e 2 2
,   x  
22
Giải:
a)
plot(k, p(k), type = "h", ylab = "P(X = x)")
0.30
0.25
0.20
P(X = x)

0.15
0.10
0.05
0.00

0 2 4 6 8

b)
curve(f(x,0,1),from=-3,to=3, ylab = "fX(x)")
0.4
0.3
fX(x)

0.2
0.1
0.0

-3 -2 -1 0 1 2 3

3. Hàm phân phối


3.1 Định nghĩa
FX (x)  P(X  x)
* X rời rạc,
FX (x)  
kX(  ) (  ,x]
P(X  k)

* X liên tục,
x
FX (x) 

f X (t)dt

3.2 Tính toán

Ví dụ 3

4
a) Xét tiếp Ví dụ 1a). Tính FX (4)  P( X  4)   P( X  k ) .
k 0
2
1.96
1  x2
b) Xét tiếp Ví dụ 1b). Tính FX (1.96)  P( X  1.96)  
 2
e dx .

Giải:
a)
F = function(k) sum(p(0:k))
F = Vectorize(F)
F(4)
[1] 0.9420323

b)
F2 = function(a,mu = 0, sigma = 1){
integrate(function(x) f(x,mu,sigma), lower = -Inf, upper =
a)$value
}
F2 = Vectorize(F2)
F2(1.96)
0.9750021

3.3 Vẽ đồ thị
Ví dụ 4

a) Xét tiếp Ví dụ 1a). Vẽ hàm phân phối xác suất của X .


b) Xét tiếp Ví dụ 1b). Vẽ hàm phân phối.
Giải:
a)
plot(stepfun(k, c(0, F(k))), ylab = "FX(x)", main = "")
1.0
0.8
0.6
FX(x)

0.4
0.2
0.0

0 2 4 6 8

b)
curve(F2(x), from = -3, to = 3, ylab = "FX(x)")
1.0
0.8
0.6
FX(x)

0.4
0.2
0.0

-3 -2 -1 0 1 2 3

4. Phân vị
4.1 Định nghĩa
Cho p  (0,1) và X là một biến ngẫu nhiên.
* Nếu X rời rạc, thì phân vị mức p của X , ký hiệu là x p , là
x p  inf{k  ; FX (k)  p}
* Nếu X liên tục, thì phân vị mức p của X , ký hiệu là x p , là giá trị thỏa FX (x p )  p .

4.2 Tính toán


Ví dụ 5

a) Xét tiếp Ví dụ 1a). Tính phân vị mức 0.25 của X .


b) Xét tiếp Ví dụ 1b). Tính phân vị mức 0.975 của X .
Giải:
a)
K = k[F(k) >= 0.25];
K[1]
[1] 1

Kiểm tra lại bằng lệnh:


F(0)
[1] 0.05764801
F(1)
[1] 0.2552983

b)
uniroot(function(x) F2(x)-0.975, c(-3,3))$root
[1] 1.959992

Kiểm tra lại bằng lệnh


F2(1.959992)
[1] 0.9750016
5. Mô phỏng
5.1 Lệnh sample
a) Sử dụng cơ bản
Lệnh cơ bản là: sample(x), với x là vector số, logic hoặc chuỗi ký tự.
Lệnh này trả về một vector có các phần tử được rút ra từ x mà không hoàn lại.
Tạo một hoán vị các phần tử của x ta làm:
x = 1:7
sample(x)
[1] 2 4 1 7 5 6 3

Ta chạy lại cùng lệnh này:


sample(x)
[1] 1 7 6 2 3 4 5

Ta nhận được các kết quả khác nhau; thứ tự của hoán vị thay đổi mỗi lần chạy.
Ta có thể giữ lại kết quả của một phép hoán vị trong một vector để sử dụng sau này:
y = sample (c ("red", "green", "blue", "white", "black"))
y
[1] "black" "white" "green" "red," "blue"

5.2 Các tùy chọn


Có một số tùy chọn trong lệnh sample để thay đổi mẫu cho phù hợp với thực tế. Nó được làm
bằng cách thêm một hoặc vài tham biến trong lệnh sample.

Ví dụ:
sample(1:3, size = 2, replace = TRUE, prob = c(25 / 100, 20 / 100,
55 / 100))
Các tùy chọn được trình bày bên dưới

a) Size (cỡ mẫu): size = "n", với n là một số nguyên, xác định số lần n ta thực hiện rút ra.
Mặc định, số được rút ra bằng chiều dài x.
sample(1:10, size = 3)
[1] 10 7 3
Trong cú pháp sample, tham biến size là thứ hai. Ta có thể viết tắt như sau :
sample(1:10, 3).

b) Replace (hoàn lại): replace = L, với L là TRUE hoặc FALSE, trong đó rút có thay thế
(hoàn lại) nếu L = TRUE và không hoàn lại nếu khác.
Ta làm :
sample(1:5, size = 9, replace = TRUE)
[1] 5 1 4 1 3 1 2 1 3

c) Prob (xác suất : Tham biến prob cho phép ta gán các giá trị xác suất cho từng giá trị trong
vector x.
k
P(X  x j )  p j , j {1, , k}, p j [0,1],  p j  1.
j1

Do đó, prob = vec, với vec là vector chứa các xác suất ( p1 ,, pk ) .
Nếu prob không được xác định, mặc định p j  1/ k (các giá trị bằng nhau).
Ta làm:
y = c ("red", "green", "blue", "white", "black")
sample(y, 2, prob = c(10 / 100, 30 / 100, 10 / 100, 30 / 100, 20 /
100))
[1] "red" "green"

Bài tập

Bài 1

1. Biến ngẫu nhiên P, nhận các giá trị giữa 0 và 1, có hàm mật độ xác suất f P ( p)  0.07 p 0.93 .
a) Tính xác suất P(P ≤ 0.2) bằng cách sử dụng hàm: 1) f=function(p){.07*p**(-0.93)}, và 2)
integrate(f,lower=0,upper=.2).
b) Kiểm tra f P ( p) là hàm mật độ xác suất bằng cách tính diện tích dưới đường cong từ 0 đến
1.

Bài 2

Sử dụng lệnh x=sample(1:5,100,TRUE,c(0.1,0.2,0.4,0.2,0.1)) để rút một mẫu


ngẫu nhiên cỡ 100 từ phân phối với hàm xác suất
x 1 2 3 4 5
P(x) 0.1 0.2 0.4 0.2 0.1
và chứa mẫu này trong x. Tiếp theo vẽ biểu đồ cột của các xác suất thực nghiệm (mẫu) bằng
lệnh table(x)/100
Bài 4.
Một số phân phối xác suất thông dụng
1. Cú pháp chung
Với biến ngẫu nhiên X có phân phối (luật) được định nghĩa sẵn trong R, cú pháp chung là
như sau:
* Để nhận mật độ của X , dùng lệnh: dluật; bằng cách thêm ký tự d trước luật,
* Để nhận giá trị của hàm phân phối của X , dùng lệnh: pluật; bằng cách thêm ký tự p
trước luật,
* Để nhận giá trị phân vị của X , dùng lệnh: qluật; bằng cách thêm ký tự q trước luật,
* Để mô phỏng giá trị của X , dùng lệnh: rluật; bằng cách thêm ký tự r trước luật.
Tên của các phân phối phổ biến là: norm (cho phân phối chuẩn), binom (cho nhị thức), geom
(cho phân phối hình học), pois (cho phân phối Poisson), t (cho phân phối Student), chisq
(cho phân phối Chi bình phương), exp (cho phân phối mũ), f (cho phân phối Fisher),…
Phần bên dưới sẽ trình bày chi tiết, ví dụ và minh họa cho các lệnh này.

2. Mật độ
2.1 Định nghĩa

* Với biến ngẫu nhiên X rời rạc, “mật độ” của X tại x là xác suất P( X  x) .
* Với biến ngẫu nhiên X có hàm mật độ f X , “mật độ” của X tại x là f X ( x) .

2.2 Lệnh
Nếu phân phối của X phụ thuộc vào một hoặc nhiều tham số, tham1 và tham2, thì mật độ
của X tại x được cho bởi lệnh:
dluật(x, tham1, tham2)
Dưới đây là một số ví dụ:

Luật Nhị thức Hình học Poisson


Tham số n  * , p  (0,1) p  (0,1) 0
X~ B(n, p) G ( p) P ( )
X () {0,, n} *

P( X  x ) n x n x p(1  p)x 1 k


  p (1  p) e 
x k!
Lệnh dninom(x, n, p) dgeom(x, p) dpois(x, lambda)

Luật Đều Mũ Chuẩn


Tham (a, b)  2
,a  b 0  ,   0
số
X~ U ([a, b]) E ( ) N ( , 2 )
X () [ a , b] [0, )
f X ( x) 1 ex 1 
(x  )2
2 2
ba e
22
Lệnh dunif(x, a, b) dexp(x, lambda) dnorm(x, mu, sigma)
Tìm hiểu thêm: help("dgamma"), help("dt"), help("dchisq") và help("df")

2.3. Tính toán

Ví dụ 1

8
a) Cho biến ngẫu nhiên X ~ B(8,0.3) . Tính P( X  4)    0.34 (1  0.7)84 .
 4
b) Cho biến ngẫu nhiên X ~ N (2,0.12 ) . Tính hàm mật độ của X tại x  1.7 :
2

(1.7  2)2
1 
f (1.7)  e 20.122
,   x  
2 0.12 2

Giải:
a)
Ta làm:
dbinom(4, 8, 0.3)
[1] 0.1361
Kiểm tra lại bằng lệnh:
choose(8, 4) * 0.3^4 *(1- 0.3)^(8 - 4)
[1] 0.1361

b)
dnorm(1.7, 2, 0.12)
[1] 0.1460692
Kiểm tra lại bằng lệnh:
(1 / sqrt(2 * pi * 0.12^2)) * exp(- (1.7 - 2)^2 / (2 * 0.12^2))
[1] 0.1460692

Để tính toán mật độ tại nhiều giá trị, ta nhập x là vector có các giá trị này. Ta cũng có thể làm
tương tự cho một tập các tham số.

Ví dụ 2

(a) Tính giá trị mật độ của X ~ B(8,0.3) tại x {4,6} .


(b) Tính giá trị mật độ của X ~ E ( ) tại x  2 và   1,   2 và   3 .
Giải :
(a)
Ta làm:
dbinom(c(4, 6), 8, 0.3)
[1] 0.13613670 0.01000188

(b) Ta làm :
dexp(2, c(1, 2, 3))
[1] 0.135335283 0.036631278 0.007436257

Ta cũng có thể lưu kết quả vào một vector để sử dụng sau này.
Ta làm :
vec = dexp(2, c(1, 2, 3))
vec
[1] 0.135335283 0.036631278 0.007436257
2.4. Biểu diễn bằng đồ thị
Ta có thể biểu diễn đồ thị của hàm xác suất của biến rời rạc X với lệnh plot và tùy chọn
type=h.

Ví dụ 3

a) Vẽ đồ thị hàm xác suất trong Ví dụ 1a): B(8,0.3) .


b) Vẽ hàm mật độ xác suất trong Ví dụ 1b): N (2, 0.122 ) .
Giải:
a)
plot(0:8, dbinom(0:8, 8, 0.3), type = "h", ylab = "P(X = x)")
0.30
0.25
0.20
P(X = x)

0.15
0.10
0.05
0.00

0 2 4 6 8

0:8

b)
curve(dnorm(x,2,0.12),from=1.5,to=2.5, ylab = "fX(x)")
3.0
2.5
2.0
fX(x)

1.5
1.0
0.5
0.0

1.6 1.8 2.0 2.2 2.4

3. Hàm phân phối


3.1 Định nghĩa
FX (x)  P(X  x)
* X rời rạc,
FX (x)  
kX(  ) (  ,x]
P(X  k)

* X liên tục,
x
FX (x)  f

X (t)dt

3.2 Lệnh
Nếu phân phối của X phụ thuộc vào một hoặc nhiều tham số, tham1 và tham2, thì hàm
phân phối của X tại x được cho bởi lệnh:
pluật(x, tham1, tham2)
Có thể tính: P( X  x)  1  FX ( x) , bằng lệnh:
pluật(x, tham1, tham2, lower.tail = FALSE)

3.3 Tính toán

Ví dụ 4

4
a) Xét tiếp Ví dụ 1a). Tính FX (4)  P( X  4)   P( X  k ) .
k 0
2.1 ( x  2)2
1 
b) Xét tiếp Ví dụ 1b). Tính FX (2.1)  P( X  2.1)  
 2  0.12 2
e 20.122
dx .

c) Tính P( X  2) , X ~ E (3) .

Giải:
a)
pbinom(4, 8, 0.3)
[1] 0.9420324

Ta có thể kiểm tra lại:


sum(dbinom(0:4, 8, 0.3))
[1] 0.9420324

b)
pnorm(2.1, 2, 0.12)
[1] 0.7976716

c)
pexp(2, 3, lower.tail = FALSE)
[1] 0.002478752

Kiểm tra lại bằng cách tính toán:


 

P(X  2)   f X (x)dx   3e3x dx   e3x   e32  e6 .
2
2 2
Và tính
exp(-6)
[1] 0.002478752
3.4 Vẽ đồ thị
Để biễu diễn hàm phân phối của biến ngẫu nhiên rời rạc dùng lệnh stepfun, biến ngẫu nhiên
liên tục dùng hàm curve.
Ví dụ 5

a) Xét tiếp Ví dụ 1a). Vẽ hàm phân phối xác suất của X .


b) Xét tiếp Ví dụ 1b). Vẽ hàm phân phối.
Giải:
a)
plot(stepfun(0:8, c(0, pbinom(0:8, 8, 0.3))), ylab = "FX(x)", main =
"") 1.0
0.8
0.6
FX(x)

0.4
0.2
0.0

0 2 4 6 8

b)
curve(pnorm(x, 2, 0.12), from = 1.5, to = 2.5, ylab = "FX(x)")
1.0
0.8
0.6
FX(x)

0.4
0.2
0.0

1.6 1.8 2.0 2.2 2.4

4. Phân vị
4.1 Định nghĩa
Cho p  (0,1) và X là một biến ngẫu nhiên.
* Nếu X rời rạc, thì phân vị mức p của X , ký hiệu là x p , là
x p  inf{k  ; FX (k)  p}
* Nếu X liên tục, thì phân vị mức p của X , ký hiệu là x p , là giá trị thỏa FX (x p )  p .

4.2 Lệnh
Nếu phân phối của X phụ thuộc vào một hoặc nhiều tham số, tham1 và tham2, thì phân vị
mức p của X được cho bởi lệnh:
qluật(x, tham1, tham2)

4.2 Tính toán


Ví dụ 6

a) Xét tiếp Ví dụ 1a). Tính phân vị mức 0.25 của X .


b) Xét tiếp Ví dụ 1b). Tính phân vị mức 0.975 của X .
Giải:
a)
qbinom(0.25, 8, 0.3)
[1] 1
x 0.25  inf{k  ;FX (k)  0.25} .
Ta có thể kiểm tra lại bằng cách tính các giá trị FX ( x) tại x {0,1, ,7,8}:
pbinom(0:8, 8, 0.3)
[1] 0.05764801 0.25529833 0.55177381 0.80589565 0.94203235
[6] 0.98870779 0.99870967 0.99993439 1.00000000
Khi đó ta thấy rằng FX (0)  0.0576  0.25  0.2552  FX (1) , do đó x0.25  1 .

b)
qnorm(0.975, 2, 0.12)
[1] 2.235196

Như vậy, ta đã tính được phân vị mức p  0.975 của biến X ~ N (2,0.12) : là x0.975 sao cho
FX ( x0.975 )  0.975 .
Kiểm tra lại bằng lệnh
pnorm(2.235196, 2, 0.12)
[1] 0.9750002

5. Mô phỏng các phân phối được lập trình sẵn


5.1 Lệnh
Nếu phân phối của X phụ thuộc vào một hoặc vài tham số, tham1 và tham2, thì mô phỏng
n biến độc lập có cùng phân phối như X bằng lệnh:
rluật(n, tham1, tham2)

5.2 Tính toán


Ví dụ 7

a) Mô phỏng một mẫu ngẫu nhiên cỡ 10 của phân phối Poisson P(2) .
80
b) Mô phỏng giá trị ngẫu nhiên của biến X
i 1
i , X1 ,, X 80 là các biến ngẫu nhiên độc lập

nhau có phân phối Bernoulli B(1,0.02) .


c) Mô phỏng một mẫu ngẫu nhiên cỡ 15 của phân phối N (2, 0.122 ) .
Giải:
a)
rpois(10, 2)
[1] 0 2 2 3 3 5 1 3 1 2

b)
sum(rbinom(80, 1, 0.02))
[1] 3

80
Bởi vì X
i 1
i ~ B(80, 0.02) , nên ta có thể dùng lệnh sau để mô phỏng biến Y ~ B(80,0.02) :

rbinom(1, 80, 0.02).

c)
x = rnorm(15, 2, 0.12)
x
[1] 2.021767 1.898343 2.072553 1.974686 2.044200 2.050094
[7] 2.063342 2.000698 1.702115 1.958284 1.984903 1.897726
[13] 2.011624 2.074341 1.720218

6. Bài tập

Bài 1
Vẽ một biểu đồ cột của hàm xác suất của phân phối siêu bội với N = 100, M = 25 và cỡ mẫu
n = 15.

Bài 2
Nếu X có phân phối như trên, đầu tiên tính P(5 ≤ X ≤ 12) bằng cách lấy tổng các xác suất
được cho bởi hàm xác suất,và sau đó bằng cách sử dụng hàm phân phối tích lũy.

Bài 3

a) Sử dụng lệnh curve(dexp(x,0.6),0,10) để vẽ hàm mật độ xác suất của phân phối mũ
với tham số λ = 0.6.
b) Đối với đồ thị nhận được bạn vẽ thêm hàm mật độ xác suất của phân phối mũ với tham số
λ = 0.3 (đảm bảo bạn thêm add=T trong lệnh curve).
c) Sử dụng hàm phân phối tích lũy để tính diện tích bên dưới của hai hàm mật độ.

Bài 4

Vẽ hàm xác suất của biến X ~ P(1) với x {0,,8} .

Bài 5

Vẽ đồ thị hàm mật độ xác suất của biến X ~  2 (3) với x [0,10] .

Bài 6
Chia cửa sổ đồ thị thành hai phần trên và dưới.
- Trong phần trên, vẽ đồ thị của hàm xác suất của biến X ~ B(50,0.08) lấy
ylim=c(0,0.25).
- Trong phần dưới, vẽ đồ thị của hàm xác suất của biến X ~ P(4) với x {0,,50} với cùng
lựa chọn: ylim=c(0,0.25).
(Điều này minh họa kết quả là khi n đủ lớn và np đủ nhỏ ta có thể xấp xỉ phân phối nhị thực
B(n, p) bằng luật Poisson P(np) ).

Bài 7

Vẽ đồ thị của hàm mật độ của biến X ~ B(50,0.4) và thêm vào đồ thị này hàm mật độ của
biến Y ~ N (20,12) (điều này minh họa kết quả rằng khi n lớn, np lớn và n(1-p) lớn, ta có thể
xấp xỉ phân phối nhị thức B(n, p) bằng phân phối chuẩn N (np, np(1  p)) ).
Bài 5.
Phân phối mẫu và định lý giới hạn trung tâm

5.1. Mẫu ngẫu nhiên phân phối chuẩn


Mô phỏng
Định lý. Cho X1 , X2 , , Xn là mẫu ngẫu nhiên lấy từ phân phối chuẩn N  ; 2  . Ta có
X 
N ; n
2
 và  n 1S2X
2
2  n  1 .

Đầu tiên ta mô phỏng cho phân phối của trung bình mẫu X :
Đối với mẫu ngẫu nhiên lấy từ phân phối chuẩn, ta thành lập mẫu ngẫu nhiên kích thước n
(xem hàm rnorm(n,mu,sigma)),
mu <- 2
sigma <- 2
Y <- function() rnorm(1,mu,sigma)
Y()
[1] 4.298447
vecY <- function(n) replicate(n,Y())
n=4
vecY(n)
[1] 3.298608 3.804107 3.272638 2.029872
vecY(n)
[1] 0.3444242 1.7142771 2.5943892 3.1046964
và ta có phân phối trung bình mẫu ngẫu nhiên kích thước n như sau
MeanY <- function() mean(vecY(n))
MeanY()
[1] 2.268478
SampleMeanY <- function(m) replicate(m,MeanY())
m=10000
hist(SampleMeanY(m),freq=0,breaks=40)
curve(dnorm(x,mu,sigma/sqrt(n)),col="blue",lty=1,lwd=2,add=TRUE)
 n 1S2X
và ta có mô phỏng tương tự cho phân phối của 2
,
mu<-2
sigma<-2
n<-10
Z<-function() {
x<-rnorm(n,mu,sigma)
(n-1)*var(x)/sigma^2
}
Z()
[1] 2.074494
Z()
[1] 23.87044
vecZ<-function(m) replicate(m,Z())
hist(vecZ(1000),freq=0,breaks=40)
curve(dchisq(x,df=n-1),col="blue",lty=1,lwd=2,add=TRUE)
hist(vecZ(10000),freq=0,breaks=40)
curve(dchisq(x,df=n-1),col="blue",lty=1,lwd=2,add=TRUE)

5.2. Mẫu ngẫu nhiên có cùng phân phối


Mô phỏng
Định lý. Xét mẫu ngẫu nhiên X1 , X2 , , Xn lấy từ một phân phối có trung bình  hữu hạn
và phương sai dương  2 . Ta có biến ngẫu nhiên Yn  n  X    /  có phân phối xấp xỉ với
phân phối chuẩn N  0;1 .
bằng cách lần lượt phát sinh các mẫu ngẫu nhiên kích thước n  100 , 10.000, và 100.000, lấy
từ phân phối nhị thức B 10;0,3 , để tính giá trị của biến Yn  n  X    /  . Lập lại
m  1.000 lần để nhận được mẫu kích thước 1.000 cho Yn để so sánh với phân phối chuẩn
N  0,1 :
size=10
prob=0.3
mauX<-function(n) {
x<-rbinom(n,size,prob)
sqrt(n)*(mean(x)-3)/sqrt(2.1)
}
Y<-function(m) replicate(m,mauX(n))
n=100
m=1000
hist(Y(m),freq=0,breaks=40)
curve(dnorm(x),col="blue",lty=1,lwd=2,add=TRUE)

n=10000
hist(Y(m),freq=0,breaks=40)
curve(dnorm(x),col="blue",lty=1,lwd=2,add=TRUE)
n=100000
hist(Y(m),freq=0,breaks=40)
curve(dnorm(x),col="blue",lty=1,lwd=2,add=TRUE)

và mô phỏng cho
Định lý. Xét mẫu ngẫu nhiên X1 , X2 , , Xn lấy từ một phân phối Bernoulli B 1; p  . Ta có
các biến ngẫu nhiên f p n
p1 p 
và f p n
f 1 f 
có phân phối xấp xỉ với phân phối chuẩn N  0;1 .
bằng cách phát sinh m  1.000 mẫu ngẫu nhiên kích thước n  100 lấy từ phân phối
Bernoulli B 1;0,3 . Ứng với mỗi mẫu ngẫu nhiên, tính giá trị Y   p 1p để nhận được mẫu
f p n
 

ngẫu nhiên kích thước m cho Y và so sánh với phân phối chuẩn N  0,1 .
prob=0.3
Y<-function(n) {
x<-rbinom(n,1,prob)
(mean(x)-prob)*sqrt(n)/sqrt(prob*(1-prob))
}
vecY<-function(m) replicate(m,Y(n))
n=100
m=1000
hist(vecY(m),freq=0,breaks=40)
curve(dnorm(x),col="blue",lty=1,lwd=2,add=TRUE)

Tương tự, ứng với mỗi mẫu ngẫu nhiên, tính giá trị Z   f 1f  để nhận được mẫu ngẫu nhiên
f p n

kích thước m cho Z và ta cũng so sánh histogram của mẫu này so với phân phối chuẩn
N  0,1 .
Z<-function(n) {
x<-rbinom(n,1,prob)
(mean(x)-prob)*sqrt(n)/sqrt(mean(x)*(1-mean(x)))
}
vecZ<-function(m) replicate(m,Z(n))
hist(vecZ(m),freq=0,breaks=40)
curve(dnorm(x),col="blue",lty=1,lwd=2,add=TRUE)
5.3. Bài tập

Bài 1. Cho X1 , X 2 là mẫu ngẫu nhiên kích thước 2 lấy từ phân phối chuẩn N  0;1 . Dùng
hàm rnorm() phát sinh X1 , X 2 và Y  X12  X22 . Xây dựng hàm MauY phát sinh mẫu ngẫu nhiên
kích thước n cho Y. Lần lượt phát sinh mẫu ngẫu nhiên kích thước 100, 1000, 10000 cho Y,
vẽ biểu đồ tần suất và đồ thị hàm mật độ xác suất của phân phối Chi-bình phương với 2 bậc
tự do cho từng trường hợp. Liên hệ với lý thuyết mẫu.
Bài 6:
Lý thuyết mẫu

1. Nhập, xử lý, xuất dữ liệu

1.1. Nhập dữ liệu

a) Working directory

Trước khi nhập dữ liệu ta nên thiết lập thư mục làm việc. Đây là thư mục chứa những thứ
mà ta muốn tương tác với R (như file dữ liệu, code script R, hình ảnh, đồ thị,
package,…).
- Để thiết lập thư mục làm việc, ví dụ ở ổ D, thư mục Works
> setwd('D:/Works')
hoặc vào File -> Change dir
- Xem thư mục hiện hành
> getwd()
- Liệt kê tất cả file trong thư mục làm việc
> list.files() hoặc > dir()

b) Workspace

Từ khi mở R (cửa sổ R console xuất hiện) cho đến khi tắt R là một phiên làm việc.
Những đối tượng ta tạo ra trong một phiên làm việc được R lưu trong Workspace. Ta có
thể lưu lại mọi thứ trong Workspace này để tiếp tục công việc đang làm của ta ở một thời
điểm khác.
- Lưu Workspace
> save.image('ten_file.rda')
- Tải Workspace đã lưu
> load('ten_file.rda')
- Lưu biến đang làm việc, chẳng hạn biến x
> save(x, file=’ten_file.rda’)
- Khôi phục biến x
> load(‘ten_file.rda’), ten_file.rda là file chứa biến x vừa lưu ở trên.
- Xóa 1 biến ra khỏi Workspace
> rm(x)
- Xóa tất cả
> rm(list=ls())
- Liệt kê tất cả những biến trong Workspace
> ls()
- Xem thông tin của 1 biến
> str(x)
- Xem thông tin của tất cả biến đang làm việc
> ls.str()

c) Nhập dữ liệu

- Nhập trực tiếp từ R, dùng lệnh edit(data.frame())


> frame <- edit(data.frame())
Sẽ mở 1 cửa sổ nhập trực tiếp, ta nhập các biến cần thiết thuộc frame vào.
- Nhập từ file .txt, dùng lệnh read.table
> data <- read.table('D:/Đường dẫn/solieu.txt ', header=TRUE,
sep= "")
Đọc file solieu.txt rồi gán cho biến data. Nếu file để trong thư mục làm việc thì không
cần chỉ ra đường dẫn.
- Nhập từ file excel (file excel phải save dưới dạng .csv)
> data <- read.csv(‘solieu.csv’, header= FALSE)

1.2. Xử lý dữ liệu

0/ Đưa một data frame vào workspace để xử lý: attach(dataframe)


1/ Tách dữ liệu: Lệnh subset( bien_goc, dieu_kien)
2/ Nhập 2 dataframe thành một: dùng lệnh merge(frame_1, frame_2, by=)
3/ Biến đổi số liệu: từ biến dạng numeric sang biến phân loại, sử dụng các phép toán
logic hoặc dùng lệnh replace( ).
Dùng lệnh factor( ): chuyển từ biến dạng numeric sang nhân tố.
4/ Phân nhóm số liệu, dùng hàm cut2 (trong thư viện Hmisc).
> library(Hmisc)
> cut2(bien_goc, g= so_nhom)

1.3. Xuất dữ liệu

a) Định dạng R (.rda)

Lệnh: save()
VD: save(data frame, file= “data.rda”)

b) Định dạng excel (.xls, xlsx)

- Sao chép 1 vector trong R vào clipboard sau đó dán vào Excel.
writeClipboard(x), trong đó x là 1 vector dạng ký tự (character)
Ví dụ:
writeClipboard(as.character(factor.name))
Ví dụ:
writeClipboard(as.character(numeric.variable))

- Sao chép 1 data frame trong R vào clipboard sau đó dán vào Excel.
write.table(data,"clipboard",sep="\t",col.names=NA)

- Lưu trực tiếp một data frame trong R thành 1 file Excel
Hàm write.xlsx() trong package xlsx có thể được dùng để lưu một data frame R
thành một workbook Excel 2007.
library(xlsx)
write.xlsx(x , outfile , col.Names=TRUE, row.names=TRUE,
sheetName="Sheet 1", append=FALSE)
Ví dụ:
library(xlsx)
write.xlsx(mydata, "mydata.xlsx")
xuất data frame mydata vào một worksheet (Sheet 1 theo mặc định) trong một work-
book Excel được đặt tên là mydata.xlsx trong thư mục làm việc hiện tại. Mặc định, các
tên biến trong dataset được dùng để tạo tiêu đề cột trong spreadsheet (bảng tính) và các
tên hàng được đặt trong cột đầu tiên của bảng tính. Nếu mydata.xlsx đã có, nó sẽ bị
ghi đè. Nếu cần lưu ở một thư mục khác thì cho đường dẫn vào. Ví dụ,
write.xlsx(mydata, "D:/mydata.xlsx") hoặc write.xlsx(mydata,
"D:\\mydata.xlsx")

c) Định dạng text (.txt)

Hàm write.table() dùng để lưu một đối tượng trong R vào 1 file text
write.table(x, outfile , sep=delimiter, quote=TRUE, na="NA")
trong đó
x là đối tượng cần lưu lại
outfile là file chứa đối tượng.
Ví dụ:
write.table(mydata, "mydata.txt", sep=",")
sẽ lưu dataset mydata vào 1 file được phân cách bởi dấu phẩy đặt tên là mydata.txt trong
thứ mực làm việc hiện tại. Chỉ rõ đường dẫn (ví dụ, “d:/myprojects/mydata.txt”)
để lưu file output ở nơi khác. Thay sep="," bằng sep="\t" sẽ lưu dữ liệu trong một
file được phân cách bởi dấu tab. Mặc định, các chuỗi được đặt trong dấu nháy kép (“”) và
các giá trị khuyết được viết là NA.

2. Một số hàm về vec-tơ: cho vec-tơ x

max(x), min(x) : giá trị lớn nhất, bé nhất của x.


sum(x): tổng các giá trị trong x
mean(x): trung bình của x
median(x): trung vị của x
range(x): bằng max(x) – min(x)
var(x): phương sai của x
sort(x): sắp xếp x, mặc định theo thứ tự tăng dần
order(x): trả về các vị trí của x khi đã sắp theo thứ tự tăng dần
quantile(x): tính các phân vị của x
cumsum(x): tổng tích lũy
cumprod(x): tích tích lũy

3. Vẽ đồ thị một số phân phối thông dụng: (nhị thức, poisson, đều, mũ, chuẩn)

Dùng hàm plot( );


Ví dụ: vẽ đồ thị hàm số
y  e x và y  ln( x)
> x <- seq(0,10,0.1)
> y <- exp(x)
> plot(y~x, type='l ')
> y <- log(x)
> plot(y~x, type='l')
Phân phối nhị thức:
> x <- 0:50
> y <- dbinom(x,50,0.25)
> plot(x,y, 'S ') hoặc > plot(x,y, 'h ')
Phân phối chuẩn:
> sample <- rnorm(50)
> hist(sample, prob=T)
> mu <- mean(sample)
> sigma <- sd(sample)
> x <- seq(-4,4,length=500)
> y <- dnorm(x,mu,sigma)
> lines(x,y)

4. Bài tập:

1 Tạo vec-tơ: x =[1,2,5,7,-3,0,5,1,5,6] và y=[2,2,0,-5,7,8,11,9,3,2]


a. Tính x+y, x*y,x-y.
b. Tao z =[Những phần tử chẵn của x], t =[Những phần tử lẻ của y]
c. Trích những phần tử lớn hơn 0 của x và y.
d. Tính trung bình, độ lệch tiêu chuẩn, sai số chuẩn của x và y.
e. Tìm phần tử lớn nhất, bé nhất của x, y.
f. Sắp xếp x tăng dần, y giảm dần.
g. Lưu x và y.

2 Nhập số liệu từ file data01.xls bằng lệnh read.csv( ) (chuyển file .xls -> .csv) gán vào
frame data1. Thực hiện:
a. Tính trung bình, phương sai, trung vị của các biến FPSA và TPSA.
b. Vẽ biểu đồ dạng đường, boxplot cho FPSA và TPSA.
c. Tách những giá trị của biến FPSA có K=0 và K=1.
d. Đọc số liệu từ file data02.csv gán vào frame data2, merge 2 frame này theo biến
K.
e. Tạo biến mới tPSA theo yêu cầu sau: Nếu tuổi <= 30, tPSA=0; nếu 30< tuổi
<=50, tPSA=1; nếu tuổi>50, tPSA =2. Tạo bảng thống kê cho tPSA.

3 Bảng sau là điểm một bài kiểm tra gồm 3 câu hỏi của 10 SV

Sinh viên Câu hỏi 1 Câu hỏi 2 Câu hỏi 3


1 3 5 1
2 3 3 3
3 3 5 1
4 4 5 1
5 3 2 1
6 4 2 3
7 3 5 1
8 4 5 1
9 3 4 1
10 4 2 1
a. Nhập các số liệu sau và gán vào biến tương ứng sử dụng 3 cách: Dùng lệnh c( );
dùng lệnh scan( ); lệnh read.table( ) (Tạo file .txt) , edit(data.frame() ).
b. Tạo bảng kết quả riêng cho câu hỏi 1 và câu hỏi 2.
c. Vẽ biểu đồ bar cho 3 câu hỏi.
d. Vẽ biểu đồ bar dạng nằm ngang cho câu hỏi 2 và 3. (Gợi ý: dùng đối số horiz = T
trong lệnh barplot).

4
a. Tạo ngẫu nhiên 100 giá trị có phân phối nhị thức, với n = 60 và xác suất thành
công mỗi lần 0.4. Vẽ biểu đồ tổ chức tần số.
b. Tạo ngẫu nhiên 100 giá trị có phân phối Poisson với lambda = 4, vẽ biểu đồ tổ
chức tần số.
c. Tạo ngẫu nhiên 100 giá trị có phân phối chuẩn có trung bình là 50 và độ lệch tiêu
chuẩn 4. Vẽ hàm phân phối, hàm mật độ.
d. Tạo ngẫu nhiên 100 giá trị có phân phối mũ với lambda=1/25. Vẽ hàm phân phối,
hàm mật độ.

5 File diesel_engine.dat và diesel_time.xls chứa số liệu về hoạt động của các động cơ
chạy bằng dầu diesel. Thực hiện:
a. Đọc số liệu từ hai file này, gán và hai dataframe, đặt tên hai dataframe cùng tên với
file.
b. Liệt kê tên các biến có trong hai dataframe vừa nhập.
c. Xác định có bao nhiêu dữ liệu bị khuyết (missing data) trong diesel_engine. Thay
thế các giá trị khuyết trong biến speed bằng 1500, biến load bằng 20.
d. Tính: trung bình, phương sai, độ lệch tiêu chuẩn, giá trị lớn nhất, nhỏ nhất của biến
alcohol trong dataframe diesel_engine.
e. Ghép hai dataframe diesel_engine và diesel_time lại thành một frame có tên là
diesel.
f. Trích giá trị của biến run (số thứ tự các động cơ) mà có thời gian trễ (biến delay)
dưới 1.000.
g. Đếm xem có bao nhiêu động cơ có timing bằng 30.
h. Vẽ biểu đồ boxplot cho các biến speed, timing và delay.
i. Vẽ biểu đồ phân tán cho các cặp biến (timing, speed), (temp, press).
j. Chuyển biến load sang biến nhân tố.
k. Chia phạm vi giá trị của biến delay thành 4 đoạn đều nhau và đếm số giá trị nằm
trong các đoạn đó. Tạo bảng thống kê và vẽ biểu đồ cột.
l. Chia phạm vi giá trị của biến delay thành 4 đoạn như sau: (0.283, 0.7], (0.7, 0.95],
(0.95, 1.2], (1.2, 1.56]. Tạo bảng thống kê và vẽ biểu đồ cột.

6 Cho số liệu sau:


year snow.cover
1970 6.5
1971 12.0
1972 14.9
1973 10.0
1974 10.7
1975 7.9
1976 21.9
1977 12.5
1978 14.5
1979 9.2
a. Nhập số liệu trên vào R.
b. Vẽ snow.cover theo year.
c. Vẽ biểu đồ histogram cho snow.cover.
d. Lặp lại câu b. và c. sau khi lấy logarit của biến snow.cover.

7 Cho số liệu sau:


Temperature Erosion Blowby Total
(F) incidents incidents incidents
53 3 2 5
57 1 0 1
63 1 0 1
70 1 0 1
70 1 0 1
75 0 2 1
Nhập số liệu trên vào một dataframe, vẽ đồ thị biểu diễn tổng số incidents theo
temperature.

8 Thống kê số liệu tỉ lệ lạm phát tại 4 nước trong giai đọan 1960-1980 được thu thập
trong 2 bảng số liệu sau (Đvt: %)
Nam US Anh Nam Nhat Duc
1960 1.5 1 1960 3.6 1.5
1961 1.1 3.4 1961 5.4 2.3
1962 1.1 4.5 1962 6.7 4.5
1963 1.2 2.5 1963 7.7 3
1964 1.4 3.9 1964 3.9 2.3
1965 1.6 4.6 1965 6.5 3.4
1966 2.8 3.7 1966 6 3.5
1967 2.8 2.4 1967 4 1.5
1968 4.2 4.8 1968 5.5 18
1969 5 5.2 1969 5.1 2.6
1970 5.9 6.5 1970 7.6 3.7
1971 4.3 9.5 1971 6.3 5.3
1972 3.6 6.8 1972 4.9 5.4
1973 6.2 8.4 1973 12 7
1974 10.9 16 1974 24.6 7
1975 9.2 24.2 1975 11.7 5.9
1976 5.8 16.5 1976 9.3 4.5
1977 6.4 15.9 1977 8.1 3.7
1978 7.6 8.3 1978 3.8 2.7
1979 11.4 13.4 1979 3.6 4.1
1980 13.6 18 1980 8 5.5

a. Nhập dữ liệu trên vào 2 data.frame lamphat1 và lamphat2 trong R bằng 3 cách.
b. Trộn 2 data.frame trên vào 1 data.frame duy nhất là lamphat theo Nam.
c. Đếm số năm các nước US, Anh, Nhật, Đức có tỉ lệ lạm phát trên 5%.
d. Vẽ đồ thị phân tán về tỉ lệ lạm phát cho mỗi quốc gia theo thời gian. Cho nhận xét
tổng quát về lạm phát của 4 nước?
e. Tính trung bình, trung vị, Max, Min, độ lệch chuẩn, sai số chuẩn của từng nước?
f. Để xác định lạm phát nước nào biến thiên nhiều hơn, ta cần dựa vào tham số
thống kê nào? Kết luận?
g. Tạo một data.frame mới lamphat1 với số biến như trong data.frame lamphat
nhưng không chứa dữ liệu của năm 1980.
h. Ta biết rằng hệ số của phương trình hồi quy tuyến tính ̂ ̂ ̂ ̂ được xác
định như sau:
∑ ̅̅
̂
∑ ̅
̂ ̅ ̂ ̅
Xác định các hệ số này trong mô hình hồi quy: lạm phát theo thời gian cho US
bằng cách sử dụng data.frame lamphat1. Vẽ đồ thị phương trình hồi quy này?
i. Sử dụng phương trình hồi quy trong câu h) hãy xác định tỉ lệ lạm phát trong năm
1980 của US. So sánh với số liệu thực tế?
Bài 7.
Ước lượng tham số thống kê

Trong nội dung bài thực hành, chúng ta chỉ xét bài toán ước lượng khoảng (tìm khoảng tin cậy)
cho tỷ lệ và kỳ vọng.

I. Tóm tắt lý thuyết


I.1 Khoảng tin cậy cho trung bình của tổng thể:
- Trung bình tổng thể: 

- Độ lệch chuẩn tổng thể: 


- Trung bình mẫu: x = mean(x)

- Độ lệch chuẩn mẫu: s  s 2 = sd(x)

- Dung sai: 
- Công thức tính dung sai: phụ thuộc vào 3 trường hợp
TH1:  đã biết, tổng thể có phân phối chuẩn (nếu n  30 thì giả thiết tổng thể có phân phối
chuẩn là không còn cần thiết)
TH2:  không biết và n  30 .
TH3:  không biết và n  30 kèm theo tổng thể có phân phối chuẩn (khi cỡ mẫu nhỏ hơn 30 thì
cần tới giả thiết tổng thể có phân phối chuẩn)

 
 z1 /2 , TH1
 n
 s
   z1 /2 , TH2
 n
 n 1 
t1 /2 , TH3
 n

Trong đó, z1 /2 = qnorm(1-alpha/2); t1n1/2 = qt(1-alpha/2, df = n-1)

- Công thức tính khoảng tin cậy:


Khoảng tin cậy = trung bình mẫu  dung sai
I.2 Khoảng tin cậy cho tỷ lệ tổng thể
- Tỷ lệ tổng thể: p

- Tỷ lệ mẫu: p̂

1
pˆ (1  pˆ )
- Dung sai:   z1 /2
n
- Công thức tính khoảng tin cậy:
Khoảng tin cậy = tỷ lệ mẫu  dung sai
I.3 Ý nghĩa của khoảng tin cậy 95% cho tham số cần ước lượng (trung bình / tỷ lệ)
Nếu chúng ta lấy mẫu nhiều lần, mỗi mẫu chúng ta tính 1 khoảng tin cậy thì sẽ có xấp xỉ 95%
khoảng tin cậy chứa tham số cần ước lượng.
Ví dụ: đoạn chương trình sau mô phỏng 50 khoảng tin cậy cho tỷ lệ xuất hiện mặt sấp khi tung
một đồng xu cân đối
> m = 50; n=30; p = .5; alpha = 0.05 # Tung 30 đồng xu cân đối 50 lần
> p.hat = rbinom(m,n,p)/n # Tính tỷ lệ mẫu
> epsilon = qnorm(1-alpha/2)*sqrt(p.hat*(1-p.hat)/n)
# Dung sai
> matplot(rbind(p.hat - epsilon, p.hat + epsilon),
rbind(1:m,1:m),type="l",lty=1,
xlab = "Vi tri cac khoang tin cay",
ylab = "50 khoang tin cay")
# Ve 50 khoang tin cay
> abline(v=p) # Ve duong thang p = 0.5

Chú thích: hàm matplot(x,y,…) ở trên cho phép ta vẽ m đoạn thẳng, đoạn thẳng thứ i có 2
hoành độ ( của điểm đầu và điểm cuối) nằm trong cột i của ma trận x; và có 2 tung độ bằng nhau
là i nằm trong cột i của ma trận y.
Kết quả nhận được:
50
40
50 khoang tin cay

30
20
10
0

0.2 0.4 0.6 0.8

Vi tri cac khoang tin cay

2
II. Bài tập

1. Tạo ngẫu nhiên 35 giá trị của biến ngẫu nhiên có phân phối chuẩn với trung bình bằng
10 và độ lệch chuẩn 5. Tìm khoảng tin cậy 95% cho kỳ vọng của biến ngẫu nhiên chuẩn
dựa vào số liệu vừa tạo.
2. Số liệu thống kê về doanh số bán hàng của một siêu thị cho ở file data31.xls:
a) Đọc dữ liệu từ file data31.xls vào R.
b) Viết hàm ci.mean(x, alpha) xuất ra khoảng tin cậy cho kỳ vọng, với x là vec-tơ
dữ liệu, (1-alpha) là độ tin cậy. Áp dụng để tìm khoảng tin cậy 95% và 99% cho
doanh số bán hàng trung bình ở siêu thị.

3. File data32.xls chứa số liệu về thời gian tự học của 120 sinh viên trường ĐH Khoa học
Tự nhiên.
a. Hãy ước lượng thời gian học nhóm trung bình của sinh viên trường ĐH KHTN, độ
tin cậy là 95%. (Dùng hàm ci.mean(x, alpha))
b. Viết hàm hàm ci.prop(f, n, alpha) xuất ra khoảng tin cậy cho tỷ lệ, với n là cỡ
mẫu; f: số các phần tử thỏa yêu cầu (với tỷ lệ p cần tìm); (1-alpha) là độ tin cậy.
Áp dụng để tìm khoảng tin cậy 90%; 95% và 99% cho tỷ lệ sinh viên có thời gian
tự học trên 5 giờ mỗi ngày.

4. Bảng sau thống kê chiều cao (Đv: m) của 125 thanh niên 18 tuổi trong một khu vực:
Chiều cao [1.2,1.4) [1.4,1.6) [1.6,1.8) [1.8,2.0) [2.0,2.2)
Số thanh niên 6 34 31 42 12

a. Chuyển bảng tần số dạng khoảng ở trên thành dữ liệu dạng véc-tơ cột. Áp dụng
hàm ci.mean đã ở bài 2 để tìm khoảng tin cậy 95% cho chiều cao trung bình của
thanh niên trong khu vực.
b. Những người có chiều cao từ 1.7 m trở lên được xếp vào sức khỏa loại A. Sử dụng
hàm ci.prop ở bài 3 để tìm khoảng tin cậy 95% cho tỷ lệ thanh niên đạt sức khoẻ
loại A.
5. Viết hàm ktc.tb() để tìm khoảng tin cậy cho trung bình biết:
- Input: là trung bình mẫu ̅ , độ lệch chuẩn của tổng thể (có thể biết trước hoặc không),
trường hợp không biết thì phải nhập độ lệch chuẩn của mẫu s, kích thước mẫu n, và
mức ý nghĩa .
- Output: khoảng tin cậy cho trung bình.

3
6. Từ hàm được viết trong câu 5) hãy viết hàm ktc.tb.mau() để tìm khoảng tin cậy cho
trung bình biết:
- Input: vecto dữ liệu mẫu x, độ lệch chuẩn của tổng thể (có thể biết trước hoặc không),
và mức ý nghĩa .
- Output: khoảng tin cậy cho trung bình.
7. Đo đường kính của một chi tiết máy do một máy tiện tự động sản xuất, ta ghi nhận
được số liệu như sau:
X 12.00 12.05 12.10 12.15 12.20 12.25 12.30 12.35 12.40
n 2 3 7 9 10 8 6 5 3
Bằng cách sử dụng hàm ktc.tb.mau() trong câu 6), hãy ước lượng khoảng tin cậy 95% cho
đường kính trung bình.

4
Bài 8.

KIỂM ĐỊNH GIẢ THUYẾT THỐNG KÊ

I. Giới thiệu

1. Định nghĩa một giả thuyết thống kê (statistical hypothesis) là một phát biểu (tuyên bố) về các
tham số của một hay nhiều tổng thể.

Ví dụ: Giả sử ta cần nghiên cứu về thu nhập của người dân thành phố, gọi μ là thu nhập trung
bình, ta cần xác định xem thu nhập trung bình của một người dân có bằng 7 triệu đồng/tháng hay
không? Giả thuyết được phát biểu như sau
H0: μ = 7 triệu/tháng
H1: μ ≠ 7 triệu/tháng
Phát biểu H0: μ = 7 gọi là giả thuyết không (null hypothesis), phát biểu H1: μ ≠ 7 gọi là đối
thuyết (alternative hypothesis). Bài toán kiểm định giả thuyết như trên gọi là kiểm định giả
thuyết hai phía. Trong một số trường hợp, ta có bài toán kiểm định giả thuyết một phía, chẳng
hạn như

H0 :   7 H0 :   7
 hoặc 
 H1 :   7  H1 :   7

Tổng quát, xét biến ngẫu nhiên X có phân phối F  x;  , tham số  chưa biết. Với một giá trị
 0 cho trước, bài toán kiểm định giả thuyết cho tham số  gồm các dạng sau

 H 0 :   0  H 0 :   0  H 0 :   0
  
 H1 :    0  H1 :    0  H1 :    0

2. Các loại sai lầm trong kiểm định giả thuyết


Sai lầm loại I: Nếu ta bác bỏ H0 khi H0 đúng thì sai lầm đó gọi là sai lầm loại I, ký hiệu α. α còn
được gọi là mức ý nghĩa (significance level) của kiểm định.
Sai lầm loại II: Nếu H0 sai mà ta không bác bỏ H0 thì sai lầm đó gọi là sai lầm loại II, ký hiệu β.

Quyết định H0 đúng H0 sai

Không bác bỏ H0 Đúng Sai lầm loại II

Bác bỏ H0 Sai lầm loại I Đúng

1
3. P – giá trị (P – value) Với một giả thuyết không H0 và mẫu cỡ n cho trước, P – giá trị là mức
ý nghĩa nhỏ nhất dẫn đến việc bác bỏ giả thuyết H0, P – giá trị được tính dựa theo giá trị thống kê
kiểm định.
II. Kiểm định giả thuyết cho kỳ vọng
(Trong thực hành, ta chỉ xét trường hợp không biết phương sai)
Giả thuyết: mẫu ngẫu nhiên X1 , X 2 ,, X n được chọn từ tổng thể có phân phối chuẩn (hoặc xấp
xỉ chuẩn tức phân phối có dạng đối xứng) với kỳ vọng  và phương sai  2 .

   0

Giả thuyết: H 0 :   0 Đối thuyết: H1 :    0 (Một trong 3 trường hợp)
  
 0

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

X  0
T0 
s n
Miền bác bỏ:
Với H1 :   0 bác bỏ H0 nếu T0  t1n1/2 hoặc T0  t1n1/ 2
Với H1 :   0 bác bỏ H0 nếu T0  t1n1
Với H1 :   0 bác bỏ H0 nếu T0  t1n1

n ( X  0 ) / s

Miền bác bỏ trong trường hợp kiểm định giả thuyết hai phía

Trong R, để tìm phân vị t1n1/ 2 sử dụng hàm qt(1-alpha/2,n-1).

2
Trong kết quả do R xuất ra, ta xác định có bác bỏ H 0 hay không thông qua P – giá trị:

Quy tắc: Khi P – giá trị bé hơn α, bác bỏ H0.

Khi cỡ mẫu n lớn, phân phối của thống kê T0 sẽ trở thành phân phối chuẩn hoá N(0,1), khi đó
giá trị tiêu chuẩn dùng để so sánh là z1 / 2 (dùng qnorm(1-alpha/2) ) .

Bảng tính p – giá trị:

Giả thuyết H0 Đối thuyết H1 Thống kê T0 P – giá trị

  0   0 2P{Tn1  | T0 |}
X  0
  0   0 n P{Tn1  T0 }
s
  0   0 P{Tn1  T0 }

( Tn 1 là biến ngẫu nhiên có phân phối Student với n – 1 bậc tự do)

Trong R, để tính P Tn1  t0  sử dụng hàm pt(t0, n – 1); nếu muốn tính P Tn1  t0  , sử
dụng pt(t0, n – 1, lower.tail = FALSE).

Sử dụng hàm t.test để kiểm định

t.test(x,alternative = c("two.sided", "less", "greater"),


mu = mu_0, conf.level = 0.95)

Trong đó:
- x : véc-tơ dữ liệu
- alternative : xác định kiểm định là hai phía (“two.sided”), bên trái (“less”)
hay bên phải (“greater”), mặc định là two.sided.
- mu = mu_0 : giá trị cần kiểm định
- conf.level : xuất ra khoảng tin cậy với độ tin cậy tương ứng
Ví dụ: Biến heights chứa chiều cao của 125 thanh niên trong một khu vực (để mở heights, load
tập tin “heights.rda”). Hãy kiểm định chiều cao của thanh niên trong khu vực có bằng 160 cm
hay không, với mức ý nghĩa 5%? Đồng thời xác định khoảng tin cậy 95% cho chiều cao trung
bình thanh niên trong khu vực này.
> load('heights.rda')
> summary(heights)
Min. 1st Qu. Median Mean 3rd Qu. Max.
129.3 156.2 163.4 162.8 169.6 209.3
> hist(heights)

3
Histogram of heights

40
30
Frequency

20
10
0
120 140 160 180 200

heights

> t.test(heights,mu = 160, conf.level=0.95)


One Sample t-test

data: heights
t = 2.6175, df = 124, p-value = 0.009959
alternative hypothesis: true mean is not equal to 160
95 percent confidence interval:
160.6941 164.9990
sample estimates:
mean of x
162.8465

Dùng lệnh hist để vẽ đồ thị histogram cho dữ liệu để kiểm tra phân phối của dữ liệu, cho nhận
xét?
Lệnh t.test cho các kết quả sau:
Thống kê kiểm định t = 2.6175, bậc tự do n – 1 = 124, p – value = 0.00996.
Khoảng tin cậy 95%: 160.6941 ≤ μ ≤ 164.9990
Với mức ý nghĩa 5%, ta thấy p – value < 0.05, do đó bác bỏ H0 tức là chiều cao trung bình của
thanh niên trong khu vực khác 160 cm.
Nếu sử dụng giá trị thống kê t = 2.6175, ta so sánh với t1n1/ 2  t0.975
124
 z0.975  1.96 (dùng lệnh
qt(0.975,124) hoặc qnorm(0.975)), ta cũng có kết luận tương tự.
Cho nhận xét: có thể sử dụng khoảng tin cậy 95% để xác định có bác bỏ giả thuyết H0 hay không
tại mức ý nghĩa 5%?
Chú ý:

4
Trong ví dụ trên, nếu ta đặt:
> result <- t.test(heights,mu = 162, conf.level=0.95)
thì ta có thể rút ra thống kê kiểm định t bằng lệnh result$statistic (hoặc
result[['statistic']] hoặc unname(result[['statistic']])):
Danh sách đầy đủ tên các đối tượng trả về:
> names(result)
[1] "statistic" "parameter" "p.value" "conf.int" "estimate"
[6] "null.value" "alternative" "method" "data.name"

III. Kiểm định giả thuyết cho tỷ lệ


Giả sử cần kiểm định tỷ lệ phầ ntử thoả tính chất A trong tổng thể. Khảo sát một mẫu cỡ n gồm n
biến ngẫu nhiên Y1 , Y2 ,, Yn với
1 , neáu thoaû A
Yi  
0 , neáu khoâng thoaû A
n
Gọi: Y   Yi là tổng số phần tử thoả tính chất A trong n phần tử khảo sát, suy ra tỷ lệ mẫu
i 1

Y
Pˆ 
n
Giả thuyết: cỡ mẫu khảo sát n phải tương đối lớn.
 p  p0

Giả thuyết: H 0 : p  p0 Đối thuyết: H1 :  p  p0 (Một trong 3 trường hợp)
p  p
 0

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

Pˆ  p0
Z0 
p0 (1  p0 )
n
Miền bác bỏ:
Với H1 : p  p0 bác bỏ H0 nếu Z0   z1 /2 hoặc Z0  z1 /2
Với H1 : p  p0 bác bỏ H0 nếu Z0   z1
Với H1 : p  p0 bác bỏ H0 nếu Z0  z1

Để tìm z1 / 2 , sử dụng hàm qnorm(1-alpha/2).


Sử dụng hàm prop.test để kiểm định:
prop.test(y, n, p = p0,
alternative = c("two.sided", "less", "greater"),

5
conf.level = 0.95)

Các tham số:


- y : số phần tử thoả tính chất A trong n phần tử khảo sát
- n : cỡ mẫu
- alternative : xác định kiểm định là hai phía (“two.sided”), bên trái (“less”)
hay bên phải (“greater”)
- p = p0 : giá trị cần kiểm định
- conf.level : xuất ra khoảng tin cậy với độ tin cậy tương ứng

Ví dụ: Trong một cuộc bầu cử thị trưởng tại một thành phố, ứng cử viên A tin rằng có trên 50%
người dân thành phố ủng hộ ông ta. Để kiểm định điều này, các chuyên gia thống kê chọn ngẫu
nhiên 800 người dân trong thành phố, thấy có 448 người dân cho ý kiến ủng hộ ông A. Hãy xét
xem tuyên bố của ông A về tỷ lệ cử tri có đúng không với mức ý nghĩa 1%.
Ta có:
- Cỡ mẫu kháo sát n = 800.
- Số người dân ủng hộ ông A y = 448.
 H 0 : p  0.5
- Giả thuyết cần kiểm tra 
 H1 : p  0.5
Trong đó: p là tỷ lệ người dân thành phố ủng hộ ông A.

Sử dụng hàm prop.test:


> n = 800; y = 448
> prop.test(y,n,p=0.5,alternative="greater",conf.level=0.99)
1-sample proportions test with continuity correction

data: y out of n, null probability 0.5


X-squared = 11.2812, df = 1, p-value = 0.0003915
alternative hypothesis: true p is greater than 0.5
99 percent confidence interval:
0.5182781 1.0000000
sample estimates:
p
0.56

- Kết quả cho biết p – giá trị = 0.0003915 < 1% dẫn đến bác bỏ giả thuyết H0, ta kết luận
rằng tỷ lệ người dân ủng hộ ông A trong thành phố trên 50%.
- Khoảng tin cậy 99% cho tỷ lệ p là: 0.5182 ≤ p ≤ 1.0000.
Trong trường hợp kiểm định 1 mẫu, hàm binom.test cũng cho kết quả tương tự
> binom.test(y,n,p=0.5,alternative="greater",conf.level=0.99)

6
Exact binomial test

data: y and n
number of successes = 448, number of trials = 800, p-value = 0.0003864
alternative hypothesis: true probability of success is greater than
0.5
99 percent confidence interval:
0.5183309 1.0000000
sample estimates:
probability of success
0.56

Bảng tính p – giá trị:

Giả thuyết H0 Đối thuyết H1 Thống kê Z0 P – giá trị


p  p0 p  p0 2 min   Z0  ,1    Z0 
Pˆ  p0
p  p0 p  p0 n 1    Z0 
p0 1  p0 
p  p0 p  p0   Z0 

Với   Z0   P Z  Z0  : hàm Laplace – hàm phân phối của biến ngẫu nhiên chuẩn hoá N(0,1).

Trong R,   Z 0  = pnorm(Z0).

Bài tập
1. Số liệu thống kê về doanh số bán hàng của một siêu thị cho ở file profit.csv:

a) Vẽ đồ thị histogram cho dữ liệu, có nhận xét gì về phân phối của dữ liệu.

b) Những ngày có doanh số bán trên 65 triệu đồng là những ngày bán đắt hàng. Hãy ước
lượng doanh số bán trung bình của một ngày “bán đắt hàng” ở siêu thị này với độ tin cậy
99% (giả thuyết doanh số bán của những ngày bán đắt hàng là đại lượng ngẫu nhiên phân
phối theo quy luật chuẩn).

c) Trước đây doanh số bán trung bình của siêu thị là 60 triệu đồng/ngày. Số liệu của bảng
trên được thu thập sau khi siêu thị áp dụng một phương thức bán hàng mới. Hãy cho nhận
xét về phương thức bán hàng mới với mức ý nghĩa là 1%.

2. Sau một đợt bồi dưỡng sư phạm, người ta kiểm tra ngẫu nhiên 70 học viên. Kết quả cho bởi
bảng sau (thang điểm là 10):
Điểm (xi) 5 6 7 8 9 10
Tần số (ni) 5 10 15 20 12 8

7
Giả sử điểm số của các học viên tuân theo phân phối chuẩn. Có ý kiến cho rằng điểm số trung
bình là 8. Hãy kiểm tra ý kiến trên ở mức α = 5%.

a) Chỉ ra cách biến đổi số liệu của X để sử dụng được hàm t.test. Vẽ biểu đồ stem & leaf
cho số liệu đã biến đổi.
b) Viết hàm test.geq.oneside(x, 0 , alpha) để kiểm định giả thuyết H 0 :   0 và đối thuyết
H1 :   0 . Xuất ra kết luận và p - giá trị. Áp dụng để kiểm định H1 :   8 . (Lưu ý:
không gọi hàm t.test)
c) Viết hàm test.leq.oneside(x, 0 , alpha) để kiểm định giả thuyết H 0 :   0 và đối thuyết
H1 :   0 . Xuất ra thông báo và p - giá trị. Áp dụng để kiểm định H1 :   8 . (Lưu ý:
không gọi hàm t.test)
3. Sử dụng số liệu trong file teen-birth-rate-2002.txt để tạo bảng sau (xuất ra màn hình)
Bang: Ty le sinh tre em duoi gia thiet phan phoi chuan

X S n Z p
Black 76.14 15.60 44 4.79 0
Hispanic 88.96 23.66 48 7.05 0
White 32.51 11.71 51 -19.74 0
Trong đó: X , s, n lần lượt là trung bình mẫu, độ lệch tiêu chuẩn của mẫu và cỡ mẫu của các biến
tương ứng; Z   X  0  n / s với 0 là trung bình tổng cộng của ba biến Black, Hispanic và
White; p là p - giá trị tương tứng với từng thống kê Z.

4. Hội đồng khoa học Trường ĐH Khoa học Tự nhiên muốn thay đổi đánh giá học lực của sinh
viên từ thang điểm 10 sang thang điểm 4. HĐ Khoa học quyết định khảo sát ý kiến các giảg viên
trong trường trước khi ra quyết định. Nếu như tỷ lệ giảng viên đồng ý với sự thay đổi trên 60%
thì việc thay đổi thang điểm sẽ được thực hiện. Khảo sát ngẫu nhiên 80 giảng viên trong trường,
gọi p là tỷ lệ giảng viên đồng ý với sự thay đổi.

a) Hãy chọn 1 cặp giả thuyết/ đối thuyết thích hợp với yêu cầu kiểm định của bài toán:
(1) H 0 : p  0.6 và H1 : p  0.6

(2) H 0 : p  0.6 và H1 : p  0.6

Giải thích sự lựa chọn.

b) Biến survey có trong tập tin data04.rda chứa kết quả khảo sát ý kiến của 80 giảng viên (0:
không đồng ý, 1: đồng ý). Theo kết quả khảo sát, HĐ Khoa học có nên thay đổi thang
điểm hay không? Mức ý nghĩa 5%.

8
5. Tại một đợt khám sức khỏe của trẻ em ở nhà trẻ, người ta khám ngẫu nhiên 100 cháu thấy có
20 cháu có hiện tượng còi xương do suy dinh dưỡng. Gọi p là xác suất để bắt gặp 1 trẻ mắc bệnh
còi xương. Hãy kiểm định giả thuyết H0: p = 0,15 và đối thuyết H1: p ≠ 0,15 ở mức α = 5%.

6. File times.csv chứa thời gian tự học mỗi ngày của sinh viên hai trường Khoa học Tự nhiên và
Kinh tế.
a) Có ý kiến cho rằng tỷ lệ sinh viên có thời gian tự học trên 5 giờ mỗi ngày của sinh viên
trường Khoa học Tự nhiên là 50%. Với mức ý nghĩa 5%, hãy kiểm tra ý kiến này.
b) Viết hàm proptest.geq(f, n, p0, alpha) để kiểm định giả thuyết H 0 : p  p0 và đối thuyết
H1 : p  p0 trong đó f là số phần tử thoả tính chất quan tâm trong n phần tử khảo sát.
Xuất ra kết quả và giá trị P. Áp dụng cho câu a. với đối thuyết H1: p > 0.5. (Lưu ý: không
gọi hàm prop.test hay binom.test)
c) Viết hàm proptest.leq(f, n, p0, alpha) để kiểm định giả thuyết H 0 : p  p0 và đối thuyết
H1 : p  p0 . Xuất ra kết quả và giá trị P. Áp dụng cho câu a. với đối thuyết H1: p < 0.5.
(Lưu ý: không gọi hàm prop.test hay binom.test)
7. Hãy viết hàm test.mean( …) với tính năng tương tự hàm t.test trong R: thực hiện
kiểm định hai phía, một phía (bên trái, bên phải) cho kỳ vọng; xuất ra thông báo, giá trị trả về
gồm trung bình mẫu của dữ liệu vào, p – giá trị. (Tham khảo hàm zpfunction(…) sau để làm
mẫu)

zp <- function(y , n , p0, alpha = 0.05 ,HA = c('neq', 'greater' ,


'smaller')){

#Compute sample proportion


p.hat <- y / n ;
#Compute Standard Eror (SE)
se <- sqrt(p0 * (1 - p0) / n)
#Compute test statistic
Z0 <- (p.hat - p0) / se
#Compute critical value
critical.z <- qnorm(1 - alpha/2)
HO <- ifelse(abs(Z0) > critical.z , 'Reject' ,'Do not reject')
HA <-match.arg(HA)
if (HA == 'smaller') {
critical.z <- qnorm(alpha)
HO <- ifelse(Z0 < critical.z , 'Reject' ,'Do not reject')
}
if (HA == 'greater') {
critical.z <- qnorm(1 - alpha)
HO <- ifelse(Z0 > critical.z , 'Reject' ,'Do not reject')
}
results <- list(Z0 , critical.z , alpha , HO)
names(results) <- c('Z' , 'critical.z' , 'alpha' , 'HO')

9
class(results) <- 'table'
print(results)
}

8. Ký hiệu X ~ N ( ,  2 ) chỉ X là biến ngẫu nhiên có phân phối chuẩn với kỳ vọng  và
phương sai  2 ; Y ~ B(n, p) chỉ Y là biến ngẫu nhiên có phân phối nhị thức với tham số n và p
(xác suất thành công). Hãy tính p – giá trị trong các trường hợp sau và cho biết chúng có ý nghĩa
hay không?
1) X  1.96, X ~ N (0,1) , kiểm định hai phía.
2) X  1.96, X ~ N (0,1) , kiểm định một phía bên trái.
3) X  1.96, X ~ N (0,1) , kiểm định một phía bên phải.
4) X  1.7, X ~ N (0,1) , kiểm định hai phía.
5) X  1.7, X ~ N (0,1) , kiểm định một phía bên trái.
6) X  1.7, X ~ N (0,1) , kiểm định một phía bên phải.
7) Y  18, Y ~ B(50,0.5) , kiểm định hai phía.
8) Y  18, Y ~ B(50,0.5) , kiểm định một phía bên trái.
9) Y  18, Y ~ B(50,0.5) , kiểm định một phía bên phải.

10
Bài 9.
Kiểm định giả thuyết thống kê
(Trường hợp hai mẫu)

I. So sánh kỳ vọng giữa hai tổng thể độc lập:


Giả sử  X1 , X 2 ,, X n  (mẫu 1) là mẫu ngẫu nhiên chọn từ một tổng thể có phân phối chuẩn với
kỳ vọng là  X và phương sai là  X2 và Y1 , Y2 ,, Ym  (mẫu 2) là mẫu ngẫu nhiên độc lập chọn
từ một tổng thể có phân phối chuẩn với kỳ vọng là Y và phương sai  Y2 . Trong phần thực
hành, ta giả sử  X2 và  Y2 không biết.

Các giả thuyết:


 H 0 :  X  Y
 Một phía – bên trái: 
 H1 :  X  Y
 H 0 :  X  Y
 Một phía – bên phải: 
 H1 :  X  Y
 H 0 :  X  Y
 Hai phía: 
 H1 :  X  Y
Trường hợp  X2   Y2   2 : giả sử phương sai của hai tổng thể bằng nhau.
Sử dụng phương sai mẫu chung S P2 ,

S 2

 n  1 S X2   m  1 SY2
(1)
nm2
P

Thống kê kiểm định,


X Y
T0  (2)
1 1
SP 
n m
T0 có phân phối Student với n + m – 2 bậc tự do.

Với X , S X và Y , SY lần lượt là trung bình mẫu và độ lệch tiêu chuẩn mẫu tương tứng với mẫu 1
và mẫu 2.

1
Kết luận:
Giả thuyết H0 Đối thuyết H1 Miền bác bỏ với mức P – giá trị
ý nghĩa 𝛂
 X  Y  X  Y T0  t1nm/22 2P{Tn m2  | T0 |}
 X  Y  X  Y T0  t1nm2 P{Tn m2  T0 }
 X  Y  X  Y T0  t1nm2 P{Tn m2  T0 }
Bảng 1
Trường hợp  X2   Y2 : trong một số trường hợp, ta không thể giả sử các phương sai không biết
 X2 và  Y2 bằng nhau. Khi đó thống kê kiểm định:
X Y
T0*  (3)
S X2 SY2

n m
T0 có phân phối Student với bậc tự do df được xác định bởi
2
 S X2 SY2 
  
df   n m
(4)
 S X2 / n    SY2 / m 
2 2

n 1 m 1
Thay thế T0 trong bảng 1 bởi T0* ta thu được các kết luận tương ứng.

Chú ý, nếu biết  X2 và  Y2 thì công thức (3) trở thành

̅ ̅
(5)

Thống kê Z ~ N(0,1), khi đó thay thế các giá trị thống kê và phân vị trong bảng 1 bằng thống kê
Z và phân vị z1 / 2 hoặc z1 tương ứng.

Thực hành trong R:


Sử dụng hàm t.test
t.test(x, y, alternative = c("two.sided", "less", "greater"),
var.equal = FALSE, conf.level = 0.95)

Trong đó
 x, y : véc-tơ dữ liệu tương ứng với hai mẫu
 alternative: đối thuyết (hai phía – “two.sided”, bên trái – “less”, bên phải – “greater”)

2
 var.equal: giá trị mặc định là FALSE nghĩa là phương sai khác nhau
 conf.level: độ tin cậy của khoảng tin cậy cho  X  Y , mặc định là 95%
Nếu như hai mẫu  x1 ,, xn  và ( y1 ,, ym ) được chứa trong cùng 1 biến, chẳng hạn data và
được phân biệt bởi 1 biến chia nhóm, group. Ta sử dụng hàm t.test với cú pháp sau
t.test(data ~ group, alternative = c("two.sided", "less", "greater"),
var.equal = FALSE, conf.level = 0.95)

Ví dụ 1:
File scores.rda chứa điểm thi giữa kỳ và cuối kỳ của môn Thống kê (Thang điểm: 100)
> load('scores.rda')
> scores
$midterm
[1] 66 78 62 99 80 63 82 86 84 70 98 81 66 42 92 74 75 89 87 84 89 87 76 45
84
$final
[1] 79 78 65 75 84 94 79 84 79 66 76 76 79 91 88 78 77 87 86 73 73 84 88 79

Hỏi: điểm trung bình giữa kỳ và cuối kỳ có bằng nhau hay không với α = 0.05?
> alpha <-0.05
> (var.equal <- var.test(scores$midterm, scores$final))
F test to compare two variances
data: scores$midterm and scores$final
F = 3.9807, num df = 24, denom df = 23, p-value = 0.001486

Sử dụng hàm var.test để kiểm tra xem phương sai hai tổng thể có bằng nhau hay không? p giá trị
= 0.001486 suy ra phương sai khác nhau.
> t.test(scores$midterm, scores$final, var.equal=FALSE)
Welch Two Sample t-test
data: scores$midterm and scores$final
t = -0.7354, df = 35.656, p-value = 0.4669
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-8.858370 4.145037
sample estimates:
mean of x mean of y
77.56000 79.91667

3
p giá trị = 0.4669 > 0.05, ta kết luận rằng điểm thi giữa kỳ không khác với điểm thi cuối kỳ với
mức ý nghĩa   0.05 .
Biểu đồ Boxplot cho midterm và final:
> boxplot(scores)

II. So sánh theo cặp:


Giả sử  X1 , X 2 ,, X n  và Y1 , Y2 ,, Yn  là hai mẫu có cùng cỡ được chọn từ cùng một tổng thể
có phân phối chuẩn với kỳ vọng lần lượt là  X và Y ; như vậy, sẽ có một mối liên hệ giữa các
giá trị X i và Yi . Do đó, các cặp giá trị  X i , Yi  , i  1,, n sẽ không độc lập. Do đó, ta sử dụng
phương pháp kiểm định theo cặp để kiểm tra các giả thuyết liên quan đến  X và Y . Thông
thường, đối với bài toán so sánh theo cặp, ta sẽ ghi nhận hai giá trị trên mỗi phần tử của mẫu tại
hai thời điểm khác nhau, chẳng hạn như trước và sau khi áp dụng một phương pháp nghiên cứu
trên các phần tử đó. Ví dụ: đo lượng cholesterol ở những người béo phì trước và sau khi cho họ
áp dụng các bài tập thể dục và chế độ ăn kiêng; đo nhịp tim ở của những người tham gia thí
nghiệm trước và sau khi cho họ uống cà-fê để so sánh tác dụng của chất caffein trong cà-fê, …
Với  X1 , Y1  ,  X 2 , Y2  ,,  X n , Yn  là n cặp quan trắc, đặt
Di  X i  Yi , i  1,, n (5)

Biến ngẫu nhiên Di giả sử có phân phối chuẩn với kỳ vọng là

4
 D = E  Di   E  X i  Yi   E  X i   E Yi    X  Y
và phương sai  D2 .
Các giả thuyết:
 H 0 : D  0  H 0 : D  0  H 0 : D  0
  
 H1 :  D  0  H1 :  D  0  H1 :  D  0
Thống kê kiểm định:
D
T0 
SD n
có phân phối Student với n – 1 bậc tự do.

1 n 1 n
   Di  D 
2
Trong đó: D  Di và S D2 
n i 1 n  1 i 1

Kết luận:
Giả thuyết H0 Đối thuyết H1 Miền bác bỏ với mức P – giá trị
ý nghĩa 𝛂
D  0 D  0 T0  t1n1/ 2 2P{Tn1  | T0 |}
D  0 D  0 T0  t1n1 P{Tn1  T0 }
D  0 D  0 T0  t n 1
1
P{Tn1  T0 }
Bảng 2
Thực hành trong R:
Sử dụng hàm t.test
t.test(x, y, alternative = c("two.sided", "less", "greater"),
paired = TRUE, conf.level=0.95)
hoặc
t.test(x ~ group, alternative = c("two.sided", "less", "greater"),
paired = TRUE, conf.level=0.95)

Tương tự như trường hợp hai mẫu độc lập, sử dụng paired = TRUE.

Ví dụ 2:
File cholesterol.txt chứa hàm lượng cholesterol trong máu đo trên 15 người đàn ông béo
phì từ ở độ tuổi 35 – 50. Những người tham gia thử nghiệm sẽ thực hiện 1 chế độ ăn kiêng và tập
thể dục trong vòng 3 tháng. Bác sĩ sẽ đo hàm lượng cholesterol trong máu mỗi người trước và

5
sau khi thử nghiệm. Với mức ý nghĩa 5%, chế độ ăn kiêng và tập thể dục có hiệu quả trong việc
giảm hàm lượng cholesterol trong máu những người béo phì này không?

> cholesterol = read.table('cholesterol.txt',header=T)


> cholesterol
> boxplot(cholesterol[2:3])

> attach(cholesterol)
> v.equal <- var.test(Before,After,data=cholesterol)
F test to compare two variances
data: Before and After
F = 5.6691, num df = 14, denom df = 14, p-value = 0.002529

p giá trị bằng 0.002529, suy ra phương sai khác nhau.

> p.v.equal <- v.equal$p.value


> alpha <- 0.05
> v.equal <- ifelse(p.v.equal <= alpha, FALSE, TRUE)
> t.test(Before,After, paired=TRUE, var.equal = v.equal,
alternative = ‘greater’, data=cholesterol)

6
Paired t-test

data: Before and After


t = 5.4659, df = 14, p-value = 4.158e-05
alternative hypothesis: true difference in means is greater than 0
95 percent confidence interval:
18.20922 Inf
sample estimates:
mean of the differences
26.86667

p giá trị < 0.05 và dựa vào đồ thị boxplot ta kết luận rằng với mức ý nghĩa 5%, chế độ ăn kiêng
và tập thể dục có hiệu quả trong việc giảm hàm lượng cholesterol trong máu của những người
đàn ông béo phì.
III. So sánh 2 tỷ lệ:
Gọi và lần lượt là tỷ lệ của các phần tử thoả một tính chất quan tâm tương ứng với
hai tổng thể. Từ hai tổng thể chọn ra hai mẫu độc lập với cỡ mẫu lần lượt là và (
và lớn).

 H 0 : p1  p2  H 0 : p1  p2
Ta cần kiểm định các giả thuyết sau:   với mức ý nghĩa
 H1 : p1  p2  H1 : p1  p2

Gọi và là số phần tử thoả tính chất quan tâm trong hai mẫu độc lập được chọn từ
hai tổng thể.
Y1 Y Y Y
Các tỷ lệ mẫu: pˆ1  ; pˆ 2  2 ; pˆ  1 2
n1 n2 n1  n2

pˆ1  pˆ 2
Tính thống kê kiểm định: Z 0 
1 1
pˆ 1  pˆ    
 n1 n2 

Kết luận:
Giả thuyết H0 Đối thuyết H1 Miền bác bỏ với P – giá trị
mức ý nghĩa 𝛂
p1  p2 p1  p2 Z0  z1 /2 2P{Z  Z0 }

7
p1  p2 p1  p2 Z0  z1 P{Z  Z0 }
Bảng 3

Thực hành trong R:


Sử dụng hàm prop.test
prop.test(y, n, alternative = c("two.sided", "less", "greater"),
conf.level = 0.95, correct = TRUE)

Trong đó:
: Số phần tử thoả tính chất quan tâm tương ứng với mẫu 1 và 2.
: cỡ mẫu 1 và 2.

Ví dụ 3:
Trong một nhà máy sản xuất linh kiện điện tử, các kỹ sư thử nghiệm một phương pháp
sản mới trong sản xuất vi mạch. Các kỹ sư cho rằng phương pháp mới hiệu quả hơn
phương pháp cũ trong việc làm giảm tỷ lệ vi mạch hỏng. Để kiểm tra, 320 vi mạch được
sản xuất theo phương pháp mới và 360 vi mạch được sản xuất theo phương pháp cũ.
Kết quả cho thấy trong 320 vi mạch có 76 vi mạch hỏng và trong 360 vi mạch sản xuất
theo phương pháp cũ có 94 vi mạch hỏng. Với mức ý nghĩa 5% và dựa vào dữ liệu mẫu,
có thể cho rằng phương pháp mới làm giảm tỷ lệ vi mạch hỏng hay không?
Gọi
: tỷ lệ vi mạch hỏng khi sản xuất theo phương pháp cũ
: tỷ lệ vi mạch hỏng khi sản xuất theo phương pháp mới
 H 0 : p1  p2
Ta cần kiểm định giả thuyết 
 H1 : p1  p2

> y = c(94,76)
> n = c(360,320)
> prop.test(y,n,alternative = 'greater')
2-sample test for equality of proportions with
continuity correction
data: y out of n
X-squared = 0.3856, df = 1, p-value = 0.2673
alternative hypothesis: greater
95 percent confidence interval:

8
-0.03393952 1.00000000
sample estimates:
prop 1 prop 2
0.2611111 0.2375000
P - giá trị = 0.2673 > 0.05 => không có đủ cơ sở để bác bỏ giả thuyết , chưa đủ bằng
chứng để kết luận rằng phương pháp mới có hiệu quả hơn phương pháp cũ

BÀI TẬP

1. Hai máy máy rót sữa tự động được sử dụng để đưa sữa vào hộp giấy có dung tích 1 lít trong
một dây chuyền sản xuất. Lượng sữa thực tế hai máy đưa vào hộp có phân phối chuẩn với độ
lệch tiêu chuẩn lần lượt là 0.002 và 0.0025 lít. Một thành viên trong số các kỹ sư giám sát dây
chuyền cho rằng thể tích tích sữa trung bình được hai máy đưa vào các hộp là như nhau và không
phụ thuộc vào dung tích của các hộp chứa. Một mẫu ngẫu nhiên được lấy từ hai máy này được
cho trong file volume.csv.

a) Bạn có cho rằng phán đoán của kỹ sư trên là đúng hay không? Sử dụng   0.05 .
b) P-giá trị của kiểm định trên là bao nhiêu?
c) Hãy tìm khoảng tin cậy 95% cho sự khác biệt về trung bình lượng sữa hai máy đưa vào
các hộp.
d) Viết hàm test.leq.oneside(x, y, 0 , 1 ,  2 ,  ) để kiểm định giả thiết H 0 :   0 và đối
thuyết H1 :   0 trong đó   1  2 với 1 , 2 lần lượt là thể tích sữa trung bình hai
máy 1 và 2 đưa vào các hộp; x, y là hai vector dữ liệu chứa thể tích sữa do máy số 1 và
máy số 2 đưa vào các hộp giấy;  là mức ý nghĩa. Hàm xuất ra kết quả chấp nhận hoặc
bác bỏ và cho biết P-giá trị.
e) Viết hàm test.geq.oneside(x, y, 0 ,  1 ,  2 ) để kiểm định giả thiết H 0 :   0 và đối
thuyết H1 :   0 với các ký hiệu và yêu cầu như ở câu trên.
2. Đường kính (mm) của các thanh thép được sản xuất bởi hai máy cán thép tại một nhà máy
được đem ra so sánh. Hai mẫu ngẫu nhiên về đường kính của các thanh thép được sản xuất bởi
hai máy này được thu thập và tổng hợp trong file diameter.csv. Giả sử rằng đường kính của các
thanh thép được cán bởi hai máy này có phân phối chuẩn với phương sai bằng nhau.

a) Hỏi có bằng chứng ủng hộ giả thiết hai máy cho ra các thanh thép với đường kính khác
nhau hay không? Hãy kiểm tra và đưa ra kết luận với mức ý nghĩa   0.05 .
b) Hãy tìm P-giát trị cho thống kê bạn tính ở câu vừa rồi.
c) Hãy ước lượng sự sai biệt về đường kính trung bình của các thanh thép do hai máy này
sản xuất với độ tin cậy 95%.

9
d) Viết hàm test.leq.oneside(x, y, 0 ,  ) để kiểm định giả thiết H 0 :   0 và đối thuyết
H1 :   0 trong đó   1  2 với 1 , 2 lần lượt là đường kính trung bình của các thanh
thép do máy số 1 và máy số 2 sản xuất ra; x, y là hai vector dữ liệu chứa đường kính của
các thanh thép do máy số 1 và máy số 2 sản xuất ra;  là mức ý nghĩa. Hàm xuất ra kết
quả chấp nhận hoặc bác bỏ và cho biết P-giá trị.
e) Viết hàm test.geq.oneside(x, y, 0 ,  ) để kiểm định giả thiết H 0 :   0 và đối thuyết
H1 :   0 với các ký hiệu và yêu cầu như ở câu trên.
3. Một hãng công nghệ (G) sản xuất hệ điều hành (HĐH) cho máy tính công bố rằng tốc độ khởi
động của HĐH mới của họ cho thời gian khởi động nhanh gấp đôi HĐH mới nhất của hãng đối
thủ (M). Một mẫu khảo sát gồm 250 laptop cùng cấu hình, trong đó 100 laptop được cài HĐH
của hãng (G) và 150 laptop còn lại được cài HĐH của hãng đối thủ (M). Kết quả được ghi lại
trong file “tg.khoidong.csv”. Giả sử độ lệch chuẩn về thởi gian khởi động HĐH của hãng (G) và
(M) lần lượt là (s) và (s). Hỏi công bố về thời gian khởi động của hãng (G) có
phù hợp với số liệu thu thập được? Với mức ý nghĩa 5\%.

4. Hai mươi người nam với độ tuổi từ 35 đến 50 tham gia vào một nghiên cứu để đánh giá sự ảnh
hưởng của chế độ ăn uống và luyện tập thể thao lên hàm lượng cholesterol trong máu. Mỗi người
tham gia được đo lượng cholesterol trước khi bắt đầu chương trình tập luyện thể dục và chuyển
sang ăn uống với chế độ ít chất béo. Dữ liệu được cho trong file cholesterol.csv.

a) Hỏi rằng dữ liệu có ủng hộ kết luận rằng chế độ ăn kiêng và luyện tập thể dục đã có tác
dụng trong việc giảm lượng cholesterol trong máu hay không? Hãy tiến hành ở mức ý
nghĩa 0.05.
b) Giả sử hàm lượng cholesterol ở mỗi người tham gia nghiên cứu trước và sau khi bắt đầu
chương trinh luyện tập thể dục thể thao có phân phối chuẩn với phương sai khác nhau.
Viết hàm test.leq.oneside(x, y, 0 ,  ) để kiểm định giả thiết H1 :   0 và đối thiết
H1 :   0 trong đó   1  2 với 1 , 2 lần lượt là trung bình hàm lượng cholesterol
trước và sau khi tham gia chương trình luyện tập,  là mức ý nghĩa. Hàm xuất ra kết quả
chấp nhận hoặc bác bỏ và cho biết P-giá trị.
c) Với cùng giả định như ở câu b, hãy viết hàm test.geq.oneside(x, y, 0 ,  ) để kiểm định
giả thiết H1 :   0 và đối thuyết H1 :   0 với các ký hiệu và yêu cầu như ở câu trên.
5. Một sản phẩm ăn kiêng dạng lỏng được nhà sản xuất quảng cáo có tác dụng giảm cân ít nhất
1.5 kg khi sử dụng sản phẩm trong 1 tháng. Một mẫu ngẫu nhiên 50 người sử dụng sản phẩm
trong một tháng, kết quả trọng lượng (kg) trước khi sử dụng sản phẩm và sau khi dùng 1 tháng
được ghi lại trong file ‘giamcan.csv’. Hãy sử dụng các thủ tục kiểm định giả thuyết để trả lời các
câu hỏi sau

(a) Dữ liệu có phù hợp với quảng cáo của nhà sản xuất về sản phẩm ăn kiêng hay không với
mức ý nghĩa 0.05?

10
(b) Dữ liệu có phù hợp với quảng cáo của nhà sản xuất về sản phẩm ăn kiêng hay không với
mức ý nghĩa 0.01?
(c) Để cải thiện doanh số bán hàng, nhà sản xuất đang xem xét thay đổi quảng cáo từ “ít nhất
1.5 kg” thành “ít nhất 2.5 kg”. Thực hiện lại câu (a), (b) để kiểm định quảng cáo mới này.
6. Một nhà khoa học máy tính tiến hành kiểm tra sự hữu dụng của hai ngôn ngữ thiết kế khác
nhau trong việc cải thiện các tác vụ lập trình. Hai mươi chuyên gia lập trình thành thạo với cả hai
ngôn ngữ này được yêu cầu lập trình cho cùng một module chức năng trên hai ngôn ngữ thiết kế.
Thời gian hoàn thành công việc (tính theo phút và tuân theo phân phối chuẩn) được ghi lại và
tóm tắt trong file pro.time.csv.

a) Hãy xác định khoảng tin cậy 95% cho sự sai khác giữa thời gian lập trình trung bình
trên hai ngôn ngữ. Có dấu hiệu nào cho thấy một trong hai ngôn ngữ là tốt hơn hay
không?
b) Viết hàm test.leq.oneside(x, y, 0 ,  ) để kiểm định giả thiết H1 :   0 và đối thuyết
H1 :   0 trong đó   1  2 với 1 , 2 lần lượt là thời gian trung bình của các lập
trình viên viết xong module đối với ngôn ngữ thứ nhất và thứ hai,  là mức ý nghĩa.
Hàm xuất ra kết quả chấp nhận hoặc bác bỏ và cho biết P-giá trị.
c) Viết hàm test.geq.oneside(x, y, 0 ,  ) để kiểm định giả thiết H1 :   0 và đối
thuyết H1 :   0 với các ký hiệu và yêu cầu như ở câu trên..
7. Hai loại máy đúc khác nhau được sử dụng để gia công các chi tiết bằng plastic. Một chi tiết
được xem là phế phẩm nếu nó có sự thay đổi về hình dạng và khối lượng hoặc sai biệt về màu
sắc so với chi tiết mẫu vượt quá mức cho phép. Hai mẫu ngẫu nhiên được thu thập, mỗi mẫu có
cỡ 300. Trong mẫu thu được từ máy số 1 người ta nhận thấy có 15 chi tiết là phế phẩm và đối với
mẫu thu được từ máy thứ 2 có 8 chi tiết là phế phẩm. Liệu có cơ sở để kết luận rằng hai loại máy
có tỉ lệ phế phẩm như nhau hay không (mức ý nghĩa 0.025)? Tìm P-giá trị cho kiểm định vừa rồi.

8. Trong một mẫu ngẫu nhiên gồm 500 người sống tại thành phố Hồ Chí Minh người ta thấy có
385 người ủng hộ việc tăng tốc độ lưu thông trên các tuyến đường quốc lộ lên 65 km/h. Trong
khi đó một mẫu ngẫu nhiên khác gồm 400 người sống tại Hà Nội cho thấy có 267 nguời ủng hộ
việc tăng tốc độ. Liệu số liệu thu thập được có cho ta kết luận rằng có sự khác biệt về tỉ lệ người
ủng hộ việc tăng tốc độ tại hai thành phố hay không (   0.05 )? P-giá trị cho kiểm định trên là
bao nhiêu?

9. Trong một mẫu ngẫu nhiên 200 tài xế ở Tp.HCM có 165 trường hợp mang đai an toàn thường
xuyên, trong khi một mẫu khác, 250 tài xế ở Hà Nội, cho thấy có 198 trường hợp mang đai an
toàn thường xuyên.

(a) Thực hiện thủ tục kiểm định giả thuyết để xác định xem có sự khác biệt mang ý nghĩa
thống kê giữa việc sử dụng đai an toàn ở Tp.HCM và Hà Nội hay không? Với mức ý
nghĩa 0.05
(b) Tương tự câu (a) với mức ý nghĩa 0.1

11
(c) Giả sử các số liệu ở trên được nhân đôi. Nghĩa là, trong một mẫu ngẫu nhiên 400 tài xế ở
Tp.HCM có 330 trường hợp mang đai an toàn thường xuyên, trong khi một mẫu khác,
500 tài xế ở Hà Nội cho thấy có 396 trường hợp mang đai an toàn thường xuyên. Thực
hiện lại câu (a), (b) và cho nhận xét về ảnh hưởng của việc tăng kích thước mẫu mà
không thay đổi các tỉ lệ lên kết quả kiểm định.
10. Doanh số bán hàng (triệu đồng) của hai chi nhánh trong hệ thống siêu thị Co-op Mart đặt tại
quận 1 và quận 3 trong 200 ngày được cho trong file Profit.csv.

a) Hãy xác định khoảng tin cậy 95% cho sự sai khác về doanh số bán hàng trung bình của
hai chi nhánh này.
b) Một ngày được gọi là có doanh số cao nếu doanh số bán hàng trong ngày đó trên 600
triệu đồng. Có nhận xét rằng tỉ lệ các ngày có doanh số cao tại chi nhánh quận 1 cao hơn
tỉ lệ các ngày có doanh số bán hàng cao tại chi nhánh quân 3. Hãy kiểm chứng nhận xét
này với   0.05 . Hãy cho biết P-giá trị của kiểm định vừa rồi.
c) Viết hàm prop.test.leq(x, y,  ) để kiểm định giả thiết và đối thuyết
H1 : px  p y trong đó px , p y lần lượt là tỉ lệ ngày có doanh số bán cao (trên 600 triệu) tại
chi nhánh quận 1 và quận 3; x, y lần lượt là hai vector chứa doanh số bán hàng tại hai chi
nhánh của Co-op Mart đặt tại quận 1 và quận 3 trong một số ngày nào đó;  là mức ý
nghĩa. Hàm xuất ra kết quả chấp nhận hoặc bác bỏ và cho biết P-giá trị.
11. Thu nhập của các nhân viên trong ngành công nghệ thông tin tại hai thành phố Hà Nội và
thành phố Hồ Chí Minh được cho trong file Inf.Sal.csv.

a) Hãy xác định khoảng tin cậy 95% cho sự sai khác về mức lương trung bình của nhân viên
trong ngành công nghệ thông tin tại hai thành phố.
b) Một người được gọi là có thu nhập cao nếu thu nhập của người đó trên 11,5 triệu đồng.
Có nhận xét rằng tỉ lệ nhân viên công nghệ thông tin có thu nhập cao tại thành phố Hồ
Chí Minh cao hơn so với tỷ lệ này tại Hà Nội. Hãy kiểm chứng nhận xét này với
  0.025 . Hãy cho biết P-giá trị của kiểm định vừa rồi.
c) Viết hàm prop.test.geq(x, y,  ) để kiểm định giả thiết và đối thuyết
trong đó px , p y lần lượt là tỉ lệ người có thu nhập cao (trên 11,5 triệu đồng)
tại thành phố Hồ Chí Minh và Hà Nội; x, y là hai vector chứa giá trị thu nhập của một số
nhân viên ngành công nghệ thông tin tại Hà Nội và thành phố Hồ Chí Minh;  là mức ý
nghĩa. Hàm xuất ra kết quả chấp nhận hoặc bác bỏ và cho biết P-giá trị.
d) Tìm khoảng tin cậy 95% cho hiệu hai tỉ lệ trên.

12
Tuần 1

#Bai01
x <- c(4, 2, 6)
y <- c(1, 0, -1)

length(x)
sum(x)
sum(x ^ 2)
x + y
x * y
x - 2
x ^ 2

#Bai 02
7:11
seq(2, 9)
seq(4, 10, by = 2)
seq(3, 10, length = 10)
seq(6, -4, by = -2)

#Bai 03
rep(2, 4)
rep(c(1, 2), 4)
rep(c(1, 2), c(4, 4))
rep(1:4, 4)
rep(1:4, rep(3, 4))

#Bai 04
rep(6, 6)
rep(c(5, 8), 4)
rep(c(5, 8), c(4, 4))

#Bai 05

1
x <- c(5, 9, 2, 3, 4, 6, 7, 0, 8, 12, 2, 9)
x[2]
x[2:4]
x[c(2, 3, 6)]
x[c(1:5, 10:12)]
x[-(10:12)]

#Bai 06
y <- c(33, 44, 29, 16, 25, 45, 33, 19, 54, 22, 21,
49, 11, 24, 56)
for (i in 1:5) {
v <- c()
for (j in 1:3)
v <- c(v, (i - 1) * 3 + j)
print(summary(y[v]))
}
for (i in 1:3) {
v <- c()
for (j in 1:5)
v <- c(v, i + (j - 1) * 3)
print(summary(y[v]))
}

#Bai 07
x <- matrix(data = c(3, -1, 2, 1), nrow = 2, ncol
= 2)
y <- matrix(data = c(1, 0, 4, 1, 0, -1), nrow = 2,
ncol = 3)
z <- matrix(data = c(1, 2), nrow = 1, ncol = 2)
2 * x
x * x
x %*% x
x %*% y
t(y)
solve(x)

2
#Bai 08
x[1,]
x[2,]
x[,2]
y[1, 2]
y[, 2:3]

#Bai 09
x <- data.frame(quakes)
summary(x$depth)
summary(x$mag)

y <- data.frame(mtcars)
mean(y$wt)
mean(y$mpg)

Tuần 2

#Bai01
tong <- function(x, n) {
ans = 0
for (i in 1:n)
ans = ans + x[i]
return (ans)
}

#Bai 02
df <- function(radius) {
volume = (4 / 3 * pi * (r ^ 3))
return (data.frame(radius, volume))
}
r = c(3:20)
df(r)

#Bai 03

3
data = read.csv("Data/data01.csv", header
= TRUE)
age = data[,1]
id = rep(0, length(age))
for (i in 1:length(age)) {
x = age[i]
if (x <= 60)
{id[i] = 0}
else {
if (x <= 70)
{id[i] = 1}
else {
if (x <= 80)
{id[i] = 2}
else
{id[i] = 3}
}
}
}
id

#Bai 04
df = read.csv("Data/data11.csv", header =
TRUE)

information <- function(df) {


avg = (df$a + df$b) / 2;
df = data.frame("Height" = avg,
"Freq" = df$n);

h = df$Height;
f = df$Freq;

m = min(h[f != 0]); print(m);


M = max(h[f != 0]); print(M);
mh = sum(h * f) / sum(f); print(mh);

4
var = sum(f * (h - mh) ^ 2) /
(sum(f) - 1); print(sqrt(var));
print(df)
# chuyen thanh vector khong co tan
so
# dung min max mean sd
}
information(df)
print(df)

#Bai 05
phanvi <- function(x, p) {
y = sort(x)
n = length(x)
i = round(p * n / 100, 0);
if (p * n %% 100 == 0) {
return (y[i])
} else {
return ((y[i] + y[i + 1]) / 2)
}
}

#Bai 06
CRMethod <- function(R, c1, c2) {
n_mean = (c1 + 1) * (c2 + 1) / (R
+ 1) - 1;
n_var = (c1 + 1) * (c2 + 1) * (c1
- R) * (c2 - R) / ((R + 1) ^ 2 * (R + 2))
cat(n_mean - 1.96 * sqrt(n_var),
n_mean + 1.96 * sqrt(n_var))
}
CRMethod(4, 12, 15)

Tuần 3

5
#Bai01
f <- function(p) { 0.07 * (p **
(-0.93)) };
F <- function(p) integrate(f,
lower = 0, upper = p)
F(0.2)

#Bai 02
n = 100
x = sample(1:5, 100, TRUE,
c(0.1, 0.2, 0.4, 0.2, 0.1))
plot(1:5, table(x) / n, type =
"h", xlab = "x", ylab = "P(X =
x)")

Tuần 4

#Bai01
x = 0:15
plot(x, dhyper(x, 25, 100 - 25, 15), type = "h")

#Bai 02
sum(dhyper(5:15, 25, 75, 15))
phyper(12, 25, 75, 15) - phyper(4, 25, 75, 15)

#Bai 03
curve(dexp(x, 0.6), 0, 10)
curve(dexp(x, 0.3), 0, 10, add = T)
pexp(10, 0.6) - pexp(0, 0.6)
pexp(10, 0.3) - pexp(0, 0.3)

#Bai 04
x = 0:8
plot(x, dpois(x, 1), type = "h")

6
#Bai 05
x = 0:10
plot(x, dchisq(x, 3), type = "h")

#Bai 06
layout(matrix(c(1, 2), nrow = 1))
x = 0:50
plot(x, ylim = c(0, 0.25), dbinom(x, 50, 0.08),
type = "h")
plot(x, ylim = c(0, 0.25), dpois(x, 50 * 0.08),
type = "l")

#Bai 07
x = 0:50
plot(x, dbinom(x, 50, 0.4))
curve(dnorm(x, 20, 12), 0, 50, add = T)

Tuần 5
#Bai01
Y <- function() rnorm(1, 0, 1) ** 2 + rnorm(1,
0, 1) ** 2;
VecY <- function(n) replicate(n, Y())
n = 10000
hist(VecY(n), freq = 0, breaks = 40)
curve(dchisq(x, 2), from = 0, to = 8, add = T)

Tuần 6

#Bai01
x = c(1,2,5,7,-3,0,5,1,5,6)
y = c(2,2,0,-5,7,8,11,9,3,2)
x + y

7
x - y
x * y

z = x[x %% 2 == 0]
z

t = y[y %% 2 == 1]
t
sort(x, decreasing = FALSE)
sort(y, decreasing = TRUE)

#Bai 02
data = read.csv("Data/data01.csv")

FPSA = data[,2] #data$FPSA or


data['FPSA']
mean(FPSA)
var(FPSA)
median(FPSA)

boxplot(FPSA, horizontal = T)

K = data[,4]
k0 = FPSA[K == 0]
k1 = FPSA[K == 1]

data2 =
read.csv("Data/data02.csv")
data3 = merge(data, data2, by =
'K')

8
Age = data[,1]
tPSA = Age
tPSA[Age <= 30] = 0
tPSA[30 < Age & Age <= 50] = 1
tPSA[50 < Age] = 2

Tuần 7

#Bai01
a = rnorm(35, 10, 5)
alpha = 0.05
epsilon = qnorm(1 - alpha / 2) * 5 / sqrt(35)
cat(10 - epsilon)
cat(10 + epsilon)

#Bai 02
data = read.csv("Data/data31.csv")
ci.mean = function(x, alpha) {
trung_binh = mean(x)
do_lech_chuan = sd(x)
so_luong = length(x)
dung_sai = qnorm(1 - alpha / 2) *
do_lech_chuan / sqrt(so_luong);
cat(trung_binh - dung_sai, trung_binh +
dung_sai)
}

profit = data[,2]
ci.mean(profit, 1 - 0.95)

#Bai 03
data = read.csv("Data/data32.csv", header = T);
time = data[,1]
ci.mean(time, 1 - 0.95)

9
ci.prop <- function(f, n, alpha) {
ti_le = f / n;
dung_sai = qnorm(1 - alpha / 2) *
sqrt(ti_le * (1 - ti_le) / length(x));
cat(ti_le - dung_sai, ti_le + dung_sai);
}

cnt = length(time[time > 5])


ci.prop(cnt, length(time), 1 - 0.9);

#Bai 04
x <- rep(1.3, 6)
x <- c(x, rep(1.5, 34));
x <- c(x, rep(1.7, 31));
x <- c(x, rep(1.9, 42));
x <- c(x, rep(2.1, 12));
ci.mean(x, 1 - 0.95)

#Bai 05
ktc.tb <- function(mean, adj, s, n, alpha) {
if (adj == T) { #Da biet DLC cua tong the
epsilon = qnorm(1 - alpha / 2) * s
/ sqrt(n)
} else {
if (n >= 30) {
epsilon = qnorm(1 - alpha
/ 2) * s / sqrt(n)
} else {
epsilon = qt(1 - alpha /
2, df = n - 1) * s / sqrt(n)
}
}
cat(mean - epsilon, mean + epsilon)
}

10
#Bai 06
ktc.tb.mau <- function(x, adj, s, alpha) {
n = length(x)
mean = mean(x)
if (adj == F) # Chua biet DLC tong the
s = sd(x)
ktc.tb(mean, adj, s, n, alpha)
}

#Bai 07
x <- rep(12, 2)
x <- c(x, rep(12.05, 3))
x <- c(x, rep(12.10, 7))
x <- c(x, rep(12.15, 9))
x <- c(x, rep(12.20, 10))
x <- c(x, rep(12.25, 8))
x <- c(x, rep(12.30, 6))
x <- c(x, rep(12.35, 5))
x <- c(x, rep(12.40, 3))
ktc.tb.mau(x, F, 0, 1 - 0.95)

Tuần 8

#Bai01
data1 = read.csv("Data/profit.csv", header = T)
#data1 = read.csv(file.choose(), header = T)

x1 = data1[,1]
hist(x1)

x2 = x1[x1 > 65]


ci.mean = function(x, alpha){
x.mean = mean(x)
n = length (x)
s = sd(x)
epsilon = qt(df = n - 1,1 - alpha / 2) * s
/ sqrt(n)

11
#Khi n >= 30 thi qt xap xi qnorm
c(x.mean - epsilon, x.mean + epsilon)
}
ci.mean(x2, 0.01)

#n nho dung binom.test, n lon dung prop.test


t.test(x1, alternative = "less", mu = 60,
conf.level=0.99)
#p-value nho hon 0.05 nen bac bo H0

Tuần 9

#Caua
#H0: m1 = m2
#H1: m1 # m2
data = read.csv("Data/volume.csv", header = T)
attach(data)
t.test(x = machine1, y = machine2, alternative =
"two.sided", conf.level = 1 - 0.05)
#p-value lon hon alpha khong co can cu bac bo H0

#Cau b
#Dua vao cau a

#Cau c
#Dua vao cau a

#Cau d
test.leq.oneside = function(x, y, mu0, sig1, sig2,
alpha) {
z0 = (mean(x) - mean(y)) / sqrt( sig1 ^ 2 /
length(x) + sig2 ^ 2 / length(y))

12
p.value = dnorm(z0)
res = ifelse(p.value < alpha, "Bac bo H0",
"Khong co can cu Bac bo H0")
cat(res)
}
test.leq.oneside(machine1, machine2, 1,0.002,
0.0025, 0.05)

#Cau e
test.geq.oneside = function(x, y, mu0, sig1, sig2,
alpha) {
z0 = (mean(x) - mean(y)) / sqrt( sig1 ^ 2 /
length(x) + sig2 ^ 2 / length(y))
p.value = 1 - dnorm(z0)
res = ifelse(p.value < alpha, "Bac bo H0",
"Khong co can cu Bac bo H0")
cat(res)
}
test.geq.oneside(machine1, machine2, 1,0.002,
0.0025, 0.05)

13

You might also like