*참고자료: introductory statistics with R, 기타 블로그 및 R 개론서
* 한마디
강의는 명령어나 배경지식에 대한 디테일한 설명 없이 생각보다 휙 휙 지나가버려서 개인공부가 중요.
교과서는 상당히 step-by-step으로 자세히 쓰여 있으므로 교과서를 정독할 것.
다른 객체지향 언어들과 유사한 점이 많고, 문법 상 크게 다르진 않은 듯 함.
* 범위: chapter 1
교재의 많은 부분은 ISwR 패키지를 활용하므로 항상 실행시킬 것.
> library(ISwR)
* 함수와 인자
보통 함수명(인자) 의 방식으로 호출해서 이용하게 되며, 여러 인자가 들어가는 경우 그 위치에 따라 의미를 갖는 "positional matching"과 keyword=value 로 지정해줘야 하는 "keyword matching"이 존재한다. 또한 많은 인자들은 기본값을 가지고 있어서 매번 지정해주지 않아도 적절히 기능이 수행되는 경우가 많음.
args(함수): 해당 함수가 갖는 arguments들을 보여줌.

tripple dot(...) 인자: 임의의 인자들을 받아서 다른 함수에 넘겨주는 용도로 사용됨. 다른 함수에 넘겨줄 수는 있으나, 해당 함수에서 완전히 이용할 수 없다.

* 기본 함수/명령어
ls(): workspace에 있는 변수들의 이름을 문자열 벡터로 반환함.
rm(객체): 호출된 객체를 삭제함.
rm(list=벡터): 입력된 벡터에 있는 문자열에 해당하는 이름의 객체를 삭제한다.
응용) rm(list=ls()): 메모리 상 모든 객체를 삭제한다.
head(): 변수에 저장된 데이터의 첫 6 row만을 출력한다.
tail(): 변수에 저장된 마지막 6 row만을 출력한다.
cat(벡터): concatenate의 약자인 듯? 문자열 벡터의 성분들을 'space bar'를 사이에 두고 결합해 출력해준다. 단, 벡터의 마지막에 \n이 존재하지 않는다면 다음 prompt가 문자열 바로 옆에 나타난다.
추가: Cat은 단순히 '붙이는 것'만이 아니라 '출력'을 해주는 것이다. 즉, 뭔가를 return해주지 않는다. 따라서 여러 성분
벡터들이 결합한 새로운 벡터를 원하는 경우 paste()함수를 써야 함.


* R의 기본 데이터 구조

Vector/matrix/array: 동일 종류 자료, 차원에 차이가 있음. 벡터는 1차원, matrix는 2차원, array는 3차원 이상
Data frame: matrix와 유사한 구조이나, 다른 종류의 data type으로 column으로 구성할 수 있음. Column에 따른 자료 접근이 용이해 많이 사용되는 것 같음.
List: 여러 자료 구조를 담을 수 있음.
- Vector
R은 벡터를 통해 여러 데이터를 한번에 쉽게 다룰 수 있다는 점이 장점!
두 벡터의 구성요소 숫자가 똑같다면 간단히 연산할 수 있음: 동일 인덱스의 구성요소끼리 계산됨.
두 벡터의 구성요소 숫자가 다르다면, 짧은 쪽이 "반복"된다: 긴 쪽 벡터가 짧은 벡터의 "배수"가 아니라면 경고메시지가 출력된다. 물론 반복이 중간에 멈추긴 하지만 계산값이 출력되긴 함.
벡터에는 실수, 문자, 진리값(T or F), 결측치(NA) 등 다양한 값이 들어갈 수 있다.
특히 벡터에 대한 논리연산은 진리값을 리턴해준다.

벡터의 생성 함수: c, rep, seq
c()는 입력된 데이터들을 순서대로 합쳐서 벡터를 만든다. 또한 벡터의 각 element에 이름을 붙여줄 수도 있다. 이 경우, element는 변수['키']를 통해 접근이 가능하다. 또한 벡터의 이름 목록은 names(변수)를 통해 확인이 가능하다.

