Download as pdf or txt
Download as pdf or txt
You are on page 1of 69

TÀI LIỆU THỰC HÀNH

THỐNG KÊ TRONG KHOA HỌC


SỰ SỐNG
Mã Môn: C01125

Tp. Hồ Chí Minh - 2024


Mục lục

1 GIỚI THIỆU NGÔN NGỮ R 4


1.1 R - Nguồn gốc lịch sử . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.1.1 R là gì? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.1.2 Nguồn gốc lịch sử . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2 Ưu điểm và nhược điểm của R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.2.1 Ưu điểm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.2.2 Nhược điểm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.3 Cài đặt R và Rstudio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.3.1 Cài đặt R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.3.2 Cài đặt Rstudio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.4 Trợ giúp trong R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.5 Một số tiện ích của R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.5.1 Tải và cài đặt các gói lệnh . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.5.2 Quản lý “Workspace” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.5.3 Quản lý các tập tin và môi trường vận hành . . . . . . . . . . . . . . . . . . . . . . . . . . 10

2 CẤU TRÚC DỮ LIỆU - CÁC TÍNH TOÁN 11


2.1 Cấu trúc dữ liệu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.1.1 Các kiểu đối tượng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.1.2 Các lớp đối tượng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.1.3 Các giá trị đặc biệt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.1.4 Thông tin đối tượng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.2 Các phép toán . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.2.1 Số và biến số . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.2.2 Các phép toán cơ bản . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.2.3 Các phép toán logic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.2.4 Các phép toán trên vector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

1
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

2.2.5 Factor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.2.6 Array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.2.7 Matrix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.2.8 List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.2.9 Data.frame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

3 NHẬP, XUẤT VÀ BIÊN TẬP DỮ LIỆU 34


3.1 Những dạng dữ liệu R có thể đọc được . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.2 Nhập và xuất dữ liệu trực tiếp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.2.1 Nhập trực tiếp từ bàn phím . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.2.2 Nhập dữ liệu từ file *.txt vào R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.2.3 Nhập dữ liệu từ file *.xlxs vào R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.2.4 Nhập dữ liệu từ file *.sav và file *.dta vào R . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.2.5 Nhập dữ liệu từ file *pdf vào R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.3 Biên tập dữ liệu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.3.1 Sắp xếp dữ liệu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.3.2 Rút trích dữ liệu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.3.3 Hợp nhất dữ liệu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3.3.4 Mã hóa dữ liệu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.4 Mô tả dữ liệu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.4.1 Mô tả dữ liệu bằng biểu đồ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.4.2 Môi trường và thiết kế biểu đồ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.4.3 Mô tả dữ liệu bằng các đặc trưng thống kê . . . . . . . . . . . . . . . . . . . . . . . . . . 60
3.4.4 Biểu đồ hộp và outliers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
3.5 Mô tả dữ liệu bằng bảng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
3.5.1 Bảng một chiều . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
3.5.2 Bảng hai chiều . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

4 MỘT SỐ PHÂN PHỐI XÁC SUẤT THÔNG DỤNG 69


4.1 Biến ngẫu nhiên rời rạc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
4.1.1 Phân phối nhị thức (Binomial distribution) . . . . . . . . . . . . . . . . . . . . . . . . . . 69
4.1.2 Phân phối Poisson (Poisson distribution) . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
4.1.3 Bài tập . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
4.2 Biến ngẫu nhiên liên tục . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
4.2.1 Nhập một hàm số . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
4.2.2 Vẽ đồ thị hàm số . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

2
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

4.2.3 Phân phối chuẩn (Normal distribution) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

5 ƯỚC LƯỢNG THAM SỐ VÀ KIỂM ĐỊNH GIẢ THUYẾT THỐNG KÊ 81


5.1 Ước lượng và kiểm định giả thuyết cho tham số trung bình của tổng thể . . . . . . . . . . . . . . 81
5.2 Ước lượng và kiểm định giả thuyết cho tham số tỷ lệ của tổng thể . . . . . . . . . . . . . . . . . 84
5.3 Bài tập . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87

3
Chương 1

GIỚI THIỆU NGÔN NGỮ R

1.1 R - Nguồn gốc lịch sử

1.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 và vẽ biểu đồ. Thực ra, về bản chất, R là
ngôn ngữ máy tính đa năng, có thể sử dụng cho nhiều mục tiêu khác nhau, từ tính toán đơn giản, tính toán
ma trận, đến các phân tích thống kê phức tạp.

1.1.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

4
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

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ả (Robert Gentleman và Ross Ihaka).

1.2 Ưu điểm và nhược điểm của R

1.2.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 với nhiều chức năng thống kê tiên tiế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 ngà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, . . .

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 các hàm và gói lệnh được đóng góp từ
người dùng có thể được 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 – Linux, Window, Mac.

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 trữ như một đối tượng R.

7. R là một 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 một cách hiệu quả.

10. R cung cấp một bộ các phép toán để tính toán trên mảng, danh sách, vector, và ma trận.

1.2.2 Nhược đ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 tìm kiếm các lệnh khả thi tốt nhất trong nhiều gói lệnh.

4. Mọi bảng, đồ thị phải được “lập trình” – không được tạo ra bằng cách click chuột.

5
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

1.3 Cài đặt R và Rstudio

1.3.1 Cài đặt R

Truy cập https://cran.r-project.org/ , trong mục “Download and Install R”, ta chọn một trong các đường dẫn
sau để cài đặt R cho các hệ điều hành khác nhau:

• Download R for Linux.

• Download R for (Mac) OS X.

• Download R for Windows.

Nhấp vào base và chọn Download R 4.x.x Đây là giao diện của R.

6
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

1.3.2 Cài đặt Rstudio

Truy cập https://www.rstudio.com, chọn Download RStudio, sau đó chọn mục download free, cuối cùng chọn
hệ điều hành phù hợp. Tải về và cài đặt bình thường. Đây là giao diện của RStudio. Khi làm việc với R, chúng

ta nên viết và thực thi các dòng lệnh trên cửa sổ Editor (Script).

• Mở cửa sổ Editor (Script): File → New File → R Script hoặc tổ hợp phím Ctrl+Shift+N.

• Lưu file Script: File → Save → Thư mục lưu trữ → Đặt tên file.

• Mở lại file Script: File → Open Script → Thư mục lưu trữ → file cần mở.

Chú ý: Thực thi dòng lệnh bằng cách đặt con trỏ tại dòng lệnh cần thực thi (bất kỳ vị trí nào ở dòng đó) và
nhấn tổ hợp phím Ctrl+Enter.

1.4 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ụ 1.4.1. Chạy thử các lệnh sau:

7
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

• 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.

1.5 Một số tiện ích của R

1.5.1 Tải và cài đặt các gói lệnh

Hầu hết các hàm trong R đều thuộc các gói lệnh khác nhau. Do đó, để sử dụng được các hàm này, ta cần
phải tải và cài đặt các gói lệnh vào R.

1. Kiểm tra các gói lệnh đã cài đặt


Ban đầu, khi ta tải và cài đặt R và máy tính thì có khoảng 30 gói lệnh được cài sẵn. Trong quá trính sử
dụng, nếu ta cài thêm các gói lệnh khác thì thư viện của R sẽ tiếp tục cập nhật. Để kiểm tra những gói
lệnh nào đã có trong máy, ta dùng lệnh sau:
.packages(TRUE)
Hơn nữa, ta có thể xem một vài thông tin hay những đặc trưng của từng gói lệnh bằng cách dùng lệnh
sau:
library()

2. Gọi các gói lệnh đã cài đặt ra để sử dụng


Do số lượng các gói lệnh khá lớn nên khi khởi động R, một số gói lệnh được R mặc định gọi ra. Ta có thể
kiểm tra các gói lệnh đó bằng lệnh:
search()
Dĩ nhiên, các gói lệnh chưa đủ để sử dụng nên ta sẽ gọi thêm các gói khác bằng cách
library(tên gói lệnh cần sử dụng)

3. Xác định gói lệnh chứa một số hàm cụ thể


Khi sử dụng R, chúng ta lưu ý rằng mỗi hàm trong R chỉ được thực hiện khi ta gọi đúng gói chứa nó ra
trước khi thực hiện câu lệnh. Chính vì thế, việc xác định đúng gói lệnh chứa hàm ta cần dùng là một việc
rất quan trọng. Để xác định gói lệnh chứa một hàm cụ thể ta dùng lệnh find().

Ví dụ 1.5.1. Giả sử ta cần xác định hàm combinations thuộc gói lệnh nào, ta làm như sau:
find(what = "combinations")
[1] "package:gtools

Chú ý 1.5.1. Trong trường hợp hai hoặc nhiều gói lệnh có hàm trùng tên nhau thì khi ta sử dụng cần chú
ý chọn đúng hàm trong gói cụ thể để R thực thi đúng. Chẳng hạn, hàm det() vừa thuộc gói base vừa
thuộc gói Matrix.
find("det")
[1] "package:Matrix""package:base"
Do đó, khi sử dụng hàm này ta có thể thực hiện như sau để tránh nhầm lẫn
# Dung ham det() thuoc goi Matrix
Matrix::det()

8
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

# Dung ham det() thuoc goi base


base::det()

4. Cách unload một gói lệnh


Trong quá trình làm việc với R nếu ta muốn bỏ những gói lệnh đã gọi trước đó thì ta dùng lệnh detach()
hoặc unlibrary().

Ví dụ 1.5.2. Giả sử ta cần unload gói gtools, ta thực hiện như sau
# Cach 1
detach(name = "package:gtools")
# Cach 2
install.package("lsr")
library(lsr)
unlibrary(gtools)

5. Tải và cài đặt gói lệnh


Tại giao diện của Rsudio, chọn Packages → Install → Nhập tên gói package cần tải và cài đặt vào →
Chọn Install.

6. Update các gói lệnh


Tại giao diện của Rsudio, chọn Update → click vào ô vuông trước tên các gói lệnh cần update → Chọn
Install Update.

1.5.2 Quản lý “Workspace”

1. Liệt kê các biến đang tồn tại trong phiên làm việc
Ta có thể dùng hàm objects(), hàm ls() hoặc hàm who() (thuộc package lrs).

Ví dụ 1.5.3. Tạo ra 4 biến như sau


x = seq(1,10,2)
y = seq(2,10,2)
z = y - x
w = letters
Liệt kê các biến trên như sau
# Cach 1
objects()
[1] "w""x""y""z"
# Cach 2
ls()
[1] "w""x""y""z"
# Cach 3
library(lrs)
who()
- - Name - - - - Class - - - - Size - -
w character 26
x numeric 5
y numeric 5
z numeric 5

9
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

2. Loại bỏ các biến đang tồn tại trong phiên làm việc

• Loại bỏ một hoặc một số biến cụ thể


# Loai bo bien x
rm(x)
# Loai bo bien x va z
rm(x,z)
• Loại bỏ tất cả các biến hiện có
# Cach 1
rm(list = objects())
rm(list = ls())
# Cach 2
rmAll()

1.5.3 Quản lý các tập tin và môi trường vận hành

1. Working directory
Dữ liệu trong quá trình sử dụng R phải được lưu vào một khu vực trong máy tính gọi là working directory.
Để biết hiện tại R đang làm việc ở working directory nào ta dùng lệnh
getwd()
[1] "C:/Users/Administrator/Documents"
Để tạo một working directory mới riêng cho cá nhân ta thực hiện
setwd("C:/Users/Administrator/Documents/Trang")
Lưu ý: R dùng forward slash "/" chứ không phải là backward slash "\"như trong hệ thống Windows.

2. Liệt kê các thư mục, tập tin đang tồn tại trong working directory
list.files()

3. Options
Để biết các thông số hiện tại của R ta dùng lệnh
options()
Đặc biệt, ta có thể thay đổi những mặc định của các thông số đó. Chẳng hạn, trong R prompt mặc định
là ">", chúng ta có thể thay đổi bằng cách
options(prompt = "trang>")
trang>
hay muốn màn ảnh R rộng hơn (100 characters) thay vì 80 characters như mặc định thì dùng options(width
= 100)

