[R] 연습

[R] 빅데이터 분석기사 예시 문제로 연습하기

Simon Yoon 2021. 11. 28. 18:39

이번 포스팅은 빅데이터 분석기사 예시 문제를 활용해서 데이터셋을 자유롭게 다루는 연습을 해보도록 하겠다.

 

- 사용된 라이브러리: dplyr  # 굳이 쓸 필요는 없지만, 지난 포스팅에서 dplyr을 사용봤기 때문에 한번 시도했다.

- 사용한 데이터셋: BankExample.csv (첨부파일)  # 예시 문제는 데이터셋에 맞도록 변형했다.

 

BankExample.csv
BankExample.csv
0.00MB


★ Q1)

데이터셋의 Experience 칼럼을 기준으로 상위 10개의 데이터를 구하고, Experience 칼럼 10개 중 최소값으로 데이터를 대체한 후, Income 칼럼에서 80 이상인 데이터의 Experience 칼럼 평균값을 구하시오.


방법 구상)

    일단 상위 10개를 구해야 하니까 dplyr에서 arrange(desc())써서 내림차순 정렬을 할 수 있겠다.

    내림차순 정렬한 데이터에서 해당 칼럼 최소값을 min() 함수 써서 1~10열 데이터에 대입시키고,

    Income 값이 80 이상인 데이터 중 Experience 칼럼의 평균을 mean() 함수로 계산하면 되겠다.

 

예시 답안)

library(dplyr)
bank_example <- read.csv("BankExample.csv")
bank.desc <- bank_example %>% arrange(desc(Experience))
bank.desc$Experience[1:10] <- min(bank.desc$Experience[1:10])
mean(bank.desc$Experience[bank.desc$Income >= 80])

 

실행 결과)

 

예시 답안으로 출력한 결과


★ Q2)

데이터셋(bank_example)의 순서대로 70%의 데이터만 사용해서, 'Age' 칼럼의 결측치를 중앙값으로 채우기 전과 후의 표준편차를 구하고, 두 표준편차의 차의 절대값을 구하시오.


참고) bank_example의 Age 변수에는 결측값이 없다. 따라서 결측값을 임의로 만들어줘야 한다.

일단 연습의 일종으로 Age 변수에 결측값이 있는지 여부를 먼저 확인하고, 임의의 결측치를 만들도록 하겠다.

 

table(is.na(bank_example$Age))

 

결과로는 FALSE 100이 출력될 텐데, NA가 아닌 데이터가 100개라는 의미이다.

결측치가 10개 있다면 FALSE 90  TRUE 10이 출력 된다.

혹은 전체 데이터의 결측치 갯수를 알고 싶다면 다음과 같은 두 가지 방식의 코드를 쓸 수 있다.

 

apply(is.na(데이터명), 2, sum)
# 열별 함수 적용(is.na 함수를, 열별로, sum 구하기)

colSums(is.na(데이터명))
# 출력된 결과는 동일하다

 

결측치가 없다는 것을 확인했으니, 임의로 10개의 결측치를 만들도록 하겠다.

 

bank_example$Age[c(5,10,15,20,25,30,35,40,45,50)] <- NA

 

결측치를 만들고 나면 'Age' 변수의 해당 열의 데이터는 결측치로 바뀌어 있음을 알 수 있다.

 

 

다시 문제를 보자면, 데이터셋(bank_example)의 순서대로 70%의 데이터만 사용해서, 'Age' 칼럼의 결측치를 중앙값으로 채우기 전과 후의 표준편차를 구하고, 두 표준편차의 차의 절대값을 구하시오.

 

방법 구상)

    순서대로 70% 데이터를 추출하기 위해서, nrow(bank_example)*0.7 을 이용하면 되겠다.

    새로 만든 데이터를 가지고 'Age' 칼럼의 표준편차를 sd() 함수를 사용해서 구하고,

    중앙값을 median() 함수를 사용해서 결측치에 대입한 후, 다시 'Age' 칼럼의 표준편차를 구하고,

    두 값의 차의 절대값을 abs()를 사용하여 구하면 되겠다.

 

예시 답안)

bank.70 <- bank_example[1:(nrow(bank_example) * 0.7), ]
with.na <- sd(bank.70$Age, na.rm = TRUE)

bank.70[is.na(bank.70$Age), 'Age'] <- median(bank.70$Age, na.rm = TRUE)
without.na <- sd(bank.70$Age)

abs(with.na - without.na)

 

실행 결과)

예시 답안으로 출력한 결과


★ Q3)

데이터셋(bank_example)의 Income 칼럼의 이상치의 총합을 구하시오. 단 평균으로부터 ' ± 표준편차 * 1.5'를 벗어나는 영역을 이상치라고 판단한다.


방법 구상)

    이상치 바운더리(boundary)를 먼저 알고, 조건에 맞는 데이터만 sum() 함수를 사용하면 될 것 같다.

    평균과 표준편차는 이전 문제에서 사용한 mean()과 sd()를 사용하면 되겠다.

 

예시 답안)

outlier.min <- mean(bank_example$Income) - 1.5 * sd(bank_example$Income)
outlier.max <- mean(bank_example$Income) + 1.5 * sd(bank_example$Income)
sum(bank_example$Income[bank_example < outlier.min | bank_example$Income > outlier.max])

실행 결과)

예시 답안으로 출력한 결과

 

 

※ 참고: 코드 예시는 여러 방법 중 하나일 수 있습니다. 따라서 다른 방법이 존재할 수 있습니다.