
0. 시작하기 전에
앞서 파이썬에서와 마찬가지로 R은 기본적으로 통계 프로그래밍을 위한 언어이지만, 최근 Shiny 와 같은 동적 웹 애플리케이션 생성 등 다양한 기능을 지원하고 있다. 때문에 이번 장에서는 데이터 자료 구조에 대한 기본적인 개념만 살펴볼 예정이며, 좀 더 자세한 설명을 필요로 한다면 "R Basic" 에서 관련된 내용을 찾아볼 수 있다.
1. 스칼라
스칼라란, 단일 차원의 값을 의미하며, 대표적으로 숫자 1, 2, 3 등을 예로 들 수 있다. R에서는 데이터 타입의 기본이 벡터이며, 스칼라는 길이가 1인 벡터와 같다고 볼 수 있다. 정수, 부동소수 등과 같은 모든 숫자형 데이터 타입과 문자열, 불리언 값(진리값)을 지원하며, 데이터가 없음을 의미하는 "NA", 값이 미정임을 의미하는 NULL 이 해당하며, 여기서, "NA" 와 "NULL" 은 구분해서 생각해야한다. NA 는 결측치, 즉 값이 빠져있다는 의미이지만, NULL은 프로그래밍의 편의를 위해 미정인 값을 표현한다는 점이다. 만약 특정 변수에 NA 혹은 NULL 로 저장되어있는지를 확인하고 싶다면, 각각 is.na(), is.null() 함수를 사용해서 확인해보면 된다.
a <- 3
b <- 4.5
c <- a+b
print(c) # 7.5
d <- NA
is.na(d) # True
x <- NULL
is.null(x) # True
2. 벡터
하나 이상의 스칼라 원소들이 갖는 단순한 형태의 집합으로, 다른 프로그래밍 언어에서의 배열과 유사한 개념이다. 포함되는 원소는 숫자, 문자, 논리 연산자 등이 될 수 있다. 생성하는 방법은 c() 함수를 사용하면 되며, 특징으로는 무조건 같은 데이터 타입만 입력할 수 있으며, 같은 벡터를 합치면 합쳐진 벡터의 형식도 이전과 동일한 형식을 따르나 합치는 벡터에 문자열 벡터가 포함되면 해당 벡터는 문자열 벡터가 된다.
x <- c(10, 20)
names(x) <- c("kor", "math")
x
[실행결과]
kor math
10 20
3. 행렬
수학에서 배우는 행렬의 정의와 동일하게 행과 열을 갖는 m x n 형태의 직사각형에 데이터를 나열한 구조이며, 특징으로는 벡터와 마찬가지로 한 가지 유형의 스칼라만 저장할 수 있기 때문에, "1열은 숫자, 2열은 문자열"과 같은 형태는 불가능하다. 행렬의 구현방법은 다음과 같다.
matrix(c(1,2,3,4), ncol=2, byrow=T)
# 값: 행렬 생성을 위한 벡터 객체
# nrow: 행렬의 행 개수 지정
# ncol: 행렬의 열 개수 지정
# byrow: 행을 우선으로 채울지 여부를 선택, 기본값은 F(False)
4. 리스트
리스트는 서로 다른 데이터 객체를 결합한 구조로 특징은 서로 다른 형태의 데이터를 묶어서 하나의 객체에 저장한다. 자료구조에서 리스트와 배열을 비교할 때 데이터를 중간 삽입이 가능한 유리한 구조로 설명이 되지만, R에서는 데이터를 접근한다는 관점에서 보기 때문에 다른 언어에서의 배열보다는 해시 테이블이나 딕셔너리(사전) 구조와 좀 더 유사하다고 볼 수 있다. 생성 방법은 아래와 같다.
z <- list(“Wcup”, 2018, c(T,T,F), max)
5. 데이터 프레임
처리할 데이터를 엑셀과 같이 표 형식으로 정리한 모습을 하고 있다. 행렬과 유사한 2차원 목록 데이터 구조이며, 다루기 쉽고 한 번에 많은 정보를 담을 수 있다는 장점이 있다. 생성 방법은 다음과 같다.
mydat <- data.frame(income,car,marriage)
데이터 프레임의 경우 다른 데이터 구조들보다 많이 활용되는 데이터 구조이기 때문에, 구체적으로 생성하는 방법과 사용하는 방법들에 대해 아래에서 좀 더 살펴보도록 하자.
5.1 외부 데이터 불러오기
데이터프레임을 생성하는 방법 중 가장 많이 사용하는 방법은 외부의 데이터를 데이터프레임으로 변환하는 작업이 가장 많을 것이다. 이에 대해 각 외부 데이터들로부터 데이터를 데이터프레임으로 가져오는 방법을 살펴보도록 하자.
5.1.1 csv 파일 불러오기
read.table()
데이터프레임 형식으로 데이터를 로드하며, header=T로 할 경우 속성변수명을 첫 줄에 지정한다. sep=“,”옵션으로 데이터가 쉼표로 구분된 데이터 파일임을 지정한다. 파일 경로는 \\ 혹은 /를 사용한다.
data1 <- read.table(“D:/DATA/example.csv”, header=T, sep=“,”)
read.csv()
read.table과 유사하지만 sep=“,”옵션을 사용할 필요는 없다. 추가적으로 stringAsFactor 옵션은 문자형 변수를 요인으로 읽을 것인지에 대한 옵션을 의미한다.
data1 <- read.csv(“D:/DATA/example.csv”, header=T, stringAsFactor=F)
5.1.2 txt 파일 불러오기
read.table()에서 sep=“,”옵션을 사용하지 않을 경우 .txt 파일을 불러올 수 있다. 단, .txt 파일이 구분자나 형식 등이 잘 지켜져야한다.
data2 <- read.table(“D:\\DATA\\example.txt”)
5.1.3 엑셀파일 불러오기
엑셀로 실행시킨 후 .csv 파일 형식으로 저장한 뒤 .csv 파일 불러오기 방법을 사용한다. R에서 RODBC 패키지를 불러온 뒤 odbcConnectExcel과 sqlFetch명령어를 사용하면 된다.
library(RODBC)
new <- odbcConnectExcel(“c:\\data\\mydata”) #엑셀파일 경로지정
yourdata <- sqlFetch(new, “Sheet1”) #엑셀파일 워크 시트명 입력
close(new)
5.2 유틸리티 함수
분석할 데이터는 앞서 본 것처럼 보통은 파일 등에서 불러들이며, 불러온 데이터가 올바른 데이터 타입으로 저장되어 있는지 확인할 필요가 있다. 하지만, 데이터프레임에 저장되는 데이터는 전체 데이터이고, 양이 많은 경우 전부다 확인하기에는 어려울 수도 있다. 이를 위해 R에서는 데이터를 손쉽게 살펴볼 수 있는 유틸리티 함수들을 제공하고 있으며, 아래 3가지 함수가 대표적이라고 할 수 있다.
5.2.1 head() 함수
말 그대로 데이터프레임 객체의 처음 부분을 반환한다. 기본적으로는 처음 6줄을 출력해주며, 필요에 따라 확인하고 싶은 데이터 수를 매개값으로 넘겨주면, 매개 값 만큼의 데이터를 출력해서 보여준다.
df <- data.frame(x=1:100)
head(df, 10) # 처음 10줄을 출력함
5.2.2 tail() 함수
앞서 본 head() 함수가 데이터프레임의 앞을 보는 것이라면, tail() 은 데이터프레임 객체의 맨 뒷부분을 반환한다. head() 함수와 마찬가지로 기본적으로는 마지막 6줄을 출력해주며, 필요에 따라 확인하고 싶은 데이터 수만큼 입력해주면, 해당 뒤에서 데이터 수부터 마지막까지를 출력한다.
tail(df, 10) # 마지막 10줄을 출력함
5.2.3 View() 함수
끝으로 View() 함수는 데이터프레임으로 강제 형 변환을 하여 뷰어 형태로 데이터를 확인할 수 있도록 하는 함수이다.
View(df)
5.3 apply 계열 함수
R에서는 벡터, 행렬, 데이터프레임에 임의의 함수를 적용한 결과를 빠르게 얻을 수 있도록 하는 apply() 계열의 함수가 존재한다. 총 5가지 함수가 존재하며, 각 함수에 대한 내용은 다음과 같다.
함수
|
설명
|
특징
|
apply()
|
배열, 행렬에 주어진 함수를 적용함
결과는 벡터, 배열, 리스트로 반환됨 |
배열, 행렬 → 벡터, 리스트
|
lapply()
|
벡터, 리스트, 표현식에 주어진 함수를 적용함
결과는 리스트로 반환됨 |
벡터, 리스트, 표현식 → 리스트
|
sapply()
|
벡터, 리스트, 표현식에 주어진 함수를 적용함
결과는 벡터, 행렬, 배열 |
벡터, 리스트, 표현식 →
백터, 행렬, 배열 |
tapply()
|
벡터의 데이터를 특정 기준에 따라 그룹화한 후
각 그룹마다 주어진 함수를 적용, 결과 반환 |
데이터를 그룹화 후 적용
|
mapply()
|
여러 개의 벡터, 리스트를 인자로 받아 함수에
각 데이터의 첫째요소, 둘째요소, 셋째요소들을 적용한 결과 등을 반환함 |
여러 데이터를 함수의 인자로 적용
|
다음으로 각 함수들의 사용 방법에 대해서 살펴보도록 하자.
5.3.1 apply() 함수
가장 먼저 apply() 함수를 살펴보도록 하자. 해당 함수는 배열이나 행렬에 적용할 함수를 한 번에 적용하고 결과를 벡터, 배열 또는 리스트 형태로 반환해준다.
mat1 <- matrix(1:9, ncol=3)
apply(d, 1, sum) # margin 옵션에 따라 행 방향(1), 열 방향(2)으로 함수를 적용할 수 있다.
# 위의 경우에는 행 방향으로 sum 한 결과를 출력함
5.3.2 lapply() 함수
다음으로 lapply() 함수를 알아보자. 해당 함수는 apply() 와 유사하지만 반환값이 무조건 리스트 형태로 반환하는 함수이다.
result <- lapply(1:3, function(x) { x*2 }))
result
5.3.3 sapply() 함수
이번에는 lapply() 함수와 유사한 sapply() 함수에 대해 살펴보자. 앞서 본 lapply() 는 반환 값이 무조건 리스트였다면, sapply() 함수는 행렬, 벡터로 결과를 반환해주는 특징이 있다.
sapply(iris[, 1:4], mean)
5.3.4 tapply() 함수
다음으로 그룹별로 함수를 적용시켜주는 tapply() 함수의 사용법을 살펴보자. 해당 함수에는 앞서 본 apply 계열 함수들과 달리, 데이터를 그룹으로 묶을 대상을 index 매개변수의 값으로 지정해줘야하며, 반드시 팩터형(factor) 으로 지정해야한다. (팩터형이 아닌 경우 자동 형변환 됨)
tapply(1:10, 1:10 %% 2 == 1, sum)
5.3.5 mapply() 함수
마지막으로 mapply() 함수에 대해 알아보자. 해당 함수는 sapply() 함수와 유사하지만 다수의 인자를 함수에 넘길 수 있다는 차이점이 있다. 주로 다수의 인자를 받은 임의의 함수에 대해 매개값을 갖고 있는 데이터를 한 번에 넘겨서 결과를 추출하고자 할 때 사용된다.
mapply(rnorm,
c(1, 2, 3), # n
c(0, 10, 100), # mean
c(1, 1, 1)) # sd
데이터프레임 뿐만 아니라 앞서 다룬 벡터, 행렬, 리스트 등을 지원하는 함수들, 그 외에 유용한 함수들도 많이 있으며, 관련된 내용은 이번 장 서두에서도 언급했듯이 R Basic 에서 구체적으로 다룰 내용들이기 때문에 여기서 마무리하겠다.
'Data Science > 데이터 분석 📊' 카테고리의 다른 글
[데이터분석] 6. 통계 분석Ⅰ: 모집단 & 표본 (0) | 2024.07.31 |
---|---|
[데이터 분석] 5. 데이터 전처리 Ⅱ: 정규화, 표준화 (0) | 2024.07.31 |
[데이터 분석] 4. 데이터 전처리 Ⅰ : 결측치 & 범주형 (0) | 2024.07.30 |
[데이터 분석] 2. 데이터 자료구조Ⅰ: Python (0) | 2024.07.30 |
[데이터분석] 1. 데이터의 이해 (0) | 2024.07.29 |