1 Bài tập về nhà tuần 7

library("tidyverse")
## Warning: package 'tidyverse' was built under R version 4.2.3
## Warning: package 'ggplot2' was built under R version 4.2.3
## Warning: package 'tibble' was built under R version 4.2.3
## Warning: package 'tidyr' was built under R version 4.2.3
## Warning: package 'readr' was built under R version 4.2.3
## Warning: package 'purrr' was built under R version 4.2.3
## Warning: package 'dplyr' was built under R version 4.2.3
## Warning: package 'stringr' was built under R version 4.2.3
## Warning: package 'forcats' was built under R version 4.2.3
## Warning: package 'lubridate' was built under R version 4.2.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.2     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ ggplot2   3.4.2     ✔ tibble    3.2.1
## ✔ lubridate 1.9.2     ✔ tidyr     1.3.0
## ✔ purrr     1.0.1     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library("DT")
## Warning: package 'DT' was built under R version 4.2.3
library("ggplot2")
library("AER")
## Warning: package 'AER' was built under R version 4.2.3
## Loading required package: car
## Warning: package 'car' was built under R version 4.2.3
## Loading required package: carData
## Warning: package 'carData' was built under R version 4.2.3
## 
## Attaching package: 'car'
## 
## The following object is masked from 'package:dplyr':
## 
##     recode
## 
## The following object is masked from 'package:purrr':
## 
##     some
## 
## Loading required package: lmtest
## Warning: package 'lmtest' was built under R version 4.2.3
## Loading required package: zoo
## Warning: package 'zoo' was built under R version 4.2.3
## 
## Attaching package: 'zoo'
## 
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## 
## Loading required package: sandwich
## Warning: package 'sandwich' was built under R version 4.2.3
## Loading required package: survival
library("scales")
## Warning: package 'scales' was built under R version 4.2.3
## 
## Attaching package: 'scales'
## 
## The following object is masked from 'package:purrr':
## 
##     discard
## 
## The following object is masked from 'package:readr':
## 
##     col_factor
library("WDI")
## Warning: package 'WDI' was built under R version 4.2.3
library("rvest")
## Warning: package 'rvest' was built under R version 4.2.3
## 
## Attaching package: 'rvest'
## 
## The following object is masked from 'package:readr':
## 
##     guess_encoding
library("netstat")
library("stringr")

1.1 Scrape dữ liệu

1.1.1 Em cạo dữ liệu chi phí sinh hoạt của Hoa Kỳ theo tiểu bang

Dữ liệu chi phí sinh hoạt ở mỗi tiểu bang có thể khác nhau tùy thuộc vào yếu tố được phân tích và người thực hiện nghiên cứu Dữ liệu này bao gồm 4 biến và bao gồm 50 tiểu bang được thu thập từ năm 2022:

  • Tiểu bang (State): bao gồm 50 tiểu bang ở Hoa Kỳ

  • Annual Mean Wage (All Occupations): Mức lương trung bình hàng năm cho tất cả các ngành nghề thể hiện mức lương mà nhân viên làm việc trong tiểu bang kiếm được mỗi năm

  • Average Monthly Rent: Giá thuê trung bình hàng tháng cho biết giá trị tổng thể trung bình tiền thuê căn hộ trong tiểu bang

  • Value of $100: Giá trị $100 phản ánh giá trị của 100 George Washingtons trong tiểu bang. Nếu giá trị của một đô la giảm xuống dưới 100 đô la, thì nó sẽ không đi xa ở trạng thái đó.

col_link <- "https://www.patriotsoftware.com/blog/accounting/average-cost-living-by-state/"

col_page <-  read_html(col_link)

col_table <-  col_page %>% html_nodes("table.has-fixed-layout") %>%
  html_table() %>% .[[1]]
datatable(col_table)

1.1.2 Thao tác trên dữ liệu

str(col_table)
## tibble [50 × 4] (S3: tbl_df/tbl/data.frame)
##  $ State                             : chr [1:50] "Alabama" "Alaska" "Arizona" "Arkansas" ...
##  $ Annual Mean Wage (All Occupations): chr [1:50] "$50,620" "$66,130" "$58,620" "$48,570" ...
##  $ Average Monthly Rent              : chr [1:50] "$1,055.00" "$1,507.00" "$1,613.00" "$912.00" ...
##  $ Value of $100                     : chr [1:50] "$114.20" "$94.90" "$103.70" "$115.30" ...
head(col_table)
## # A tibble: 6 × 4
##   State      Annual Mean Wage (All Occu…¹ `Average Monthly Rent` `Value of $100`
##   <chr>      <chr>                        <chr>                  <chr>          
## 1 Alabama    $50,620                      $1,055.00              $114.20        
## 2 Alaska     $66,130                      $1,507.00              $94.90         
## 3 Arizona    $58,620                      $1,613.00              $103.70        
## 4 Arkansas   $48,570                      $912.00                $115.30        
## 5 California $73,220                      $2,032.00              $83.60         
## 6 Colorado   $67,870                      $1,633.00              $98.10         
## # ℹ abbreviated name: ¹​`Annual Mean Wage (All Occupations)`
summary(col_table)
##     State           Annual Mean Wage (All Occupations) Average Monthly Rent
##  Length:50          Length:50                          Length:50           
##  Class :character   Class :character                   Class :character    
##  Mode  :character   Mode  :character                   Mode  :character    
##  Value of $100     
##  Length:50         
##  Class :character  
##  Mode  :character

1.2 Function

Trong phần này tôi sử dụng lại bộ dữ liệu HousePrices, đây là bộ dữ liệu mà em đã thao tác từ tuần 1 đến tuần 6.

data('HousePrices')
mk <- HousePrices
names(mk) <- c("pr","lot","bed","bat","str","dr","rec","fb","gas","air","gar","pre")
price <- mk$pr
lotsize <- mk$lot
bedrooms <- mk$bed
bathrooms <- mk$bat
stories <- mk$str
datatable(mk)

Tôi tạo một function để tính toán thống kê mô tả cho giá trị của các biến bao gồm: tính toán giá trị trung bình, trung vị, phân vị, phương sai,…

fuc <- function(data, var) {
  library(tidyverse)
  
  varr <- data[[var]]
  
     data %>%  summarize(
      mean = mean(varr,na.rm = TRUE),
      median = median(varr,na.rm = TRUE),
      quartiles_25 = quantile(varr, c(0.25)),
      quartiles_50 = quantile(varr, c(0.5)),
      quartiles_75 = quantile(varr, c(0.75)),
      sd = sd(varr),
      variance = var(varr),
      max_value = max(varr),
      min_value = min(varr),
      skewness = moments::skewness(varr),
      kurtosis = moments::kurtosis(varr),
      sum = sum(varr,na.rm=TRUE)
     
    )
   
}

Dùng funtion này để tính toán thống kê mô tả trên bộ dữ liệu HousePrices và funtion này tôi đặt tên là fuc

  • Giá bán nhà
fuc(mk, "pr")
##      mean median quartiles_25 quartiles_50 quartiles_75       sd  variance
## 1 68121.6  62000        49125        62000        82000 26702.67 713032635
##   max_value min_value skewness kurtosis      sum
## 1    190000     25000 1.206503 4.930871 37194392
  • Số phòng tắm
fuc(mk, "bat")
##       mean median quartiles_25 quartiles_50 quartiles_75        sd  variance
## 1 1.285714      1            1            1            2 0.5021579 0.2521625
##   max_value min_value skewness kurtosis sum
## 1         4         1 1.587718 5.144182 702
  • Số phòng ngủ
fuc(mk, "bed")
##       mean median quartiles_25 quartiles_50 quartiles_75        sd variance
## 1 2.965201      3            2            3            3 0.7373879 0.543741
##   max_value min_value  skewness kurtosis  sum
## 1         6         1 0.4945091 3.717276 1619
  • Diện tích của ngôi nhà
fuc(mk, "lot")
##       mean median quartiles_25 quartiles_50 quartiles_75       sd variance
## 1 5150.266   4600         3600         4600         6360 2168.159  4700912
##   max_value min_value skewness kurtosis     sum
## 1     16200      1650 1.319121  5.72637 2812045

1.3 Indicator

library(WDI)

1.3.1 Hai Indicator về giáo dục(Education)

1.3.1.1 Indicator SE.PRM.UNER.FE

  • Indicator này cho chúng ta biết số trẻ em nữ nghỉ học tiểu học qua các năm của từng quốc gia.
Eco <- WDIsearch("Education")
Edu1 <- WDI(indicator = "SE.PRM.UNER.FE")
Edu1 <- na.omit(Edu1)
datatable(Edu1)
str(Edu1)
## 'data.frame':    3395 obs. of  5 variables:
##  $ country       : chr  "Afghanistan" "Afghanistan" "Albania" "Albania" ...
##  $ iso2c         : chr  "AF" "AF" "AL" "AL" ...
##  $ iso3c         : chr  "AFG" "AFG" "ALB" "ALB" ...
##  $ year          : int  1993 1974 2021 2020 2013 2012 2011 2010 2009 2008 ...
##  $ SE.PRM.UNER.FE: num  1117896 888979 5013 1473 2626 ...
##  - attr(*, "lastupdated")= chr "2023-06-29"
##  - attr(*, "label")= chr [1:16758] "Children out of school, primary, female" "Children out of school, primary, female" "Children out of school, primary, female" "Children out of school, primary, female" ...
##  - attr(*, "na.action")= 'omit' Named int [1:13363] 1 2 3 4 5 6 7 8 9 10 ...
##   ..- attr(*, "names")= chr [1:13363] "1" "2" "3" "4" ...

Biểu đồ các quốc gia qua các năm

Edu11 <- Edu1 %>% filter(country %in% c("Australia", "Brazil","Indonesia","Cambodia","Chile","Cuba"))
ggplot(data = Edu11, aes(x = year, y = SE.PRM.UNER.FE,color = country, group = country)) +
  geom_line() +
  geom_point() +
  xlab("Năm") +
  ylab("Số người") +
  ggtitle("Số trẻ em nữ nghỉ học tiểu học của mỗi quốc gia") 

Nhận xét: chúng ta có thể lọc một số quốc gia ra để có cái nhìn tổng quát hơn. Qua biểu đồ tên ta có thể thấy nước Indonesia có tỷ lệ trẻ em nữ nghỉ học giảm dần qua các năm. còn các quốc gia khác thì số lượng trẻ em nghỉ học không nhiều.

1.3.1.2 Indicator SE.PRM.UNER.ZS

Indicator này cho chúng ta biết tỷ lệ phần trăm số trẻ em không đi học ở độ tuổi đi học qua các năm ở mỗi quốc gia

