8 분 소요

본 글은 빅데이터분석기사 실기 작업형에 대비하여 R 기초 문법과 핵심 조작법을 정리한 글이다. 기출문제 데이터셋은 https://github.com/ingu627/BigDataAnalysis에 수록되어 있으며, 전체 실습 코드는 /concept/R_basic_to_pro_1.R 파일에 담겨 있다.1

2021.12.31 : 제 3회 빅데이터 분석기사 실기 합격 후 정리한 내용이며, 빅데이터 분석기사(R) 시리즈를 통해 실기 작업형 대비를 돕는다.

해당 글을 PDF로 확인하려면 이메일과 함께 댓글을 남기면 된다.

기본 단축키

  • ctrl + shift + c : 해당 줄 주석 처리
  • # : 해당 줄 주석 처리
  • ctrl + enter : 해당 줄 실행
  • help(함수명, 데이터 세트) : 함수명, 데이터 세트 등에 대한 설명을 해 주는 기능
  • ctrl + shift + m : %>% 생성

산술 연산자(Arithmetic Operator)

연산자 내용
+ 값을 더함
- 값을 뺌
* 값을 곱함
/ 값을 나눔(몫 + 나머지)
%% 나머지 반환
%/% 정수 몫 반환
^ 지수 계산
** 지수 계산

관계 연산자(Relation Operator)

  • TRUE 또는 FALSE로 결괏값이 반환된다.
연산자 내용
> 크다 (초과)
< 작다 (미만)
>= 크거나 같다 (이상)
<= 작거나 같다 (이하)
== 같다
!= 같지 않다 (다름)

논리 연산자(Logic Operator)

연산자 내용
& 모두 참이어야 참. 그렇지 않으면 거짓
| 하나라도 참이면 참. 모두 거짓일 경우 거짓

대입 연산자(Assignment Operator)

연산자 내용
= 왼쪽 변수에 오른쪽 값을 대입
<-, «- 왼쪽 변수에 오른쪽 값을 대입
->, -» 오른쪽 변수에 왼쪽 값을 대입

변수 형태 이해하기

  • mode(x) : 객체 형식 반환2
    • numeric, character, logical 중 하나의 값 출력
  • typeof(x) : 정수형은 integer, 실수형은 double로 반환하고, 나머지는 mode 함수와 동일
String Type 설명
chr 문자열 형태
int 숫자
num 숫자
Factor 명목형 변수
Posixct 시간 변수
Tseries 시계열 변수

데이터의 값

  • NA : Not Available의 약자. 결측값 (데이터 값이 존재하지 않음)
  • NULL : 변수가 초기화되지 않거나 빈 객체인 경우
  • NAN : Not a Number의 약자. 수학적으로 정의할 수 없는 값
  • INF : INFinite의 약자. 무한대 값

변수 생성

  • = : 변수에 값을 할당
a=2
print(a)
# [1] 2

== 또는 !=

  • == : 두 값이 일치하는지 비교
  • != : 두 값이 일치하지 않는지 비교
a = 2
a ==2
# [1] TRUE
a != 2
# [1] FALSE

벡터(Vector)

  • c() : combine의 약자
  • 벡터의 생성
  • c(값1, 값2…)
x1 = c(1,2,3,4)
x1
# [1] 1 2 3 4

seq()

  • seq = sequence의 약자
  • seq(from = 시작 숫자 , to = 마지막 숫자, by = 증가범위)
x1 = c(1:10)
x1
# [1]  1  2  3  4  5  6  7  8  9 10

x2 = seq(1,10,2)
x2
# [1] 1 3 5 7 9

rep()

  • rep = repeat의 약자
  • rep(반복할 값, 반복할 횟수)
y = rep(1,10)
y
# [1] 1 1 1 1 1 1 1 1 1 1
y2 = rep(c(1,10),2)
y2
# [1]  1 10  1 10
y3 = rep(c(1,100), c(2,2))
y3
# [1]   1   1 100 100