4. Thoát khỏi R
Khi muốn thoát khỏi R ta dùng lệnh
q()
Save workspace image to /.RData? [y/n]:
Trong đó, q là viết tắt của từ quit còn y/n/c là viết tắt của từ yes/no/cancel. Nếu chọn y (hoặc n) sẽ
lưu (hoặc không lưu) toàn bộ “workspace”. Ngược lại nếu chọn c thì R sẽ hủy lệnh q().

10
Chương 2

CẤU TRÚC DỮ LIỆU - CÁC TÍNH


TOÁN

2.1 Cấu trúc dữ liệu

2.1.1 Các kiểu đối tượng

Dữ liệu trong R được chia thành các loại sau

• Loại numeric
x = 1
class ( x )
[ 1 ] " numeric "

• Loại character
y = " Hello "
class ( y )
[ 1 ] " character "

• Loại logical
z = TRUE
class ( z )
[ 1 ] " logical "

2.1.2 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.

11
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

2.1.3 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)

2.1.4 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.

2.2 Các phép toán

2.2.1 Số và biến số

1. Gán tên biến


Ta có thể dùng toán tử gán (“=”, “<-”, “->”) để khai báo biến. Chẳng hạn, ta cần tạo một biến sales
có giá trị 350. Khi đó, ta thực hiện một trong ba lệnh sau:
#Cach 1 #Cach 2 #Cach 3
sales <- 350 sales -> 350 sales = 350
[1] 350 [1] 350 [1] 350

2. Tính toán trên biến


sales <- 350 revenue <- sales*price revenue <- revenue+550
price <- 7 revenue revenue
sales*price [1] 2450 [1] 3000
[1] 2450 revenue <- price*sales
350*7 revenue
[1] 2450 [1] 2450

3. Quy tắc đặt tên biến

• Tên biến có thể được thiết lập từ các chữ cái (in hoa hoặc in thường) kết hợp với dấu “.”, dấu “_”
và số đếm (gọi chung là các ký tự). Chẳng hạn, ta có thể đặt tên biến S.ale1_s. Tuy nhiên, không
nên đặt tên biến quá phức tạp đến thế.

12
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

• Trong tên biến, ở giữa các ký tự không có khoảng trắng. Ví dụ, tên biến là “my sales”, R sẽ báo lỗi.
• Tên biến không được trùng với một số từ đặc biệt trong R như: if, else, repeat, while, function,
for, in, next, break, TRUE, FALSE, NULL, Inf, NaN, NA, NA_integer_, NA_real_, NA_complex_,
NA_character_.
• Lời khuyên: ngoài những nguyên tắc mà R đã mặc định ta nên đặt tên biến sao cho
ngắn gọn, có tính gợi nhớ.

2.2.2 Các phép toán cơ bản

a + b # a plus b
a - b # a minus b
a * b # a multiply b
a / b # a divide b
a % / % b # Integer part of a divided b
a %% b # Remainder of a divided b
x ^ n or x * * n # x power n
a ^ x # General exponential funct of x
exp ( x ) # Exponential funct of x
sqrt ( x ) or x ^(1 / 2) # Square root of x
x ^(1 / n ) # n root of x
abs ( x ) # Absolute value of x
log (x , base = a ) or logb (x , base = a ) # Logarithm of base a of x
log (x , base = 2) or log2 ( x ) # Logarithm of base 2 of x
log (x , base = 10) or log10 ( x ) # Logarithm of base 10 of x
log (x , base = exp (1)) or log ( x ) # Logarithm of base e of x
sin ( x ) , cos ( x ) , tan ( x ) # Trigonometric funct
asin ( x ) , acos ( x ) , atan ( x ) # Inverse functions of trigonometric funct
sum () # Sum of vector elements
prod () # Product of vector elements
choose (n , k ) # Combination funct
factorial ( n ) or prod ( n :1) # Factorial funct

Ví dụ 2.2.1.
abs ( -30) # gia tri tuyet doi cua -30
[1] 30
sqrt (36) # can bac hai cua 36
[1] 6
-8^(1 / 3) # can bac ba cua -8
[1] -2
sin ( pi / 6)
[1] 0.5
asin (0.5) # arcsin cua 0.5
[1] 0.5235988
exp (3) # Gia tri cua e ^3
[1] 20.08554
log ( exp (3)) # Logarit tu nhien cua e ^3
{[1] 3
log10 (10000) # Logarit co so 10 cua 10000
[1] 4

13
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

logb (9 ,3) # Logarit co so3 cua 9


[1] 2
x =1:10
sum ( x ) # Tong 1+2+3+...+10
[1] 55
sum ( x ^2) # Tong binh phuong : 1^2 + 2^2 +...+ 10^2
[1] 385
sum ( x )^2 # Binh phuong cua tong (1+2+3+...+10)^2
[1] 3025
prod ( x ) # Tich 1.2.3...10
[1] 3628800
prod ( x ^2) # Tich binh phuong 1^2.2^2...10^2
[1] 1.316819 e +13
factorial (5) # Giai thua cua 5
[1] 120
factorial (5) / factorial (5 -2) # Chinh hop cua 5 chap 2
[1] 20
choose (5 ,2) # To hop cua 5 chap 2
[1] 10

2.2.3 Các phép toán logic

a == b # a equal to b
a ! = b # a not equal to b
a < b # a smaller than b
a <= b # a smaller than or equal to b
a > b # a bigger than b
a >= b # a bigger than or equal to b
! a # not a
a | b # a or b
a & b # a and b

Đây là dữ liệu dạng logic (TRUE hoặc FALSE) để xác định chân trị của một vấn đề.

Chú ý: dấu “=” trong R là phép gán giá trị còn dấu “==” mới thật sự là phép so sánh
thông thường.
Ví dụ 2.2.2.
99 < 100 99 > 100 99 >= 100
[1] TRUE [1] FALSE [1] FALSE
100 > 100 100 <= 100 (2 + 2) ! = 5
[1] FALSE [1] TRUE [1] TRUE
! ((2 + 2) == 5) ! (2 < 3)
[1] TRUE [1] FALSE
((2 + 2) == 4) & ((2 + 2) == 5) ((2 + 2) == 4)|((2 + 2) == 5)
[1] FALSE [1] TRUE
! (2 < 3) & (3 <= 4) (2 ! = 3)|(2 == 3)}
[1] FALSE [1] TRUE

14
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

2.2.4 Các phép toán trên vector

• Khai báo vector x = (x1 , x2 , . . . , xn ): x = c(x1, x2, ..., xn)

Ví dụ 2.2.3.
# Vector kieu so ( numeric )
x = c ( 1 ,3 ,5 ,7 ,9 ,0 ,2 ,4 ,6 ,8 )
x
[1] 1 3 5 7 9 0 2 4 6 8
# Vector chuoi ( string ): them dau nhay ( mot dau hay hai dau deu duoc )
name = c ( ’A ’ , ’B ’ , ’C ’ , ’D ’)
name
[1] "A" "B" "C" "D"
# vector kieu date
t = c ( " 1 4 / 0 2 / 2 0 1 5 " ," 8 / 3 / 2 0 1 5 " ," 0 1 / 4 / 2 0 1 5 " ," 3 0 / 0 4 / 2 0 1 5 " )
t = as . Date (t , format = " % d /% m /% Y " )
t
[ 1 ] " 2 0 1 5 -0 2 -1 4 " " 2 0 1 5 -0 3 -0 8 " " 2 0 1 5 -0 4 -0 1 " " 2 0 1 5 -0 4 -3 0 "
x <- c ( " 1 jan 1 9 6 0 " , " 2 jan 1 9 6 0 " , " 3 1 mar 1 9 6 0 " , " 3 0 jul 1 9 6 0 " )
z <- as . Date (x , " % d % b % Y " )
z
[ 1 ] " 1 9 6 0 -0 1 -0 1 " " 1 9 6 0 -0 1 -0 2 " " 1 9 6 0 -0 3 -3 1 " " 1 9 6 0 -0 7 -3 0 "

• seq(from = , to = , by = ) hoặc seq(from = , to = , len = ), tạo phần tử


liên tiếp.

• rep(x, times = , len = , each = ), tạo các phần tử lặp lại.


Ví dụ 2.2.4.
x = seq ( from = 1 0 , to = 2 0 , by = 1 )
x
[1] 10 11 12 13 14 15 16 17 18 19 20
y = seq ( from = 2 0 , to = 1 0 , by = -1 )
y
[1] 20 19 18 17 16 15 14 13 12 11 10
z = rep ( 1 : 3 , times = 5 )
z
[1] 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3
t = rep ( c ( 2 ,3 ) , times = c ( 5 ,4 ))
t
[1] 2 2 2 2 2 3 3 3 3

• Trích thành phần thứ i của vector x : x[i]

• Đếm thành phần của vector x : length(x)

• Tổng của hai vector x và y: x+y

15
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

• Hiệu của hai vector x và y: x-y

• Nhân vector x với số thực k : k*x

• Tích vô hướng của hai vector x và y: sum(x*y)

• Nối hai vector x và y: c(x,y)


Ví dụ 2.2.5.
x = c ( 1 ,3 ,5 ,7 ,9 ,0 ,2 ,4 ,6 ,8 )
y = seq ( 1 ,1 0 )
x+y
[1] 2 5 8 11 14 6 9 12 15 18
x*y
[1] 1 6 15 28 45 0 14 32 54 80
x/y
[1] 1.0000000 1.5000000 1.6666667 1.7500000 1.8000000 0.0000000
[7] 0.2857143 0.5000000 0.6666667 0.8000000

• Thay đổi giá trị trong một vector

Giả sử trong quá trình nhập dữ liệu có sai sót. Vấn đề đặt ra là ta chỉ thay giá trị
sai sót đó bằng giá trị đúng mà không cần nhập lại toàn bộ số liệu. Có hai cách
làm như sau:
x = c(1, 3, 5, 7, 9, 0, 2, 4, 6, 8)
x
[1] 1 3 5 7 9 0 2 4 6 8

Giá trị thứ 6 là 10 nhưng người nhập lại nhập là 0.


# Cach 1
x[6]<-10
x
[1] 1 3 5 7 9 10 2 4 6 8
# Cach 2
fix ( x )
x
[1] 1 3 5 7 9 10 2 4 6 8

• Lọc dữ liệu theo từng điều kiện cụ thể: x[điều kiện]


x < - c ( - 1 ,4 ,5 ,-6 ,1 0 ,8 ,-3 ,0 ,-9 ,7 )
x [x > 0 ]
[1] 4 5 10 8 7
x [ x \%\% 2 == 0 ]
[ 1 ] 4 -6 1 0 8 0

16
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

2.2.5 Factor

Lệnh factor() dùng để 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(). Lệnh levels() kết
quả 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 danh mục. Một hàm quan trọng cho phân
tích factor là hàm table(), đưa ra một loại tổng hợp. 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.

Ví dụ 2.2.6.
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 = 1 0 , labels = c ( " Male " , " Female " )) # generate factor levels
[ 1 ] Male Male Female Female Male Male Female Female Male Male
Levels : Male Female

2.2.6 Array

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ị.

17
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

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 : 2 7 , 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]

18
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

[ 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 : 1 8 , 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

2.2.7 Matrix

Ma trận là một mảng hai chiều gồm các số, ký hiệu hoặc biểu thức sắp xếp theo
hàng và cột. Trong đó, tất cả các phần tử có cùng một kiểu numeric, character hoặc
logical.

19
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

Nếu ta muốn tạo một ma trận, một cách là sử dụng hàm matrix(data, nrow, ncol,
byrow, dimnames). 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).

• Tạo một ma trận 4 dòng 5 cột:


A <- matrix ( 1 : 2 0 , nrow = 4 , ncol = 5 )
A
[,1] [,2] [,3] [,4] [,5]
[ 1 ,] 1 5 9 13 17
[ 2 ,] 2 6 10 14 18
[ 3 ,] 3 7 11 15 19
[ 4 ,] 4 8 12 16 20

