이번 포스팅은 빅데이터 분석기사 예시 문제를 활용해서 데이터셋을 자유롭게 다루는 연습을 해보도록 하겠다.
- 사용된 라이브러리: dplyr # 굳이 쓸 필요는 없지만, 지난 포스팅에서 dplyr을 사용봤기 때문에 한번 시도했다.
- 사용한 데이터셋: BankExample.csv (첨부파일) # 예시 문제는 데이터셋에 맞도록 변형했다.
★ 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])
실행 결과)
※ 참고: 코드 예시는 여러 방법 중 하나일 수 있습니다. 따라서 다른 방법이 존재할 수 있습니다.
'[R] 연습' 카테고리의 다른 글
[R] 데이터 정제하기 (결측치편) (0) | 2021.12.01 |
---|---|
[R] dplyr 패키지 활용하기 (4편) (0) | 2021.11.30 |
[R] dplyr 패키지 활용하기 (3편) (0) | 2021.11.29 |
[R] dplyr 패키지 활용하기 (2편) (0) | 2021.11.27 |
[R] dplyr 패키지 활용하기 (1편) (0) | 2021.11.26 |