벡터의 인덱싱

구분 설명
벡터명[n] 벡터의 n번째 요소 반환
벡터명[-n] 벡터에서 n번째 요소를 제외한 모든 요소 반환
벡터명[조건문] 지정한 조건문을 만족하는 요소 반환
벡터명[a:b] 벡터의 a번째 요소부터 b번째 요소까지 요소 반환

벡터 함수

함수 설명
sqrt(x) 제곱근
log(x) 로그
abs(x) 절댓값
round(x) 반올림
trunc(x) 소수점 버림
mean(x) 평균
sum(x) 합계
median(x) 중앙값
range(x) 범위(최솟값, 최댓값)출력
sd(x) 표준편차
var(x) 분산
cov(x,y) 공분산
cor(x,y) 상관계수
min(x) 최솟값
max(x) 최댓값
union(x,y) 합집합
intersect(x,y) 교집합
setdiff(x,y) 차집합(방향 고려 필요)

리스트(List)

  • 리스트는 (키, 값) 형태로 데이터를 저장하는 R의 모든 객체를 담을 수 있는 데이터 구조
  • list(key=value, key=value...)
a=list(
  x=c('poeun', 'pouen1'),
  y=c(1,2))
a$x  
# [1] "poeun"  "pouen1"
a$y
# [1] 1 2

행렬

  • matrix(): matrix(data = 데이터 , nrow = 행의 수, ncol = 열의 수, byrow = 행/열 기준, dimnames = 행과 열의 이름 리스트)
    • byrow는 TRUE이면 행을 기준으로 입력, FALSE이면 열을 기준으로 입력한다. (default = FALSE)
x1=c(1:8)
x1
# [1] 1 2 3 4 5 6 7 8

MATRIX_R = matrix(
  data =x1,
  nrow =4
)
MATRIX_R
#      [,1] [,2]
# [1,]    1    5
# [2,]    2    6
# [3,]    3    7
# [4,]    4    8

MATRIX_C = matrix(
  data = x1,
  ncol = 4
)
MATRIX_C
#      [,1] [,2] [,3] [,4]
# [1,]    1    3    5    7
# [2,]    2    4    6    8
함수 설명
dim(x) x 행렬의 차원 확인
dim(x)<-c(m,n) x 벡터/행렬을 m x n 행렬로 변환
nrow(x) x 행렬 행의 수 확인
ncol(x) x 행렬 열의 수 확인
x[m, n] x 행렬의 m행 n열의 원소 추출
x[m, ] x 행렬의 m행에 접근
x[ ,m] x 행렬의 n열에 접근
rownames(x) x 행렬의 행 이름 출력
colnames(x) x 행렬의 열 이름 출력

data.frame()

  • dataframe의 생성
  • data.frame(변수명1=벡터1)
DATA_SET = data.frame(
  x1 = c(1:10),
  x1_2 = seq(1,10,1),
  x2 = seq(1,10,2),
  y = rep(1,10)
)
head(DATA_SET, 3)
#   x1 x1_2 x2 y
# 1  1    1  1 1
# 2  2    2  3 1
# 3  3    3  5 1
  • names(데이터프레임) <- c(열이름1, 열이름2, ...) : 데이터 프레임의 열 이름 지정
  • ex. 특정열 이름을 바꾸고 싶을 때 (2번째 열 이름을 바꾸고자 한다면)
    • names(데이터프레임)[2] <- c('바꿀 열이름')
  • colnames(데이터프레임명) : 데이터프레임의 열 이름 추출

  • head() : 데이터 상단 행을 지정한 개수만큼 출력하는 함수

length()

  • 1차원 벡터일 경우
  • 벡터에 속한 원소의 개수
length(c(1:10))
# [1] 10

dim()

  • 2차원 행렬, 데이터프레임인 경우
  • 첫번째 : 행의 개수, 두번째 : 열의 개수
dim(MATRIX_R)
# [1] 4 2

