안녕하세요

모두를 위한 R 데이터 분석 입문 연습문제 7장 본문

Study_exam/모두를 위한 R 데이터 분석 입문 연습문제

모두를 위한 R 데이터 분석 입문 연습문제 7장

godxxy1229 2023. 6. 15. 06:00

01 다음과 같이 결측값이 포함된 데이터셋 ds를 생성한 후, 다음 문제를 해결하기 위한 R 코드를 작성 하시오.

ds <- state.x77
ds[2,3] <- NA; ds[3,1] <- NA; ds [2,4] <- NA; ds [4,3] <- NA

 

(1) 각 열별로 결측값이 몇 개인지 출력하시오.
(2) 결측값이 포함된 행들의 데이터를 출력하시오.
(3) 결측값이 포함된 행은 몇 개인지 출력하시오.
(4) 결측값이 포함된 행들을 제외하고 새로운 데이터셋 ds.new를 만들어보시오.

 

ds <- state.x77
ds[2,3] <- NA; ds[3,1] <- NA; ds[2,4] <- NA; ds[4,3] <- NA
#(1)
for(i in (1:ncol(ds))){
  cat("col",i, ":", sum(is.na(ds[,i])), "\n")
}
#(2)
for( i in (1:nrow(ds))){
  if(sum(is.na(ds[i, ])) >= 1){
    cat("row", i, ":", ds[i, ], "\n")
  }
}
#(3)
n <- 0;
for( i in (1:nrow(ds))){
  if(sum(is.na(ds[i, ])) >= 1){
    n <- n + 1
  }
}
cat("number of rows :", n, "\n")
#(4)
ds.new <- ds[complete.cases(ds), ]


02 다음과 같이 state.x77 데이터셋을 st에 저장한 후 다음 문제를 해결하기 위한 R 코드를 작성하시오.

st <- data.frame(state.x77)

 

(1) st의 각 변수(열)들에 대해 특이값이 존재하는지 상자그림을 그려 확인하시오.

(2) 특이값이 존재하는 경우 이상치를 NA로 대체하여 저장하시오.
(3) st에서 NA가 존재하는 행들을 제거하여 st2에 저장하시오.

 

st <- data.frame(state.x77)
#(1)
boxplot(x = st)
#Population, Income, Area 열에 특이점이 존재.
#(2)
#확인용 - NA값 적용하기 전
#idx <- which(st[, 1] %in% boxplot.stats(x = st[,1])$out)
for(i in 1:ncol(st)){
  if(length(boxplot.stats(x = st[, i])$out) != 0)  {
    st[which(st[,i] %in% boxplot.stats(x = st[, i])$out), i] <- NA
  }
}
#확인용 - 적용 후
#st[idx, 1]; boxplot(x=st)
#(3)
st2 <- st[complete.cases(st),]
# 확인
#sum(is.na(st2))


03 R에서 제공하는 airquality 데이터셋에 대해 다음의 문제를 해결하기 위한 R 코드를 작성하시오.
(1) airquality를 AQ에 저장하시오.
(2) AQ에서 열별로 NA의 개수를 출력하시오.
(3) AQ에서 행별로 NA의 개수를 출력하시오.
(4) AQ에서 NA를 포함하지 않은 행들만 출력하시오.
(5) AQ에서 NA를 NA가 속한 열의 평균값으로 치환하여 AQ2로 저장하고, AQ2의 내용을 출력하시오.

 

#(1)
AQ <- airquality
#(2)
na.line <- function(x){
  return(sum(is.na(x)))
}
sum(apply(AQ, 2, na.line))
#(3)
sum(apply(AQ, 1, na.line))
#(4)
AQ[complete.cases(AQ),]
#(5)
AQ2 <- AQ
for(i in 1:nrow(AQ)){
  if(sum(is.na(AQ[i,])) != 0){
    subsum <- 0
    for(j in which(!is.na(AQ[i,]))){
      subsum <- subsum + AQ[i,j]
    }
    subsum <- subsum / length(which(!is.na(AQ[i,])))
    AQ2[i, which(is.na(AQ[i,]))] <- subsum
  }
}
AQ2

 

04 R에서 제공하는 state.x77 데이터셋에 대하여 다음 문제를 해결하기 위한 R 코드를 작성하시오.
(1) state.x77 데이터셋을 Population(인구수)를 기준으로 오름차순 정렬하시오.

(2)state.x77 데이터셋을 Income (소득)을 기준으로 내림차순 정렬하시오.

(3) Illiteracy (문맹률)가 낮은 상위 10개 주의 이름과 문맹률을 출력하시오.

 

#(1)
state.x77[order(state.x77[,"Population"], decreasing = FALSE),]
#(2)
state.x77[order(state.x77[,"Income"], decreasing = TRUE),]
#(3)
state.x77[order(state.x77[,"Illiteracy"], decreasing = FALSE),][1:10,"Illiteracy"]