Nếu thêm byrow = TRUE thì các phần tử được sắp theo hàng trước
B <- matrix ( 1 : 2 0 , nrow = 4 , ncol = 5 , byrow = T )
B
[,1] [,2] [,3] [,4] [,5]
[ 1 ,] 1 2 3 4 5
[ 2 ,] 6 7 8 9 10
[ 3 ,] 11 12 13 14 15
[ 4 ,] 16 17 18 19 20
x = c(1, 3, 5, 7, 9, 0, 2, 4, 6, 8)
rnames <- c ( " R 1 " , " R 2 " , " R 3 " , " R 4 " , " R 5 " )
cnames <- c ( " C 1 " , " C 2 " )
C <- matrix (x , nrow = 5 , byrow = T , dimnames = list ( rnames , cnames ))
C
C1 C2
R1 1 3
R2 5 7
R3 9 0
R4 2 4
R5 6 8

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

20
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

v1 1 2 3 4 5
v2 1 4 7 10 13

• Chiều của một ma trận có thể tính được bằng cách sử dụng hàm dim(). Một cách
khác là dùng lệnh nrow() và ncol() trả về số dòng và số cột của ma trận.
X <- matrix ( data = 1 : 1 5 , 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


X <- matrix ( data = 1 : 1 5 , nrow = 5 , ncol = 5 , byrow = T )
X
[,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
D <- t ( X )
D
[,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

• Đường chéo của ma trận vuông diag()


y <- c ( 1 : 1 6 )
E <- matrix (y , nrow = 4 , byrow = T )
E
[,1] [,2] [,3] [,4]
[ 1 ,] 1 2 3 4
[ 2 ,] 5 6 7 8
[ 3 ,] 9 10 11 12
[ 4 ,] 13 14 15 16
diag ( E )
[1] 1 6 11 16
z <- c ( 0 , -3 , 0 , -3 , 1 , 9 , 8 , 8 , -5 , 2 , 1 , 4 , 1 , 0 , -2 , -2 )
F 1 <- matrix (z , nrow = 4 )
F1
vvvvv [ , 1 ] [ , 2 ] [ , 3 ] [ , 4 ]
[ 1 ,] 0 1 -5 1

21
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

[ 2 ,] -3 9 2 0
[ 3 ,] 0 8 1 -2
[ 4 ,] -3 8 4 -2
diag ( F 1 )
[1] 0 9 1 -2

• Tạo ma trận đơn vị diag(1,n)


I = diag ( 1 , 3 )
I
[,1] [,2] [,3]
[ 1 ,] 1 0 0
[ 2 ,] 0 1 0
[ 3 ,] 0 0 1

• Các phép toán trên ma trận


E + F1
[,1] [,2] [,3] [,4]
[ 1 ,] 1 3 -2 5
[ 2 ,] 2 15 9 8
[ 3 ,] 9 18 12 10
[ 4 ,] 10 22 19 14
E - F1
[,1] [,2] [,3] [,4]
[ 1 ,] 1 1 8 3
[ 2 ,] 8 -3 5 8
[ 3 ,] 9 2 10 14
[ 4 ,] 16 6 11 18
E * F 1 # Nhan tung phan tu
[,1] [,2] [,3] [,4]
[ 1 ,] 0 2 -1 5 4
[ 2 ,] -1 5 54 14 0
[ 3 ,] 0 80 11 -2 4
[ 4 ,] -3 9 112 60 -3 2
E %*% F 1 # Nhan hai ma tran ( dong nhan cot )
[,1] [,2] [,3] [,4]
[ 1 ,] -1 8 75 18 -1 3
[ 2 ,] -4 2 179 26 -2 5
[ 3 ,] -6 6 283 34 -3 7
[ 4 ,] -9 0 387 42 -4 9
3 * E # Nhan ma tran voi mot so
[,1] [,2] [,3] [,4]
[ 1 ,] 3 6 9 12
[ 2 ,] 15 18 21 24
[ 3 ,] 27 30 33 36
[ 4 ,] 39 42 45 48

• Tính định thức


det ( E )

22
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

[ 1 ] 4 . 7 3 3 1 6 5e - 3 0
det ( F 1 )
[ 1 ] -2 1 3

• Ma trận nghịch đảo


u 1 = c ( 3 ,5 ,-8 )
u 2 = c ( 4 ,1 2 ,-1 )
u 3 = c ( 2 ,5 ,-3 )
H = rbind ( u 1 ,u 2 ,u 3 )
H
[,1] [,2] [,3]
u1 3 5 -8
u2 4 12 -1
u3 2 5 -3
solve ( H )
u1 u2 u3
[ 1 ,] 2.8181818 2 . 2 7 2 7 2 7 3 -8 . 2 7 2 7 2 7
[ 2 ,] -0 . 9 0 9 0 9 0 9 -0 . 6 3 6 3 6 3 6 2.636364
[ 3 ,] 0.3636364 0 . 4 5 4 5 4 5 5 -1 . 4 5 4 5 4 5

• Tìm trị riêng và vector riêng


eigen ( H )
eigen () decomposition
$ ‘ values ‘
[ 1 ] 1 2 . 5 6 6 9 3 9 -1 . 2 6 1 0 5 2 0.694113

$ vectors
[,1] [,2] [,3]
[ 1 ,] -0 . 2 1 1 5 7 6 6 0 . 9 1 0 7 0 6 2 -0 . 9 4 2 4 6 8 5 7
[ 2 ,] -0 . 9 2 2 2 9 8 9 -0 . 2 4 9 9 0 0 4 0.32752158
[ 3 ,] -0 . 3 2 3 4 1 9 3 0 . 3 2 8 8 8 3 1 -0 . 0 6 6 9 5 2 2 6

• Hạng của ma trận


Đầu tiên chúng ta cần cài đặt package "Matrix" bằng lệnh sau
install . packages ( " Matrix " )
library ( Matrix ) # Load package Matrix
rankMatrix ( H )
[1] 3
attr ( , " method " )
[ 1 ] " tolNorm 2 "
attr ( , " useGrad " )
[ 1 ] FALSE
attr ( , " tol " )
[ 1 ] 6 . 6 6 1 3 3 8e - 1 6

Hoặc mượn tạm lệnh phân tích qr() để tìm hạng của ma trận

23
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

qr ( H )
$ ‘ qr ‘
[,1] [,2] [,3]
u 1 -5 . 3 8 5 1 6 4 8 -1 3 . 5 5 5 7 5 9 7 6.3136415
u2 0.7427814 -3 . 2 0 0 2 1 5 5 -5 . 8 0 7 7 9 8 5
u3 0.3713907 0 . 1 7 9 4 0 8 4 -0 . 6 3 8 2 8 4 7
$ rank
[1] 3
$ qraux
[1] 1.5570860 1.9837747 0.6382847
$ pivot
[1] 1 2 3
attr ( , " class " )
[ 1 ] " qr "

• Giải phương trình và hệ phương trình tuyến tính Cramer


solve ( 2 , 1 0 ) # giai phuong trinh 2 * x = 1 0
[1] 5

Để giải hệ phương trình ta thiết lập ma trận hệ số A và ma trận cột tự do B



x − y = 5

 2x + y

=4

A <- matrix ( c ( 1 , 2 , -1 , 1 ) , nrow = 2 )


A
[,1] [,2]
[ 1 ,] 1 -1
[ 2 ,] 2 1
B <- matrix ( c ( 5 , 4 ) , nrow = 2 )
solve (A , B )
[,1]
[ 1 ,] 3
[ 2 ,] -2

2.2.8 List

List là một dạng dữ liệu phức tạp nhất trong R. Nó là một tập hợp có thứ tự các
đối tượng (object – components) khác nhau. Trong đó, mỗi object có thể là vector, ma
trận, data.frame, hay một list khác.

Hàn list() dùng để 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 cần cùng loại hoặc chiều dài.

24
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

Ví dụ 2.2.7.
x <- c ( 1 : 4 )
y <- FALSE
z <- matrix ( c ( 1 : 4 ) , nrow = 2 , ncol = 2 )
t <- c ( 2 8 ,1 9 ,1 8 ,2 0 )
myList <- list ( vector = x , logical = y , matrix = z , age = t )
myList
$ ‘ vector ‘
[1] 1 2 3 4
$ logical
[ 1 ] FALSE
$ matrix
[,1] [,2]
[ 1 ,] 1 3
[ 2 ,] 2 4
$ age
[1] 28 19 18 20
myList $ age
[1] 28 19 18 20
myList [ " vector " ]
$ ‘ vector ‘
[1] 1 2 3 4
print ( myList [[ 3 ]])
un <- unlist ( myList )
print ( un )
vector 1 vector 2 vector 3 vector 4 logical matrix 1 matrix 2
1 2 3 4 0 1 2
matrix 3 matrix 4 age 1 age 2 age 3 age 4
3 4 28 19 18 20
print ( un [[ 4 ]])
[1] 4
print ( un [[ 1 0 ]])
[1] 28

2.2.9 Data.frame

Data frame là một cấu trúc trong R gồm nhiều dòng và nhiều cột. Trong đó, mỗi cột
tương ứng với mỗi biến, mỗi dòng tương ứng với mỗi quan sát. Chú ý, ở các cột khác
nhau thì dữ liệu có thể thuộc các loại khác nhau (chẳng hạn numeric, character, hoặc
logical).

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

25
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

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
và ký hiệu $.
Ví dụ 2.2.8.
v1 = 1:5
v 2 = c (T ,T ,F ,F , T )
df = data . frame ( v 1 ,v 2 )
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 $ v 2
[1] TRUE TRUE FALSE FALSE TRUE
# Cach tao mot data . frame
ID <- c ( 1 , 2 , 3 , 4 ) # STT cua benh nhan
Age <- c ( 2 5 , 3 4 , 2 8 , 5 2 )
Diabetes <- c ( " Type 1 " , " Type 2 " , " Type 1 " , " Type 1 " ) # Benh tieu duong
Status <- c ( " Poor " , " Improved " , " Excellent " , " Poor " )
data <- data . frame ( ID , Age , Diabetes , Status )
data
ID Age Diabetes Status
1 1 25 Type 1 Poor
2 2 34 Type 2 Improved
3 3 28 Type 1 Excellent
4 4 52 Type 1 Poor
# Cach loc cac yeu to trong data . frame
data [ 1 : 2 ]
ID Age
1 1 25
2 2 34
3 3 28
4 4 52
data [ c ( " Diabetes " , " Status " )]
Diabetes Status
1 Type 1 Poor
2 Type 2 Improved
3 Type 1 Excellent
4 Type 1 Poor
# Dung $
data $ Age
[1] 25 34 28 52
# Dung ham with ()
with ( data = data , expr = Age )
[1] 25 34 28 52
with ( data , age )
[1] 25 34 28 52

26
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

data $ Diabetes [ data $ Age > 3 5 & data $ Status == " Poor " ]
[ 1 ] Type 1
Levels : Type 1 Type 2
with ( data = data , Diabetes [ age >3 5 & Status == " Poor " ])
[ 1 ] Type 1
Levels : Type 1 Type 2
# Xac dinh ten cac bien
names ( data )
[ 1 ] " ID " " Age " " Diabetes " " Status "

27
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

Bài tập

Bài tập 2.2.1. 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

d) 5,5,5,8,8,8,5,5,8,8,8,5,5,8,8,8

Bài tập 2.2.2. Sử dụng hàm seq() để xác định các vector sau trong R.

a) Khởi tạo vector u = (1, 2, . . . , 99, 100).

b) Khởi tạo vector u = (1, . . . , 9, 9, . . . , 1).

c) Khởi tạo vector u = (1, . . . , 1, 2, . . . , 2, 3, . . . , 3) (mỗi số trong các số 1, 2, 3 lặp lại


10 lần).

d) Khởi tạo vector u = (2, 4, 6, . . . , 98, 100).

e) Khởi tạo vector u = (1, 3, 5, . . . , 97, 99).

