소개

이 글은 딥러닝 패키지 라이브러리를 사용하지 않고 R로 딥러닝의 원리를 파악하고 구현해나가는 과정을 소개할 것 입니다. 이 글은 기본적인 수학적 지식을 가지고 있고, R 사용법을 어느정도 익힌 사람들을 대상으로 합니다. 그러나 첫 번째 글에서는 R 사용에 익숙하지 않은 분들을 위하여 자료형과 함수, 반복문, 조건문 등의 기본적인 배경지식을 간략하게 소개하고 넘어갈 예정입니다. R을 처음 접하시는 분들은 이전 글의 R설치와 기초 사용법을 참조해주시기 바랍니다. R 사용에 익숙하신 분들은 1번 태그의 글들을 넘어가셔도 좋습니다.

1.1 R의 자료형에 대해서 알아보자 !

1.1.1 벡터

R의 자료형의 가장 기본은 앞서 설명한 객체(objects)이며 모든 자료형은 객체로 만들어 질 수 있습니다. 그 다음 자료형은 벡터(vector)입니다. R에서 벡터는 c()를 통해 만듭니다. 벡터의 가장 큰 특징은 입력되는 데이터 타입이 모두 같다는 것입니다. 예를 들면 아래의 a는 숫자형 벡터이고, b는 문자형 벡터입니다. c는 문자형과 숫자형 데이터가 같이 있지만, 벡터의 특징상 자동으로 문자형 타입 하나로 맞춰집니다.

벡터에는 데이터가 가로로 나열되는 경우를 행 벡터라 부르고, 데이터가 세로로 나열되는 경우를 열 벡터라 부릅니다. 그러나, R에서는 행 벡터로만 표기되며 열 벡터의 경우 행렬로 나타낼 수 있습니다. 따라서 구분을 위해 앞으로 벡터는 행 벡터를 의미한다고 보시면 됩니다.

1
2
3
4
5
6
7
8
9
a <- c(1,2,3)
b <- c("4","5","6")
c <- c("1",2,3)
> a
[1] 1 2 3
> b
[1] "4" "5" "6"
> c
[1] "1" "2" "3"

1.2.2 행렬

행렬은 2개 이상의 벡터가 모인 자료형입니다. 벡터가 두 개 이상이 결합되면서 벡터에 열이라는 차원이 생기게 됩니다. (열 벡터가 2개 이상이 결합하는 반대 경우도 마찬가지입니다.) 이렇게 만들어진 자료형을 행렬이라 부르고, 행과 열의 개수를 통해 자료형의 전체 크기가 정해지게 됩니다. 행렬은 벡터가 2개 이상이 결합된 형태이기 때문에 벡터의 특징 또한 공유합니다. 예를 들면 두 벡터가 숫자형이면 모두 숫자형으로 저장된 행렬이 만들어지고, 문자형이면 문자형으로 저장된 행렬이 만들어집니다. 행렬을 만드는 R코드는 아래와 같습니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
m1 <- matrix(data = 1:6, nrow = 2, ncol = 3)
m2 <- matrix(data = 1:6, nrow = 2, ncol = 3, byrow = TRUE)

> m1
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

> m2
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6

> dim(m1)
[1] 2 3

> str(m2)
 int [1:2, 1:3] 1 4 2 5 3 6

R에서는 두 벡터의 결합으로도 행렬을 만들 수 있지만, matrix()라는 기본 함수를 통해서 만들 수도 있습니다. matrix() 함수에서 data, nrow, ncol, byrow 4가지 인자가 있습니다. 이 4가지 중 행렬의 원소를 구성하는 data 인자는 필수로 행렬의 원소가 됩니다. nrow와 ncol 인자는 만들어질 행렬의 크기를 정할 수 있습니다.