하나의 벡터는 하나의 data type만을 가질 수 있으므로 서로 다른 형태의 데이터를 c를 이용해 합치는 경우, 덜 제한적인 쪽의 type을 취한다.
seq()는 다음과 같이 사용한다: seq(시작값, 끝값, by)
연속된 정수값을 형성하기 위해서는 n:m 과 같은 문구를 쓸 수도 있으나, by=1로 고정적임.
rep()은 값이 반복된 벡터를 형성한다: rep(벡터, 반복형태)
'반복형태' 자리에 오는 것이 단일 숫자인 경우 해당 숫자만큼 전체 요소를 반복, 만약 each=n 이 온다면 각각의 요소를 n번만큼 반복한다. 만약 벡터가 온다면, 각 자리의 값만큼 대응되는 벡터의 값을 반복한다.

- Matrix, array
Matrix(행렬)은 수학적으로 2차원 배열(two-dimensional array)을 말하며, array는 더 높은 차원의 배열을 가질 수도 있다. R에서는 물론 matrix가 수열 연산에도 이용되지만, 단순히 data table을 저장하기 위해 사용되기도 한다.
R에서 matrix, array는 차원을 가진 벡터로 볼 수 있다.
dim(변수)는 변수의 dimension을 나타내기도 하며, 변수의 차원에 접근해 변경을 할 때도 이용할 수 있음.

matrix() 함수를 이용해 행렬을 만들 수도 있다.
matrix(벡터, nrow=행숫자, ncol=열숫자, byrow=T or F, dimnames=리스트)
R에서 데이터는 기본적으로 column-major(즉, 열부터 배열됨)이다. Matrix() 명령어를 통해 벡터값으로부터 matrix를 생성할 수 있는데, 이 때 byrow=T를 이용해 row 순서대로 자료를 채울 수 있다.

Matrix를 생성한 다음 rownames(변수), colnames(변수) 함수를 이용해 row, column 각각에 이름을 부여할 수 있다.
아래 명령어를 이용해 행과 열의 이름을 지정 가능하다.
names(dimnames(데이터)) <- c("행이름", "열이름")

행렬 연산은 다음과 같이 시행한다.
스칼라 곱/나누기는 일반적인 프로그래밍 언어와 동일.
덧셈/뺄셈: 행렬 끼리는 동일 구조인 경우만 가능, 일반 숫자는 모든 요소에 더해지거나 빼짐.
행렬곱: %*%
역행렬: solve(행렬)
전치행렬: t(행렬), matrix의 행과 열을 바꾸는 경우를 말함.
rbind(), cbind()
벡터를 합쳐 matrix/array를 만들 때 이용함. rbind는 한 벡터가 하나의 row로 합쳐지고, cbind는 한 벡터가 하나의 column으로 합쳐진다. 또한 기존의 data frame에 vector를 추가하는데 이용할 수도 있다.

- Factor
범주형 자료(categorical data)를 위한 데이터 타입. 범주형 자료는 범주 간 우열이 없는 명목형 자료와 우열이 있는 순서형 자료라 나뉜다. 기본적으로 factor는 명목형 자료를 생성하지만, factor의 argument로 ordered=T를 지정하거나 ordered() 함수를 이용하면 순서형 자료를 만들 수 있다. ordered() 함수는 factor와 사용법이 동일하다.
factor(변수, 범주벡터) 혹은 factor(변수, levels=범주벡터)

levels를 지정하지 않아도 변수에 들어있는 값들을 이용해 자동으로 범주를 지정해주긴 하지만 가능하면 levels를 꼭 따로 입력하는 습관을 들이도록 하자. 위의 예에서는 levels를 숫자로 지정한 다음 levels()를 이용해 다시 문자로 labeling 했다면, 애초에 labels argument를 이용해 만들 수도 있다.
fpain <- factor(c(0,3,2,2,1), levels=0:3, labels=c("none","mild","moderate","severe"))
as.numeric() 함수를 이용하면 factor형 자료의 numerical coding을 추출할 수 있으며 levels()를 이용하면 전체 범주의 이름들을 출력해준다.

우열관계가 있는, 순서형 자료형의 생성
factor(변수, 범주벡터, ordered=TRUE) 또는 ordered(변수, 범주벡터)
- List
다른 언어의 '딕셔너리'에 해당된다. 즉, "키"와 "값"을 매칭할 수 있다. 이 때 "값"은 하나의 값일 수도 있고, 벡터나 matrix, data frame 등 더 큰 구조를 담을 수도 있음.