Edu2 <- WDI(indicator = "SE.PRM.UNER.ZS")
Edu2 <- na.omit(Edu2)
datatable(Edu2)
Edu22 <- Edu2 %>% filter(country %in% c("Australia", "Brazil","Indonesia","Cambodia","Chile","Cuba"))
ggplot(data = Edu22, aes(x = year, y = SE.PRM.UNER.ZS,color = country, group = country)) +
  geom_line() +
  geom_point() +
  xlab("Năm") +
  ylab("%") +
  ggtitle("Tỷ lệ số trẻ em không đi học ") 

1.3.2 Hai indicator về dân số(GDP)

1.3.2.1 Indicator SP.ADO.TFRT

Indicator này cho chúng ta biết tỷ lệ sinh ở tuổi vị thành niên(số ca sinh trên 1000 phụ nữ trong độ tuổi 15-19)

Eco2 <- WDIsearch("GDP")
GDP1 <- WDI(indicator = "SP.ADO.TFRT")
GDP1 <- na.omit(GDP1)
datatable(GDP1)
## Warning in instance$preRenderHook(instance): It seems your data is too big for
## client-side DataTables. You may consider server-side processing:
## https://rstudio.github.io/DT/server.html

Lọc tỷ lệ sinh của mỗi quốc gia từ năm 2012 đến năm 2014

GDP12 <-  WDI(indicator="SP.ADO.TFRT", country="all", start = 2012, end = 2014)
head(GDP12)
##                       country iso2c iso3c year SP.ADO.TFRT
## 1 Africa Eastern and Southern    ZH   AFE 2014    107.6977
## 2 Africa Eastern and Southern    ZH   AFE 2013    108.0928
## 3 Africa Eastern and Southern    ZH   AFE 2012    109.5322
## 4  Africa Western and Central    ZI   AFW 2014    122.3955
## 5  Africa Western and Central    ZI   AFW 2013    125.0845
## 6  Africa Western and Central    ZI   AFW 2012    125.6104

Vẽ biểu đồ thể hiện tỷ lệ sinh ở độ tuổi vị thành niên qua các năm

ggplot(data = GDP1, aes(x = year, y = SP.ADO.TFRT)) +
  geom_line(color = "blue") +
  geom_point(color = "blue") +
  xlab("Year") +
  theme_minimal()

Nhận xét: Qua biểu đồ trên ta có thể thấy tỷ lệ sinh ở độ tuổi bị thành niên đang có xu hướng giảm dần qua các năm nhưng không nhiều.

1.3.2.2 Indicator NY.GDP.PCAP.KD

Indicator này cho chúng ta biết về GDP bình quân đầu người(USD cố định năm 2015)

GDP22 <- WDI(indicator = "NY.GDP.PCAP.KD")
GDP22 <- na.omit(GDP22)
datatable(GDP22)

Bên cạnh đó chúng ta có thể lọc tên của một số quốc gia bằng mã quốc gia

GDP23 <-  WDI(indicator='NY.GDP.PCAP.KD', country=c('MX','CA','US'), start=1960, end=2012)
head(GDP23)
##   country iso2c iso3c year NY.GDP.PCAP.KD
## 1  Canada    CA   CAN 2012       42315.81
## 2  Canada    CA   CAN 2011       42037.52
## 3  Canada    CA   CAN 2010       41156.15
## 4  Canada    CA   CAN 2009       40368.93
## 5  Canada    CA   CAN 2008       42063.24
## 6  Canada    CA   CAN 2007       42098.43
ggplot(GDP23, aes(year, NY.GDP.PCAP.KD, color=country)) + geom_line() + 
    xlab('Year') + ylab('GDP bình quân đầu người')
## Warning: Removed 21 rows containing missing values (`geom_line()`).

Như vậy ta có thể thấy GDP bình quân đầu người của nước United States và Canada tăng trưởng mạnh qua các năm và Mexico cũng tăng nhưng không cao

1.3.3 Hai indicator về sức khỏe(Healthy)

Indicator SH.TBS.INCD: cho chúng biết tỷ lệ mắc bệnh lao(trên 100000 người) của các quốc gia qua mỗi năm

Ecu3 <- WDIsearch("Healthy")
He1 <- WDI(indicator = "SH.TBS.INCD")
He1 <- na.omit(He1)
datatable(He1)

Bên cạnh đó chúng ta có thể lọc tên của 4 quốc gia bằng mã quốc gia từ năm 2012 đến năm 2021

He12 <-  WDI(indicator='SH.TBS.INCD', country=c("AR","AU","HU","FR"), start=2012, end=2021)
head(He12)
##     country iso2c iso3c year SH.TBS.INCD
## 1 Argentina    AR   ARG 2021          30
## 2 Argentina    AR   ARG 2020          28
## 3 Argentina    AR   ARG 2019          29
## 4 Argentina    AR   ARG 2018          27
## 5 Argentina    AR   ARG 2017          27
## 6 Argentina    AR   ARG 2016          27
ggplot(He12, aes(year, SH.TBS.INCD, color=country)) + geom_line() + 
    xlab('Year') + ylab('Tỷ lệ mắc bệnh lao của mỗi quốc gia')

Nhận xét: Qua biểu đồ ta có thể thấy từ năm 2012 đến năm 2020 Argentina có tỷ lệ mắc bệnh lao tăng mạnh và các quốc gia khác đang có xu hướng giảm dần

Indicator SP.DYN.LE00.FE.IN: Indicator này cho chúng ta biết về tuổi thọ trung bình của nữ qua các năm của mỗi quốc gia

He2 <- WDI(indicator = "SP.DYN.LE00.FE.IN")
He2 <- na.omit(He2)
datatable(He2)
## Warning in instance$preRenderHook(instance): It seems your data is too big for
## client-side DataTables. You may consider server-side processing:
## https://rstudio.github.io/DT/server.html
He22 <-  WDI(indicator='SP.DYN.LE00.FE.IN', country=c("AR","AU","HU","FR"), start=2012, end=2021)
head(He22)
##     country iso2c iso3c year SP.DYN.LE00.FE.IN
## 1 Argentina    AR   ARG 2021            78.647
## 2 Argentina    AR   ARG 2020            79.285
## 3 Argentina    AR   ARG 2019            80.681
## 4 Argentina    AR   ARG 2018            80.329
## 5 Argentina    AR   ARG 2017            80.085
## 6 Argentina    AR   ARG 2016            79.670
ggplot(He22, aes(year, SP.DYN.LE00.FE.IN, color=country)) + geom_line() + 
    xlab('Year') + ylab('Tuổi thọ trung bình của nữ qua các năm')

Nhận xét: nhìn chung 4 nước nữ đều có tuổi thọ trung bình cao từ năm 2012 đến năm 2020. Nhưng có 2 nước có tuổi thọ trung bình từ 84 tuổi đến 87 tuổi là nước Astralia và France. Còn nước Argentina và Hungary có tuổi thọ trung bình từ 78 đến 81 tuổi

1.3.4 Hai indicator về

2 Bài tập về nhà tuần 5+6

2.1 Mô tả bộ dữ liệu

Dataset: HousePrices - Package AER. Dữ liệu “HousePrices” được lấy từ gói AER. Trong bộ dữ trên liên quan đến giá bán của 546 căn nhà ở thành phố Windsor, Canada trong tháng 7,8,9 của năm 1987.

Dữ liệu trên bao gồm 12 biến:

  • Price: Giá bán của ngôi nhà (nghìn đô)
  • Lotsize: Diện tích của ngôi nhà là bao nhiêu mét vuông
  • Bedrooms: Số phòng ngủ của ngôi nhà
  • Bathrooms: Số phòng tắm của ngôi nhà
  • Stories: Nhà có bao nhiêu tầng bao gồm tầng hầm
  • Driveway: Khu vực đó có đường cho xe chạy vào nhà hay không
  • Recreation: Ở trong nhà có phòng giải trí không
  • Fullbase: Tầng hầm của ngôi nhà đã được hoàn thiện hay chưa
  • Gasheat: Nhà có sử dụng hệ thống sưởi bằng gas không
  • Aircon: Nhà có sử dụng máy lạnh không
  • Garage: Số chỗ để xe
  • Prefer: Ngôi nhà có nằm trong vị trí ưu thích của thành phố hay không
library("tidyverse")
library("DT")
library("ggplot2")
library("AER")
library("scales")
library("utf8")
## Warning: package 'utf8' was built under R version 4.2.3
data("HousePrices")

2.2 Bài tập trên lớp

library("AER")
data("HousePrices")
  • Tôi gán dữ liệu HousePrices thành mk sau đó tôi đặt tên cho các biến. Tiếp tục tôi lập bảng tần số giữa biến số phòng ngủ của ngôi nhà và xem phòng đó có máy lạnh hay không.
mk <- HousePrices
names(mk) <- c("pr","lot","bed","bat","str","dr","rec","fb","gas","air","gar","pre")
price <- mk$pr
lotsize <- mk$lot
bedrooms <- mk$bed
bathrooms <- mk$bat
stories <- mk$str
table(cut(mk$bed, 6),mk$air)
##               
##                 no yes
##   (0.995,1.83]   2   0
##   (1.83,2.67]  114  22
##   (2.67,3.5]   193 108
##   (3.5,4.33]    55  40
##   (4.33,5.17]    7   3
##   (5.17,6]       2   0
  • Nhận xét: Có 2 ngôi nhà có 1 phòng ngủ là không sử dụng máy lạnh có 0 ngôi nhà có 1 phòng tắm là có sử dụng máy lạnh. Ở những ngôi nhà có 2 phòng ngủ thì có 114 ngôi nhà là không sử dụng máy lạnh và có 22 ngôi nhà là đang sử dụng máy lạnh và ở những ngôi nhà có 3 phòng ngủ thì đang có 193 ngôi nhà là không sử dụng máy lạnh và có 108 ngôi nhà là có sử dụng máy lạnh.

2.3 Giá bán nhà

mk$pr <- cut(mk$pr, breaks = c(25000,80000,135000,190000), labels = c(" giá thấp", "giá Vừa", "giá cao"))
table(mk$pr)  
## 
##  giá thấp   giá Vừa   giá cao 
##       400       131        12

Nhận xét: Bảng phân tích trên em đã phân giá bán nhà thành 3 mức giá: Ở múc giá thấp là có 400 ngôi nhà có mức giá từ 25000-80000 nghìn đô, ở mức giá vừa là có 131 ngôi nhà có mức giá từ 80000-135000 nghìn đô và ở mức giá cao có 12 ngôi nhà có mức giá từ 135000-190000 nghìn đô.

2.4 Diện tích ngôi nhà

summary(mk$lot)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1650    3600    4600    5150    6360   16200
  • Nhận xét: Qua bảng tóm tắt thống kê trên trong 546 ngôi nhà thì ngôi nhà có diện tích bé nhất là 1650 mét vuông và to nhất là 16200 mét vuông, diện tích trung bình là 5150 mét vuông. Có 25% ngôi nhà là có diện tích bé hơn 3600 mét vuông, có 50% ngôi nhà là có diện tích bé hơn 4600 mét vuông và có 75% ngôi nhà là có diện tích bé hơn 6360 mét vuông
