빅데이터분석기사 실기 작업형(2) - R 데이터 수집, 전처리
본 글은 빅데이터분석기사 실기 작업형에 대비하여 요약 및 실습한 것을 작성한 글입니다. 기출문제의 데이터는 https://github.com/ingu627/BigDataAnalysis에 데이터 셋을 남겨놨습니다. 또한 해당 전체 코드는 /concept/R_basic_to_pro_2.R 파일에 담겨져 있습니다.
2021.12.31 : 제 3회 빅데이터 분석기사 실기를 합격했습니다. 빅데이터 분석기사(R) 시리즈를 보시고 도움이 되길 바랍니다.
혹시 해당 글을 pdf로 받고 싶으신 분은 이메일과 함께 댓글로 남겨주세요~
데이터 수집 작업
파일 종류
1. TXT 파일
read.table(file, header, sep, fill, what): TXT 파일로부터 데이터를 읽는 함수1
| 주요 파라미터 | 설명 |
|---|---|
| file | 읽어 들일 파일명을 설정 |
| header | 첫 번째 행을 열 이름으로 인식할지 여부를 설정 |
| sep | 구분자 지정 |
| fill | 비어있는 부분을 NA로 채울지 여부를 결정 |
| what | 실수와 문자를 읽는 경우 사용 |
write.table(x, file, append, quote, sep,... ): 테이블 형식의 데이터 집합을 파일에 쓸 때 사용하는 함수
| 주요 파라미터 | 설명 |
|---|---|
| x | 데이터 집합. 일반적으로 데이터 프레임 형식으로 저장 |
| file | 작업 폴더에 저장하려는 파일명과 확장명 기록, 경로 지정 가능 |
| append | TRUE면 이어쓰기 FALSE면 덮어쓰기(default) |
| quote | TRUE면 모든 값과 열 이름에 “로 수식 (default). FALSE면 큰따옴표 생략 |
| sep | 구분자 지정 |
2. CSV 파일
read.csv(file, header): CSV 파일로부터 데이터를 수집하는 함수
| 주요 파라미터 | 설명 |
|---|---|
| file | 읽어 들일 파일명을 설정 |
| header | 첫 번째 행을 열 이름으로 인식할지 여부를 설정 |
-
stringsAsFactors=TRUE: 불러올 때 문자열을 factor형으로 변환한다. -
write.csv(x, file, append, quote, sep, ...): csv파일로 저장할 때 사용하는 함수
| 주요 파라미터 | 설명 |
|---|---|
| x | 데이터 집합. 일반적으로 데이터 프레임 형식으로 저장 |
| file | 작업 폴더에 저장하려는 파일명과 확장명 기록, 경로 지정 가능 |
| append | TRUE면 이어쓰기 FALSE면 덮어쓰기(default) |
| quote | TRUE면 모든 값과 열 이름에 “로 수식 (default). FALSE면 큰따옴표 생략 |
| sep | 구분자 지정 |
row.names=FALSE: 행 번호(인덱스)를 파일에 기록하지 않는다.
3. TSV 파일
- 생략
4. EXCEL 파일
read_excel(path): 엑셀 파일로부터 데이터를 읽을 때 사용하는 함수2install.packages("readxl"): 엑셀 파일 로드를 위해 패키지 설치가 필요하다.path: 읽어 들일 파일 경로를 설정한다.write.xlsx(x, file,...): 엑셀 파일로 저장할 때 사용하는 함수
1. 데이터 전처리 작업
plyr 패키지
- plyr 패키지는 원본 데이터를 분석하기 쉬운 형태로 나눠서 다시 새로운 형태로 만들어 주는 패키지이다.3
- plyr 패키지의 함수들은 데이터 분할(split), 원하는 방향으로 특정 함수 적용(apply), 그 결과를 재조합(combine)하여 반환한다.
- plyr 패키지 함수는 ##ply 형태이고, 첫 번째 글자는 입력 데이터의 형태, 두 번째 글자는 출력 데이터의 형태를 의미한다.
- (data frame == d), (list == l), (array == a)
dplyr 패키지
- 데이터 전처리는 분석에 적합하도록 데이터를 가공하는 작업이다.4
- 데이터 일부를 추출하거나 종류별로 나누거나, 여러 데이터를 합치는 등의 데이터 가공을 통하여 분석 작업을 최적화할 수 있다.
dplyr 패키지의 주요 함수
| dplyr 함수 | 기능 |
|---|---|
| select | 열(변수) 추출 |
| filter | 행 추출 |
| mutate | 변수 추가 |
| group_by | 데이터 그룹별로 나누기 |
| summarise | 요약 통계치 산출 |
| arrange | 데이터 정렬 |
| inner_join | 두 데이터 프레임에서 공통적으로 존재하는 모든 열 병합 |
| left_join | 왼쪽 데이터 프레임을 기준으로 모든 열 병합 |
| right_join | 오른쪽 데이터 프레임을 기준으로 모든 열 병합 |
| full_join | 두 데이터 프레임에 존재하는 모든 열 병합 |
| bind_rows | 행 방향으로 데이터 결합 |
| bind_cols | 열 방향으로 데이터 결합 |
select()
데이터 프레임 이름 %>% select(선택할 변수명, -제외할 변수명)ctrl + shift + m단축키 :%>%%>%: 파이프 연산자라고 읽고, 함수들을 연결하는 기능을 한다. 선행 연산의 결과를 후행 함수의 첫 번째 인수로 전달한다.
library(dplyr)
iris %>%
select(Sepal.Length) %>% head()
# 1 5.1
# 2 4.9
# 3 4.7
# 4 4.6
# 5 5.0
# 6 5.4
filter()
데이터 프레임 이름 %>% filter(조건): 조건에 맞는 데이터 추출
iris %>%
filter(Species == 'setosa') %>%
select(Sepal.Length, Sepal.Width) %>%
head()
# 1 5.1 3.5
# 2 4.9 3.0
# 3 4.7 3.2
# 4 4.6 3.1
# 5 5.0 3.6
# 6 5.4 3.9
mutate()
데이터 프레임 이름 %>% mutate(새로운 변수명=값): 데이터에 새로운 파생변수를 추가
iris %>%
filter(Species == 'virginica') %>%
mutate(Len = ifelse(Sepal.Length>6, 'L', 'S')) %>%
select(Species, Len) %>%
head()
# Species Len
# 1 virginica L
# 2 virginica S
# 3 virginica L
# 4 virginica L
# 5 virginica L
# 6 virginica L
group_by와 summarise
데이터 프레임 이름 %>% group_by(그룹화할 기준 변수1, ...) %>% summarise(새로운 변수명=계산식): 지정한 변수들을 기준으로 데이터를 그룹화하고, 요약 통계치 산출- 요약 통계치 함수 : mean(), sd(), sum(), median(), min(), max(), n
iris %>%
group_by(Species) %>%
summarise(Petal.Width = mean(Petal.Width))
# # A tibble: 3 x 2
# Species Petal.Width
# <fct> <dbl>
# 1 setosa 0.246
# 2 versicolor 1.33
# 3 virginica 2.03
n()
- 이 함수는 단독으로 사용되지 않고 반드시 group_by()함수와 연결된 summarise()함수의 내부에 포함되어 쓰인다.
- 예시 :
mpg %>% group_by(class) %>% summarise(n = n())
count()
count(데이터프레임명, 변수명): 데이터의 빈도수를 산출한다.
arrange()
데이터 프레임 이름 %>% arrange(정렬 기준변수): 오름차순 정렬데이터 프레임 이름 %>% arrange(desc(정렬 기준변수)): 내림차순 정렬
iris %>%
filter(Species == 'setosa') %>%
mutate(Len = ifelse(Sepal.Length>5, 'L', 'S')) %>%
select(Species, Len, Sepal.Length) %>%
arrange(desc(Sepal.Length)) %>%
head()
# Species Len Sepal.Length
# 1 setosa L 5.8
# 2 setosa L 5.7
# 3 setosa L 5.7
# 4 setosa L 5.5
# 5 setosa L 5.5
# 6 setosa L 5.4
join()