List 자료형 접근하기: List[인덱스]를 호출하면 (키, 값)을 모두 갖고 있는 리스트를 반환하며, list[[인덱스]]를 호출하면 값만을 반환한다. 또한 data frame처럼 list$키 를 호출해서 접근할 수도 있다.
- Data frames
교과서의 설명: a list of vectors and/or factors of the same length that are related "across" such that data in the same position come from the same experimental unit.
동일한 length의 벡터/factor들이 column을 구성하며 하나의 row에 위치하는 column 상의 값들은 동일한 객체의 특성값을 나타낸다. 쉽게 말하면, 일반적인 실험 결과값 table을 받아와서 저장할 수 있는 객체이며 column을 위주로 구성되어 접근 및 편집이 용이해 많이 사용되고 있다.
* Indexing
Vector/matrix/array 변수의 []대괄호 안에 숫자 혹은 벡터값을 넣어 특정 부분만을 가져올 수 있다. 이 때 값의 앞에 - 부호를 붙이면 해당 부분만 제외한 나머지 요소들이 호출된다. Indexing을 비워두는 경우는 전체 값이 호출된다.
Data frame 역시 마찬가지로 indexing 할 수도 있으나, d$colname 을 이용해 column을 호출할 수도 있다. 아래의 조건부 선택문을 활용해 원하는 데이터만을 indexing 할 수 있다.

필요에 따라 Data frame의 각각의 column을 외부의 vector에 저장해야 할 수도 있다. 변수 <- dataframe$colname[] 을 이용할 수 있다. Data frame의 자료를 외부 vector로 보낼 때 조건부 선택문을 이용해 특정 조건에 만족하는 데이터만을 보낼 수도 있다.

Split() 함수를 이용하면 Data frame의 자료를 group에 따라 나눈 벡터를 묶어 list의 형태로 반환해준다.
split(x,f)에서 x는 대상이 되는 column이며, f는 기준이 되는 group label이 붙어있는 column을 얘기한다.

* Conditional selection: 조건부 선택
인덱싱과 마찬가지로 변수의 [] 대괄호 안에 "relational expression(관계식)"을 넣으면 해당하는 요소들만 호출이 된다. 이 때, 길이만 같다면 다른 변수에 대한 관계식을 넣어도 무관한데 이유는 관계식은 진리값 벡터를 리턴하며, 0과 1로 구성된 진리값 벡터값이 []에 들어감에 따라 1이 들어간 자리의 데이터만 추출이 되기 때문. 바꿔서 말하면 변수의 [] 대괄호 안에 0과 1로 구성된 벡터를 넣는 경우에도 1이 들어간 자리의 데이터만 호출이 된다.

위의 관계식처럼 logical value를 반환하는 함수들이 있다. 예를 들면 is 함수 그룹이 있는데, is.na()의 경우 결측치인지 여부를 TRUE/FALSE로 구성된 벡터로 반환한다.
* 논리연산자
크다/작다: <, >
크거나 같다/작거나 같다: >=, <=
같지 않다/ 같다: !=, ==
And/Or: &, |
&&나 ||는 flow control에 사용하며 추후에 다루도록 함.
* Implicit loops: apply 구문을 이용한 함축적 순환문
for, while 등 순환구문을 쓰지 않더라도 apply 함수를 이용하면 모든 데이터에 특정 함수를 적용해 원하는 값을 얻어낼 수 있다. 다음과 같은 다양한 apply 구문들이 있으며, 조금씩 다른 특성을 갖는다.

apply(input, 적용방향, output)
array를 input, array를 output으로 갖는다. 적용방향은 1이 row, 2가 column 방향.

lapply()
apply의 단점인, input으로 array만 입력이 가능하다는 것을 해결하기 위해 vector, list를 입력 받아 list로 반환함.
'리스트'가 싫다면, unlist(변수)를 해서 다시 벡터로 변용 가능. 데이터프레임도 리스트에 기반한 object이므로 적용 가능.
sapply()
lapply()와 유사하지만, 리스트 대신 행렬/벡터 등을 결과로 반환함. 즉, unlist를 해야 하는 번거로움을 좀 줄여줌.