sum(mk$lot)
## [1] 2812045

Nhận xét: Em thực hiện lệnh sum để tính tổng xem trong 546 ngôi nhà tổng diện tích là bao nhiêu. Qua câu lệnh trên thì kết quả trả về là 2812045 mét vuông có nghĩa tổng diện tích của 546 ngôi nhà là 2812045 mét vuông.

aggregate(mk$lot,list(mk$bat),FUN ='mean')
##   Group.1        x
## 1       1 4921.090
## 2       2 5699.526
## 3       3 6677.000
## 4       4 8960.000
  • Nhận xét: Kết quả trên cho ta biết những ngôi nhà có 1 phòng tắm thì có diện tích trung bình là 4921 mét vuông, ở những ngôi nhà có 2 phòng tắm thì diện tích trung bình là 5699,526 mét vuông, ở những ngôi nhà 3 phòng tắm thì diện tích trung bình là 6677 mét vuông và ở những ngôi nhà có 4 phòng tắm thì diện tích ngôi nhà là 8969 mét vuông. Như vậy ta có thể thấy là khi số phòng tắm trong ngôi nhà càng nhiều thì diện tích cũng rộng hơn.
mk$lotsize <- cut(mk$lot, breaks = c(4000,5000,8000,11000), labels = c("S nhỏ","S vừa","S rộng"))
table(mk$lotsize)
## 
##  S nhỏ  S vừa S rộng 
##    103    183     42
  • Nhận xét: Bảng phân tích trên em đã phân diện tích của các ngôi nhà thành 3 mức: Có 103 ngôi nhà có diện tích nhỏ(4000-5000 mét vuông), có 183 ngôi nhà có diện tích vừa(5000-8000 mét vuông), có 42 ngôi nhà có diện tích rộng(8000-11000 mét vuông)

2.5 Số phòng ngủ

table(cut(mk$bed, breaks = c(0,1,2,3,4,5,6)))
## 
## (0,1] (1,2] (2,3] (3,4] (4,5] (5,6] 
##     2   136   301    95    10     2
  • Nhận xét: Bảng phân tích trên cho thấy là có 2 ngôi nhà là có 1 phòng ngủ, có 136 ngôi nhà là có 2 phòng ngủ, có 301 ngôi nhà là có 3 phòng ngủ, có 95 ngôi nhà là có 4 phòng ngủ, có 10 ngôi nhà có 5 phòng ngủ và có 2 ngôi nhà là có 6 phòng ngủ
sum(mk$bed)
## [1] 1619
  • Nhận xét: Ở trên em thực hiện câu lệnh sum để tính tổng trong 546 ngôi nhà thì có bao nhiêu phòng ngủ và kết quả trả về là 1619 phòng
var(mk$bed)
## [1] 0.543741
sd(mk$bed)
## [1] 0.7373879
quantile(mk$bed, .58)
## 58% 
##   3

2.6 Số phòng tắm

table(cut(mk$bat, breaks = c(0,1,2,3,4)))
## 
## (0,1] (1,2] (2,3] (3,4] 
##   402   133    10     1
  • Nhận xét: Bảng phân tích trên cho thấy là có 402 ngôi nhà là có 1 phòng tắm, có 133 ngôi nhà là có 2 phòng tắm, có 10 ngôi nhà là có 3 phòng tắm và có 1 ngôi nhà là có 4 phòng tắm
mk %>%  ggplot(aes(x = bathrooms)) +
  geom_bar( fill = 'red')+
  xlab("Số phòng tắm")+
  ylab("Số ngôi nhà")

  • Nhận xét: Đồ thị cột phía trên thể hiện cho chúng ta biết là có khoảng 401 ngôi nhà đang có 1 phòng tắm, có khoảng 134 ngôi nhà là có 2 phòng tắm, có khoảng 10 ngôi nhà là có 3 phòng tắm và có 1 ngôi nhà đang có 4 phòng tắm

  • Thêm tỷ lệ phần trăm cho biến số phòng tắm và làm chúng thành cột ngang

mk |>  group_by(bat) |> 
  summarise(n = n()) |> 
mutate(pg = scales::percent(n/sum(n), accuracy = 0.01)) |>
  ggplot(aes(x = bat, y = pg)) +
  geom_col(fill = 'yellow') +
  theme_classic() +
  labs(x = 'Số phòng tắm', y = 'Tỷ lệ %')

mk %>%  count(bat) %>% 
mutate(p = scales::percent(n/sum(n), accuracy = 0.01)) %>% 
  ggplot(aes(x = bat, y = n,fill = bat)) +
  geom_col() +
  geom_text(aes(label = p),color = 'brown', hjust =0 , size = 3) +
  theme_classic() +
  labs(x = 'Số phòng tắm', y = 'Số ngôi nhà')+
 coord_flip()

mk %>%  ggplot(aes(x = bat, y = after_stat(count))) +
  geom_bar(fill = 'blue') +
  geom_text(aes(label = scales::percent(after_stat(count/sum(count)))), stat = 'count', color = 'black', vjust = - .5) +
  theme_classic() +
  labs(x = 'Số phòng tắm', y = 'Số ngôi nhà')

  • Nhận xét: Qua 2 biểu đồ trên cho biết là có khoảng 401 ngôi nhà là đang có 1 phòng ngủ và chiếm tới 73,6%. Có 134 ngôi nhà có 2 phòng tắm chiếm 24,4%. Có khoảng 10 ngôi nhà có 3 phòng tắm chiếm 1,8% và có 1 ngôi nhà có 4 phòng tắm chiếm 0,2%.

2.7 Lập bảng tần số giữa biến giá bán nhà và biến số phòng tắm

table(mk$pr,mk$bat)
##            
##               1   2   3   4
##    giá thấp 340  56   4   0
##   giá Vừa    56  73   2   0
##   giá cao     3   4   4   1
  • Nhận xét: Ở mức giá bán thấp thì ở những ngôi nhà có 1 phòng tắm chiếm số lượng đông 340 ngôi nhà, 2 phòng tắm là 56 ngôi nhà, 3 phòng tắm là 4 ngôi nhà và 4 phòng tắm là không có ngôi nhà nào. Khi mức giá càng tăng thì số lượng phòng tắm ít đi.

2.8 Lập bảng tần số giữa biến giá bán nhà và diện tích

table(mk$pr,mk$lot)
##            
##             1650 1700 1836 1905 1950 2000 2015 2135 2145 2160 2175 2176 2275
##    giá thấp    1    1    1    1    2    1    1    1    6    1    1    1    1
##   giá Vừa      0    0    0    0    0    0    0    0    0    0    0    0    0
##   giá cao      0    0    0    0    0    0    0    0    0    0    0    0    0
##            
##             2325 2398 2400 2430 2475 2500 2520 2550 2610 2640 2650 2684 2700
##    giá thấp    1    1    2    1    1    1    1    1    2    1    1    1    2
##   giá Vừa      0    0    0    0    0    0    0    0    0    0    0    0    0
##   giá cao      0    0    0    0    0    0    0    0    0    0    0    0    0
##            
##             2747 2787 2800 2817 2835 2850 2856 2870 2880 2910 2953 2970 2990
##    giá thấp    1    2    2    1    1    1    1    1    2    1    1    1    1
##   giá Vừa      0    0    0    0    0    0    0    0    0    0    0    0    0
##   giá cao      0    0    0    0    0    0    0    0    0    0    0    0    0
##            
##             3000 3036 3040 3060 3069 3090 3100 3120 3150 3162 3180 3185 3210
##    giá thấp   14    1    1    1    1    2    1    3    4    1    7    3    1
##   giá Vừa      0    0    0    0    0    0    0    0    0    0    0    0    0
##   giá cao      0    0    0    0    0    0    0    0    0    0    0    0    0
##            
##             3240 3264 3290 3300 3350 3360 3400 3410 3420 3450 3460 3480 3500
##    giá thấp    2    1    1    2    1    1    1    1    4    5    2    5    5
##   giá Vừa      1    0    0    0    0    0    0    0    0    0    0    0    1
##   giá cao      0    0    0    0    0    0    0    0    0    0    0    0    0
##            
##             3510 3512 3520 3540 3570 3584 3600 3620 3630 3635 3640 3649 3650
##    giá thấp    2    1    5    1    1    1    8    0    7    1    7    1    2
##   giá Vừa      0    0    0    0    0    0    0    0    0    0    0    0    0
##   giá cao      0    0    0    0    0    0    0    0    0    0    0    0    0
##            
##             3660 3680 3700 3720 3745 3750 3760 3780 3792 3800 3816 3840 3850
##    giá thấp    1    1    0    1    1    3    1    1    1    2    1    1    4
##   giá Vừa      0    0    1    0    0    0    1    0    0    0    0    0    0
##   giá cao      0    0    0    0    0    0    0    0    0    0    0    0    0
##            
##             3880 3900 3930 3934 3960 3968 3970 3986 3990 4000 4032 4040 4046
##    giá thấp    1    1    1    1    2    1    2    1    1    9    1    6    1
##   giá Vừa      0    0    0    0    1    0    0    0    0    2    0    1    0
##   giá cao      0    0    0    0    0    0    0    0    0    0    0    0    0
##            
##             4050 4075 4079 4080 4095 4100 4120 4130 4160 4200 4240 4260 4280
##    giá thấp    2    1    1    2    2    2    2    1    2    1    1    1    1
##   giá Vừa      0    0    0    0    0    1    0    0    0    0    0    1    0
##   giá cao      0    0    0    0    0    0    0    0    0    0    0    0    0
##            
##             4300 4320 4340 4350 4352 4360 4370 4400 4410 4500 4510 4520 4560
##    giá thấp    0    3    1    2    1    1    1    4    2   12    2    1    0
##   giá Vừa      2    1    0    0    0    0    0    0    0    1    0    0    1
##   giá cao      0    0    0    0    0    0    0    0    0    0    0    0    0
##            
##             4600 4632 4640 4646 4700 4750 4770 4775 4785 4800 4815 4820 4840
##    giá thấp    4    1    0    1    1    1    1    1    1    2    1    1    2
##   giá Vừa      1    0    1    0    0    0    0    0    0    3    0    0    0
##   giá cao      0    0    0    0    0    0    0    0    0    0    0    0    0
##            
##             4880 4900 4920 4950 4960 4990 4992 4995 5000 5010 5020 5040 5076
##    giá thấp    1    2    1    1    3    1    1    1    1    1    0    1    1
##   giá Vừa      1    0    0    0    0    0    0    0    3    0    1    0    0
##   giá cao      0    0    0    0    0    0    0    0    0    0    0    0    0
##            
##             5136 5150 5170 5200 5300 5320 5360 5400 5450 5495 5500 5600 5640
##    giá thấp    1    0    1    1    3    2    1    5    1    1    4    1    1
##   giá Vừa      0    1    0    1    0    0    0    1    1    0    5    0    0
##   giá cao      0    0    0    0    0    0    0    0    0    0    0    0    0
##            
##             5680 5700 5720 5750 5800 5828 5830 5850 5880 5885 5900 5948 5960
##    giá thấp    1    0    1    0    2    0    1    2    2    1    2    1    1
##   giá Vừa      0    1    0    0    1    1    0    0    0    0    0    0    1
##   giá cao      0    0    0    1    0    0    0    0    0    0    0    0    0
##            
##             5985 6000 6020 6040 6050 6060 6100 6210 6240 6254 6300 6321 6325
##    giá thấp    1    2    1    1    1    2    3    1    0    0    1    1    0
##   giá Vừa      0   21    0    0    0    0    0    0    1    1    0    0    1
##   giá cao      0    1    0    0    0    0    0    0    0    0    0    0    0
##            
##             6350 6360 6400 6420 6440 6450 6480 6500 6525 6540 6550 6600 6615
##    giá thấp    0    4    0    0    1    2    1    0    0    1    0    3    1
##   giá Vừa      1    3    1    4    0    0    1    2    1    2    2    6    1
##   giá cao      0    0    0    0    0    0    0    0    0    0    0    0    0
##            
##             6650 6660 6670 6710 6720 6750 6800 6825 6840 6862 6900 6930 7000
##    giá thấp    1    0    0    1    1    1    1    1    0    1    1    1    2
##   giá Vừa      0    1    1    0    0    1    1    0    1    0    1    0    3
##   giá cao      0    0    0    0    0    0    0    0    0    0    0    0    0
##            
##             7020 7085 7152 7155 7160 7200 7231 7260 7320 7350 7410 7420 7424
##    giá thấp    0    1    1    0    0    1    0    1    0    1    0    0    1
##   giá Vừa      1    0    0    1    1    1    1    0    1    0    1    0    0
##   giá cao      0    0    0    0    0    0    0    0    0    0    0    2    0
##            
##             7440 7475 7482 7500 7600 7680 7686 7700 7770 7800 7950 7980 8000
##    giá thấp    0    0    0    0    1    0    1    1    1    1    0    2    0
##   giá Vừa      2    1    1    0    0    1    0    1    0    1    1    0    1
##   giá cao      0    0    0    2    0    0    0    0    0    0    0    0    0
##            
##             8050 8080 8100 8150 8250 8372 8400 8500 8520 8580 8800 8875 8880
##    giá thấp    1    1    2    1    3    0    3    0    1    0    0    0    0
##   giá Vừa      1    0    0    0    1    1    0    1    0    1    1    1    2
##   giá cao      0    0    1    0    0    0    0    0    0    1    0    0    0
##            
##             8960 9000 9166 9500 9620 9667 9800 9860 9960 10240 10269 10360
##    giá thấp    0    1    1    1    0    1    1    1    0     1     1     1
##   giá Vừa      0    3    0    0    1    0    0    0    0     0     0     0
##   giá cao      1    0    0    0    0    0    0    0    1     0     0     0
##            
##             10500 10700 11175 11410 11440 11460 12090 12900 12944 13200 15600
##    giá thấp     2     1     0     1     0     0     0     1     1     0     0
##   giá Vừa       1     0     1     0     1     1     1     0     0     1     1
##   giá cao       0     0     0     0     0     0     0     0     0     1     0
##            
##             16200
##    giá thấp     0
##   giá Vừa       0
##   giá cao       1
  • Nhận xét: Ở mức giá thấp thì đang có 86 ngôi nhà có diện tích nhỏ , có 90 ngôi nhà có diện tích vừa và có 24 ngôi nhà có diện tích rộng.