Bài tập 2.2.3. Dự đ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 tập 2.2.4. Nếu x<- c(5,9,2,3,4,6,7,0,8,12,2,9) xác định giá trị của các 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)]

28
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

(d) x[c(1:5,10:12)]
(e) x[-(10:12)]

Bài tập 2.2.5. Tạo vector


x = c(1,2,5,7,-3,0,5,1,5,6)
y = c(2,2,0,-5,7,8,11,9,3,2)
a. Tính x+y, x*y, x-y
b. Tạo 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 và gán cho vector w.

Bài tập 2.2.6. Xét dãy số x1 , x2 , . . . , x10 với

A4k+4 143
xk = − , k = 1, 2, . . . , 10.
(k + 2)! 4 · k!

a) Xuất ra tất cả các số hạng của dãy.

b) Xuất ra tất cả các số hạng không âm của dãy.

c) Các số hạng không âm là các số hạng thứ bao nhiêu trong dãy.

Bài tập 2.2.7. Tính:

a) 3! + 4 · 5! − 6!.

b) 1! + 2! + · · · + 20!.

c) 1 − 2 + 3 − 4 + · · · + 99 − 100.
23 13 7
d) C25 − C15 − 3C10 .
0 1 10
e) C10 + C10 + · · · + C10 .
2 k 10
1 C10 C10 C10
f) C10 +2 1 + · · · + k k−1
+ · · · + 10 9 .
C10 C10 C10
P100 1
g) j=1 j 2 . h) A210 .
A515 + A210
i) A57 − A25 . j) .
A59
P10 k
Q10 k
k) k=1 A10 . l) k=1 A10 .
10
A59 Y 1
m) − 2!A210 . n) √ √ .
4 n=1
n + n + 1

29
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

Tạo các ma trận sau trong R:

Bài tập 2.2.8.


       
0 0 0 1 0 0  −1 0 0  1 2 3
A =  0 0 0  , B =  0 1 0  , C =  0 −3 0 ,D =  0 4 5 
       
       
0 0 0 0 0 1 0 0 6 0 0 6

Ma trận E
Ung thu Khong ung thu
Phoi nghiem 11 17
Khong phoi nhiem 36 127

Bài tập 2.2.9. Thực hiện các phép toán trên ma trận
  
 1 −3 0   2 0 3 
   
1 0 −3 −1 3 6
1. 3   + 4 , 2.  2 −4 1   0 1 −4 
  
2 −8 1 1 −6 0   
3 −5 2 1 −1 0
 3  4
1 2 −1 0
3.  , 4.  
0 4 0 −4
   T
 1 3 0  2 7 
 
h iT 11 5 −3
5.  0 −2 0  1 23 45 , 6.  − 5
 + 4 9 
  
  2 −18 0  
−3 −8 2 12 −5

Bài tập 2.2.10. Tính các định thức

1 3 5 −1
0 2 2
2 −1 0 2
1. 1 0 1 , 2.
7 −1 1 5
1 2 0
7 9 1 0

Bài tập 2.2.11. Tìm các ma trận nghịch đảo (nếu có)
   
1 2 −2 6
A= , B= 
−2 3 −3 9

30
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG
   
1 0 2   1 3 −2 
C =  2 −1 3 , D =  1 −5 1 
   
   
4 1 8 3 13 −6
   
1 1 1 1 1 1 1 1
   
1 1 −1 −1   1 1 −1 −1 
E= , F =
   

 1 −1 0 0   1 −1 1 −1 
   
0 0 1 −1 1 −1 −1 1

Bài tập 2.2.12. Giải các hệ phương trình sau



 
 3x1 − 2x2 − 5x3 + x4 = 3
 2x1 + x2 − 3x3 = 1

 

  2x − 3x + x + 5x = −3

1 2 3 4
1. 5x1 + 2x2 − 6x3 = 5 , 2.

 
 x1 + 2x2 − 4x4 = −3
 3x1 − x2 − 4x3 = 7
 


x1 − 2x2 − 4x3 + 9x4 = 22

Bài tập 2.2.13. Khởi tạo ma trận A có 50 dòng và 10 cột, trong đó các phần tử trên
dòng thứ i của A có giá trị bằng i.

Bài tập 2.2.14. Xét hai ma trận


   
1 5 1 2 0 −1 2 1
   
2 6 3 4 2 1 −1 1 
A= , B=
   

3 7 5
 6
4
 3 4 −2 

4 8 7 8 6 5 1 −4

T
Tính: A + 2B, A − B 2 , AB, BA, AT + B, A + B T , (AB) , B T AT , det(A), A2 B, A−1 .

Bài tập 2.2.15. Tạo ra một list tên là Jane gồm các objects sau:
Tuổi (age) bằng 34.
Tình trạng việc làm (working status) là TRUE.
Giới tính (gender) là female.
Tên của cha mẹ (parents) lần lượt là Joe và Liz.
Con (children) là Alex 5 tuổi (age.of.children).

31
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

Bài tập 2.2.16. Cho danh sách các bệnh nhân bị bệnh tiểu đường theo bảng sau

P atientID Gender Age Diabetes Status


1 F emale 25 T ype1 Improved
2 M ale 34 T ype2 P oor
3 M ale 28 T ype1 Excellent
4 F emale 52 T ype1 P oor
5 F emale 40 T ype2 P oor
6 M ale 42 T ype2 Improved
7 F emale 62 T ype1 Excellent
8 F emale 35 T ype2 Improved
9 M ale 65 T ype1 P oor
10 M ale 27 T ype2 Excellent

a) Tạo data frame có tên là patientdata.

b) Lọc cột Age và Status trong patientdata bằng cách (dùng $ và hàm with()).

c) Lọc các bệnh nhân là Male và Female.

Bài tập 2.2.17. Tạo một data.frame có tên diemthi với các số liệu cụ thể sau

N ame Age Gender Group Score


An 19 M ale Group1 60
Binh 19 M ale Group1 70
Hai 21 M ale Group1 40
N guyen 28 M ale Group2 55
T rung 18 M ale Group2 60
T huy 19 F emale Group2 75
V an 30 F emale Group3 90
M ai 18 F emale Group3 80
T hao 19 F emale Group3 95

a) Lọc cột score trong diemthi bằng hai cách.

b) Lọc ra tên người có tuổi lớn hơn 20 và là nam.

32
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

c) Xác định tên người có điểm (score) thấp nhất và cao nhất.

d) Tính tổng điểm của từng group (dùng sum()).

e) Sắp xếp data frame diemthi theo biến score với thứ tự từ nhỏ đến lớn (dùng hàm
order()).

33
Chương 3

NHẬP, XUẤT VÀ BIÊN TẬP DỮ


LIỆU

3.1 Những dạng dữ liệu R có thể đọc được

3.2 Nhập và xuất dữ liệu trực tiếp

3.2.1 Nhập trực tiếp từ bàn phím

Nhập dữ liệu sau vào R

34
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

STT 1 2 3 4 5 6 7 8 9 10
Age 50 62 60 40 48 47 57 70 48 67
Insulin 16.5 10.8 32.3 19.3 14.2 11.3 15.5 15.8 16.2 11.2

a) Dùng hàm c() và hàm data.frame()


stt = 1 : 1 0
age = c ( 5 0 , 6 2 , 6 0 , 4 0 , 4 8 , 4 7 , 5 7 , 7 0 , 4 8 , 6 7 )
insulin = c ( 1 6 . 5 , 1 0 . 8 , 3 2 . 3 , 1 9 . 3 , 1 4 . 2 , 1 1 . 3 , 1 5 . 5 , 1 5 . 8 , 1 6 . 2 , 1 1 . 2 )
data 1 = data . frame ( id , age , insulin )
data 1

b) Dùng hàm edit()


data 2 = edit ( data . frame ())
data 2

• Lưu dữ liệu lại thành file của R (*rda)


setwd ( " E :/ Thuchanh " ) # noi luu tru
save ( data 1 , file = " insu . rda " ) # luu data 1 va dat ten insu . rda

• Xuất dữ liệu thành các dạng khác (word, text, excel,. . . )


write . table ( data 1 , " E :/ Thuchanh / insulin 1 . txt " , sep = " \ t " ,
row . names = FALSE )
write . table ( data 1 , " E :/ Thuchanh / insulin 2 . xls " , sep = " \ t " ,
row . names = FALSE )
write . table ( data 1 , " E :/ Thuchanh / insulin 3 . doc " , sep = " \ t " ,
row . names = FALSE )

Trong đó, sep là tham số để tạo ngăn cách các cột, row.names mặc định là TRUE
xuất ra chỉ số thứ tự của các dòng. Do đó, ta phải chọn FALSE không xuất ra các
chỉ số đó.

• Lưu tất cả các công việc đã làm thành file text: File/Save as File. . .

3.2.2 Nhập dữ liệu từ file *.txt vào R

Dùng hàm read.table().

Ví dụ 3.2.1. Đọc file iqsize.txt trong thư mục Datafiles vào R.


data = read . table ( file . choose () , header = TRUE )
data

35
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

3.2.3 Nhập dữ liệu từ file *.xlxs vào R

Nhập gián tiếp: thông qua hàm read.csv().


Bước 1: lưu file *.xlsx hoặc *.xls dạng *.csv.
Bước 2: dùng hàm read.csv() đọc dữ liệu vào R.

Ví dụ 3.2.2. Đọc file diemthi trong thư mục Datafiles vào R.


diem = read . csv ( file = file . choose () , header = TRUE )
diem

3.2.4 Nhập dữ liệu từ file *.sav và file *.dta vào R

Dùng hàm spss.get() thuộc package Hmisc. Hoặc dùng hàm read.spss(file.choose())
và read.dta(file.choose()) thuộc package foreign

Ví dụ 3.2.3. Đọc file khanangtrano.sav trong thư mục Datafiles ở ổ đĩa E vào R.
install . packages ( " Hmisc " )
library ( Hmisc )
nganhang = spss . get ( file . choose ())
head ( nganhang ) # xuat 6 dong dau tien cua du lieu

3.2.5 Nhập dữ liệu từ file *pdf vào R

Đôi khi, chúng ta đọc các file tài liệu như word, excel, pdf, sách điện tử (nói chung
tài liệu điện tử),. . . và ở đó, chúng ta thỉnh thoảng thấy có một số bảng dữ liệu có sẵn.
Lúc này, nếu ta muốn sao chép chúng để sử dụng thì ta có thể sử dụng hàm scan() sẽ
đỡ mất thời gian gõ từng con số và ký tự. Hãy theo dõi các ví dụ sau:
• Dữ liệu dạng numeric

Trọng lượng của 50 cầu thủ hàng đầu NBA Bộ dữ liệu dưới đây liệt kê về trọng
lượng của 50 cầu thủ hàng đầu NBA (đơn vị: lb).

240 210 220 260 250 195 230 270 325 225
165 295 205 230 250 210 220 210 230 202
250 265 230 210 240 245 225 180 175 215
215 235 245 250 215 210 195 240 240 225
260 210 190 260 230 190 210 230 185 260

36
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

Bước 1: Copy toàn bộ số liệu.


Bước 2: Vào cửa số Console tạo một object mới trong.luong = scan().
Bước 3: Nhấn enter rồi paste dữ liệu vào cửa sổ Console, sau đó nhấn enter.
• Dữ liệu dạng character
Tin tưởng vào thông tin Internet. Một cuộc khảo sát đã được thực hiện về mức độ
tin cậy của mọi người đối với thông tin họ đọc trên Internet. A = tin tưởng vào mọi
thứ họ đọc, M = tin tưởng vào hầu hết những gì họ đọc, H = tin tưởng vào khoảng
một nửa những gì họ đọc, S = tin tưởng vào một phần nhỏ những gì họ đọc. (Dựa trên
thông tin từ Báo cáo Internet UCLA.)

M M M A H M S M H M
S M M M M A M M A M
M M H M M M H M H M
A M M M H M M M M M