05 R에서 제공하는 mtcars 데이터셋에 대하여 다음 문제를 해결하기 위한 R 코드를 작성하시오.
(1) mtcars 데이터셋을 gear (기어)의 개수에 따라 그룹을 나누어 mt.gear에 저장하시오. (단. split() 함수를 사용하시오.)
(2) mt.gear에서 gear (기어)의 개수가 4인 그룹의 데이터를 출력하시오.
(3) mt.gear에서 gear (기어)의 개수가 3인 그룹과 5인 그룹의 데이터를 합쳐서 mt.gear.35 에 저장하고 내용을 출력하시오.

(4) mtcars 데이터셋에서 wt (중량)가 1.5~3.0 사이인 행들을 추출하여 출력하시오.

 

#(1)
mt.gear <- split(x = mtcars, f = mtcars$gear)
#(2)
mt.gear$'4'
#(3)
mt.gear.35 <- rbind(mt.gear$'3', mt.gear$'5')
mt.gear.35
#(4)
mtcars[mtcars[,"wt"] > 1.5 & mtcars[, "wt"] < 3.0, ]


06 mlbench 패키지에서 제공하는 Glass 데이터셋에 대해 다음의 문제를 해결하기 위한 R 코드를 작성하시오.
(1) 다음과 같이 Glass 데이터셋을 myds에 저장하시오.

library(mlbench)
data("Glass")
myds <- Glass

 

(2) myds에서 Type 열의 값을 그룹으로 하여 RI, Na, Mg, Al, Si 열의 값들의 평균을 구하시 오. (주의: 집계 작업시 팩터 타입의 열은 제외해야 한다.)

 

#(1)
library(mlbench)
data("Glass")
myds <- Glass
#(2)
aggregate(x = myds[,c("RI", "Na", "Mg", "Al", "Si")], by=list(type=myds$Type),
          FUN = mean)

 

07 mlbench 패키지에서 제공하는 Ionosphere 데이터셋에 대해 다음의 문제를 해결하기 위한 R 코드를 작성하시오.
(1) 다음과 같이 Ionosphere 데이터셋을 myds에 저장하시오.

library(mlbench) data("Ionosphere") myds <- Ionosphere

 

(2) myds에서 class와 V1열의 값을 그룹으로 하여 V3~V10 열의 값들의 표준편차를 출력하시오. (주의: 집계 작업시 팩터 타입의 열은 제외해야 한다.)

 

#(1)
library(mlbench)
data("Ionosphere")
myds <- Ionosphere
#(2)
aggregate(x = myds[, 3:10], by = list(V1 = myds$V1), FUN = sd)


08 state.x77 데이터셋에서 20개의 행을 임의로 추출하여 st20에 저장하고, 나머지 행들은 st.other에 저장하시오. 그리고 st20과 st.other의 내용을 출력하시오.

 

set.seed(100)
idx <- sample( x = 1:nrow(state.x77), size = 20, replace = FALSE )
st20 <- state.x77[idx, ]
st.other <- state.x77[-idx]


09 iris 데이터셋에서 각 품종별로 10개의 행을 임의로 추출하여 iris.10에 저장하고, iris.10의 내용을 출력하시오. (품종 정보와 품종별 행의 개수를 알고 있다고 가정한다.)

 

set.seed(100)
#setosa : 1~50, versicolor : 51~100, virginica : 101~150
idx1 <- sample( x = 1:50, size = 10, replace = FALSE )
idx2 <- sample( x = 51:100, size = 10, replace = FALSE )
idx3 <- sample( x = 101:150, size = 10, replace = FALSE )
iris.10 <- rbind(iris[idx1, ], iris[idx2, ], iris[idx3, ])
iris.10


10 sample() 함수를 이용하여 iris 데이터셋의 행들의 순서를 임의로 바꾸어서(셔플링하여) 출력하시오.

 

set.seed(100)
iris[sample(1:nrow(iris), size = nrow(iris), replace = FALSE), ]


11 iris 데이터셋에서 3개의 Species(품종)를 2개씩 짝지어 출력하시오.

 

combn(unique(iris$Species), 2)


12 red, green, blue, black, yellow를 3개씩 짝지어 출력하시오.

 

combn(c("red", "green", "blue", "black", "yellow"), 3)


13 state.x77 데이터셋에서 Area(면적)가 Alabama 주보다 크고 California 주보다 작은 주의 이름과 Population (인구 수), Income(소득), Area(면적)를 출력하시오.

 

#subset 함수는 data.frame을 대상으로 할 것
subset(x = data.frame(state.x77), Area > state.x77["Alabama", "Area"] & 
         Area < state.x77["California", "Area"])[, c("Population", "Income", "Area")]

 

14 다음 문제를 해결하기 위한 R 코드를 작성하시오.
(1) 제공된 파일 중 subway.csv와 subway_latlong.csv 파일을 읽은 후 병합하여 subway.tot에 저장하시오(병합 기준 열은 STATION_CD와 station).