- x, y : 병합할 데이터 프레임
-
by : 병합 기준 칼럼(key)
inner_join(x, y, by, ...): 두 데이터 프레임에서 공통적으로 존재하는 모든 열을 병합하는 함수left_join(x, y, by, ...): 왼쪽 데이터 프레임을 기준으로 모든 열을 병합하는 함수right_join(x, y, by, ...): 오른쪽 데이터 프레임을 기준으로 모든 열을 병합하는 함수full_join(x, y, by, ...): 두 데이터 프레임에 존재하는 모든 열을 병합하는 함수
bind_rows()
bind_rows(데이터명1, ...): 데이터 행들을 연결하여 결합
x = data.frame(x=1:3, y=1:3)
x
# x y
# 1 1 1
# 2 2 2
# 3 3 3
y = data.frame(x=4:6, z=4:6)
y
# x z
# 1 4 4
# 2 5 5
# 3 6 6
bind_rows(x, y)
# x y z
# 1 1 1 NA
# 2 2 2 NA
# 3 3 3 NA
# 4 4 NA 4
# 5 5 NA 5
# 6 6 NA 6
bind_cols()
bind_cols(데이터명1, ...): 데이터 열들을 연결하여 결합
x = data.frame(title=c(1:5),
a=c(30,70,45,90,65))
x
# title a
# 1 1 30
# 2 2 70
# 3 3 45
# 4 4 90
# 5 5 65
y = data.frame(b=c(70,65,80,80,90))
y
# b
# 1 70
# 2 65
# 3 80
# 4 80
# 5 90
bind_cols(x, y)
# title a b
# 1 1 30 70
# 2 2 70 65
# 3 3 45 80
# 4 4 90 80
# 5 5 65 90
결측치
is.na()
- 결측치 여부 확인 함수다.5
- 결측치가 있으면 TRUE, 결측치가 없으면 FALSE를 반환한다.
na.omit()
- 결측치 제거 함수다.
- 행 단위로 어떤 결측치라도 있으면 해당 행을 제거하고 완전한 케이스(complete cases)만 반환한다.
결측값을 다른 값으로 대체
dataset$var[is.na(dataset$var)] <- new_value
한계 및 주의사항
- 인메모리 처리 한계: R의 기본 데이터 객체(
data.frame)는 모든 데이터를 물리 메모리(RAM)에 상주시켜 처리하므로, 가용 RAM 용량을 초과하는 대용량 데이터셋 적재 시 메모리 부족(OOM) 오류가 발생한다. - 단일 스레드 기본 동작: base R 및 기본
dplyr연산은 기본적으로 단일 CPU 코어(단일 스레드)에서 순차 실행되므로 수백만 행 이상의 대규모 데이터 병합이나 그룹 집계 시 연산 병목이 발생할 수 있다. - 실기 시험 환경의 자원 제약: 빅데이터분석기사 실기 클라우드 시험 환경은 세션당 메모리(보통 1~2GB 내외)와 실행 시간(최대 1분 내외)에 엄격한 타임아웃 제한이 있으므로, 불필요한 전체 열 로딩을 피하고
read.csv()호출 시 필요한 열만 지정하거나 전처리 중간 객체를 적절히 정리(rm(),gc())해야 한다.
References
- 2022 수제비 빅데이터분석기사 실기 (필답형+작업형)
- Must Learning with R (개정판)
- Do it! 쉽게 배우는 R 데이터 분석
- [R 데이터분석] 조인(join) 을 이용하여 데이터 병합하기
- R, Python 분석과 프로그래밍의 친구 (by R Friend)
-
R Core Team, “R Data Import/Export: Importing from other programs”, CRAN ↩
-
Hadley Wickham and Jennifer Bryan, “readxl: Read Excel Files”, CRAN ↩
-
Hadley Wickham, “plyr: Tools for Splitting, Applying and Combining Data”, CRAN ↩
-
Hadley Wickham et al., “dplyr: A Grammar of Data Manipulation”, CRAN ↩
-
R Core Team, “The R Base Package: ‘NA’ and ‘na.omit’”, CRAN Manuals ↩
댓글남기기