Cách làm tương tự như dữ liệu dạng numeric, tuy nhiên thêm đối số what = "string".
• Dữ liệu vừa có numeric vừa có character

Giả sử ta cần nhập bảng số liệu sau vào R.


Categories Superior Michigan Huron Erie Ontario
Length (miles) 350 307 206 241 193
Breadth (miles) 160 118 183 57 53
Depth (feet) 1,330 923 750 210 802
Volume (cubic miles) 2,900 1,180 850 116 393
Area (square miles) 31,700 22,300 23,000 9,910 7,550
Shoreline (U.S., miles) 863 1,400 580 431 300
Bước 1: Copy toàn bộ số liệu (trừ các header).
Bước 2: Vào cửa sổ Console tạo một object mới data = scan( , what = "string").
Bước 3: Nhấn enter rồi paste dữ liệu vào cửa sổ Console.
Lưu ý:
Thay các khoảng trắng (nếu có) bằng “dấu _” hoặc “dấu .”
Bỏ các “dấu ,” ngăn cách giữa hàng nghìn, chục nghìn,. . . ;
Thay “dấu .” của số âm bằng “dấu –” . Sau đó nhấn enter.

37
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

Bước 4: Chuyển kiểu vector thành ma trận (dùng hàm matrix())


Bước 5: chuyển ma trận về dạng data.frame (dùng hàm as.data.frame())
Bước 6: Đặt tên các cột và chuyển dữ liệu về dạng phù hợp (dùng hàm edit())

3.3 Biên tập dữ liệu

3.3.1 Sắp xếp dữ liệu

• Sắp xếp biến x theo thứ tự tăng dần: x[order(x)] hoặc sort(x, decreasing =
FALSE).

• Sắp xếp biến x theo thứ tự giảm dần: x[order(-x)] hoặc sort(x, decreasing =
TRUE).

Ví dụ 3.3.1.
Sắp xếp dãy số sau tăng dần: 2;-1.5; 0; 3; 2; 1; 7; 9; 10.
x = c ( 2 , -1 . 5 , 0 , 3 , 2 , 1 , 7 , 9 , 1 0 )
x
[ 1 ] 2 . 0 -1 . 5 0 . 0 3 . 0 2 . 0 1 . 0 7 . 0 9 . 0 1 0 . 0
sort ( x )
[ 1 ] -1 . 5 0 . 0 1 . 0 2 . 0 2 . 0 3 . 0 7 . 0 9 . 0 1 0 . 0
sort (x , decreasing = TRUE )
[ 1 ] 1 0 . 0 9 . 0 7 . 0 3 . 0 2 . 0 2 . 0 1 . 0 0 . 0 -1 . 5

Ví dụ 3.3.2. Cho bảng số liệu về điểm thi học kỳ 1 của 10 học sinh như sau:

id name gender diem.hk1


1 Minh male 7.0
2 Quan male 8.8
3 Phuc male 9.0
4 Linh female 5.0
5 Vy female 6.0
6 Tu female 6.8
7 Mai female 7.5
8 Tram female 8.5
9 Tien female 8.0
10 Ngoc female 9.5

38
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

a) Nhập bảng dữ liệu vào R và đặt tên là hk1.

b) Sắp xếp điểm theo thứ tự tăng dần.

c) Sắp xếp bảng số liệu theo thứ tự điểm tăng dần.

3.3.2 Rút trích dữ liệu

• Rút ra một số phần từ từ tập dữ liệu


Vì mỗi data frame được xem như một ma trận nên chúng có cột và hàng. Do đó,
chúng ta có thể rút trích ra bất kỳ phần tử nào từ tập dữ liệu ban đầu.

Ví dụ 3.3.3. Ở ví dụ 3.3.2, thực hiện các yêu cầu sau

a) Rút ra cột 4, tức là cột điểm trong dữ liệu hk1.


b) Rút ra dòng 3 trong dữ liệu hk1.
c) Rút ra phần tử ở vị trí dòng 3, cột 2 trong dữ liệu hk1.
d) Rút ra các phần tử ở các vị trí từ dòng 1 đến dòng 5, từ cột 2 đến cột 4 trong
dữ liệu hk1.

• Rút ra một tập con dữ liệu thỏa mãn điều kiện đặt ra
Dùng lệnh subset(data, điều kiện)
Ở ví dụ 3.3.2, thực hiện các yêu cầu sau

a) Rút ra một tập con dữ liệu với điều kiện giới tính là nữ
b) Rút ra một tập con dữ liệu với điều kiện giới tính là nữ và có điểm lớn hoặc
bằng 8.0
c) Rút ra một tập con dữ liệu với điều kiện giới tính là nữ hoặc có điểm lớn hoặc
bằng 8.0

3.3.3 Hợp nhất dữ liệu

Hợp nhất theo cột

Chúng ta có hai bảng số liệu về kết quả điểm học kỳ 1 (bảng dữ liệu ở ví dụ trên) và
bảng dữ liệu học kỳ 2, chúng ta cần hợp hai bảng dữ liệu điểm bằng lệnh merge().
Sau đó, tạo cột điểm trung bình và cột xếp loại cho dataframe ca.nam.
39
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

id name gender diem.hk2


1 Minh male 9.0
2 Quan male 6.8
3 Phuc male 8.0
4 Linh female 6.0
5 Vy female 5.0
6 Tu female 8.8
7 Mai female 6.5
8 Tram female 5.5
9 Tien female 10.0
10 Ngoc female 8.5

Nhập dữ liệu bảng trên đặt tên là hk2


ca . nam = merge ( hk 1 , hk 2 , by = c ( " id " , ’ gender ’ , ’ name ’ ))
ca . nam

Hợp nhất theo dòng

Chúng ta cần hai bảng dữ liệu điểm data1 và data2 sau


id gender age diabetes status id gender age diabetes status
1 Female 25 Type1 Improved 6 Male 42 Type2 Improved
2 Male 34 Type2 Poor 7 Female 62 Type1 Excellent
3 Male 28 Type1 Excellent 8 Female 35 Type2 Improved
4 Female 52 Type1 Poor 9 Male 65 Type1 Poor
5 Female 40 Type2 Poor 10 Male 27 Type2 Excellent
id = 1 : 5
gender = c ( " Female " ," Male " ," Male " ," Female " ," Female " )
age = c ( 2 5 ,3 4 ,2 8 ,5 2 ,4 0 )
diabetes = c ( " Type 1 " ," Type 2 " ," Type 1 " ," Type 1 " ," Type 2 " )
status = c ( " Improved " ," Poor " ," Excellent " ," Poor " ," Poor " )
data 1 = data . frame ( id , gender , age , diabetes , status )
id = 6 : 1 0
gender = c ( " Male " ," Female " ," Female " ," Male " ," Male " )
age = c ( 4 2 ,6 2 ,3 5 ,6 5 ,2 7 )
diabetes = c ( " Type 2 " ," Type 1 " ," Type 2 " ," Type 1 " ," Type 2 " )
status = c ( " Improved " ," Excellent " ," Improved " ," Poor " ,
" Excellent " )

40
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

data 2 = data . frame ( id , gender , age , diabetes , status )


patiendata = rbind ( data 1 , data 2 )
patiendata

3.3.4 Mã hóa dữ liệu

Chúng ta cần mã hóa female là 0, male là 1. Chúng ta có thể mã hóa và lưu vào
cột tên là Gioi.tinh như sau
hk 1 $ Gioi . tinh [ gender == ’ female ’] <- 0
hk 1 $ Gioi . tinh [ gender == ’ male ’] <- 1
hk 1
id name gender diem . hk 1 Gioi . tinh
1 1 Minh male 7.0 1
2 2 Quan male 8.8 1
3 3 Phuc male 9.0 1
4 4 Linh female 5.0 0
5 5 Vy female 6.0 0
6 6 Tu female 6.8 0
7 7 Mai female 7.5 0
8 8 Tram female 8.5 0
9 9 Tien female 8.0 0
1 0 1 0 Ngoc female 9.5 0

Chúng ta cần xếp loại học lực trung bình, khá, giỏi. Chúng ta có thể mã hóa và
lưu vào cột tên là Xep.loai như sau:
hk 1 $ Xep . loai [ diem . hk 1 >= 5 & diem . hk 1 < 6 . 5 ] < - " TB "
hk 1 $ Xep . loai [ diem . hk 1 >= 6 . 5 & diem . hk 1 < 8 ] <- " Kha "
hk 1 $ Xep . loai [ diem . hk 1 >= 8 . 0 ] <- " Gioi "
hk 1
id name gender diem . hk 1 Gioi . tinh Xep . loai
1 1 Minh male 7.0 1 Kha
2 2 Quan male 8.8 1 Gioi
3 3 Phuc male 9.0 1 Gioi
4 4 Linh female 5.0 0 TB
5 5 Vy female 6.0 0 TB
6 6 Tu female 6.8 0 Kha
7 7 Mai female 7.5 0 Kha
8 8 Tram female 8.5 0 Gioi
9 9 Tien female 8.0 0 Gioi
1 0 1 0 Ngoc female 9.5 0 Gioi

41
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

3.4 Mô tả dữ liệu

3.4.1 Mô tả dữ liệu bằng biểu đồ

Trong ngôn ngữ R có rất nhiều cách để thiết kế một biểu đồ gọn và đẹp. Phần lớn
những hàm để thiết kế biểu đồ có sẵn trong R, nhưng một số loại biểu đồ tinh vi và
phức tạp khác có thể thiết kế bằng các package chuyên dụng như lattice hay trellis
có thể tải từ website của R.

3.4.2 Môi trường và thiết kế biểu đồ

• Nhiều biểu đồ cho một cửa sổ (windows)


Thông thường, R vẽ một biểu đồ cho một cửa sổ. Nhưng chúng ta có thể vẽ
nhiều biểu đồ trong một cửa sổ bằng cách sử dụng hàm par. Chẳng hạn như
par(mfrow=c(1,2)) có hiệu năng chia cửa sổ ra thành 1 dòng và hai cột, tức là
chúng ta có thể trình bày hai biểu đồ kề cạnh bên nhau. Còn par(mfrow=c(2,3))
chia cửa sổ ra thành 2 dòng và 3 cột, tức chúng ta có thể trình bày 6 biểu đồ trong
một cửa sổ. Sau khi đã vẽ xong, chúng ta có thể quay về với “chế độ” 1 cửa sổ bằng
lệnh par(mfrow=c(1,1).
par ( mfrow = c ( 2 ,2 ))
N <- 2 0 0
x <- runif (N , -4 , 4 )
y <- sin ( x ) + 0 . 5 * rnorm ( N )
plot (x , y , main = " Scatter plot of y and x " )
hist (x , main = " Histogram of x " )
boxplot (y , main = " Box plot of y " )
barplot (x , main = " Bar chart of x " )
par ( mfrow = c ( 1 ,1 ))

• Đặt tên cho trục tung và trục hoành


Biểu đồ thường có trục tung và trục hoành. Vì dữ liệu thường được gọi bằng các
chữ viết tắt, cho nên biểu đồ cần phải có tên cho từng biến để dễ theo dõi. Đối số
xlab (viết tắt từ x label) và ylab (viết tắt từ y label) dùng để đặt tên cho trục
hoành và trục tung. Còn main được dùng để đặt tên cho biểu đồ.
par ( mfrow = c ( 1 ,2 ))
N <- 2 0 0
x <- runif (N , -4 , 4 )
y <- sin ( x ) + 0 . 5 * rnorm ( N )

42
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

plot (x , y )
plot (x , y , xlab = " X factor " , ylab = " Production " ,
main = " Production and x factor \ n Second line of title here " )
par ( mfrow = c ( 1 ,1 ))}

• Cho giới hạn của trục tung và trục hoành


Nếu không cung cấp giới hạn của trục tung và trục hoành, R sẽ tự động tìm điều
chỉnh và cho các số liệu này. Tuy nhiên, chúng ta cũng có thể kiểm soát biểu đồ
bằng cách sử dụng xlim và ylim.
plot (x , y , xlab = " X factor " ,
ylab = " Production " ,
main = " Plot of production and x factor " ,
xlim = c ( - 5 , 5 ) ,
ylim = c ( - 3 , 3 ))