(2) subway.tot에서 역 이름과 날짜를 기준으로 on_tot (탑승 인원)과 off_tot (하차 인원)을 집계(합계)하여 출력하시오.

(3) subway.tot에서 2011년도에 대해서만 역 이름을 기준으로 on_tot (탑승 인원)과 off_tot(하차 인원)을 집계(합계)하여 출력하시오.
(4) subway.tot에서 2011년도에 대해서 LINE_NUM(호선)별 on_tot (탑승 인원)과 off_tot(하차 인원)을 집계(합계)하여 출력하시오.

 

# 해당 파일은 예제소스 파일에 있습니다.
# https://www.hanbit.co.kr/store/books/look.php?p_code=B1274323702
# source 폴더를 작업 프로젝트 폴더에 두세요.

#(1)
subway <- read.csv('./source/Ch07/subway.csv')
subway_latlong <- read.csv('./source/Ch07/subway_latlong.csv')
# subway_latlong 의 역이름이 한글로 되어 있습니다.
# 이걸 적용 안하면 콘솔에 깨져서 보입니다.
Sys.setlocale("LC_ALL", "korean")
head(subway)
head(subway_latlong)
unique(subway$station)
unique(subway_latlong$STATION_CD)
subway.tot <- merge(x = subway, y = subway_latlong, 
                    by.x = c("station"), by.y = c("STATION_CD"))
# 깨지면 다시 실행해주세요 
Sys.setlocale("LC_ALL", "korean")

#(2)
aggregate(x = subway.tot[,c("on_tot", "off_tot")], 
 by = list(NAME = subway.tot$stat_name, DATE = subway.tot$income_date), FUN = sum)

#(3)
which(substr(subway.tot$income_date, 1, 4) == "2014")
aggregate(x = subway.tot[which(substr(subway.tot$income_date, 1, 4) == "2011") ,
c("on_tot", "off_tot")], by = list(NAME = subway.tot[which(substr(subway.tot$income_date, 1, 4) == "2011"),]$stat_name), FUN = sum)
# 맞는지 확인하고 싶으시면, 아래 두 부분을 실행해보세요.
sum(subway.tot[which(subway.tot[,"stat_name"] == "강동" & substr(subway.tot$income_date, 1, 4) == "2011"), "on_tot"])
aggregate(x = subway.tot[which(substr(subway.tot$income_date, 1, 4) == "2011"),
c("on_tot", "off_tot")], by = list(NAME = subway.tot[which(substr(subway.tot$income_date, 1, 4) == "2011"),]$stat_name), FUN = sum)[3, ]
#(4)
aggregate(x = subway.tot[which(substr(subway.tot$income_date, 1, 4) == "2011") ,
c("on_tot", "off_tot")], by = list(LINE_NUM = subway.tot[which(substr(subway.tot$income_date, 1, 4) == "2011"),]$LINE_NUM), FUN = sum)


15 다음의 문제를 해결하기 위한 R 코드를 작성하시오.
(1) 다음과 같이 데이터프레임 authors와 books를 생성하고 authors와 books의 내용을 출력하시오.

authors <- data.frame(
    surname = c("Twein", "Venables", "Tierney", "Ripley", "McNeil"),
    nationality = c("US", "Australia", "US", "UK", "Australia"),
    retired = c("yes", rep("no", 4)))
books <- data.frame(
    name = c("Johns", "Venables", "Tierney", "Ripley", "Ripley", "McNeil"),
    title= c("Exploratory Data Analysis", "Modern Applied Statistics...", "LISP-STAT", "Spatial Statistics", "Stochastic Simulation", "Interactive Data Analysis"),
    other.author = c(NA, "Ripley", NA, NA, NA, NA))


(2) surname과 name을 공통 열로 하여 authors와 books를 병합하여 출력하시오(두 데이터프레임에서 공통 열의 값이 일치하는 것들만 병합).

 

#(1)
authors <- data.frame(
  surname = c("Twein", "Venables", "Tierney", "Ripley", "McNeil"),
  nationality = c("US", "Australia", "US", "UK", "Australia"),
  retired = c("yes", rep("no", 4))
)
books <- data.frame(
  name = c("Johns", "venables", "Tierney", "Ripley", "Ripley", "McNeil"),
  title = c("Exploratory Data Analysis", "Modern Applied Statistics ...", 
            "LISP-STAT", "Spatial Statistics", "Stochastic Simulation",
            "Interactive Data Analysis"),
  other.author = c(NA, "Ripley", NA, NA, NA, NA)
)
#(2)
merge(x = authors, y = books, by.x = c("surname"), by.y = c("name"))
#(3)
merge(x = authors, y = books, by.x = c("surname"), by.y = c("name"), all.x = TRUE)
#(4)
merge(x = authors, y = books, by.x = c("surname"), by.y = c("name"), all.y = TRUE)
#(5)
merge(x = authors, y = books, by.x = c("surname"), by.y = c("other.author"))