mk %>%  ggplot(aes(x = mk$lot, y = mk$pr)) +
  geom_smooth(formula = y ~ x, method = 'lm', color = 'blue') +
  geom_point(color = 'orange') +
  labs(title = 'Đồ thị dạng Scatter', x = 'Diện tích', y = 'Giá bán')

2.8.1 Vẽ biểu đồ cột ghép giữa biến số phòng tắm và số tầng của ngôi nhà

mk %>%  ggplot(aes(x = bat, y = after_stat(count))) +
  geom_bar(fill = 'blue') +
  geom_text(aes(label = scales::percent(after_stat(count/sum(count)))), stat = 'count', color = 'black', vjust = - .5) +
  facet_grid(. ~ str) +
  theme_classic() +
  labs(x = 'Số phòng tắm', y = 'Số ngôi nhà')

  • Nhận xét: Qua biểu đồ trên ta thấy ở những ngôi nhà có 1 tầng thì có khoảng 180 ngôi nhà là có 1 phòng tắm(36,08%),có khoảng 20 ngôi nhà là có 2 phòng tắm(5,31%) và có khoảng 3 ngôi nhà có 3 phòng tắm(0,18%) và không có ngôi nhà nào có 4 phòng tắm ở những ngôi nhà có 1 tầng. Ở những ngôi nhà có 1 phòng tắm chiếm tỷ lệ khá cao ở những ngôi nhà có 1 và 2 tầng.
mk |> count(bat, str) |>
  mutate(pCH = prop.table(n)) |>
  ggplot(aes(x = bat, y = n, fill = str)) +
  geom_col(position = 'dodge') +
  geom_text(aes(label = percent(pCH, accuracy = .01)), position = position_dodge(1), vjust = 0, size = 3) +
  ylab('Số ngôi nhà') +
  xlab('Số phòng tắm')

2.9 Vẽ biểu đồ cột thể hiện mối quan hệ giữa số phòng tắm và số phòng ngủ

table(mk$bed,mk$bat)
##    
##       1   2   3   4
##   1   2   0   0   0
##   2 128   8   0   0
##   3 225  72   4   0
##   4  42  48   4   1
##   5   4   4   2   0
##   6   1   1   0   0
mk %>%  ggplot(aes(x = bat, y = after_stat(count))) +
  geom_bar(fill = 'purple') +
  geom_text(aes(label = scales::percent(after_stat(count/sum(count)))), stat = 'count', color = 'black', vjust = - .5) +
  facet_grid(. ~ bed) +
  theme_classic() +
  labs(x = 'Số phòng tắm', y = 'Số ngôi nhà')

  • Nhận xét: Ở biểu đồ trên ta thấy là ở những ngôi nhà có 3 phòng ngủ mà có 1 phòng tắm chiếm tỷ lệ cao có khoảng 260 ngôi nhà. Số lượng những ngôi nhà có 1,4,5,6 phòng ngủ chiếm tỷ lệ thấp và rất thấp khi có số lượng phòng tắm chiếm tỷ lệ phần trăm thấp

2.10 Vẽ biểu đồ số tầng của ngôi nhà

mk %>%  count(str) %>% 
  mutate(pC = percent(n/sum(n),accuracy = 0.01)) |>
  ggplot(aes(x = str, y = n)) +
  geom_col(fill = 'green') +
  geom_text(aes(label = pC),color = 'black', vjust = 2, size = 5) +
  ylab('Số ngôi nhà') +
  xlab('Số tầng')

  • Nhận xét: Có khoảng 227 ngôi nhà có 1 tầng(41,58%), Có khoảng 235 ngôi nhà là có 2 tầng(43,49%)

  • Biểu đồ bên dưới em vẽ biểu độ cột ngang cho biến số tầng của ngôi nhà

mk |> count(str) |>
  mutate(pC = percent(n/sum(n),accuracy = 0.01)) |>
  ggplot(aes(x = str, y = n)) +
  geom_col(fill = 'gray') +
  geom_text(aes(label = pC),color = 'yellow', hjust = 2, size = 5) +
  ylab('Số ngôi nhà') +
  xlab('Số tầng') +
  coord_flip()

2.11 Lập bảng tần số và tần suất cho biến số tầng của ngôi nhà và biến diện tích của ngôi nhà

table(mk$bed, mk$lotsize)
##    
##     S nhỏ S vừa S rộng
##   1     0     0      0
##   2    32    27      8
##   3    48   113     23
##   4    21    39     10
##   5     1     4      1
##   6     1     0      0
h= table(mk$bed, mk$lotsize)
prop.table(h)
##    
##          S nhỏ      S vừa     S rộng
##   1 0.00000000 0.00000000 0.00000000
##   2 0.09756098 0.08231707 0.02439024
##   3 0.14634146 0.34451220 0.07012195
##   4 0.06402439 0.11890244 0.03048780
##   5 0.00304878 0.01219512 0.00304878
##   6 0.00304878 0.00000000 0.00000000

Nhận xét: Ở những ngôi nhà có 1 phòng ngủ và 4 phòng ngủ thì diện tích ngôi nhà chiếm tỷ lệ rất nhỏ dưới 0,3%. Ở những ngôi nhà có 3 phòng ngủ thì diện tích của ngôi nhà chiếm tỷ lệ cao hơn những ngôi nhà có 2 phòng ngủ. Ở những ngôi nhà có diện tích vừa mà có 3 phòng ngủ chiếm tỷ lệ cao 34,5% . Qua bảng tần suất diện tích của ngôi nhà thì ta thấy các ngôi nhà có diện tích nhỏ và vừa mà có 2,3 phòng ngủ chiến tỷ lệ khá cao.

3 Bài tập về nhà tuần 4

library("tidyverse")
library("DT")
library("ggplot2")
library("AER")
library("scales")
library("utf8")

data("HousePrices")
mk <- HousePrices
datatable(mk)

3.1 Đồ thị phân tán scatter

3.1.1 Đồ thị thể hiện mối quan hệ giữa số lượng phòng tắm và giá bán của ngôi nhà

  • Trong mục này em vẽ biểu đồ phân tán thể hiện mối quan hệ giữa số lượng phòng tắm và giá bán của ngôi nhà với trục hoành là biến số phòng tắm và trục tung là biến giá bán nhà. Sau đó biểu đồ thứ 2 em thêm màu và tăng kích cỡ chúng lên 2 cho biểu đồ phân tán phía trên
mk %>%  ggplot(map = aes(x = bathrooms, y = price)) +
  geom_point()

  • Thêm màu cho đồ thị Scatter giữa số phòng tắm và giá bán của ngôi nhà
mk |> ggplot(map = aes(x = bathrooms, y = price)) +
  geom_point(color = 'orange', size=2)

3.1.2 Biểu đồ phân tán thể hiện mối quan hệ giữa diện tích của ngôi nhà và giá bán nhà