• Thể loại và đường biểu diễn


Xem ở biểu đồ đường
par ( mfrow = c ( 2 ,2 ))
plot (y , type = " l " ); title ( " lines " )
plot (y , type = " b " ); title ( " both " )
plot (y , type = " o " ); title ( " overstruck " )
plot (y , type = " h " ); title ( " high density " )}

plot (y , type = " l " , lty = 1 ); title ( main = " Production data " , sub = " lty = 1 " )
plot (y , type = " l " , lty = 2 ); title ( main = " Production data " , sub = " lty = 2 " )
plot (y , type = " l " , lty = 3 ); title ( main = " Production data " , sub = " lty = 3 " )
plot (y , type = " l " , lty = 4 ); title ( main = " Production data " , sub = " lty = 4 " )

• Màu sắc, khung, và kí hiệu


Xem ở biểu đồ đường
par ( mfrow = c ( 1 ,1 ))
plot ( runif ( 1 0 ) , ylim = c ( 0 ,1 ) , type = ’l ’)
for ( i in c ( ’ red ’ , ’ blue ’ , ’ green ’ ))
{ lines ( runif ( 1 0 ) , col = i )}
title ( main = " Duong nhieu mau " )

plot ( runif ( 5 ) , ylim = c ( 0 ,1 ) , type = ’n ’)


for ( i in 6 : 2 )
{ lines ( runif ( 5 ) , col = i , lwd = i )}
title ( main = " Do day cua duong khac nhau " )

• Ghi chú (legend)


Hàm legend() rất có ích cho việc ghi chú một biểu đồ và giúp người đọc hiểu được
ý nghĩa của biếu đồ tốt hơn.
43
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

• Viết chữ trong biểu đồ


Phần lớn các biểu đồ không cung cấp phương tiện để viết chữ hay ghi chú trong
biểu đồ, hay có cung cấp nhưng rất hạn chế. Trong R có hàm mtext() cho phép
chúng ta đặt chữ viết hay giải thích bên cạnh hay trong biểu đồ. Bắt đầu từ phía
dưới của biểu đồ (side=1), chúng ta chuyển theo hướng kim đồng hố đến cạnh số
4.
Lệnh plot trong ví dụ sau đây không in tên của trục và tên của biểu đồ, nhưng
chỉ cung cấp một cái khung. Trong ví dụ này, chúng ta sử dụng cex (character
expansion) để kiểm soát kích thước của chữ viết. Theo mặc định thì cex=1, nhưng
với cex=2, chữ viết sẽ có kích thước gấp hai lần kích thước mặc định. Lệnh text()
cho phép chúng ta đặt chữ viết vào một vị trí cụ thể. Lệnh thứ nhất đặt chữ viết
trong ngoặc kép và trung tâm tại x=1.5, y=4.3 (giá trị này phụ thuộc vào giới hạn
của 2 trục tọa độ).
plot (y , xlab = " " , ylab = " " , type = " n " )
mtext ( " Text on side 1 , cex = 1 " , side = 1 , cex = 1 )
mtext ( " Text on side 2 , cex = 1 . 2 " , side = 2 , cex = 1 . 2 )
mtext ( " Text on side 3 , cex = 1 . 5 " , side = 3 , cex = 1 . 5 )
mtext ( " Text on side 4 , cex = 2 " , side = 4 , cex = 2 )
text ( 1 . 5 , 4 . 3 , " text ( 1 . 5 , 4 . 3 ) " )
text ( 3 . 5 , 3 . 5 , adj = 0 , " text ( 3 . 5 , 3 . 5 ) , left aligned " )

• Biểu đồ đường
Sử dụng hàm plot(x, y, type, lty, lwd, pch, main, xlab, ylab, xlim, ylim,
col, ...)
trong đó,
x, y: là các vector số liệu để vẽ tương ứng trên trục hoành và trục tung. Trong
trường hợp chỉ khai báo một thông số thì trục hoành được vẽ mặc định và trục
tung thể hiện các giá trị số liệu.
type: loại đồ thị cần vẽ.
type = "p": point (vẽ điểm);
type = "l": lines (vẽ đường);
type = "b": both (vẽ cả đường và điểm);
type = "o": overplotted (đường điểm dính liền);
type = "h": histogram (có dạng gậy thẳng đứng);

44
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

type = "s": step (dạng bước nhảy);


type = "n": no (không vẽ gì hết);
lty: lines type (nét đường): nét liền, nét đứt, nét chấm chấm, nét gạch gạch,. . .
lwd: lines width (độ dày của đường);
pch: plot character (kiểu ký tự điểm): tròn, tam giác, vuông, kim cương,. . .
main: đặt tên biểu đồ; xlab, ylab: tên trục hoành, trục tung;
xlim, ylim: đặt giới hạn các trục;
col: thêm các màu sắc,. . .

Ví dụ 3.4.1. Cho số liệu về lượng mưa của một số thủ đô (data file: cityrain.txt).
Vẽ biểu đồ đường thể hiện xu hướng biến động về lượng mưa theo các tháng của
các thủ đô? Thực hiện so sánh lượng mưa của các thủ đô trên?
> cityrain = read . table ( file . choose () , header = TRUE )
> attach ( cityrain )
> cityrain
plot ( Tokyo , type = ’o ’ , col = ’ blue ’ ,
ylim = c ( 0 , 2 5 0 ) , axes =F , ann = F )
axis ( 1 , at = 1 : 1 2 , lab = Month )
axis ( 2 , at = 5 0 * 0 : 2 5 0 )
box ()
lines ( NewYork , type = ’o ’ , pch = 2 2 , lty = 2 , col = ’ red ’)
lines ( London , type = ’o ’ , pch = 2 3 , lty = 3 , col = ’ green ’)
lines ( Berlin , type = ’o ’ , pch = 2 4 , lty = 4 , col = ’ black ’)
title ( main = ’ Monthly Rainfall in major cities ’ ,
col . main = ’ red ’ , font . main = 4 , xlab = ’ Month of year ’ ,
ylab = ’ Rainfall ( mm ) ’ , col . lab = rgb ( 0 ,0 . 5 ,0 ))
legend ( 1 , 2 5 0 , c ( ’ Tokyo ’ , ’ NewYork ’ , ’ London ’ , ’ Berlin ’) ,
col = c ( ’ blue ’ , ’ red ’ , ’ green ’ , ’ black ’) ,
pch = 2 1 : 2 4 , lty = 1 : 4 )

• Biểu đồ thanh - cột

Trong R, để vẽ biểu đồ cột ta dùng lệnh barplot()


barplot(height, names.arg, legend.text, beside, horiz, density, col, main,
xlab, ylab, xlim, ylim,...)
trong đó,

- height: là một vector hay một ma trận số liệu cần vẽ.

- names.agr: đặt tên dưới các cột hoặc nhóm.

- legend.text:(TRUE hoặc FALSE) tạo chú thích cho biểu đồ.


45
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

- beside: TRUE hoặc FALSE (mặc định là FALSE). Vẽ các cột chồng lên nhau
hay là xếp bên cạnh nhau.

- horiz: TRUE hoặc FALSE (mặc định là FALSE): Vẽ các cột nằm ngang hay là
thẳng đứng (mặc định là thẳng đứng).

- density: tạo mật độ cho các cột bằng các nét gạch chéo.

- col: thêm các màu sắc,. . .

Ví dụ 3.4.2. Bảng số liệu sau đây là phân phối mức độ giáo dục cao nhất cho
những người từ 25 đến 34 tuổi. Vẽ biểu đồ thanh để mô tả biến Percent.

46
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

Education Count Percent


Less than high school 4.6 12.1
High school graduate 11.6 30.5
Some college 7.4 19.5
Associate degree 3.3 8.7
Bachelor’s degree 8.6 22.6
Advanced degree 2.5 6.6

# Input data
Education = c ( ’ Not HS ’ , ’ HS ’ , ’ College ’ , ’ Associate ’ , ’ Bachelor ’ ,
’ Advanced ’)
Education
[ 1 ] " Not HS " " HS " " College " " Associate " " Bachelor " " Advanced "
Count = c ( 4 . 6 , 1 1 . 6 , 7 . 4 , 3 . 3 , 8 . 6 , 2 . 5 )
Count
[1] 4.6 11.6 7.4 3.3 8.6 2.5
Percent = c ( 1 1 . 1 , 3 0 . 5 , 1 9 . 5 , 8 . 7 , 2 2 . 6 , 6 . 6 )
Percent
[1] 11.1 30.5 19.5 8.7 22.6 6.6
level . edu = data . frame ( Education , Count , Percent )
level . edu
# Ve tho
barplot ( Percent )
# Them mau sac
barplot ( Percent , col = c ( ’ red ’ , ’ blue ’ , ’ yellow ’ , ’ orange ’ , ’ green ’ , ’ brown ’ ))
# Them ten cac cot
barplot ( Percent , col = rainbow ( 6 ) , names . arg = Education )
# Them ten truc Ox
barplot ( Percent , col = rainbow ( 6 ) , names . arg = Education , xlab = ’ Education
Degree ’)
# Them ten truc Oy
barplot ( Percent , col = rainbow ( 6 ) , names . arg = Education , xlab = ’ Education
Degree ’ , ylab = ’ Percent (%) ’)
# Them ten cho bieu do
barplot ( Percent , col = rainbow ( 6 ) , names . arg = Education , xlab = ’ Education
Degree ’ , ylab = ’ Percent (%) ’ , main = ’ The distribution of the highest
level of education ’)
# Noi rong truc Oy
barplot ( Percent , col = rainbow ( 6 ) , names . arg = Education , xlab = ’ Education
Degree ’ , ylab = ’ Percent (%) ’ , main = ’ The distribution of the highest
level of education ’ , ylim = c ( 0 ,4 0 ))
# Tao chu thich
barplot ( Percent , col = rainbow ( 6 ) , names . arg = Education , xlab = ’ Education
Degree ’ , ylab = ’ Percent (%) ’ , main = ’ The distribution of the highest
level of education ’ , ylim = c ( 0 ,4 0 ) , legend . text = Education )
# Dan cac gia tri
x = barplot ( Percent , col = rainbow ( 6 ) , names . arg = Education , xlab =

47
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

’ Education Degree ’ , ylab = ’ Percent (%) ’ , main = ’ The distribution of


the highest level of education ’ , ylim = c ( 0 ,4 0 ) , legend . text = Education )
text (x , y = Percent + 1 , labels = Percent )

Ngoài ra, biểu đồ thanh còn vẽ cho biến dạng bảng tần số. Cách làm
tương tự như phần trên. Tức là barplot(bảng tần số).

Ví dụ 3.4.3. Cho số liệu doanh thu (triệu USD) của ba sản phẩm A, B, C được
tiêu thụ ở một số thành phố lớn trên thế giới. (data file citysale.csv).

a) Vẽ biểu đồ cột so sánh doanh thu của các thành phố theo từng sản phẩm?

b) Vẽ biểu đồ cột so sánh doanh thu của ba sản phẩm theo từng thành phố?

a) citysale = read . csv ( file . choose () , header = T )


attach ( citysale )
names ( citysale )
[ 1 ] " City " " ProductA " " ProductB " " ProductC "
sale = as . matrix ( citysale [ , - 1 ]) # Bo di mot cot

48
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

