4 분 소요

본 글은 빅데이터분석기사 실기 작업형에 대비하여 요약 및 실습한 것을 작성한 글입니다. 기출문제의 데이터는 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) : 엑셀 파일로부터 데이터를 읽을 때 사용하는 함수2
  • install.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()

image

  • 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

댓글남기기