mk %>%  ggplot(map = aes(x = lotsize, y = price))  + geom_point(color= 'orange') +
labs(title = "Biểu đồ phân tán giữa tổng diện tích và tổng giá bán", x = 'Tổng diện tích', y = 'Tổng giá bán')

  • Biểu đồ bên dưới tôi vẽ thêm đường hồi quy cho biểu đồ phân tán giữa tổng diện tích và tổng giá bán
mk %>%  ggplot(map = aes(x = lotsize, y = price,color='red')) + geom_smooth(formula = y ~ x, method = 'lm', color = 'green') + geom_point(color= 'orange') +
labs(title = "Biểu đồ phân tán giữa tổng diện tích và tổng giá bán", x = 'Tổng diện tích', y = 'Tổng giá bán')

mk %>%  ggplot(aes(x = lotsize, y = price)) +
  geom_smooth(formula = y ~ x, method = 'lm', color = 'blue') +
  geom_point(color = 'orange') +
  labs(title = 'Đồ thị dạng Scatter', x = 'Diện tích', y = 'Giá bán')

3.2 Đồ thị cột

3.2.1 Đồ thị cột cho biến Bathrooms

mk %>%  ggplot(aes(x = bathrooms)) +
  geom_bar( fill = 'red')+
  xlab("Số phòng tắm")+
  ylab("Số ngôi nhà")

  • Nhận xét: Đồ thị cột phía trên thể hiện cho chúng ta biết là có khoảng 401 ngôi nhà đang có 1 phòng tắm, có khoảng 134 ngôi nhà là có 2 phòng tắm, có khoảng 10 ngôi nhà là có 3 phòng tắm và có 1 ngôi nhà đang có 4 phòng tắm

3.2.1.1 Đồ thị cột cho biến Bathrooms và thêm tỷ lệ phần trăm

mk |>  group_by(bathrooms) |> 
  summarise(n = n()) |> 
mutate(pg = scales::percent(n/sum(n), accuracy = 0.01)) |>
  ggplot(aes(x = bathrooms, y = pg)) +
  geom_col(fill = 'yellow') +
  theme_classic() +
  labs(x = 'Số phòng tắm', y = 'Tỷ lệ %')

mk %>%  count(bathrooms) %>% 
mutate(p = scales::percent(n/sum(n), accuracy = 0.01)) %>% 
  ggplot(aes(x = bathrooms, y = n,fill = bathrooms)) +
  geom_col() +
  geom_text(aes(label = p),color = 'brown', hjust =0 , size = 3) +
  theme_classic() +
  labs(x = 'Số phòng tắm', y = 'Số ngôi nhà')+
 coord_flip()

mk %>%  ggplot(aes(x = bathrooms, y = after_stat(count))) +
  geom_bar(fill = 'blue') +
  geom_text(aes(label = scales::percent(after_stat(count/sum(count)))), stat = 'count', color = 'black', vjust = - .5) +
  theme_classic() +
  labs(x = 'Số phòng tắm', y = 'Số ngôi nhà')

  • Nhận xét: Qua 2 biểu đồ trên cho biết là có khoảng 401 ngôi nhà là đang có 1 phòng ngủ và chiếm tới 73,6%. Có 134 ngôi nhà có 2 phòng tắm chiếm 24,4%. Có khoảng 10 ngôi nhà có 3 phòng tắm chiếm 1,8% và có 1 ngôi nhà có 4 phòng tắm chiếm 0,2%.

3.2.2 Vẽ biểu đồ cột ghép giữa biến số phòng tắm và số tầng của ngôi nhà

mk %>%  ggplot(aes(x = bathrooms, y = after_stat(count))) +
  geom_bar(fill = 'blue') +
  geom_text(aes(label = scales::percent(after_stat(count/sum(count)))), stat = 'count', color = 'black', vjust = - .5) +
  facet_grid(. ~ stories) +
  theme_classic() +
  labs(x = 'Số phòng tắm', y = 'Số ngôi nhà')

  • Nhận xét: Qua biểu đồ trên ta thấy ở những ngôi nhà có 1 tầng thì có khoảng 180 ngôi nhà là có 1 phòng tắm(36,08%),có khoảng 20 ngôi nhà là có 2 phòng tắm(5,31%) và có khoảng 3 ngôi nhà có 3 phòng tắm(0,18%) và không có ngôi nhà nào có 4 phòng tắm ở những ngôi nhà có 1 tầng. Ở những ngôi nhà có 1 phòng tắm chiếm tỷ lệ khá cao ở những ngôi nhà có 1 và 2 tầng.
mk |> count(bathrooms, stories) |>
  mutate(pCH = prop.table(n)) |>
  ggplot(aes(x = bathrooms, y = n, fill = stories)) +
  geom_col(position = 'dodge') +
  geom_text(aes(label = percent(pCH, accuracy = .01)), position = position_dodge(1), vjust = 0, size = 3) +
  ylab('Số ngôi nhà') +
  xlab('Số phòng tắm')

3.2.3 Vẽ biểu đồ cột thể hiện mối quan hệ giữa số phòng tắm và số phòng ngủ

mk %>%  ggplot(aes(x = bathrooms, y = after_stat(count))) +
  geom_bar(fill = 'purple') +
  geom_text(aes(label = scales::percent(after_stat(count/sum(count)))), stat = 'count', color = 'black', vjust = - .5) +
  facet_grid(. ~ bedrooms) +
  theme_classic() +
  labs(x = 'Số phòng tắm', y = 'Số ngôi nhà')

  • Nhận xét: Ở biểu đồ trên ta thấy là ở những ngôi nhà có 3 phòng ngủ mà có 1 phòng tắm chiếm tỷ lệ cao có khoảng 260 ngôi nhà. Số lượng những ngôi nhà có 1,4,5,6 phòng ngủ chiếm tỷ lệ thấp và rất thấp khi có số lượng phòng tắm chiếm tỷ lệ phần trăm thấp

3.2.4 Vẽ biểu đồ số tầng của ngôi nhà

mk %>%  count(stories) %>% 
  mutate(pC = percent(n/sum(n),accuracy = 0.01)) |>
  ggplot(aes(x = stories, y = n)) +
  geom_col(fill = 'green') +
  geom_text(aes(label = pC),color = 'black', vjust = 2, size = 5) +
  ylab('Số ngôi nhà') +
  xlab('Số tầng')

  • Nhận xét: Có khoảng 227 ngôi nhà có 1 tầng(41,58%), Có khoảng 235 ngôi nhà là có 2 tầng(43,49%)

  • Biểu đồ bên dưới em vẽ biểu độ cột ngang cho biến số tầng của ngôi nhà

mk |> count(stories) |>
  mutate(pC = percent(n/sum(n),accuracy = 0.01)) |>
  ggplot(aes(x = stories, y = n)) +
  geom_col(fill = 'gray') +
  geom_text(aes(label = pC),color = 'yellow', hjust = 2, size = 5) +
  ylab('Số ngôi nhà') +
  xlab('Số tầng') +
  coord_flip()

4 Bài tập về nhà tuần 3

4.1 Dataset: Economics - Package: ggplot2

Bộ dữ liệu kinh tế là một bộ dữ liệu nó chứa thông tin về số người thất nghiệp, tỷ lệ tiết kiệm cá nhân và tiêu dùng cá nhân theo năm và tháng. Bộ dữ liệu này được tạo ra từ dữ liệu chuỗi thời gian kinh tế của Hoa Kỳ có sẵn từ Ngân hàng Dự trữ Liên Bang St. Louis.

Dữ liệu trên bao gồm 574 quan sát và chứa 6 biến:

  • date: Ngày tháng năm thu nhập
  • pce: Chi tiêu tiêu dùng cho cá nhân (đơn vị tính bằng tỷ đô la)
  • pop: Tổng dân số (đơn vị nghìn người)
  • psavert: Tỷ lệ tiết kiệm cá nhân
  • uempmed: Thời gian thất nghiệp trung bình (Đơn vị tính: tuần)
  • unemploy: Số người thất nghiệp (đơn vị tính: nghìn người)

4.2 Tổng quan dữ liệu

4.2.1 Đọc dữ liệu từ file package ggplot2 và gán chúng cho biến Eco

library(ggplot2)
data("economics")
Eco <- economics

4.2.2 Dùng summary để có cái nhìn tổng quan dữ liệu

summary(Eco)
##       date                 pce               pop            psavert      
##  Min.   :1967-07-01   Min.   :  506.7   Min.   :198712   Min.   : 2.200  
##  1st Qu.:1979-06-08   1st Qu.: 1578.3   1st Qu.:224896   1st Qu.: 6.400  
##  Median :1991-05-16   Median : 3936.8   Median :253060   Median : 8.400  
##  Mean   :1991-05-17   Mean   : 4820.1   Mean   :257160   Mean   : 8.567  
##  3rd Qu.:2003-04-23   3rd Qu.: 7626.3   3rd Qu.:290291   3rd Qu.:11.100  
##  Max.   :2015-04-01   Max.   :12193.8   Max.   :320402   Max.   :17.300  
##     uempmed          unemploy    
##  Min.   : 4.000   Min.   : 2685  
##  1st Qu.: 6.000   1st Qu.: 6284  
##  Median : 7.500   Median : 7494  
##  Mean   : 8.609   Mean   : 7771  
##  3rd Qu.: 9.100   3rd Qu.: 8686  
##  Max.   :25.200   Max.   :15352

4.2.3 Dùng lệnh head và tail để xem 6 dòng đầu và 6 dòng cuối của dữ liệu

head(Eco)
## # A tibble: 6 × 6
##   date         pce    pop psavert uempmed unemploy
##   <date>     <dbl>  <dbl>   <dbl>   <dbl>    <dbl>
## 1 1967-07-01  507. 198712    12.6     4.5     2944
## 2 1967-08-01  510. 198911    12.6     4.7     2945
## 3 1967-09-01  516. 199113    11.9     4.6     2958
## 4 1967-10-01  512. 199311    12.9     4.9     3143
## 5 1967-11-01  517. 199498    12.8     4.7     3066
## 6 1967-12-01  525. 199657    11.8     4.8     3018
tail(Eco)
## # A tibble: 6 × 6
##   date          pce     pop psavert uempmed unemploy
##   <date>      <dbl>   <dbl>   <dbl>   <dbl>    <dbl>
## 1 2014-11-01 12051. 319564.     7.3    13       9090
## 2 2014-12-01 12062  319746.     7.6    12.9     8717
## 3 2015-01-01 12046  319929.     7.7    13.2     8903
## 4 2015-02-01 12082. 320075.     7.9    12.9     8610
## 5 2015-03-01 12158. 320231.     7.4    12       8504
## 6 2015-04-01 12194. 320402.     7.6    11.5     8526

4.2.4 Dùng lệnh str để xem qua cấu trúc của bộ dữ liệu

