HO CHI MINH
CITY
UNIVERSITY
OF
BÁO CÁO BÀI TẬP LỚN 2
MÔN XÁC SUẤT THỐNG KÊ
GVHD: TS. Nguyễn Bá Thi
Thực hiện: Nguyễn Việt Ngân - 1914289
(Lớp: L11 – Nhóm: 04)
Mục lục
PHẦN CHUNG
....................................................................................................................................................
3
BÀI 1..........................................................................................................................................3
BÀI 2........................................................................................................................................16
PHẦN RIÊNG
..................................................................................................................................................
33
PHẦN CHUNG
BÀI 1
Câu hỏi:
1. Đọc dữ liệu (Import data):
gia_nha <- read.csv("C:/Users/DELL/Desktop/gia_nha.csv")
Liệt kê các biến có trong giá nhà
names(gia_nha)
##
##
[1] "X.2"
[5] "date"
"bathrooms"
##
[9] "sqft_living
"waterfront"
## [13] "view"
"sqft_above"
## [17] "sqft_baseme
"zipcode"
## [21] "lat"
"sqft_lot15"
2.
Làm sạch dữ liệu (Data cleaning)
a) Hãy trích ra một dữ liệu con đặt tên là new_DF chỉ bao gồm các
biến chính mà ta quan tâm như đã trình bày trong phần giới thiệu dữ
liệu. Từ câu hỏi này về sau, mọi yêu cầu xử lý đều dựa trên tập dữ
liệu con new_DF này.
new_DF=data.frame(gia_nha[,c(6,23,11,14,16,9)])
head(new_DF)
#
price sqft_living15 floors condition sqft_above
sqft_living
## 1
1180
## 2
2570
## 3
770
## 4
1960
## 5
1680
## 6 1225000
5420
b) Kiểm tra các dữ liệu bị khuyết trong tập tin và đề xuất phương
pháp thay thế cho những dữ liệu bị khuyết này nếu có dữ liệu bị
khuyết:
Kiểm tra và xuất ra vị trí dịng có giá trị khuyết:
apply(is.na(new_DF),2,which)
#
$price
#
[1] 26 54 151 174 236 352 375 419 544 557 561 585 594 638
702 718 749 823 939
#
[20] 995
##
## $sqft_living15
#
integer(0)
#
$floors
#
integer(0)
#
$condition
#
integer(0)
#
$sqft_above
#
integer(0)
#
$sqft_living
#
integer(0)
#
#
#
#
Thống kê các giá trị khuyết của new_DF:
colSums(is.na(new_DF))
## price sqft_living15 floors condition sqft_above
##
0
#
##
sqft_living
0
Nhận xét: Dựa vào kết quả thu được ta nhận thấy có 20 giá trị
khuyết ở biến price. Do đó ta sẽ đưa ra phương pháp xử lý số liệu là
như sau: Do số quan sát chỉ chứa 20 giá trị khuyết chiếm rất thấp số
với tổng quan sát trên toàn bộ dữ liệu (20/2163 < 10%) vì vậy ta chọn
phương pháp xóa dữ liệu khuyết:
new_DF=na.omit(new_DF)
3. Làm rõ dữ liệu (Data visualization)
Chuyển đổi các biến price, sqft_living15, sqft_above, sqft_living lần lượt
thành log(price), log(sqft_living15), log(sqft_above ), log(sqft_living). Từ đây
mọi sự tính tốn với các biến trên được hiểu là đã qua biến đổi dạng log.
new_DF[,c(1,2,5,6)]=log10(new_DF[,c(1,2,5,6)])
a) Tính các giá trị thống kê mơ tả đối với các biến liên
tục: Trung bình (mean)
mean=apply(new_DF[,c(1,2,5,6)],2,mean)
Trung vị (median)
median=apply(new_DF[,c(1,2,5,6)],2,median)
Độ lệch chuẩn (sd)
sd=apply(new_DF[,c(1,2,5,6)],2,sd)
Giá trị lớn nhất (max)
max=apply(new_DF[,c(1,2,5,6)],2,max)
Giá trị nhỏ nhất (min)
min=apply(new_DF[,c(1,2,5,6)],2,min)
Xuất các giá trị vừa tìm được dưới dạng bảng
descriptive = data.frame(mean,median,sd,max,min)
descriptive
##
## price
## sqft_living15 3.274340 3.264818
## sqft_above
## sqft_living
Bảng thông kê số lượng cho từng chủng loại đối với các biến phân loại
Bảng thống kê số lượng cho biến floors
table(new_DF$floors)
##
##
##
Bảng thống kê số lượng cho biến condition
table(new_DF$condition)
##
##
1
#
2
30
3
172 14016
4
5
5677
1698
Dùng ham hist() đê ve đô thi phan phôi cua biên price.
hist(new_DF$price,main="Histogram of
price",labels=T,col="pink")
Nhận xét: Dựa vào đồ thị trên ta thấy với mức giá nhà phân bố
tập trung trong khoảng giữa của đồ thị. Và đồ thị cũng có dạng
giống với dạng phân phối chuẩn.
Dùng ham boxplot() ve phan phôi cua biên price cho tưng nhom phan loai cua
biên floor và biến condition.
boxplot(price~floors,main="Boxplot of house price for each
category of floor",data=new_DF,col="cyan")
boxplot(price~condition,main="Boxplot of house price for each
category of condition",data=new_DF,col="orange")
Nhận xét: Dựa vào các biểu đồ boxplot ta nhận thấy có nhiều
ngoại lai của biến price theo biến floors và condition.
Dùng lẹnh pairs() ve cac phan phôi cua biên price lân luơt theo cac biên
sqft_living15, sqft_above va sqft_living.
* Vẽ phân phối biến price theo sqft_living15:
pairs(price~sqft_living15, main="price of house price for
sqft_living15", data=new_DF,col="violet")
* Vẽ phân phối biến price theo sqft_above:
pairs(price~sqft_above, main="price of house price for
sqft_above", data=new_DF,col="violet")
* Vẽ phân phối biến price theo sqft_living:
pairs(price~sqft_living, main="price of house price for
sqft_living", data=new_DF,col="violet")
Nhận xét: Từ các đồ thị phân tán của biến price theo sqft_living15,
sqft_above, sqft_living, ta nhận thấy các biến sqft_living15, sqft_above,
sqft_living có quan hệ tuyến tính với price, nói rõ hơn là quan hệ đồng biến.
Có thể nhận thấy khi các biến sqft_living15, sqft_above, sqft_living tăng lên
thì biến price có xu hướng tăng theo.
4. Xây dựng các mơ hình hồi quy tuyến tính (Fitting linear regression
models)
Chúng ta muốn khám phá rằng có những nhân tố nào và tác động như thế
nào đến giá nhà ở quận King.
Ta cần xét các biến chính trong việc xây dựng mơ hình hồi quy.
a) Xét mơ hình hồi quy tuyến tính bao gồm biến price là một biến
phụ thuộc, và tất cả các biến còn lại đều là biến độc lập. Hãy d ùùng
lệnh lm() để thực thi mơ hình hồi quy tuyến tính bội.
* Thay các biến phân loại thành biến nhân tố.
new_DF$floors=as.factor(new_DF$floors)
new_DF$condition=as.factor(new_DF$condition)
Price là một hàm số phụ thuộc vào năm biến cịn lại. Các thơng tin về mơ
hình hồi quy tuyến tính sẽ được đưa vào một object có tên là m1.
m1=lm(price~sqft_living15 + sqft_above + sqft_living + floors +
condition, data=new_DF)
summary(m1)
##
#
Call:
# lm(formula = price ~ sqft_living15 + sqft_above +
sqft_living +
# floors + condition, data = new_DF)
##
## Residuals:
##
Min
#
-0.55193 -0.11785
#
Coefficients:
#
##
## (Intercept)
## sqft_living15
## sqft_above
## sqft_living
## floors1.5
## floors2
0.00346
0.10477
0.65127
## floors2.5
## floors3
## floors3.5
## condition2
## condition3
## condition4
## condition5
## --## Signif. codes:
1
##
## Residual standard error: 0.1601 on
## Multiple R-squared:
0.51,
Adjusted R-squared:
0.5097
## F-statistic:
b) Dựa vào kết quả của mơ hình hồi quy tuyến tính trên, những biến
nào bạn sẽ loại khỏi mơ hình tương ứng với mức tin cậy 5%?
Với mức tin cậy α = 0.05
Giả thiết:
H: biến khơng có ý nghĩa thống kê.
H: biến có ý nghĩa thống kê.
Xét giá trị kiểm định t (Pr) của các biến độc lập:
Pr (sqft_living15) < 2e-16 = 2*10-16 < 0.05 → bác bỏ giả thuyết H Pr
(floors) có các giá trị đều nhỏ hơn 0.05 → bác bỏ giả thuyết H
Pr (condition 2) có các giá trị lớn hơn 0.05 → chấp nhận giả thuyết H
Pr (condition 3, condition 4, condition 5) < 0.05 → bác bỏ giả thuyết
H Pr (sqft_above) = 2e-16 < 0.05 → bác bỏ giả thuyết H
Pr (sqft_living) = 2e-16 < 0.05 → bác bỏ giả thuyết H
Như vậy, với mức tin cậy 5%, ta sẽ loại bỏ biến “condition 2” khỏi
mơ hình hồi quy tuyến tính trên.
c) Xét 2 mơ hình tuyến tính cùùng bao gồm biến price là biến phụ
thuộc nhưng:
mơ hình m1 chứa tất cả các biến cịn lại là biến độc lập
mơ hình m2 là loại bỏ biến condition từ mơ hình M1
m2=lm(price~sqft_living15 + sqft_above + sqft_living + floors,
data=new_DF)
summary(m2)
##
#
#
Call:
lm(formula = price ~ sqft_living15 + sqft_above +
sqft_living +
# floors, data = new_DF)
##
## Residuals:
##
Min
#
-0.5583 -0.1188
#
Coefficients:
0.0035
0.1066
0.6410
#
##
## (Intercept)
## sqft_living15
## sqft_above
## sqft_living
## floors1.5
## floors2
## floors2.5
## floors3
## floors3.5
#
--#
Signif. codes:
0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' '
#
Residual standard error: 0.1614 on 21584 degrees of freedom
#
Multiple R-squared:
#
F-statistic:
1
##
0.5019, Adjusted R-squared:
2718 on 8 and 21584 DF,
Dùùng lệnh anova() để đề xuất mơ hình hồi quy hợp lý hơn.
anova(m1,m2)
## Analysis of Variance Table
0.5017
p-value: < 2.2e-16
##
# Model 1: price ~ sqft_living15 + sqft_above + sqft_living +
floors + condition
#
Model 2: price ~ sqft_living15 + sqft_above + sqft_living +
floors
##
Res.Df
RSS Df Sum of Sq
#
1
21580 553.32
#
2
21584 562.49 -4
#
---
#
Signif. codes:
F
Pr(>F)
-9.1665 89.376 < 2.2e-16 ***
0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' '
1
Giả thuyết
H: Hai mơ hình tuyến tính như nhau
H: Hai mơ hình tuyến tính khác nhau
Nhận xét: Vì kết quả thu được trong bảng Anova cho 2 mơ hình m1 và m2 là
Pr(>F) = 2,2e- 16 nhỏ hơn 0.05 nên ta bác bỏ H. Điều đó chỉ ra rằng 2 mơ
hình là khác nhau.
Do đó ta sẽ cân nhắc việc chọn mơ hình m1 hay mơ hình m2. Đối
với mơ hình m2, biến loại bỏ đi từ mơ hình m1 là condition, mà biến
condition ta khơng loại bỏ khỏi mơ hình (đã xét ở câu b) do đó ta sẽ
có chọn mơ hình m1 sẽ hợp lý hơn.
Mặt khác, ta có thể xét hệ số Multiple R-squared (hệ số xác định)
ở mơ hình m1 = 0,51 > hệ số Multiple R-squared (hệ số xác định) ở
mơ hình m2 = 0,5019. Tức có nghĩa là mơ hình m1 cho ta biết sự thay
đổi của biến price được giải thích bởi các biến độc lập tốt hơn so với
mơ hình m2. Hoặc ta so sánh RSS (tổng bình phương sai lệch giữa
thực tế
và dự báo) của m1 < m2
Theo kết quả trên, mơ hình M1 hợp lý hơn.
d) Chọn mơ hình hợp lý hơn từ câu (c) hãy suy luận sự tác động của các
biến lên giá nhà.
Từ câu c, ta chọn mơ hình m1 là mơ hình hợp lý hơn.
Biến price là một biến phụ thuộc vào 5 biến độc lập: sqft_living15, floors,
condition, sqft_above, sqft_living. Dựa trên thơng tin của mơ hình m1, ta
có đường hồi quy tuyến tính mẫu như sau:
price = 2.308027 + 0.462153 (sqft_living15) + 0.078713 (floors1.5) +
0.029366 (floors2) + 0.162118 (floors2.5) + 0.165894 (floors3) +
0.215827 (floors3.5) + 0.008113 (condition2) + 0.070449 (condition3) +
0.090356 (condition4) + 0.144105 (condition5) -0.142451 (sqft_above) +
0.670249 (sqft_living)
Các giá trị β của bốn biến độc lập đều khác 0, cho thấy chúng đều có tác động
đến price. Mối liên hệ này có ý nghĩa thống kê.
Xét đạo hàm theo từng biến độc lập, ta thấy mức độ ảnh hưởng như sau:
sqft_living15 tăng 1 đơn vị, price tăng 0.462153 đơn vị.
sqft_above tăng 1 đơn vị, price giảm 0.142451 đơn vị.
sqft_living tăng 1 đơn vị, price tăng 0.670249 đơn vị.
e) Từ mơ hình hồi quy hợp lý nhất từ câu (c) hãy dùùng lệnh plot()
để vẽ đồ thị biểu thị sai số hồi quy (residuals) và giá trị dự báo
(fitted values). Nêu ý nghĩa và nhận xét đồ thị.
plot(m1,which=1)
Ý nghĩa: đồ thị trên biểu thị sai số hồi quy và giá trị dự báo cho biến
phụ thuộc price.
Nhận xét: Các giá trị residuals và fitted values chủ yếu tập trung ở góc phần tư
thứ nhất và phần tư thứ tư, dao động đối xứng quanh đường y = 0.
- Đường thẳng chính giữa chính là đường 0 => sai số hồi quy (XSHQ)= 0
- Đường XSHQ đỏ càng gần đường 0 càng chính xác
Kết luận: Giá nhà khi đó được dự báo chính xác nhất do khoảng cách gần
đường 0 nhất.
5. Dự báo (Predictions)
Từ mơ hình bạn chọn trong câu (c), hãy dùùng lệnh (predict) để dự báo giá nhà
tại 2 thuộc tính như sau:
x1: sqft_living15 = mean(sqft_living15), sqft_above = mean(sqft_above),
sqft_living = mean(sqft_living), floor = 2, condition = 3
x2: sqft_living15 = max(sqft_living15), sqft_above = max(sqft_above),
sqft_living = max(sqft_living), floor =2, condition = 3.
So sánh khoảng tin cậy cho 2 giá trị dự báo này.
Khai báo biến
X1=data.frame(sqft_living15=mean(new_DF$sqft_living15),sqft_abo
ve=mean(new_DF$sqft_above),sqft_living=mean(new_DF$sqft_living) ,floors="2",condition="3")
X2=data.frame(sqft_living15=max(new_DF$sqft_living15),sqft_abov
e=max(new_DF$sqft_above),sqft_living=max(new_DF$sqft_living),fl
oors="2",condition="3")
Dự báo giá nhà tại thuộc tính X1:
predict_X1=predict(m1,X1,interval = "confidence")
predict_X1
##
fit
lwr
upr
## 1 5.66139 5.657203 5.665577
Dự báo giá nhà tại thuộc tính X2:
predict_X2=predict(m1,X2,interval = "confidence")
predict_X2
##
fit
lwr
upr
## 1 6.364003 6.353382 6.374624
So sánh khoảng tin cậy của hai dự báo của X1 và X2:
*Tạo bảng thể hiện dự báo giá nhà(có thể hiện độ dài khoảng tin cậy) của hai
biến X1 và X2:
pred=data.frame(rbind(predict_X1,predict_X2))
pred=data.frame(rbind(predict_X1,predict_X2))
row.names(pred)=c("X1","X2")
pred$range=pred$upr-pred$lwr
pred
##
fit
lwr
upr
range
#
X1 5.661390 5.657203 5.665577 0.008374017
#
X2 6.364003 6.353382 6.374624 0.021242160
Nhận xét: Với khoảng tin cậy 95%, ta thấy được độ dài khoảng tin cậy giá trị
dự báo của X1 < X2 nên ta có thể kết luận với tập liệu từ X1, ta có thể thu
được một giá trị dự báo chính xác hơn so với X2.
BÀI 2
Câu hỏi:
1. Đọc dữ liệu (Import data):
diem_so <- read.csv("C:/Users/DELL/Desktop/gia_nha.csv")
names(diem_so)
##
[1] "X"
"address"
##
[6] "famsize"
"Mjob"
## [11] "Fjob"
"studytime"
# [16] "failures" "schoolsup" "famsup" "paid"
"activities"
#
[21] "nursery" "higher" "internet" "romantic" "famrel"
#
[26] "freetime" "goout" "Dalc" "Walc" "health"
## [31] "absences"
"G1"
"G2"
"G3"
2.
Làm sạch dữ liệu (Data cleaning)
a) Hãy trích ra một dữ liệu con đặt tên là new_DF chỉ bao gồm các
biến chính mà ta quan tâm như đã trình bày trong phần giới thiệu.
Từ câu hỏi này về sau, mọi yêu cầu xử lý đều dựa trên tập dữ liệu
con new_DF này.
new_DF=data.frame(diem_so[,c(32,33,34,15,16,31,22,4)])
head(new_DF)
#
G1 G2 G3 studytime failures absences higher age
## 1
5
## 2
5 NA
## 3
7
##415
## 5
6
##615 NA 15
b) Kiểm tra các dữ liệu bị khuyết trong tập tin. (Các câu lệnh tham
khảo: is.na(), which(), apply()). Nếu có dữ liệu bị khuyết, hãy đề xuất
phương pháp thay thế cho những dữ liệu này.
Kiểm tra và xuất ra vị trí dịng có giá trị khuyết:
apply(is.na(new_DF),2,which)
#
$G1
#
integer(0)
#
$G2
#
##
##
#
$G3
#
integer(0)
#
$studytime
#
integer(0)
#
$failures
#
integer(0)
#
#
##
#
$absences
#
integer(0)
#
$higher
#
integer(0)
#
$age
#
integer(0)
#
#
Thống kê các giá trị khuyết của new_DF:
colSums(is.na(new_DF))
##
higher
##
0
Nhận xét: Dựa vào kết quả thu được ta nhận thấy có 5 giá trị khuyết ở biến
G2.Do đó ta sẽ đưa ra phương pháp xử lý số liệu là như sau: Do số quan sát
chỉ chứa 20 giá trị khuyết chiếm rất thấp số với tổng quan sát trên toàn bộ dữ
liệu (5/395 < 10%) vì vậy ta chọn phương pháp xóa dữ liệu khuyết:
new_DF=na.omit(new_DF)
3.
Làm rõ dữ liệu (Data visualization)
a) Đôi vơi cac biên lien tuc, hay tinh cac gia tri thông ke mo ta bao
gôm: trung binh, trung vi, đọ lẹch chuân, gia tri lơn nhât va gia tri nho
nhât. Xuât kêt qua duơi dang bang. (Ham gơi y: mean(), median(),
sd(), min(), max() , apply(), as.data.frame(), rownames())
mean=apply(new_DF[,c(1,2,3,6,8)],2,mean)
median=apply(new_DF[,c(1,2,3,6,8)],2,median)
sd=apply(new_DF[,c(1,2,3,6,8)],2,sd)
max=apply(new_DF[,c(1,2,3,6,8)],2,max)
min=apply(new_DF[,c(1,2,3,6,8)],2,min)
descriptive = data.frame(mean,median,sd,max,min)
descriptive
##
##
G1
##
G2
##
G3
## absences
## age
b) Đôi vơi cac biên phan loai, hay lạp mọt bang thông ke sô luơng
cho tưng chung loai.
table(new_DF$studytime)
##
##
#
1
2
3
4
105 194 64 27
table(new_DF$failures)
#
##
#
0
1
2
3
307 50 17 16
table(new_DF$higher)
#
#
no yes
#
20 370
c) Hay dùng ham hist() đê ve đô thi phan phôi cua biên G3.
hist(new_DF$G3,main = "histogram of G3",labels=T,col="cyan")
Nhận xét: Nhìn vào biểu đồ, ta nhận thấy điểm cuối khóa (biến G3) của sinh
viên phần lớn tập trung ở mức từ 6 – 16 điểm, cao nhất ở mức 8 – 10 điểm,
thấp nhất ở mức 2 – 4 điểm.
Đồ thị có cột đầu tiên bị lệch so với đồ thị phân phối chuẩn, có thể nói cột
đầu tiên là yếu tố ngoại lai nên nếu loại bỏ cột đầu tiên thì độ thị có dạng gần
giống phân phối chuẩn.
d) Hay dùng ham boxplot() ve phan phôi cua biên G3 cho tưng
nhom phan loai cua biên studytime, failures, va biên higher.
boxplot(G3~studytime,main ="Boxplot of G3 for each category of
studytime",data=new_DF,col="red")
boxplot(G3~failures,main ="Boxplot of G3 for each category of
failures",data=new_DF,col="yellow")
boxplot(G3~higher,main ="Boxplot of G3 for each category of
higher",data=new_DF,col="green")
Nhận xét: Nhìn chung, nhóm học sinh có thời gian tự học nhiều hơn sẽ
có điểm cuối kì cao hơn.
e) Dùng lẹnh pairs() ve cac phan phôi cua biên G3 lân luơt theo
cac biên G2, G1, age, va absences.
pairs(G3~G2, main="Phan phoi diem thi CK theo diem HK2",
data=new_DF)
pairs(G3~G1, main="Phan phoi diem thi CK theo diem HK1",
data=new_DF)
pairs(G3~age, main="Phan phoi diem thi CK theo tuoi",
data=new_DF)