sale
ProductA ProductB ProductC
[ 1 ,] 23 11 12
[ 2 ,] 89 6 56
[ 3 ,] 24 7 13
[ 4 ,] 36 34 44
[ 5 ,] 3 78 14
> rownames ( sale )= c ( ’ Seattle ’ , ’ London ’ , ’ Tokyo ’ , ’ Berlin ’ , ’ Mumbai ’)
sale
ProductA ProductB ProductC
Seattle 23 11 12
London 89 6 56
Tokyo 24 7 13
Berlin 36 34 44
Mumbai 3 78 14
barplot ( sale , beside =T , legend . text =T , ylim = c ( 0 ,1 0 0 ) , col = rainbow ( 5 ) ,
xlab = " Products " , ylab = " Revenue ( Million USD ) " , main = " Revenue of Cities by
Products " )

b) Đầu tiên ta cần chuyển vị ma trận sale để các thành phố lúc này trở thành các
cột của ma trận.
barplot ( t ( sale ) , beside =T , ylim = c ( 0 ,1 0 0 ) , col = rainbow ( 3 ) , xlab = " City " ,

49
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

ylab = " Revenue ( Million USD ) " , main = " Revenue of Products by City " )
# Tao chu thich tai toa do ( 1 0 ,1 0 0 )
legend ( 1 0 ,1 0 0 , legend = colnames ( sale ) , fill = rainbow ( 3 ))

50
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

• Biểu đồ tròn

Sử dụng lệnh pie(x, labels, density, col, main,...)

Ví dụ 3.4.4. Vẽ biểu đồ tròn cho biến Percent


pie ( Percent , col = rainbow ( 6 ) , labels = Education , main = ’ The
distribution of the highest level of education ’)
# Dan them tri so
phantram = paste ( Education , Percent , sep = " " )
phantram
[ 1 ] " Not HS 1 1 . 1 " " HS 3 0 . 5 " " College 1 9 . 5 " " Associate 8 . 7 "
[ 5 ] " Bachelor 2 2 . 6 " " Advanced 6 . 6 "
pie ( Percent , col = rainbow ( 6 ) , labels = phantram , main = ’ The distribution
of the highest level of education ’)

51
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

Ngoài ra, chúng ta cũng có thể vẽ biểu đồ tròn 3D. Sử dụng hàm: pie3D() trong
package plotrix
install . packages ( " plotrix " )
library ( plotrix )
slices <- c ( 1 0 , 1 2 , 4 , 1 6 , 8 )
lbls <- c ( ’ US ’ , ’ UK ’ , ’ Australia ’ , ’ Germany ’ , ’ France ’)
pie 3 D ( slices , labels = lbls , explode = 0 . 1 ,
main = " Pie Chart of Countries " )

52
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

• Biểu đồ phân bố thân lá

Biểu đồ thân lá thường được dùng để mô tả phân bố của số liệu có kích thước
nhỏ. Hàm sử dụng: stem(x, scale) hoặc stem.leaf(data, unit) trong package
“aplpack”, trong đó

- x, data: vector số liệu cần vẽ.

- scale: điều chỉnh đồ dài của phần thân.

- unit: đơn vị lá.

Ví dụ 3.4.5. Cho số liệu về tỷ lệ biết chữ của một số quốc gia Hồi giáo. Đọc file
literacy rates.csv, thực hiện các yêu cầu sau

a) Vẽ biểu đồ thân lá mô tả biến Female (tỷ lệ biết chữ của nữ).

b) Vẽ biểu đồ thân lá mô tả biến Male (tỷ lệ biết chữ của nam)

c) Vẽ biểu đồ thân lá cho cả hai biến trên cùng một thân để so sánh biến Male
và biến Female. Biểu đồ này được gọi là back to back stem plot (dùng hàm
stem.leaf.backback(x,y))

literacy = read . csv ( file . choose () , header = TRUE )


#a)
stem ( literacy $ Female , scale = 2 )

53
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

The decimal point is 1 digit ( s ) to the right of the |

2 | 9
3 | 18
4 | 6
5 |
6 | 038
7 | 0118
8 | 256
9 | 999

install . packages ( " aplpack " )


library ( aplpack )
stem . leaf ( literacy $ Female , unit = 1 )
1 | 2 : represents 1 2
leaf unit : 1
n: 17
1 2 | 9
3 3 | 18
4 4 | 6
5 |
7 6 | 038
(4) 7 | 0118
6 8 | 256
3 9 | 999
#c)
stem . leaf . backback ( literacy $ Female , literacy $ Male , m = 1 , unit = 1 )
______________________________
1 | 2 : represents 1 2 , leaf unit : 1
literacy $ Female
literacy $ Male
______________________________
1 9| 2 |
3 81| 3 |
4 6| 4 |
| 5 |0 1
7 830| 6 |88 3
(4) 8110| 7 |08 5
6 652| 8 |3459 (4)
3 999| 9 |24556 8
| 10 |000 3
______________________________
n: 17 17
______________________________

• Biểu đồ phân bố histogram Khác với biểu đồ thân lá, biểu đồ histogram
thường được dùng để mô tả bộ số liệu có kích thước lớn. Để vẽ histogram, ta
dùng lệnh hist()
hist(x, breaks,freq,include.lowest,right,labels, ...)
54
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

trong đó,
x: dữ liệu cần vẽ histogram.
breaks: thiết lập cách phân tổ dữ liệu.
freq: TRUE/FALSE (mặc định là TRUE). Nếu freq=T vẽ histogram tần số (mặc định).
Nếu freq=F thì vẽ histogram tần suất.
right: TRUE/FALSE (mặc định là TRUE). Nếu right =TRUE chia tổ theo kiểu (a;b].
Ngược lại nếu right=F thì phân tổ có dạng [a, b).
include.lowest: TRUE/FALSE (mặc định là TRUE),bao gồm giá trị nhỏ nhất nếu
right=T. Ngược lại, có bao gồm giá trị lớn nhất nếu right=F.
labels: TRUE/FALSE (mặc định là FALSE) hiện thị các tần số hoặc tần suất lên phía
trên các cột của histogram.

Ví dụ 3.4.6. Cho số liệu về lợi nhuận của các cửa hàng bán lẻ của một công ty
như sau. Đơn vị tính : Triệu đồng
20 35 23 52 47 31 27 44 55 24
34 58 49 60 36 43 22 25 48 56
56 41 24 58 27 46 54 39 35 42
43 22 46 51 48 42 51 44 40 31
29 46 30 49 52 47 33 51 41 43

a) Phân tổ số liệu trên thành 4 tổ và khoảng cách tổ bằng nhau. Trình bày kết
quả trên bảng tần số, tần suất.

b) Vẽ biểu đồ histogram minh họa cho câu a).


phanto = cut (x , breaks = 4 , right =F , include . lowest = T )
tanso = table ( phanto )
tanso
phanto
[ 2 0 ,3 0 ) [ 3 0 ,4 0 ) [ 4 0 ,5 0 ) [ 5 0 ,6 0 ]
10 9 19 12
tansuat = prop . table ( tanso )
tansuat
phanto
[ 2 0 ,3 0 ) [ 3 0 ,4 0 ) [ 4 0 ,5 0 ) [ 5 0 ,6 0 ]
0.20 0.18 0.38 0.24

hist (x , breaks = 4 , right =F , include . lowest =T , labels =T , ylim = c ( 0 ,2 5 ) ,


col = " lightblue " , main = c ( " Histogram of profit " ) , xlab = " Profit " )

55
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

# # Histogram cho tan suat va them duong mat do xac suat


hist (x , breaks = 4 , freq =F , right =F , labels =T , ylim = c ( 0 ,0 . 0 5 ) , col = " lightblue " ,
main = c ( " Histogram of profit " ) , xlab = " Profit " )
lines ( density ( x ) , col = ’ red ’)

56
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

Tự thực hành ví dụ sau: Cho số liệu về chỉ số IQ của 60 học sinh lớp 5 như sau:

145 139 126 122 125 130 96 110 118 118


101 142 134 124 112 109 134 113 81 113
123 94 100 136 109 131 117 110 127 124
106 124 115 133 116 102 127 117 109 137
117 90 103 114 139 101 122 105 97 89
102 108 110 128 114 112 114 102 82 101

a) Vẽ biểu đồ phân bố tần số histogram

b) Vẽ biểu đồ phân bố tần suất histogram và gắn thêm đường mật độ. Nhận xét
thông tin nhận được.

Ngoài ra, breaks có thể nhận giá trị là một vector. Xét ví dụ sau đây:

Ví dụ 3.4.7. Vẽ histogram cho dữ liệu phân phối chuẩn với trung bình 24, phương
sai 4.
57
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

normal <- rnorm ( 1 0 0 0 , 2 4 , 2 )


hist ( normal , col = ’ lightblue ’)
hist ( normal , breaks = 5 , main = ’ Normal Histogram ’ ,
col = heat . colors ( 5 ))
hist ( normal , breaks = 2 0 , main = ’ Normal Histogram ’ ,
col = heat . colors ( 5 ))
hist ( normal , breaks = c ( 1 7 ,2 0 ,2 2 ,2 5 ,2 8 ,3 0 ) ,
main = ’ Normal Histogram ’ , col = heat . colors ( 5 ))

• Biểu đồ tán xạ

Biểu đồ tán xạ dùng để thể hiện mối quan hệ của hai biến định lượng.
Hàm sử dụng: plot(x, y, type, lty, lwd, pch, main, xlab, ylab, xlim, ylim,
col, ...)

Ví dụ 3.4.8. Trong package MASS, có một dataset tên là cats, bao gồm các biến
Sex, Bwt (đơn vị kg), Hwt (g).
library ( MASS )
data ( cats )
cats
plot ( cats $ Bwt , cats $ Hwt , col = cats $ Sex )
abline ( lm ( cats $ Hwt ~ cats $ Bwt ) , col = ’ blue ’) # Duong hoi quy tuyen tinh
plot ( cats $ Bwt , cats $ Hwt , col = cats $ Sex , pch = 1 6 )
abline ( lm ( cats $ Hwt ~ cats $ Bwt ) , col = ’ blue ’)
cor ( cats $ Bwt , cats $ Hwt ) # He so tuong quan
[1] 0.8041274

58
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

59
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

3.4.3 Mô tả dữ liệu bằng các đặc trưng thống kê

Đặc trưng thống kê Hàm


Trung bình mean()
Trung vị median()
Phương sai var()
Độ lệch chuẩn sd()
Phân vị quantile(x, probs)
Phân vị thứ nhất Q1 quantile(x, probs = 0.25, type)
Phân vị thứ hai Q2 quantile(x, probs = 0.5, type)
Phân vị thứ ba Q3 quantile(x, probs = 0.75, type)
Độ trải giữa IQR IQR()
Giá trị nhỏ nhất min()
Giá trị lớn nhất max()
Tóm lược(min, max, Q1, median, Q2, Q3) summary()
Tần số table()
Tần suất prop.table()

Lưu ý: Yếu vị của một bộ dữ liệu là giá trị xuất hiện nhiều nhất trong bộ dữ liệu đó.
Câu lệnh:
freq=table()
names(freq)[freq==max(freq)]

3.4.4 Biểu đồ hộp và outliers

Ví dụ 3.4.9. Dưới đây là điểm kiểm tra học kỳ 1 môn nhập môn thống kê của 10 bạn
sinh viên.

80 75 92 85 75 98 90 75 80 90

a) Tìm trung bình, trung vị, phương sai, độ leehcj chuẩn, Q1, Q3, IQR.

b) Lập bảng tần số và bảng tần số tương đối cho dữ liệu trên.

score = c ( 8 0 ,7 5 ,9 2 ,8 5 ,7 5 ,9 8 ,9 0 ,7 5 ,8 0 ,9 0 ) # Nhap so lieu


score

60
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

[1] 80 75 92 85 75 98 90 75 80 90
mean ( score ) # Tinh trung binh
[1] 84
median ( score ) # Tinh trung vi
[1] 82.5
var ( score ) # Tinh phuong sai
[1] 67.55556
sd ( score ) # Tinh do lech chuan
[1] 8.219219
quantile ( score , probs = 0 . 2 5 ) # Tinh Q 1 theo type = 7
25%
76.25
quantile ( score , probs = 0 . 2 5 , type = 2 ) # Tinh Q 1 theo type = 2
25%
75
quantile ( score , probs = 0 . 7 5 ) # Tinh Q 3 theo type = 2
75%
90
quantile ( score , probs = 0 . 7 5 , type = 2 ) # Tinh Q 3 theo type = 2
75%
90
IQR ( score ) # Tinh do trai giua IQR theo type = 7
[1] 13.75
IQR ( score , type = 2 ) # Tinh do trai giua IQR theo type = 2
[1] 15
summary ( score ) # Tom tat so lieu bang mot lenh
Min . 1 st Qu . Median Mean 3 rd Qu . Max .
75.00 76.25 82.50 84.00 90.00 98.00