str(Eco)
## spc_tbl_ [574 × 6] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ date    : Date[1:574], format: "1967-07-01" "1967-08-01" ...
##  $ pce     : num [1:574] 507 510 516 512 517 ...
##  $ pop     : num [1:574] 198712 198911 199113 199311 199498 ...
##  $ psavert : num [1:574] 12.6 12.6 11.9 12.9 12.8 11.8 11.7 12.3 11.7 12.3 ...
##  $ uempmed : num [1:574] 4.5 4.7 4.6 4.9 4.7 4.8 5.1 4.5 4.1 4.6 ...
##  $ unemploy: num [1:574] 2944 2945 2958 3143 3066 ...

4.3 Vẽ biểu đồ

4.3.1 Vẽ biểu đồ số người thất nghiệp tính bằng nghìn người theo thời gian.

`

ggplot(data = economics, aes(x = date, y = unemploy)) +
  geom_point(aes(color =uempmed)) +
  labs(x = "Date",
       y = "Unemployment",
       title = "Số người thất nghiệp theo thời gian") +
  theme_bw()

Nhận xét: Qua biểu đồ ta thấy có các chấm sáng hơn là thể hiện thời gian thất nghiệp dài hơn, đơn vị tính cho thời gian thất nghiệp trung bình tính bằng tuần. Từ năm 2007-2010 có sự tăng trưởng ở mức cao nhất có nghĩa là thời gian thất nghiệp dài hơn trong thời kỳ suy thoái.

4.3.2 Vẽ biểu đồ thể hiện tỷ lệ tiết kiệm của dân số mỗi năm

ggplot(data = economics) +
  geom_bar(aes(x = date, y = psavert, fill = pop), stat = 'identity') +
  labs(x = "Date",
       y = "Personal Savings Rate",
       fill = 'population',
       title = "Tỷ lệ tiết kiệm của dân số mỗi năm") +
  theme_bw()

Nhận xét: Tỷ lệ tiết kiệm là số tiền mà một cá nhân tiết kiệm được qua mỗi năm theo tỷ lệ phần trăm. Qua biểu đồ ta thấy được dân số đang tăng qua mỗi năm cho thấy theo thời gian thì dân số không ảnh hưởng đến tỷ lệ tiết kiệm của dân số qua mỗi năm.

4.4 Sử dụng lệnh pivot_wider để xoay khung dữ liệu từ dạng dài sang dạng rộng

library(tidyverse)
Eco <- Eco %>% 
  pivot_wider(names_from = pce,
              values_from = unemploy)
print(Eco)
## # A tibble: 574 × 578
##    date          pop psavert uempmed `506.7` `509.8` `515.6` `512.2` `517.4`
##    <date>      <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
##  1 1967-07-01 198712    12.6     4.5    2944      NA      NA      NA      NA
##  2 1967-08-01 198911    12.6     4.7      NA    2945      NA      NA      NA
##  3 1967-09-01 199113    11.9     4.6      NA      NA    2958      NA      NA
##  4 1967-10-01 199311    12.9     4.9      NA      NA      NA    3143      NA
##  5 1967-11-01 199498    12.8     4.7      NA      NA      NA      NA    3066
##  6 1967-12-01 199657    11.8     4.8      NA      NA      NA      NA      NA
##  7 1968-01-01 199808    11.7     5.1      NA      NA      NA      NA      NA
##  8 1968-02-01 199920    12.3     4.5      NA      NA      NA      NA      NA
##  9 1968-03-01 200056    11.7     4.1      NA      NA      NA      NA      NA
## 10 1968-04-01 200208    12.3     4.6      NA      NA      NA      NA      NA
## # ℹ 564 more rows
## # ℹ 569 more variables: `525.1` <dbl>, `530.9` <dbl>, `533.6` <dbl>,
## #   `544.3` <dbl>, `544` <dbl>, `549.8` <dbl>, `556.3` <dbl>, `563.2` <dbl>,
## #   `567` <dbl>, `568.2` <dbl>, `571.6` <dbl>, `576.7` <dbl>, `576.5` <dbl>,
## #   `583.5` <dbl>, `588.7` <dbl>, `588.9` <dbl>, `593.9` <dbl>, `600.3` <dbl>,
## #   `600.9` <dbl>, `602.7` <dbl>, `609.9` <dbl>, `613.2` <dbl>, `618.5` <dbl>,
## #   `620.5` <dbl>, `622.8` <dbl>, `628.7` <dbl>, `634` <dbl>, `632.3` <dbl>, …

4.5 Kiểm định sự tương quan

4.5.1 Kiểm định xem giữa chi tiêu của cá nhân có ảnh hưởng đến tỷ lệ tiết kiệm

cor.test(economics$pce, economics$psavert)
## 
##  Pearson's product-moment correlation
## 
## data:  economics$pce and economics$psavert
## t = -31.116, df = 572, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  -0.8213959 -0.7603523
## sample estimates:
##        cor 
## -0.7928546

Nhận xét: Qua bảng số liệu ta thấy p-value < 2.2e-16 < 0,05. Suy ra bác bỏ H0. Vậy chi tiêu của cá nhân có ảnh hưởng đến tỷ lệ tiết kiệm

Dataset: HousePrices - Package AER. Dữ liệu “HousePrices” được lấy từ gói AER. Trong bộ dữ trên liên quan đến giá bán của 546 căn nhà ở thành phố Windsor, Canada trong tháng 7,8,9 của năm 1987.

Dữ liệu trên bao gồm 12 biến:

  • Price: Giá bán của ngôi nhà (nghìn đô)
  • Lotsize: Diện tích của ngôi nhà là bao nhiêu mét vuông
  • Bedrooms: Số phòng ngủ của ngôi nhà
  • Bathrooms: Số phòng tắm của ngôi nhà
  • Stories: Nhà có bao nhiêu tầng bao gồm tầng hầm
  • Driveway: Khu vực đó có đường cho xe chạy vào nhà hay không
  • Recreation: Ở trong nhà có phòng giải trí không
  • Fullbase: Tầng hầm của ngôi nhà đã được hoàn thiện hay chưa
  • Gasheat: Nhà có sử dụng hệ thống sưởi bằng gas không
  • Aircon: Nhà có sử dụng máy lạnh không
  • Garage: Số chỗ để xe
  • Prefer: Ngôi nhà có nằm trong khu phố ưu thích của thành phố hay không

5 Bài tập về nhà tuần 2

library(AER)
data("HousePrices")
mk <- HousePrices

Ở tuần này tôi sẽ thực hiện tính toán các thống kê mô tả

Đánh giá được độ tập trung và phân tán của dữ liệu. Dùng đồ thị để thể hiện tần số của các biến. Kiểm định rằng càng biến có quan hệ phụ thuộc nhau hay không và phân tích quan hệ ấy bằng đồ thị đơn giản

5.1 Phân tổ không đều

Ở mục này tôi bắt đầu phân tổ biến giá bán nhà và biến diện tích của ngôi nhà. Tôi phân thành 4 tổ và sau đó tôi gán chúng vào mk

5.1.1 Giá bán của ngôi nhà

mk$price <- cut(mk$price, breaks = c(25000,80000,135000,190000), labels = c(" giá thấp", "giá Vừa", "giá cao")) 
table(mk$price)                 
## 
##  giá thấp   giá Vừa   giá cao 
##       400       131        12
  • Qua kết quả của bảng trên cho ta thấy: Có 400 ngôi nhà là có giá bán thấp từ 25000 - 80000 nghìn đô. Có 131 ngôi nhà là có giá bán vừa từ 80000 - 135000 nghìn đô. Có 12 ngôi nhà là có giá bán cao từ 135000 - 190000 nghìn đô

5.1.2 Diện tích ngôi nhà

mk$lotsize <- cut(mk$lotsize, breaks = c(4000,5000,8000,11000), labels = c("S nhỏ","S vừa","S rộng"))
table(mk$lotsize)
## 
##  S nhỏ  S vừa S rộng 
##    103    183     42
  • Qua kết quả trên cho ta thấy: Có tới 183 ngôi nhà có diện tích vừa (5000-8000 mét vuông), 103 ngôi nhà có diện tích nhỏ khoảng 1000 mét vuông (4000-5000 mét vuông) và 42 ngôi nhà có diện tích rộng khoảng 3000 mét vuông (8000-11000 mét vuông)

5.2 Lập bảng tần số, tần suất

5.2.1 Lập bảng tần số, tần suất cho biến số phòng tắm và biến giá bán của ngôi nhà

table(mk$bat, mk$price)
##    
##      giá thấp giá Vừa giá cao
##   1       340      56       3
##   2        56      73       4
##   3         4       2       4
##   4         0       0       1
k=table(mk$bat, mk$price)
prop.table(k)
##    
##        giá thấp     giá Vừa     giá cao
##   1 0.626151013 0.103130755 0.005524862
##   2 0.103130755 0.134438306 0.007366483
##   3 0.007366483 0.003683241 0.007366483
##   4 0.000000000 0.000000000 0.001841621

Nhận xét: Ở những ngôi nhà có 1 phòng tắm thì tỷ lệ giá bán thấp sẽ tập trung đông chiến hơn một nửa 62,6% cao hơn nhiều so với giá vừa(10,3%) và giá cao(0.5%). Với những ngôi nhà có 4 phòng tắm thì tỷ lệ có giá bán thấp, vừa, cao là như nhau chiếm tỷ lệ rất nhỏ dưới 0.2%.

5.2.2 Lập bảng tần số và tần suất cho biến số tầng của ngôi nhà và biến diện tích của ngôi nhà

table(mk$bed, mk$lotsize)
##    
##     S nhỏ S vừa S rộng
##   1     0     0      0
##   2    32    27      8
##   3    48   113     23
##   4    21    39     10
##   5     1     4      1
##   6     1     0      0
h= table(mk$bed, mk$lotsize)
prop.table(h)
##    
##          S nhỏ      S vừa     S rộng
##   1 0.00000000 0.00000000 0.00000000
##   2 0.09756098 0.08231707 0.02439024
##   3 0.14634146 0.34451220 0.07012195
##   4 0.06402439 0.11890244 0.03048780
##   5 0.00304878 0.01219512 0.00304878
##   6 0.00304878 0.00000000 0.00000000

Nhận xét: Ở những ngôi nhà có 1 phòng ngủ và 4 phòng ngủ thì diện tích ngôi nhà chiếm tỷ lệ rất nhỏ dưới 0,3%. Ở những ngôi nhà có 3 phòng ngủ thì diện tích của ngôi nhà chiếm tỷ lệ cao hơn những ngôi nhà có 2 phòng ngủ. Ở những ngôi nhà có diện tích vừa mà có 3 phòng ngủ chiếm tỷ lệ cao 34,5% . Qua bảng tần suất diện tích của ngôi nhà thì ta thấy các ngôi nhà có diện tích nhỏ và vừa mà có 2,3 phòng ngủ chiến tỷ lệ khá cao.

5.3 Tính toán các đặc trưng đo lường

Trong phần này chúng ta sẽ tính các đặc trưng đo lường, trung bình, phương sai,độ lệch chuẩn,tổng của các biến bằng lệnh summary, mean, sd,var,quantile,sum để có cái nhìn tổng quan hơn.

5.3.1 DÙng hàm summary

Tôi dùng hàm Summary để tóm tắt thống kê cho toàn bộ dữ liệu.

summary(mk$bedrooms)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   2.000   3.000   2.965   3.000   6.000

Nhận xét: Qua bảng tóm tắt trên ta thấy các ngôi nhà có ít nhất 1 phòng ngủ và nhiều nhất là 6 phòng ngủ. Các ngôi nhà có số phòng ngủ trung bình là 3 phòng. Có 25% số ngôi nhà có số phòng ngủ nhỏ hơn 2 phòng, có 50% số ngôi nhà có số phòng ngủ nhỏ hơn 3 phòng và 75% số ngôi nhà có số phòng ngủ nhỏ hơn 3 phòng

summary(mk$stories)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   1.000   2.000   1.808   2.000   4.000

Nhận xét: Qua bảng tóm tắt trên ta thấy các ngôi nhà có ít nhất 1 tầng và nhiều nhất 4 tầng và trung bình các ngôi nhà có 2 tầng. Có 25% số ngôi nhà có số tầng nhỏ hơn 1 tầng, có 50% số ngôi nhà có số tầng nhỏ hơn 2 tầng và 75% số ngôi nhà có số tầng nhỏ hơn 2 tầng

summary(mk$garage)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.0000  0.0000  0.0000  0.6923  1.0000  3.0000

Nhận xét: Qua bảng tóm tắt thống kê trên ta thấy số chỗ để xe nhỏ nhất là 0 và lớn nhất là 3 chỗ. Số chỗ để xe trung bình là 3 chỗ. Có 25% số ngôi nhà có số chỗ để xe nhỏ hơn 0, có 50% số ngôi nhà có số chỗ để xe nhỏ hơn 0 và 75% số ngôi nhà có số chỗ để xe nhỏ hơn 1 chỗ.

5.3.2 Biến số phòng tắm của ngôi nhà

5.3.2.1 Trung bình

mean(mk$bathrooms)
## [1] 1.285714

Nhận xét: Số phòng tắm trung bình của ngôi nhà là 1,235714

5.3.2.2 Phương sai

var(mk$bathrooms)
## [1] 0.2521625

Nhận xét: SỐ 0.2521625 đại diện cho mức độ phân tán của số phòng tắm so với giá bán trung bình

5.3.2.3 Độ lệch chuẩn

sd(mk$bathrooms)
## [1] 0.5021579

Nhận xét: Số 0,5021579 đo lường mức độ phân tán của giá bán cho số phòng tắm trung bình

5.3.2.4 Tổng

sum(mk$bathrooms)
## [1] 702

Nhận xét: Có tới 702 phòng tắm trong 546 ngôi nhà

5.3.2.5 Quantile

quantile(mk$bathrooms, .50)
## 50% 
##   1

Nhận xét: Hàm quantile dùng để tính phân vị của tập dữ liệu. Kết quả có 50% ngôi nhà có giá bán cho số phòng tắm ít hơn 1 phòng

5.4 Thống kê mô tả với hàm Aggregate và toán tử %>%

5.4.1 Hàm Aggregate

aggregate(HousePrices$lotsize,list(HousePrices$bedrooms), FUN="mean")
##   Group.1        x
## 1       1 3710.000
## 2       2 4636.235
## 3       3 5225.867
## 4       4 5582.063
## 5       5 6291.500
## 6       6 3950.000

Nhận xét: Nhà có 1 phòng ngủ có diện tích trung bình là 3710 mét vuông. Nhà có 2 phòng ngủ có diện tích trung binhg là 4636 mét vuông, 3 phòng ngủ là 5226 mét vuông, 4 phòng ngủ là 5582 mét vuông, 5 phòng ngủ là 6292 mét vuông và 6 phòng ngủ là 3950 mét vuông

aggregate(HousePrices$lotsize,list(HousePrices$garage), FUN="mean")
##   Group.1        x
## 1       0 4502.783
## 2       1 5576.357
## 3       2 6226.380
## 4       3 7178.333

Nhận xét: Diện tích trung bình của ngôi nhà có 3 chỗ để xe chiếm diện tích lớn nhất 7178 mét vuông, 2 chỗ để xe là 6226 mét vuông, 1 chỗ để xe là 5576 mét vuông và không có chỗ để xe chiếm diện tích bé nhất là 4503 mét vuông

5.4.2 Toán tử %>%

library(tidyverse)
mk %>% group_by(lotsize) %>% summarise(mk=mean(garage))
## # A tibble: 4 × 2
##   lotsize    mk
##   <fct>   <dbl>
## 1 S nhỏ   0.592
## 2 S vừa   0.847
## 3 S rộng  1.48 
## 4 <NA>    0.459
mk %>% group_by(lotsize) %>% summarise(mk=var(garage))
## # A tibble: 4 × 2
##   lotsize    mk
##   <fct>   <dbl>
## 1 S nhỏ   0.616
## 2 S vừa   0.823
## 3 S rộng  0.743
## 4 <NA>    0.544
mk %>% group_by(lotsize) %>% summarise(mk=sd(garage))
## # A tibble: 4 × 2
##   lotsize    mk
##   <fct>   <dbl>
## 1 S nhỏ   0.785
## 2 S vừa   0.907
## 3 S rộng  0.862
## 4 <NA>    0.738

5.4.3 Ghép dữ liệu lại thành một cột

a <- mk$bathrooms
a1 <- a[1:100]
a2 <- a[101:200]
bathrooms1 <- data.frame(sophong=a1,nguoimua="A")
bathrooms2 <- data.frame(sophong=a2,nguoimua="B")
bathroomsnew <- rbind(bathrooms1,bathrooms2)
bathroomsnew
##     sophong nguoimua
## 1         1        A
## 2         1        A
## 3         1        A
## 4         1        A
## 5         1        A
## 6         1        A
## 7         2        A
## 8         1        A
## 9         1        A
## 10        2        A
## 11        2        A
## 12        1        A
## 13        1        A
## 14        1        A
## 15        1        A
## 16        1        A
## 17        1        A
## 18        1        A
## 19        1        A
## 20        2        A
## 21        1        A
## 22        2        A
## 23        1        A
## 24        1        A
## 25        1        A
## 26        1        A
## 27        1        A
## 28        1        A
## 29        1        A
## 30        1        A
## 31        1        A
## 32        1        A
## 33        1        A
## 34        1        A
## 35        1        A
## 36        1        A
## 37        1        A
## 38        1        A
## 39        2        A
## 40        2        A
## 41        1        A
## 42        1        A
## 43        1        A
## 44        3        A
## 45        1        A
## 46        1        A
## 47        1        A
## 48        1        A
## 49        1        A
## 50        1        A
## 51        2        A
## 52        1        A
## 53        1        A
## 54        1        A
## 55        3        A
## 56        1        A
## 57        1        A
## 58        2        A
## 59        1        A
## 60        1        A
## 61        1        A
## 62        1        A
## 63        1        A
## 64        1        A
## 65        1        A
## 66        1        A
## 67        1        A
## 68        1        A
## 69        1        A
## 70        1        A
## 71        1        A
## 72        1        A
## 73        1        A
## 74        1        A
## 75        1        A
## 76        1        A
## 77        1        A
## 78        1        A
## 79        2        A
## 80        1        A
## 81        1        A
## 82        1        A
## 83        1        A
## 84        1        A
## 85        1        A
## 86        1        A
## 87        1        A
## 88        2        A
## 89        1        A
## 90        1        A
## 91        1        A
## 92        2        A
## 93        1        A
## 94        2        A
## 95        1        A
## 96        1        A
## 97        1        A
## 98        1        A
## 99        1        A
## 100       1        A
## 101       2        B
## 102       3        B
## 103       1        B
## 104       2        B
## 105       2        B
## 106       1        B
## 107       1        B
## 108       2        B
## 109       2        B
## 110       1        B
## 111       1        B
## 112       1        B
## 113       1        B
## 114       1        B
## 115       2        B
## 116       1        B
## 117       1        B
## 118       2        B
## 119       2        B
## 120       1        B
## 121       1        B
## 122       2        B
## 123       1        B
## 124       1        B
## 125       1        B
## 126       2        B
## 127       3        B
## 128       2        B
## 129       2        B
## 130       2        B
## 131       1        B
## 132       1        B
## 133       1        B
## 134       1        B
## 135       1        B
## 136       2        B
## 137       1        B
## 138       1        B
## 139       1        B
## 140       1        B
## 141       1        B
## 142       1        B
## 143       2        B
## 144       1        B
## 145       1        B
## 146       1        B
## 147       1        B
## 148       2        B
## 149       2        B
## 150       1        B
## 151       1        B
## 152       1        B
## 153       2        B
## 154       1        B
## 155       1        B
## 156       3        B
## 157       1        B
## 158       2        B
## 159       1        B
## 160       1        B
## 161       1        B
## 162       1        B
## 163       1        B
## 164       2        B
## 165       1        B
## 166       1        B
## 167       1        B
## 168       1        B
## 169       1        B
## 170       1        B
## 171       1        B
## 172       1        B
## 173       1        B
## 174       1        B
## 175       1        B
## 176       2        B
## 177       1        B
## 178       2        B
## 179       2        B
## 180       1        B
## 181       1        B
## 182       1        B
## 183       1        B
## 184       1        B
## 185       1        B
## 186       1        B
## 187       1        B
## 188       1        B
## 189       1        B
## 190       1        B
## 191       1        B
## 192       1        B
## 193       1        B
## 194       2        B
## 195       1        B
## 196       1        B
## 197       1        B
## 198       1        B
## 199       1        B
## 200       1        B

5.5 Vẽ biểu đổ

5.5.1 Biểu đồ cho biến số phòng tắm

hist(mk$bathrooms )

6 Bài tập về nhà tuần 1

6.1 Đọc dữ liệu từ file package AER

  • Đầu tiên để lấy được dữ liệu từ file AER thì chúng ta phải gọi lên gói package AER và sử dụng lệnh data để lấy dữ liệu từ gói package AER
library(AER)
data("HousePrices")

6.2 Thực hành

6.2.1 Tổng quan bộ dữ liệu

  • Trong phần này tôi sẽ thực hành một số thao tác là gán dữ liệu, đặt tên cho bộ dữ liệu, sử dụng str để hiển thị cấu trúc của dữ liệu, xem các quan sát đầu, quan sát cuối và tạo các bản tóm tắt cho dữ liệu

  • Đầu tiên tôi gán dataset HousePrices vào một biến có tên là mk

mk <- HousePrices
  • Tiếp đến tôi dùng lệnh str để xem cấu trúc dữ liệu của mk
str(mk)
## 'data.frame':    546 obs. of  12 variables:
##  $ price     : num  42000 38500 49500 60500 61000 66000 66000 69000 83800 88500 ...
##  $ lotsize   : num  5850 4000 3060 6650 6360 4160 3880 4160 4800 5500 ...
##  $ bedrooms  : num  3 2 3 3 2 3 3 3 3 3 ...
##  $ bathrooms : num  1 1 1 1 1 1 2 1 1 2 ...
##  $ stories   : num  2 1 1 2 1 1 2 3 1 4 ...
##  $ driveway  : Factor w/ 2 levels "no","yes": 2 2 2 2 2 2 2 2 2 2 ...
##  $ recreation: Factor w/ 2 levels "no","yes": 1 1 1 2 1 2 1 1 2 2 ...
##  $ fullbase  : Factor w/ 2 levels "no","yes": 2 1 1 1 1 2 2 1 2 1 ...
##  $ gasheat   : Factor w/ 2 levels "no","yes": 1 1 1 1 1 1 1 1 1 1 ...
##  $ aircon    : Factor w/ 2 levels "no","yes": 1 1 1 1 1 2 1 1 1 2 ...
##  $ garage    : num  1 0 0 0 0 0 2 0 0 1 ...
##  $ prefer    : Factor w/ 2 levels "no","yes": 1 1 1 1 1 1 1 1 1 1 ...
  • Nhận xét: Kết quả cho chúng ta thấy bộ dữ liệu này có 546 quan sát và có 12 biến. Giúp tôi có cái nhìn tổng quan hơn về các thành phần trong bộ dữ liệu Tiếp tục tôi dùng lệnh head để xem các quan sát đầu của mk và dùng lệnh tail để xem các quan sát cuối của mk
head(mk)
##   price lotsize bedrooms bathrooms stories driveway recreation fullbase gasheat
## 1 42000    5850        3         1       2      yes         no      yes      no
## 2 38500    4000        2         1       1      yes         no       no      no
## 3 49500    3060        3         1       1      yes         no       no      no
## 4 60500    6650        3         1       2      yes        yes       no      no
## 5 61000    6360        2         1       1      yes         no       no      no
## 6 66000    4160        3         1       1      yes        yes      yes      no
##   aircon garage prefer
## 1     no      1     no
## 2     no      0     no
## 3     no      0     no
## 4     no      0     no
## 5     no      0     no
## 6    yes      0     no
tail(mk)
##      price lotsize bedrooms bathrooms stories driveway recreation fullbase
## 541  85000    6525        3         2       4      yes         no       no
## 542  91500    4800        3         2       4      yes        yes       no
## 543  94000    6000        3         2       4      yes         no       no
## 544 103000    6000        3         2       4      yes        yes       no
## 545 105000    6000        3         2       2      yes        yes       no
## 546 105000    6000        3         1       2      yes         no       no
##     gasheat aircon garage prefer
## 541      no     no      1     no
## 542      no    yes      0     no
## 543      no    yes      0     no
## 544      no    yes      1     no
## 545      no    yes      1     no
## 546      no    yes      1     no
  • Kế tiếp tôi đặt tên cho 12 biến trong bộ dữ liệu bằng lệnh names để dễ dàng hơn trong việc xử lý dữ liệu và tôi gán các tên biến
names(mk) <- c("pr","lot","bed","bat","str","dr","rec","fb","gas","air","gar","pre")
price <- mk$pr
lotsize <- mk$lot
bedrooms <- mk$bed
bathrooms <- mk$bat
stories <- mk$str
  • Cuối cùng tôi dùng lệnh summary để tạo báo cáo tóm tắt trên dữ liệu mk. Báo cáo tóm tắt này bao gồm các thông tin như min, max, trung bình, trung vị, tứ phân vị của các biến
summary(mk)
##        pr              lot             bed             bat       
##  Min.   : 25000   Min.   : 1650   Min.   :1.000   Min.   :1.000  
##  1st Qu.: 49125   1st Qu.: 3600   1st Qu.:2.000   1st Qu.:1.000  
##  Median : 62000   Median : 4600   Median :3.000   Median :1.000  
##  Mean   : 68122   Mean   : 5150   Mean   :2.965   Mean   :1.286  
##  3rd Qu.: 82000   3rd Qu.: 6360   3rd Qu.:3.000   3rd Qu.:2.000  
##  Max.   :190000   Max.   :16200   Max.   :6.000   Max.   :4.000  
##       str          dr       rec        fb       gas       air     
##  Min.   :1.000   no : 77   no :449   no :355   no :521   no :373  
##  1st Qu.:1.000   yes:469   yes: 97   yes:191   yes: 25   yes:173  
##  Median :2.000                                                    
##  Mean   :1.808                                                    
##  3rd Qu.:2.000                                                    
##  Max.   :4.000                                                    
##       gar          pre     
##  Min.   :0.0000   no :418  
##  1st Qu.:0.0000   yes:128  
##  Median :0.0000            
##  Mean   :0.6923            
##  3rd Qu.:1.0000            
##  Max.   :3.0000
  • Nhận xét: Kết quả của bảng báo cáo tóm tắt trên cho chúng ta thấy
    • Mức giá bán của căn nhà thấp nhất là 25 nghìn đô và cao nhất là 190 nghìn đô và mức giá trung bình của các căn nhà là khoảng 68 nghìn đô
    • Căn nhà có diện tích lớn nhất trong khu vực có tổng diện tích là 16200 mét vuông và thấp nhất là 1650 mét vuông
    • Các căn nhà ở đây cho chúng ta thấy số lượng phòng ngủ, phòng tắm cao nhất rơi vào khoảng 4-6 phòng và thấp nhất là 1 phòng.
    • Dữ liệu trên cho chúng ta thấy các căn nhà ở đây tỷ lệ không có phòng giải trí chiếm 82,23% và tỷ lệ các ngôi nhà không có hệ thống sưởi bằng gas chiếm 95,42% và tỷ lệ các tầng hầm chưa được hoàn thiện chiếm 65%. Các số liệu trên chiếm tỷ lệ khá cao đến rất cao so với là tỷ lệ có

6.2.2 Xử lý dữ liệu

  • Để tìm hiểu xem diện tích các ngôi nhà khu vực này có diện tích như thế nào thì tôi lọc số ngôi nhà có diện tích lớn hơn 5000 mét vuông và gán chúng vào lot1
lot1 <- mk[mk$lot>5000,]
  • Nhận xét: Kết quả là 236 có nghĩa là các ngôi nhà ở đây có tổng diện tích trên 5000 mét vuông thì có 236 ngôi nhà chiếm tỷ lệ 43,22% trên tổng số.

  • Tôi dùng lệnh table để tạo một bảng số phòng ngủ của các ngôi nhà được bán và tôi chia chúng thành 5 tổ có khảng cách đều nhau

table(cut(mk$bed, breaks = c(0,1,2,3,4,5)))
## 
## (0,1] (1,2] (2,3] (3,4] (4,5] 
##     2   136   301    95    10
  • Nhận xét: Qua kết quả trên tôi thấy:
    • Nếu số lượng phòng ngủ là 1 thì ở thành phố Windsor có 2 ngôi nhà, chiếm tỷ lệ ít nhất (0,37%)
    • Nếu số lượng phòng ngủ từ 1 đến 2 phòng thì ở thành phố Windsor có 136 ngôi nhà, chiếm tỷ lệ cao thứ 2 (25%)
    • Nếu số lượng phòng ngủ từ 2 đến 3 phòng thì ở thành phố Windsor có 301 ngôi nhà, chiếm tỷ lệ cao nhất (55,13%)
    • Nếu số lượng phòng ngủ từ 3 đến 4 phòng thì ở thành phố Windsor có 95 ngôi nhà, chiếm tỷ lệ 17,4%
    • Nếu số lượng phòng ngủ từ 2 đến 3 phòng thì ở thành phố Windsor có 10 ngôi nhà, chiếm tỷ lệ 1,83%
  • Kế tiếp tôi dùng lệnh table để tạo một bảng tầng hầm của ngôi nhà đã được hoàn thiện hay chưa dựa vào số chỗ để xe
table(cut(mk$gar,3 ),mk$fb)
##             
##               no yes
##   (-0.003,1] 285 141
##   (1,2]       62  46
##   (2,3]        8   4
  • Nhận xét: Qua kết quả trên tôi thấy
    • Tầng hầm của ngôi nhà chưa được hoàn thiện có chỗ để xe dưới 1 là 285 ngôi nhà để xe chiếm 52,19% và đã được hoàn thiện là 141 ngôi nhà chiếm 25,82%
    • Tầng hầm của ngôi nhà chưa được hoàn thiện để có chỗ để xe từ 2 đến 3 chỗ là 8 ngôi nhà chiếm 1,46% và đã được hoàn thiện chiếm 0,73%. Vậy tầng hầm chưa được hoàn thiện có 1 chỗ để xe chiếm tỷ lệ cao nhất 52,19% và đã được hoàn thiện có chỗ để xe từ 2 đến 3 chỗ chiếm tỷ lệ thấp nhất 0.73%
  • Tôi muốn biết dữ liệu của stories dòng 4 cột 2 là bao nhiêu tôi dùng lệnh dưới đây
mk$str[4]
## [1] 2
mk[4,2]
## [1] 6650
  • Để tìm hiểu giá bán của các ngôi nhà ở đây thì tôi lọc số ngôi nhà có giá bán lớn hơn 50 nghìn đô và nhỏ hơn 90 nghìn đô và gán chúng vào k
k <- mk[mk$pr>50000 & mk$pr<90000,]
  • Kết quả tôi nhận được là có 290 ngôi đang có giá bán từ 50 nghìn đô tới 90 nghìn đô

  • Để biết được trong tất cả 546 ngôi nhà ở đây thì có bao nhiêu ngôi nhà có 3 phòng tắm thì tôi chọn biến bathrooms. Sau đó tôi gán chúng vào h và kết quả nhận được là có tới 10 ngôi nhà đang có phòng tắm chiếm 1,83% trong tổng số các ngôi nhà

h <- mk[mk$bat == 3,]
  • Để biết được trong tất cả 546 ngôi nhà ở đây thì có bao nhiêu ngôi nhà có 4 phòng ngủ thì tôi chọn biến bedrooms. Sau đó tôi gán chúng vào bed1 và kết quả nhận được là có tới 95 ngôi nhà đang có phòng ngủ chiếm 17,39% trong tổng số các ngôi nhà
bed1 <- mk[mk$bed == 4,]