dim(DATA_SET)
# [1] 10  4

배열 문법

  • 3차원 이상
  • array(data, dim, dimnames)
    • data : 배열에 저장할 데이터 지정
    • dim : 배열의 차원을 c()로 묶어서 지정
    • dimnames : 배열의 차원 이름 지정

괄호의 활용

  • () : 실행 함수와 같이 쓰임. ()안에는 분석하고자 하는 원소값들이 입력되어야 한다.
    • c() : 들어오는 값들을 묶어 하나의 벡터로 만드는 기능을 실행
  • {} : for, if문 등에서 조건식을 삽입할 때
a=c(1,2,3,4,5)
a
# [1] 1 2 3 4 5

1차원 데이터의 경우

for(i in c(1:5)){
  print(i)
}
# [1] 1
# [1] 2
# [1] 3
# [1] 4
# [1] 5
B = c() # 빈 공간의 벡터 생성

for(k in seq(1,10,2)){
  B=c(B,k)
}
B
# [1] 1 3 5 7 9
  • [] : Index를 입력해야 될 때
# 1, 2번째 값
a[1:2]
# [1] 1 2
# 3번째 값 빼고
a[-3]
# [1] 1 2 4 5
a[c(1,2,4,5)]
# [1] 1 2 4 5

2차원 데이터의 경우

DATA_SET
#    x1 x1_2 x2 y
# 1   1    1  1 1
# 2   2    2  3 1
# 3   3    3  5 1
# 4   4    4  7 1
# 5   5    5  9 1
# 6   6    6  1 1
# 7   7    7  3 1
# 8   8    8  5 1
# 9   9    9  7 1
# 10 10   10  9 1

# 1행 전부
DATA_SET[1,]
#   x1 x1_2 x2 y
# 1  1    1  1 1

# 1열 전부
DATA_SET[,1]
#  [1]  1  2  3  4  5  6  7  8  9 10

# 1,2,3행 & 2열 빼고 나머지
DATA_SET[c(1,2,3),-2]
#   x1 x2 y
# 1  1  1 1
# 2  2  3 1
# 3  3  5 1

팩터(factor)

  • 범주형 자료를 표현하기 위한 데이터 타입
  • factor(x, levels, labels, ordered)
    • x : 범주형 데이터
    • levels : 구분하고자 하는 범주(레벨) 목록 지정
    • labels : 범주별 표시 값 지정
    • ordered
      • TRUE : 순서형
      • FALSE : 명목형 (default)

데이터 결합 (rbind(), cbind(), merge())

image

시간(날짜)형태

as.Date()

  • ‘년-월-일’ 형태
  • as.Date(변수, format=’날짜 형식’)
DATE_O = '2021-11-05'
str(DATE_O)
# chr "2021-11-05"
DATE_C = as.Date(DATE_O, format = '%Y-%m-%d')
str(DATE_C)
# Date[1:1], format: "2021-11-05"
  • str() : 저장된 데이터 타입 확인

    as.POSIXct()

  • ‘년-월-일 시간:분:초’ 형태
  • as.POSIXct(날짜, format = “날짜형식”)
DATE_02 = '2021-11-05 23:13:23'
DATE_P = as.POSIXct(DATE_02, format = '%Y-%m-%d %H:%M:%S')
DATE_P
# [1] "2021-11-05 23:13:23 KST"

format()

  • 날짜정보를 추출해 새로운 변수로 만듦
  • format(날짜변수, “형식”)
format(DATE_P, '%A')
# [1] "금요일"
format(DATE_P, '%M')
# [1] "13"
format(DATE_P, '%Y')
# [1] "2021"

as()

  • as.*() : 변수 x의 자료형을 명시적으로 변환