# Bang tan so
tanso = table ( score )
tanso
score
75 80 85 90 92 98
3 2 1 2 1 1
# Bang tan suat = tan so / n
tansuat = prop . table ( tanso )
tansuat
score
75 80 85 90 92 98
0.3 0.2 0.1 0.2 0.1 0.1
# Ghep tan so va tan suat thanh mot bang
bang = cbind ( tanso , tansuat )
bang
tanso tansuat
75 3 0.3
80 2 0.2
85 1 0.1
90 2 0.2
92 1 0.1
98 1 0.1

61
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

Biểu đồ hộp được tạo ra từ năm đặc trưng bao gồm Min, Q1, Median, Q3, Max. Trong
đó, Min và Max lần lượt là giá trị nhỏ nhất và giá trị lớn nhất khi đã loại bỏ các outliers
(các giá trị ngoại vi) ra khỏi số liệu. Outliers là các phần tử bất thường quá lớn hoặc
quá bé và chúng được xác định bằng nguyên tắc sau:

Outlier > Q3 + 1.5*IQR hoặc outlier < Q1 - 1.5*IQR

Hàm sử dụng: boxplot(x, col, main, xlab, ylab, xlim, ylim,...). Ngoài ra, ta
có thể xuất các đặc trưng Min, Q1, Median, Q3, Max, khoảng ước lượng cho trung vị
và các outliers (nếu có) qua hàm boxplot.stats().

Ví dụ 3.4.10. Vẽ biểu đồ hộp cho dữ liệu score ở ví dụ trên.

boxplot ( score , col = " blue " , xlab = " First Score " , ylab = " Score " ,
main = " The scores on the first exam in an introductory statistics " )
boxplot . stats ( score )
$ stats # lan luot la Min , Q 1 , Median , Q 3 , Max
[1] 75.0 75.0 82.5 90.0 98.0

$n
[1] 10

$ conf # Khoang uoc luong cho trung vi


[1] 75.0054 89.9946

$ out # outliers ( neu co )


numeric ( 0 )

62
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

Nhận xét: Biểu đồ hộp cho thấy không có outliers nào và biểu đồ không có râu dưới
vì Min trùng với Q1. Biểu đồ hộp cân xứng với trung vị nằm ngay chính giữa, chứng tỏ
số liệu không bị lệch.

Ví dụ 3.4.11. Vẽ biểu đồ hộp cho dữ liệu sau:

2.3 13.8 16.1 1.6 0.3 0.5 13.1 8.6 1.3 12.7
3.4 72.8 0.3 5.0 11.4 5.8 3.2 26.0 0.1 6.5

x = c(2.3, 13.8, 16.1, 1.6, 0.3, 0.5, 13.1, 8.6, 1.3, 12.7, 3.4, 72.8,
0.3, 5.0, 11.4, 5.8, 3.2, 26.0, 0.1, 6.5)
x
[1] 2.3 13.8 16.1 1.6 0.3 0.5 13.1 8.6 1.3 12.7 3.4 72.8
[13]0.3 5.0 11.4 5.8 3.2 26.0 0.1 6.5
boxplot (x , col = " red " )
boxplot . stats ( x )
$ stats
[1] 0.10 1.45 5.40 12.90 26.00

$n

63
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

[1] 20

$ conf
[1] 1.354729 9.445271

$ out
[1] 72.8

Nhận xét: ta thấy có một giá trị outlier là 72.8. Sau khi loại bỏ giá trị oulier này
thì max = 26.0, min = 0.1, Q1 = 1.45, median = 5.4, Q3 = 12.9. Số liệu bị lệch
phải do bên phải có ít số liệu hơn bên trái.

3.5 Mô tả dữ liệu bằng bảng

Phần này, sử dụng dữ liệu carprice.csv bao gồm một số biến sau:
Manufacturer: Tên nhà sản suất
Model: Các kiểu mẫu xe

64
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

Type: Các loại xe (xe có kích thước nhỏ, lớn, kích thước trung bình,
xe thể thao,\ldots)
Min.Price: giá thấp nhất
Max.Price: giá cao nhất
Price: Giá bình quân của các loại xe
MPG.city: (miles per gallon in city) số dặm chạy được trong thành phố trên
1 gallon nhiên liệu.
MPG.highway: (miles per gallon in highway) số dặm chạy được trong đường
cao tốc trên 1 gallon nhiên liệu.

3.5.1 Bảng một chiều

a) Dữ liệu định tính


Để tạo ra bảng tần số một chiều ta dùng hàm table() và bảng tần suất ta dùng
hàm prop.table()
car = read . csv ( file . choose () , header = T )
head ( car )
attach ( car )

Ta xét biến Type


tanso . Type = table ( Type )
tanso . Type
Type
Compact Large Midsize Small Sporty Van
16 11 22 21 14 9
tansuat . Type = prop . table ( tanso . Type )
tansuat . Type
Type
Compact Large Midsize Small Sporty Van
0.17204301 0.11827957 0.23655914 0.22580645 0.15053763 0.09677419
# dua ve ty le phan tram
tyle = paste ( round ( tansuat . Type * 1 0 0 ,2 ) , " % " , sep = " " )
tyle
[1] "17.2%" "11.83%" "23.66%" "22.58%" "15.05%" "9.68%"
# Ty le tich luy
tyle . tichluy = cumsum ( round ( tansuat . Type * 1 0 0 ,2 ))
tyle . tichluy
Compact Large Midsize Small Sporty Van
17.20 29.03 52.69 75.27 90.32 100.00

Ghép bảng tần số và tần suất lại

65
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

bang . Type = data . frame ( tanso . Type , tyle , tyle . tichluy , row . names = NULL )
bang . Type
Type Freq tyle tyle . tichluy
1 Compact 16 17.2% 17.20
2 Large 11 11.83% 29.03
3 Midsize 22 23.66% 52.69
4 Small 21 22.58% 75.27
5 Sporty 14 15.05% 90.32
6 Van 9 9.68% 100.00

b) Dữ liệu định lượng


Để lập các bảng tần số, tần suất đối với dữ liệu định lượng thì trước hết ta phải
phân tổ dữ liệu (chia nhóm). Sau đó, ta thực hiện tương tự như trên.
Ta xét biến Price:
Hàm chia dữ liệu là cut()
cut(x, breaks, labels = NULL, right = TRUE, ...)
x: dữ liệu cần chia nhóm
breaks: số nhóm cần chia hoặc chia nhóm theo chỉ định.
labels: dán nhãn cho các nhóm.
right: mặc định là TRUE chia nhóm dạng (a; b]; Nếu right = FALSE thì chia
nhóm có dạng [a;b).
chianhom 1 = cut ( Price , breaks = 5 , right = F ) # Chia bien Price thanh 5 nhom dang [ a ; b )
tanso . Price = table ( chianhom 1 ) # Bang tan so
tanso . Price
chianhom 1
[ 7 . 3 5 ,1 8 . 3 ) [ 1 8 . 3 ,2 9 . 2 ) [ 2 9 . 2 ,4 0 . 1 ) [ 4 0 . 1 ,5 1 ) [ 5 1 ,6 2 )
48 31 11 2 1
tansuat . Price = prop . table ( tanso . Price ) # Ty le phan tram
tyle . Price = paste ( round ( tansuat . Price * 1 0 0 ,2 ) , " % " , sep = " " )
tyle . Price
[1] "51.61%" "33.33%" "11.83%" "2.15%" "1.08%"
tichluy . Price = cumsum ( round ( tansuat . Price * 1 0 0 ,2 )) # Ty le tich luy
tichluy . Price
[ 7 . 3 5 ,1 8 . 3 ) [ 1 8 . 3 ,2 9 . 2 ) [ 2 9 . 2 ,4 0 . 1 ) [ 4 0 . 1 ,5 1 ) [ 5 1 ,6 2 )
51.61 84.94 96.77 98.92 100.00
# Bang ghep
bang . Price = data . frame ( tanso . Price , tyle . Price , tichluy . Price ,
row . names = NULL )
bang . Price
chianhom 1 Freq tyle . Price tichluy . Price
1 [ 7 . 3 5 ,1 8 . 3 ) 48 51.61% 51.61
2 [ 1 8 . 3 ,2 9 . 2 ) 31 33.33% 84.94
3 [ 2 9 . 2 ,4 0 . 1 ) 11 11.83% 96.77
4 [ 4 0 . 1 ,5 1 ) 2 2.15% 98.92

66
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

5 [ 5 1 ,6 2 ) 1 1.08% 100.00

Giả sử những chiếc xe có giá dưới 20 (đơn vị $1000) là loại xe có giá thấp; xe có giá trên
20 và dưới 40 là thuộc loại giá trung bình; còn xe có giá từ 40 trở lên là giá cao. Hãy
chia biến Price theo ba nhóm trên, dán nhãn tương ứng, thống kê tần số đếm được và
tính tỷ lệ phần trăm?
# Chia nhom co dan nhan
Gia = cut ( Price , breaks = c ( 7 , 2 0 , 4 0 , 6 5 ) , labels = c ( " Thap " , " Trungbinh " , " Cao " ) , right = F )
Gia
Freq . Price = table ( Gia )
Freq . Price
Gia
Thap Trungbinh Cao
61 29 3
f = round ( prop . table ( Freq . Price )* 1 0 0 , 2 )
Relative = paste (f , " % " , sep = " " )
bang . p = data . frame ( Freq . Price , Relative , row . names = NULL )
bang . p
Gia Freq Relative
1 Thap 61 65.59%
2 Trungbinh 29 31.18%
3 Cao 3 3.23%

3.5.2 Bảng hai chiều

Đây còn gọi là bảng chéo (cross table) thể hiện thông tin liên hệ theo hai biến. Chẳng
hạn, thống kê số xe bán được theo loại xe (biến Type) và theo giá (thấp, trung bình,
cao).
freq 1 = table ( Type , Gia )
freq 1
Gia
Type Thap Trungbinh Cao
Compact 11 5 0
Large 3 8 0
Midsize 8 11 3
Small 21 0 0
Sporty 10 4 0
Van 8 1 0

Nhận xét: Xe loại kích thước nhỏ và giá thấp có số lượng nhiều nhất: 21 chiếc; Xe có giá
cao có số lượng 3 chiếc và chúng thuộc loại xe có kích thước trung bình (Midsize). . . Có
thể sử dụng hàm xtabs() cũng cho kết quả tương tự nhưng nó có ưu điểm là ta có thể

67
THỰC HÀNH THỐNG KÊ KHOA HỌC SỰ SỐNG

dễ dàng lập bảng với số chiều lớn hơn.


freq 2 = xtabs (~ Type + Gia )
freq 2
Gia
Type Thap Trungbinh Cao
Compact 11 5 0
Large 3 8 0
Midsize 8 11 3
Small 21 0 0
Sporty 10 4 0
Van 8 1 0
prop 1 = round ( prop . table ( freq 1 ) , 2 ) # Tinh ty le
prop 1
Gia
Type Thap Trungbinh Cao
Compact 0 . 1 2 0.05 0.00
Large 0.03 0.09 0.00
Midsize 0 . 0 9 0.12 0.03
Small 0.23 0.00 0.00
Sporty 0.11 0.04 0.00
Van 0.09 0.01 0.00
margin . table ( prop 1 , 1 ) # Tinh tong cac ty le theo hang
Type
Compact Large Midsize Small Sporty Van
0.17 0.12 0.24 0.23 0.15 0.10
margin . table ( prop 1 ,2 ) # Tinh tong cac ty le theo cot
Gia
Thap Trungbinh Cao
0.67 0.31 0.03

68

You might also like