행렬의 크기는 그 연산과 직결되기 때문에 그 설정은 중요합니다. byrow 인자는 행렬을 만들 때 원소를 채워넣는 방식을 말합니다. 행렬은 보통 열부터 원소를 채워나가는데 byrow 인자의 값을 TRUE로 조정하면, 행부터 채워나가게 만들 수 있습니다. 코드 결과를 비교해보면 서로 데이터 나열 방식이 명확하게 다른 것을 확인할 수 있습니다.

R에서 행렬의 크기는 dim() 함수를 통해 확인할 수 있습니다. 이 함수에 행렬 데이터를 넣으면 행렬의 크기를 행,열 순서로 반환해 줍니다. 행렬의 행과 열의 크기를 각각 확인하는 방법도 있습니다. NROW(), NCOL() 함수를 사용하면 각각 행의 크기와 열의 크기를 알려줍니다. 이외에도 데이터 내역을 알려주는 str() 함수도 행렬의 행과 열의 크기를 아는 데 사용할 수 있습니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
temp_array <- array(c(m1,m2),dim = c(2,3,2))
> temp_array
, , 1

     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

, , 2

     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6

그렇다면 행렬이 여러 개 있는 자료형은 무엇일까요? 여러 개의 행렬을 하나로 저장한 자료형은 Array(배열)라 부르고 흔히 3차원 이상의 자료형입니다. Array(배열) 역시 행렬이 벡터의 특징을 그대로 물려 받은 것처럼 같은 특징을 지닙니다. 즉 Array(배열)를 구성하는 행렬들의 원소들은 모두 같은 데이터 타입을 지닙니다.

1.2.3 그외 기타 자료형

그외에 자료형으로는 데이터프레임, 리스트가 있습니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
a <- c(1, 2, 3)
> a
[1] 1 2 3
b <- c("7", "8", "9")
> b
[1] "7" "8" "9"

temp_df <- data.frame(num1 = a,str1 = b)
> temp_df
  num1 str1
1    1    7
2    2    8
3    3    9

> temp_df[1,]
  num1 str1
1    1    7
> temp_df[,1]
[1] 1 2 3
> temp_df[1, 1]
[1] 1

> temp_df[,"num1"]
[1] 1 2 3
> temp_df$num1
[1] 1 2 3

temp_list <- list(num1 = a, num2 = b, str1 = c)
> temp_list[1]
$num1
[1] 1 2 3
> temp_list["num1"]
$num1
[1] 1 2 3

> temp_list[[1]]
[1] 1 2 3

데이터프레임과 리스트 형식은 R에서 데이터의 형태에 구애 받지 않고 저장할 수 있는 형식입니다. 데이터프레임은 행렬과 같이 행과 열을 가진 자료형으로 행렬과 달리 데이터 타입에 구애 받지 않은 자료형입니다. 데이터프레임을 만드는 방법은 dataframe() 함수를 사용하는 것입니다.

데이터프레임에서 데이터를 확인하는 방법에는 숫자를 이용한 방법과 이름을 이용한 방법 두 가지가 있습니다. 숫자를 이용한 방법은 데이터프레임을 저장한 변수에 []를 사용하여 원하는 열이나 행 혹은 행,열의 숫자를 넣어 확인하는 것입니다. 이름을 이용한 방법 역시 [] 안에 열이름 이나 행이름을 넣어 데이터를 확인할 수 있습니다.

데이터프레임에 저장할 때 주의할 점은 여러 개의 열을 가진 데이터프레임을 만들 때 각 벡터의 데이터 개수가 같아야 한다는 점입니다. 만약 개수가 서로 다른 벡터들을 하나의 데이터프레임으로 만들려고 하면 행의 개수가 다르다는 에러 메세지를 받게 되고 데이터프레임 생성에 실패하게 됩니다.

데이터의 개수가 서로 다른 벡터들을 하나의 자료형으로 저장하는 방법은 리스트 자료형을 사용하는 것입니다. 리스트 형식은 데이터 형태에 구애 받지 않고 데이터를 저장할 수 있는 방식입니다. 리스트에서도 데이터프레임과 마찬가지로 []와 행과 열의 숫자, 이름을 이용해 데이터를 확인할 수 있습니다.