x=c(1,2,3,4,5,6,7,8,9,10)
x1 = as.integer(x) ; str(x1)
# int [1:10] 1 2 3 4 5 6 7 8 9 10
x2 = as.numeric(x) ; str(x2)
# num [1:10] 1 2 3 4 5 6 7 8 9 10
x3 = as.factor(x) ; str(x3)
# Factor w/ 10 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10
x4 = as.character(x) ; str(x4)
# chr [1:10] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10"
summary(x1)
#  Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
#  1.00    3.25    5.50    5.50    7.75   10.00
  • summary() : 요약통계 한번에 보는 함수

데이터 타입 확인

  • is() : 변수 x가 특정 데이터 타입인지 판별하는 논리 함수
  • 결괏값은 TRUE 또는 FALSE로 반환된다.
x=c(1:5)
y=c("str1", "str2")
is.integer(x)
# [1] TRUE
is.numeric(x)
# [1] TRUE
is.factor(y)
# [1] FALSE
is.character(y)
# [1] TRUE

sample()

  • sample(데이터 추출 범위, 데이터 추출 개수, replace = FALSE 또는 TRUE)
  • sample(x, size, replace=FALSE, prob=NULL)
    • replace=TRUE : 복원추출
    • replace=FALSE : 비복원추출
      • 주의사항 : TRUE, FALSE는 모두 대문자로!!
S1 =sample(1:45, 6, replace= FALSE)
S1
# [1] 39 11 35 20 37 27

set.seed()

  • 난수 생성 시 결괏값을 고정할 때 사용
  • 시드(seed) 값을 지정하면 항상 동일한 난수 순열이 생성된다.
S2 = sample(1:45, 6, replace=FALSE)
S2
# [1]  8 31 15  9 42 45

조건문

if ~ else

  • 조건문으로, 주어진 조건식이 참일 때와 거짓일 때 실행할 코드 블록을 분기한다.
  • %in% : 특정 원소가 벡터나 집합에 포함되어 있는지 확인하는 연산자

if ~ else if ~ else

ifelse 문법

  • ifelse(조건식, 명령어1, 명령어2) : 참이면 명령어1, 거짓이면 명령어2
A = c(1,2,3,4,5)
if(7 %in% A){
  print('TRUE')
} else{
  print('FALSE')
}
# [1] "FALSE"

switch 문

  • 조건에 따라 여러 개의 경로 중 하나를 선택하여 명령어를 실행하는 명령어
course = "C"
switch(course,
       "A" = "brunch",
       "B" = "lunch",
       "dinner")
# [1] "dinner"

반복문

for 문

  • 범위에 들어있는 각각의 값을 변수에 할당하고 블록 안의 문장을 수행
for (i in 1:4){
  print(i)
}
# [1] 1
# [1] 2
# [1] 3
# [1] 4

while 문

  • 조건문 참일 때 블록 안의 명령어들을 수행
i=1
while (i<=4){
  print(i)
  i=i+1
}
# [1] 1
# [1] 2
# [1] 3
# [1] 4

repeat 문

i=1
repeat {
  print(i)
  if (i>=2){
    break
  }
  i=i+1
}
# [1] 1
# [1] 2

break 문

  • 반복문을 중간에 탈출하기 위해 사용하는 명령어
for (i in 1:5){
  print(i)
  if (i>=3){
    break
  }
}
# [1] 1
# [1] 2
# [1] 3

next 문

  • 반복문에서 다음 반복으로 넘어갈 수 있도록 하는 명령어
  • 파이썬의 continue와 같은 개념
for (i in 1:5){
  if (i == 3){
    next
  }
  print(i)
}
# [1] 1
# [1] 2
# [1] 4
# [1] 5

function()

  • 사용자 함수 (직접 함수 만들기)
Plus_One = function(x){
  y=x+1
  return (y)
}
Plus_One(3)
# [1] 4

package(패키지) 설치하기

  • install.packages("설치할 패키지명")
    • 설치할 땐 "" O
  • library(설치한 패키지)
    • 불러올 땐 "" X
