Dựa trên kết quả thu được, ta nhận thấy có các giá trị khuyết tại biến price.. Ta có các phương pháp xử lý các giá trị khuyết như sau: Phương pháp 01: Deletionxoá: phương p
Trang 1ĐẠI HỌC QUỐC GIA ĐẠI HỌC BÁCH KHOA TP HỒ CHÍ MINH
BÀI TẬP LỚN SỐ 2 MÔN XÁC SUẤT THỐNG KÊ
ĐỀ TÀI:
L P L10 - NHÓM 1 - HK 202 Ớ
Gi ng viên h ng d n: Nguy n ình Huy ả ướ ẫ ễ Đ
Thành phố Hồ Chí Minh – 2021
Trang 2Bài tập 1 Tập tin "gia_nha.csv" chứa thông tin về giá bán ra thị trường (đơn vị đô la)
của 21613 ngôi nhà ở quân King nước Mỹ trong khoảng thời gian từ tháng 5/2014 đến 5/2015 Bên cạnh giá nhà, dữ liệu còn bao gồm các thuộc tính mô tả chất lượng ngôi nhà Dữ liệu gốc được cung cấp tại:
https://www.kaggle.com/harlfoxem/housesalesprediction
price: Giá nhà được bán ra
sqft_living15: Diện tích trung bình của 15 ngôi nhà gần nhất trong khu dân cư
floors: Số tầng của ngôi nhà được phân loại từ 1-3.5
condition: Điều kiện kiến trúc của ngôi nhà từ 1 − 5, 1: rất tệ và 5: rất tốt
sqft_above: Diện tích ngôi nhà
sqft_living: Diện tích khuôn viên nhà
1.Đọc dữ liệu (Import data): Hãy dùng lệnh read.csv() để đọc tệp tin
Thực hiện dòng lệnh:
>data= read.csv("D:/gia_nha.csv", header=T)
>attach(data)
Giải thích: Đọc tệp tin và lưu dữ liệu với tên là: “data”
Đưa dataframe “data” vào hệ thống
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
Thực hiện dòng lệnh:
>new_DF = data.frame(price,sqft_living15,floors,condition,sqft_above,sqft_living)
>detach(data)
>attach(new_DF)
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 bị khuyết này
Dữ liệu khuyết (missing data): Dữ liệu bị thiếu (missing values) đóng một vai trò quan trọng trong thống kê và phân tích dữ liệu Thông thường, missing values không nên bị bỏ qua mà cần được nghiên cứu cẩn thận để xem xét xem điều gì khiến cho các missing values này bị thiếu Trong R, NA được sử dụng để thể hiện các giá trị không tồn tại (not available) hay bị thiếu (missing) theo nghĩa thống kê Kí hiệu: TRUE Xác định các dữ liệu bị khuyết trong tập tin:
Thực hiện dòng lệnh:
>apply(is.na(new_DF), 2, which)
Kết quả thu được:
Trang 3Dựa trên kết quả thu được, ta nhận thấy có các giá trị khuyết tại biến price Do đó, ta cần xử đưa ra các phương pháp cho các giá trị khuyết đó
Ta có các phương pháp xử lý các giá trị khuyết như sau:
Phương pháp 01: Deletion(xoá): phương pháp này được dùng khi khi xác suất thiếu
biến là như nhau cho tất cả các quan sát Phương pháp này được thực hiện bởi 2 cách: List Wise Deletion and Pair Wise Deletion
List wise deletion: xóa các quan sát mà bất kỳ biến nào bị thiếu, nhưng phương pháp này có một lỗ hỗng bởi việc xoá quan sát cua bất cứ biến nào bị thiếu này sẽ làm giảm sức mạnh của mô hình vì nó xóa toàn bộ hàng quan sát trong đó dữ liệu bị thiếu
Pair Wise Deletion: chúng ta sẽ thực hiện phân tích với tất cả các trường hợp có các biến quan tâm Ưu điểm của phương pháp này là, nó giữ được nhiều trường hợp có sẵn để phân tích Một trong những nhược điểm của phương pháp này, nó sử dụng cỡ mẫu khác nhau cho các biến khác nhau
Phương pháp 02: Mean/ Mode/ Median Imputation: là một phương pháp để điền vào
các giá trị còn thiếu với các giá trị ước tính Mục tiêu là sử dụng các mối quan hệ đã biết có thể được xác định trong các giá trị hợp lệ của tập dữ liệu để hỗ trợ ước tính cho các giá trị còn thiếu Mean/ Mode/ Median Imputation là một trong những phương pháp được sử dụng thường xuyên nhất Ta có hai cách sử dụng:
Generalized Imputation: Trong trường hợp này, ta tính giá trị trung bình hoặc trung vị cho tất cả các giá trị không bị thiếu của biến đó sau đó thay thế giá trị bị thiếu bằng giá trị trung bình hoặc trung vị
Similar case Imputation: trong trường hợp này, ta cũng tính các giá trị trung bình nhưng các giá trị này sẽ được tính riêng lẻ theo từng đối tượng của các giá trị không bị thiếu , sau đó thay các giá trị trung bình đã được tính theo từng đối tượng trước đó
Phương pháp 03: Prediction Model (mô hình dự đoán): tạo mô hình dự đoán để ước
tính các giá trị sẽ thay thế dữ liệu bị thiếu Trong trường hợp này, chia tập dữ liệu của mình thành hai tập: Một tập không có giá trị bị thiếu cho biến và một tập khác có giá trị bị thiếu Tập dữ liệu đầu tiên trở thành tập dữ liệu huấn luyện của mô hình trong khi
Trang 4thiếu được coi là biến mục tiêu Tiếp theo, chúng tôi tạo một mô hình để dự đoán biến mục tiêu dựa trên các thuộc tính khác của tập dữ liệu huấn luyện và điền các giá trị còn thiếu của tập dữ liệu thử nghiệm
Phương pháp 4: KNN Imputation: Trong phương pháp này gán giá trị , các giá trị bị
thiếu của một thuộc tính được gán bằng cách sử dụng một số thuộc tính đã cho giống nhất với thuộc tính có giá trị bị thiếu Sự giống nhau của hai thuộc tính được xác định bằng cách sử dụng hàm khoảng cách
Tóm lại, mặc dù R có nhiều cách khác nhau để thay các dữ liệu khuyết Nhưng, với những ưu nhược điểm của từng phương pháp thì trong trường hợp này, ta sẽ chọn thay giá trị trung bình của của tất cả giá trị không bị khuyết của biến price vào các giá trị khuyết
3 Làm rõ dữ liệu (Data Visualization)
a) 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 toán với các biến trên được hiểu là đã qua đổi biến dạng log
Ý tưởng: Áp dụng hàm log() cho các cột 1, 2, 5, 6 (tương ứng với các biến liên tục
price, sqft_living15, sqft_above, sqft_living) và lưu lại vào new_DF để tiếp tục sử dụng cho những câu sau
Thứ tự thực hiện:
> new_DF[, c(1,2,5,6)] = log(new_DF[, c(1,2,5,6)])
Kết quả:
b) Đối với các biến liên tục, biến các giá trị thông kê mô tả bao gồm: trung bình, trung
vị, độ lệch chuẩn, giá trị lớn nhất và giá trị nhỏ nhất Xuất kết quả dưới dạng bảng
(hàm gợi ý: mean(), median(), sd(), min(), max(), apply(), as.data.frame(),
rownames()).
Ý tưởng: Dùng các hàm mean(), median(), sd(), min(), max() để tính các giá trị trung
bình, trung vị, độ lệch chuẩn, giá trị lớn nhất và giá trị nhỏ nhất theo cột, sau đó ghép các giá trị này với nhau
Trang 5Thứ tự thực hiện:
> mean = apply(new_DF[, c(1,2,5,6)], 2, mean)
> median = apply(new_DF[, c(1,2,5,6)], 2, median)
> sd = apply(new_DF[, c(1,2,5,6)], 2, sd)
> max = apply(new_DF[, c(1,2,5,6)], 2, max)
> min = apply(new_DF[, c(1,2,5,6)], 2, min)
Ta lần lượt dùng hàm apply() để tính các hàm mean(), median(), sd(), min(), max()
theo cột (tham số 2 truyền vào), áp dụng với các cột thứ 1, 2, 5, 6 (tương ứng với các thuộc tính price, sqft_living15, sqft_above, sqft_living) và lưu các vector trả về vào các biến tương ứng mean, median, sd, max, min
> describe = cbind(mean, median, sd, max, min)
> as.data.frame(describe)
Khi đã có các giá trị cần thiết, ta ghép các vector thành một bảng bằng hàm cbind(), rồi ép kiểu sang kiểu data frame bằng hàm as.data.frame().
Kết quả:
c) Đối với các biến phân loại, hãy lập một bảng thống kê số lượng cho từng loại.
Ý tưởng: Sử dụng hàm table() cho các biến phân loại floors, condition.
Thứ tự thực hiện:
> table(floors)
>table(condition)
Kết quả:
d) Hãy dùng hàm hist() để vẽ đồ thị phân phối cho biến price.
Trang 6Thứ tự thực hiện:
> hist(price,breaks=100,main="Biểu đồ phân phối Price")
Ta truyền vào các tham số breaks = 100 để chia biểu đồ thành nhiều cột hơn, và các tham số còn lại là các nhãn cho trục x, y và tên biểu đồ
Kết quả:
f) Hãy dùng hàm boxplot() vẽ phân phối của biến price cho từng nhóm phân loại của
biến floors và biến condition
Vẽ biểu đồ Boxplot của biến price cho từng nhóm phân loại của biến floors
Thực hiện dòng lệnh:
>boxplot(price~floors)
Kết quả:
Trang 7Vẽ biểu đồ Boxplot cho biến price cho từng nhóm phân loại của biến condition Thực hiện dòng lệnh:
>boxplot(price~condition)
Kết quả:
Trang 8g) Dùng lệnh pairs() vẽ các phân phối của biến price lần lượt theo các biến
sqft_living15, sqft_above, và sqft_living
Vẽ các phân phối của biến price theo biến sqft_living15
Thực hiện dòng lệnh:
>pairs(price~sqft_living15)
Kết quả:
Trang 9Vẽ các phân phối của biến price theo biến sqft_above Thực hiện dòng lệnh:
>pairs(price~sqft_above)
Kết quả:
Vẽ các phân phối của biến price theo biến sqft_living Thực hiện dòng lênh:
>pairs(price~sqft_living)
Kết quả:
Trang 104 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
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
Xét mô hình:
price: biến liên tục
sqft_living15: biến liên tục
floors: biến phân loại
condition: biến phân loại
sqft_above: biến liên tục
sqft_living: biến liên tục
Thực hiện các dòng lệnh:
>floors=as.factor(floors)
>condition=as.factor(condition)
Ý nghĩa: thay các biến floors và condition thành biến nhân tố
Xây dựng mô hình 1:
>M1=lm(price ~ sqft_living15 + floors + condition + sqft_above + sqft_living)
>summary(M1)
Kết quả:
Trang 11b).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 ý nghĩa 5% và 1%?
Giả thiết: H0 Các hệ số hồi quy đều không có ý nghĩa thống kê
Với mức tin cậy 5% : Các biến Condition2, condition3, condition4, condition5 có Pr(>|t|>0,05) nên ta chấp nhận giả thuyết H0 Các biến condition2, condition3, conditon4, condition5 bị loại khỏi mô hình với mức tin cậy 5%
Với mức tin cậy 1%: Các biến Condition2, condition3, condition4, condition5 có Pr(>|t|>0,01) nên ta chấp nhận giả thuyết H0 Các biến condition2, condition3, conditon4, condition5 bị loại khỏi mô hình với mức tin cậy 1%
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
Hãy dùng lệnhh anova() để đề xuất mô hình hồi quy hợp lý hơn
Xây dựng mô hình 2:
Thực hiện dòng lệnh:
>M2= lm(price~sqft_living15 +floors+ sqrt_above+sqft_living)
>summary(M2)
Kết quả:
Trang 12Phân tích ANOVA:
Xét mô hình M1 và M2:
thực hiện dòng lệnh:
>anova(M1,M2)
Kết quả:
Nhận xét: sau khi phân tích ANOVA 2 mô hình M1, M2 theo kết quả thu được thì Pr(>|t|)=2.2e-16 Chọn mức ý nghĩa 0.05 thì PR(>|t|)< 0,05 Vậy mô hình M1, M2 khác nhau Nhưng biến loại bỏ đi từ mô hình M1 là biến “ condition” không có ý nghĩa thống kê nên ta chọn mô hình M1 tốt hơn M2
Chọn mô hình M1 là tốt nhất
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à
Mô hình hồi quy tuyến tính hợp lý nhất là mô hình M1
Kết quả của mô hình M1:
Trang 13Nhận xét: Các biến sqft_living15, floors1.5, floors2, floors2.5, floors3, floors 3.5, sqft_above, sqft_living có ý nghĩa thống kê cao đối với biến price (giá cả), có nghĩa
là những sự thay đổi của các biến này có ảnh hưởng nhiều đến sự thay đổi đến giá nhà
Còn các biến condition1, condition2, condition3 không có ảnh hưởng đến giá nhà.
e) Từ mô hình mà bạn chọn ở 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ị Thực hiện dòng lệnh:
>plot(fitted(M1),resid(M1))
>plot(M1,which=1)
Kết quả:
Trang 14Nhận xét: Đường hồi quy màu đỏ trên mô hình vẽ gần sát với đường Residuals = 0e+00
Ý nghĩa: Đường hồi quy gần với đường sai số hồi quy Residuals = 0 chứng tỏ mô hình M1 ta chọn ở câu (c) là mô hình hợp lý 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
Nhập:
X1 = data.frame(sqft_living15 = mean(sqft_living15), sqft_above =
mean(sqft_above), sqft_living = mean(sqft_living), floors = “2”, condition =
“3”)
Mục đích: tạo thuộc tính X1.
predict(m1,X1, “interval=confidence”)
Mục đích: Dự báo giá nhà tại thuộc tính X1.
Trang 15Nhập:
X2 = data.frame(sqft_living15 = max(sqft_living15), sqft_above = max(sqft_above), sqft_living = max(sqft_living), floors = "2", condition =
"3")
Mục đích: tạo thuộc tính X2.
predict(m1,X2, “interval=confidence”)
Mục đích: Dự báo giá nhà tại thuộc tính X2.
Kết quả:
Dựa vào kết quả, ta thấy độ tin cậy của X1 rộng hơn X2.
Trang 16TÀI LIỆU THAM KHẢO
1 Nguyễn Đình Huy Đậu Thế Cấp, Lê Xuân Đại (2019) Giáo trình Xác suất và thống kê, NXB Đại học Quốc gia TP Hồ Chí Minh
2 Hossein Pishro-Nik ( 2016) Introduction to probability, statistics, and random processes
3 Rstudio pubs static (12/07/2019) Predict House sale prices using Multiple Linear Regression Truy cập từ
http://rstudio-pubs-static.s3.amazonaws.com/492324_a794047954284fdbbb5efd06 31be458c.html
4 Ngyễn Văn Tuấn (2013) Phân tích số liệu và biểu đồ bằng R Truy cập từ
https://cran.r-project.org/doc/contrib/Intro_to_R_Vietnamese.pdf
5 Long's blog (2019) Mô hình hồi quy ứng dụng trong bài toán dự đoán giá bất động sản – Machine Learning Truy cập từ https://bitly.com.vn/qxji22