tapply()
그룹별 처리를 위한 함수. 그룹을 인자로 주고 (factor형), 원소별 처리가 아닌 그룹별 처리를 해준다.
tapply(데이터, index(=factor), function)
iris의 예를 들자. 꽃의 '종류'에 따른 'sepal length'의 'mean'값을 보고 싶다면, tapply를 사용!

mapply()
sapply와 비슷하지만 변수를 여러 개 주어 적용하고 싶을 때 쓴다.
mapply(함수, 벡터1, 벡터2) 라고 하면
함수에 벡터 1, 벡터 2를 넣어 계산한 값을 차례대로 반환해 리스트를 만듦.
아래의 예를 참조할 것.

replicate(횟수, 함수)
단순한 함수를 횟수만큼 반복 시행해서 값을 vector로 리턴해줌. 단순한 연산에서 사용.

* Sorting
sort(), order() 명령어를 데이터 정렬을 위해 사용할 수 있으나, 특성들이 다름.
sort(변수): 지정 변수를 정렬된 형태로 바꾸어 반환. (즉, 인자로 받은 변수를 변경하진 않음) 기본은 오름차순이며, sort(변수, decreasing=TRUE)로 augment를 설정하는 경우 내림차순으로 정렬됨.
order(변수1, 변수2, ...): 변수가 정렬되어 있게 하기 위한 색인을 반환한다. 이 역시 원본 데이터는 변경 없음. 마찬가지로 기본은 오름차순 정렬이며, order(-변수)를 입력하면 내림차순 정렬 색인을 반환함. 변수2의 경우는 변수 1이 동일한 경우, 변수 2를 기준으로 추가적으로 정렬해준다는 의미.

위를 보면, x가 오름차순으로 정렬되기 위해선 순서가 x[2], x[1], x[3], x[5], x[4] 순서가 되어야 한다는 의미이다. 이 순서 벡터를 index에 이용하는 경우 정렬을 시킬 수 있다.

뿐만 아니라, 더 높은 차원인 전체 데이터에 대해서도 이용할 수 있다.

아래와 같이 [] 대괄호 안에 직접 넣을 수도 있음.

위와 같이 [] 내부에 order 값을 사용하는 경우, 색인 벡터가 순서대로 들어가며 정렬된 데이터가 출력된다. 위를 보면 9, 39, 43은 septal length가 동일하다. 이 경우, 추가적으로 petal length에 따라 정렬하게 명령할 수 있다.

* 결측치
실제 세계의 통계에서 결측치는 높은 빈도로 존재하며, 이를 처리하기 위해 통계용 프로그래밍 언어인 R은 NA라는 값을 가지고 있다. NA를 연산한 값의 결과는 NA로 나온다. is.NA(변수) 함수를 이용하면 변수 내 값들 중 NA가 있는지를 불리언 값으로 리턴해주므로 이를 결측치 처리에 활용할 수 있다.
NA와 NULL은 다르다: NA 는 결측치를 의미하며, NULL은 초기 아무런 값도 입력되지 않은 것을 의미한다.
* 이스케이프 시퀀스/탈출문자, 탈출시퀀스
탈출문자는 \를 말하며, 따옴표 내에 \가 입력되면 따옴표 안쪽 내용을 순차적으로 읽다 정지 후 \ 이후의 명령을 수행한 뒤 다시 돌아온다. 예를 들면, \n은 linefeed(한줄 추가). 또는 따옴표 안쪽에 따옴표를 문자열로 추가하고 싶을 때도 사용하는 등, 다양하게 사용이 가능함.
* Built-in variables
R에는 여러 built-in variable들이 존재한다.
LETTERS[]: A-Z까지 대문자를 element로 가짐.
letters[]: a-z까지 소문자를 element로 가짐.
month.name[]: January-December까지 각 달 이름을 element로 가짐.
month.abb[]: Jan-Dec까지 각 달 이름의 약자를 element로 가짐.
'[학습] 데이터분석방법론: R' 카테고리의 다른 글
Introductory statistics with R: chapter 6 (0) | 2021.03.18 |
---|---|
Introductory statistics with R: chapter 5 (0) | 2021.03.17 |
Introductory statistics with R: chapter 4 (0) | 2021.03.17 |
Introductory statistics with R: chapter 3 (0) | 2021.03.14 |
Introductory statistics with R: chapter 2 (0) | 2021.03.11 |