install.packages('ggplot2')
# 'C:/Rlib'의 위치에 패키지(들)을 설치합니다.
# (왜냐하면 'lib'가 지정되지 않았기 때문입니다)
# --- 현재 세션에서 사용할 CRAN 미러를 선택해 주세요 ---
# URL 'https://cran.seoul.go.kr/bin/windows/contrib/4.1/ggplot2_3.3.5.zip'을 시도합니다
# Content type 'application/zip' length 4129789 bytes (3.9 MB)
# downloaded 3.9 MB

# package 'ggplot2' successfully unpacked and MD5 sums checked

# The downloaded binary packages are in
#         C:\Users\poeun\AppData\Local\Temp\RtmpCULWCS\downloaded_packages
library(ggplot2)

ggplot 패키지

  • ggplot2 패키지의 기본 문법은 구성요소인 data, aes, geom을 기반으로 구성된다.3
주요 파라미터 설명
data 그래프를 그릴 객체명
aes(x,y) x는 x축에 해당하는 컬럼명, y는 y축에 해당하는 컬럼명
geom_xx() 그래프 지정 함수
  • geom_bar : 막대그래프를 그리는 함수
  • geom_point : 산점도를 그리는 함수
  • geom_line : 선을 그리는 함수
  • geom_boxplot : 박스 그래프를 그리는 함수

geom_boxplot 예시

head(airquality)
#   Ozone Solar.R Wind Temp Month Day
# 1    41     190  7.4   67     5   1
# 2    36     118  8.0   72     5   2
# 3    12     149 12.6   74     5   3
# 4    18     313 11.5   62     5   4
# 5    NA      NA 14.3   56     5   5
# 6    28      NA 14.9   66     5   6
library(ggplot2)
ggplot(data=airquality, # 그래프에 필요한 객체인 airquality 대입
       aes(x=Month, # x축에 들어갈 칼럼명으로 Month 대입
           y=Temp, # y축에 들어갈 컬럼명으로 Temp 대입
           group=Month) # Month 기준으로 집계
       ) + geom_boxplot() #Boxplot으로 출력

image

한계 및 주의사항

R은 모든 데이터를 물리 메모리에 적재하는 인메모리(in-memory) 아키텍처로 동작하며, 기본 실행 엔진이 단일 스레드(single thread)로 구동된다.4 이에 따라 대용량 데이터를 처리하거나 반복문 내에서 객체를 지속해서 재할당할 경우 메모리 누수와 급격한 연산 지연이 발생할 수 있다. 특히 빅데이터분석기사 실기 시험의 클라우드 응시 환경은 세션당 메모리(약 1~2GB)와 스크립트 실행 시간(타임아웃 1분 내외) 제약이 엄격하다.5 따라서 실기 시험에서는 불필요한 중간 데이터프레임 복사를 피하고, 다중 중첩 for 루프 대신 벡터화 연산이나 내장 요약 함수를 사용하여 메모리 초과(OOM)와 타임아웃 오류를 방지해야 한다.

References

  1. R Core Team. (2023). An Introduction to R: A Programming Environment for Data Analysis and Graphics. CRAN. https://cran.r-project.org/doc/manuals/r-release/R-intro.html ↩

  2. R Core Team. (2023). The R Base Package. CRAN / R Documentation. https://stat.ethz.ch/R-manual/R-devel/library/base/html/00Index.html ↩

  3. Wickham, H., Chang, W., et al. (2023). ggplot2: Create Elegant Data Visualisations Using the Grammar of Graphics. CRAN Package Repository. https://cran.r-project.org/web/packages/ggplot2/index.html ↩

  4. R Core Team. (2023). R Installation and Administration: Memory Limits. CRAN. https://cran.r-project.org/doc/manuals/r-release/R-admin.html ↩

  5. 한국데이터산업진흥원(K-DATA). 빅데이터분석기사 실기시험 응시환경 안내 및 수험자 유의사항. DataQ 자격검정. https://www.dataq.or.kr/ ↩

댓글남기기