1. R 기본 문법
1.1 데이터 분석을 위한 언어 및 패키지
1.1.1 SPSS
1.1.2 SAS
1.1.3 Python
1.1.4 R
1.1.5 WEKA: 자바 기반의 데이터마이닝 소프트웨어
1.2 R
1.2.1 통계 계산과 그래프 작성에 특화된 언어
1.2.2 데이터 분석을 위한 통계 및 그래픽스를 지원하는 자유 소프트웨어
1.2.3 Google, Facebook 등에서 R을 주된 분석 플랫폼으로 사용하고 있음
1.2.4 다양한 추가 기능을 별도의 패키지 형태로 제공
1.2.5 History
1.2.5.1 1995년 뉴질랜드 오클랜드 대학의 Ross Ihaka와 Robert Gentleman이 개발
1.2.5.2 2000년 R 1.0 공개(개발자 두 명의 이름이 모두 R로 시작해서 R로 명명함)
1.2.5.3 2002년 R Foundation 설립
1.3 R 다운로드 및 설치
1.3.1 R 다운로드 및 설치
C:/Program Files/R-x.x.x 디렉터리 대신 C:/R-x.x.x 디렉터리에 설치
(기존에 같은 버전의 프로그램이 설치되어 있으면 그대로 사용)
1.3.2 RStudio 다운로드 및 설치
R 패키지의 업데이트 - 콘솔창에 입력(시간이 많이 걸림)
update.packages(ask = FALSE)
1.4 RStudio 사용방법
1.4.1 R Script 창
Batch 모드로 R Script 실행
블록 설정 후 실행
1.4.2 Console 창
대화식으로 R 프로그램 실행
1.4.3 Environment/History
R Script의 실행 History
1.4.4 Files/Plot/Packages/Help/Viewer
파일 목록, 그래프 출력, 패키지의 정보, 도움말 등
1.4.5 RStudio 설정
1.5 IPython Notebook에서 실습하는 방법
Anaconda가 설치되어 있어야 함
cmd에서 실행(설치 시간이 오래 걸림)
conda install -c r r-essentials
1.6 실습(기본 문법)
1.6.1 도움말
1.6.2 주석: # 으로 시작
# 도움말
help(log)
?log
# 예약어에 대한 도움말을 보고 싶을 경우 따옴표로 묶는다.
help("for")
# lm 함수의 사용 예제를 보고 싶을 경우
example(lm)
1.6.3 산술 연산자
연산자 | 기능 |
+ - * / %/% %% ^, ** |
실수 나눗셈 정수 나눗셈 나머지 거듭제곱 |
# 산술 연산자
1 + 2
(11 + 54 - 13) * 76 / 9
# 9를 3으로 나눈 나머지
9 %% 3
# 5를 2로 나눈 정수 몫
5 %/% 2
# 5를 2로 나눈 실수 몫
5 / 2
# 4의 제곱
4 ** 2
# 4의 세제곱
4 ** 3
1.6.4 수학 함수
- sqrt(x): 제곱근
- abs(x): x의 절댓값
- runif(n): 0과 1 사이의 난수 n개 생성
- trunc(x): 소수점 이하 버림
- round(x, 소수 이하 자릿수): x값을 반올림
## 수학 함수
# 100의 제곱근
sqrt(100)
# -10의 절댓값
abs(-10)
# 10개의 난수(0.0 ~ 1.0)
runif(10)
# 소수점 이하 버림
trunc(100.5)
# 소수 둘째 자리에서 반올림
round(100.567, 2)
# 반올림
round(100.5)
1.6.5 변수
# 대입 연산자
x = 5
# x에 저장된 값을 출력
x
# 대입 연산자(= 보다는 <- 을 추천함)
x <- 5
x
# ()로 묶으면 변수에 대입 후 출력(계산 + 출력)
(x <- 2)
# 변수 x를 삭제
rm(x)
# x
x <- 2
y <- 3
# 현재 시스템에서 사용되는 변수의 목록
ls()
# ls 명령어에 대한 도움말
help(ls)
# 문자열 저장
x <- "one"
# 출력
x
# 출력함수
print(x)
# 따옴표를 제거하고 출력
print(x, quote = False)
print(x, quote = F)
## 서식을 이용한 출력
# %s: 문자열 형식
# %5.1f: 전체 5자리, 소수 이하 1자리 실수형
# %i: 정수형
sprintf("%s의 키는 %5.1f이다.", "김철수", 170.5)
sprintf("%s의 나이는 %i세이다.", "김철수", 23)
# R이 제공하는 기본 데이터 iris의 앞부분 6행 출력
head(iris)
# iris의 마지막 6행 출력
tail(iris)
# iris 데이터의 기초 통계량(최대, 최소, 평균, ...) 출력
summary(iris)
1.6.6 Vector
1.6.6.1 물리학 용어
- Scalar: 크기만 가지고 있는 물리량
- Vector: 크기와 방향을 모두 가지고 있는 물리량
1.6.6.2 R에서의 Vector: 값들의 집합
R에서는 Scalar인 하나의 숫자도 하나의 원소를 가진 Vector로 취급
Vector 안의 각 수치를 요소라고 함
1.6.6.3 Vector의 특징
벡터는 c() 함수로 생성
Combine Values into a Vector or List
벡터의 인덱스는 1부터 시작
하나의 벡터에는 하나의 자료형만 사용할 수 있음
벡터에서 결측값(누락된 값)은 'NA(Not Available)'를 사용
1.6.6.4 벡터 연산 주요 함수
함수 | 의미 |
cor() | 상관함수 |
cumsum() | 누적합 |
length() | 요소수 |
max() | 최댓값 |
mean() | 평균값 |
median() | 중앙값 |
min() | 최솟값 |
range() | 범위 |
rank() | 각 요소의 순위 |
rev() | 요소의 역순 |
sd() | 표준편차 |
sort() | 요소의 정렬 |
sum() | 총합 |
summary() | 요약 통계 |
## 벡터
# 요소가 1개인 벡터
1 + 2
# 벡터형의 자료를 생성해서 변수 x에 할당
x <- c(1, 2, 3, 4, 5)
# x의 값 확인
x
# 30개의 정규분포 난수를 생성하여 xy에 할당
xy <- rnorm(30)
xy
# x의 두 번째 값; 두 번째 요소(인덱스는 1부터)
x[2]
# x의 두 번째 값을 제외한 나머지 요소들
x[-2]
# x의 세 번째 값을 4로 변경
x[3] <- 4
x
## 벡터 합치기
# 벡터 생성
x <- c(3, 6, 9, 12, 15)
y <- c(5, 10, 15, 20, 25)
x
y
# x에 y를 합친다(x, y 벡터 연결)
z <- append(x, y)
z
## 벡터형 자료의 연산 가능
# 1 + 4, 2 + 5를 수행한다(인덱스끼리 덧셈)
c(1, 2) + c(4, 5)
# c에 1을 더한다(각 인덱스 값에 +1)
c(1, 2, 3) + 1
# -5에서 5까지 정수를 생성하여 할당한다
v <- -5:5
v
## seq(): Sequence Generation
# 1부터 5까지 0.5 단위로 생성하여 할당한다
q1 <- seq(from = 1, to = 5, by = 0.5)
q1
# 1부터 10까지 생성하여 할당
q2 <- seq(10)
q2
x <- c(1, 2, 3)
y <- c(4, 2, 8)
# x 값과 y 값이 같은지 순서에 따라 비교
x == y
# a, b, c를 4번 반복하여 x를 생성
(x <- rep(c("a", "b", "c"), times = 4))
# 중복 값 제거
y <- unique(x)
y
1.6.7 문자열 관련 함수
## 문자열 관련 함수
# 벡터 생성
xx <- c("a", "b", "c", "d", "e")
xx
# 문자열 결합, 벡터 xx의 첫 번째와 두 번째 연결(공백으로 연결됨)
k <- paste(xx[1], xx[2])
k
1.6.8 문자열 결합
## 문자열 결합(sep - 결합연산자)
# 문자열끼리 콤마(,)로 구분하여 연결
paste("aaa", "bbb", "ccc", sep = ",")
# 문자열(x)의 각 문자(원소) 사이에 - 를 넣는다
paste(x, collapse = "-")
# 문자(원소) 사이에 공백을 넣는다
paste(x, collapse = " ")
# 2에서 5까지의 문자열 뽑아내기
substring("abcdefghijklmn", 2, 5)
# runif(개수): 0 ~ 1 사이의 난수 생성
# runif(개수, 최솟값, 최댓값)
# 0 ~ 1 사이의 5개의 난수 생성
x <- runif(5)
x
# 10 ~ 20 사이의 5개의 난수
y <- runif(5, 10, 20)
y
# x가 0.4 ~ 0.7 사이에 있는가? (and 조건)
(0.4 <= x) & (x <= 0.7)
# x 중에 0.9 이상이 있는가? (1개라도 TRUE)
any(x >= 0.9)
# x의 값이 모두 0.9 이하인가? (모두 TRUE)
all(x <= 0.9)
# x가 벡터형의 데이터인가? (자료형 검사)
is.vector(x)
1.6.9 행렬
2차원의 자료를 저장하는 자료형
- rbind() 행을 결합
vec1 <- c(1, 2, 3)
vec2 <- c(4, 5, 6)
vec3 <- c(7, 8, 9)
# 행 결합(row bind) - 세로로 결합
mat1 <- rbind(vec1, vec2, vec3)
mat1
- cbind() 컬럼을 결합
# 열 결합(column bind) - 가로로 결합
(mat2 <- cbind(vec1, vec2, vec3))
# mat1 행렬에 필드명 추가(컬럼 이름 지정)
colnames(mat1) <- c("A", "B", "C")
mat1
1.6.10 데이터프레임
다양한 자료형으로 구성된 2차원 형태의 데이터 구조
## 데이터 프레임: 다양한 자료형을 모아서 구성된 행렬
# 벡터 선언
no <- c(1, 2, 3, 4)
name <- c("Apple", "Banana", "Peach", "Berry")
prices <- c(500, 200, 200, 50)
qty <- c(5, 2, 7, 9)
# 데이터 프레임(2차원 표 형식)
fruit <- data.frame(
No = no,
Name = name,
Price = prices,
QTY = qty
)
fruit
## 데이터 프레임 데이터의 조작
# 1번 행, 모든 필드
fruit[1, ]
# 모든 행, 2번 열을 제외하고 출력
fruit[, -2]
# 모든 행, 모든 필드
fruit[,]
1.6.11 리스트
## 리스트 자료형
# list: key, value의 형태로 구성된 자료형(자바의 HashMap, 파이썬의 Dictionary와 비슷한 자료형)
member <- list(
name = "김철수",
address = "서울",
tel = "010-2222-2222",
pay = 360
)
member
## 리스트 자료의 조작
# name만 확인(key가 name인 value는?)
member$name
# 1 ~ 3번 자료만 확인(숫자형 인덱스도 사용 가능, 4번 pay는 출력되지 않음)
member[1:3]
# 새로운 key, value 데이터 삽입
member$birth <- "190-10-23"
member
1.6.12 배열
행렬을 다차원으로 확장한 것, 행렬은 2차원이지만 배열은 필요에 따라 3차원 이상으로 확장도 가능함
## 배열
# 3행 4열의 2차원 배열(세로 방향으로 배열 생성)
array(1:12, dim = c(3, 4))
# 가로 방향으로 배열 생성
# Array by PERMuting its dimensions and optionally resizing it.
# (배열을 치환하고 사이즈 조절)
aperm(array(1:12, dim = c(3, 4))
x <- array (1:6, dim = c(3, 2))
x
# 1행 1열의 값
x[1, 1]
# 3행 2열의 값
x[3, 2]
# x의 차원
dim(x)
1.6.13 자료형 판별
# 자료형 판별
class(c(1, 2))
# 숫자와 문자를 섞어서 사용했지만 내부적으로 문자형으로 바뀌게 됨
class(matrix(c(1, 2)))
class(list(c(1, 2)))
class(data.frame(x = c(1, 2))
# is.자료형: 특정 자료형인지 검사
is.numeric(c(1, 2, 3))
is.numeric(c('a', 'b', 'c'))
is.matrix(matrix(c(1, 2))