기존의 데이터베이스 관리 도구의 역량을 넘어서는 데이터
3V
- 크기
- 다양성
- 속도
크기
- 수십 테라 or 페타 바이트 이상
- 큰 저장공간, 오랜처리 시간, 분석시간 필요
다양성
- 정형화 정도에 따라 구분
- 정형 데이터
- 고정된 필드에 저장, 일정한 형식
- 반정형 데이터
- 고정된 필드에 저장되지 않지만 메타데이터나 구조정보 등을 포함
- 일정한 구조는 없으나 구조를 파악할 수 있음
- 비정형 데이터
- 고정된 필드에 저장되지 않는 데이터
- 문제 정의 및 계획
- 문제 정의가 구체적이고 명확할수록 데이터 분석이 효과적으로 진행될 수 있음
- 데이터 수집
- 필요한 데이터 수집
- 데이터 정제 및 전처리
- 수집된 데이터를 분석가능한 형태로 정돈하는 과정
- 데이터 탐색
- 정돈된 데이터 자체를 이해하고 파악하는 과정
- 데이터 분석
- 파악한 정보를 바탕으로 심화된 분석을 수행
- 고급 분석 기법들이 동원
- 결과 보고
- 내용을 정리해서 보고
- 문제를 해결하는 데 도움이 되는 내용을 요약
- 데이터 시각화가 중요
2+3
(3+6)*8
2^3
> 2+3
[1] 5
> (3+6)*8
[1] 72
> 2^3
[1] 8
연산자 | 의미 |
---|---|
+ | 덧셈 |
- | 뺄셈 |
* | 곱셈 |
/ | 나눗셈 |
%% | 나머지 |
^ | 제곱 |
2+3 # 2 더하기 3
log(10)+5
sqrt(25)
max(5,3,2)
> log(10)+5
[1] 7.302585
> sqrt(25)
[1] 5
> max(5,3,2)
[1] 5
함수 | 의미 | 사용 |
---|---|---|
log() | 로그함수 | log(10), log(10, base=2) |
sqrt() | 제곱근 | sqrt(36) |
max() | 가장 큰 값 | max(5,3,2) |
min() | 가장 작은 값 | min(5,3,2) |
abs() | 절대값 | abs(-10) |
factorial() | 팩토리얼 | factorial(5) |
sin(),cos(),tan() | 삼각함수 | sin(pi) |
a <- 10
b <- 100
c <- a + b
ab.sum <- a + b # 마침표도 변수명에 사용 가능
print(ab.sum)
> a <- 10
> b <- 100
> c <- a + b
> ab.sum <- a + b # 마침표도 변수명에 사용 가능
> print(ab.sum)
[1] 110
- 숫자형
- 1, 1.5
- 정수와 실수 모두 가능
- 문자형
- 'Good', "night"
- 작은 따옴표나 큰 따옴표로 묶어서 표현
- 논리형
- TRUE, FALSE
- 반드시 따옴표가 없는 대문자로 표기
- T, F로 줄이는 것도 가능
- 특수값
- NULL
- 정의되어 있지 않음을 의미
- 자료형도 없고, 길이도 0
- NA
- 결측치
- NaN
- 수학적으로 정의가 불가능한 값
- Inf, -Inf
- 무한대
- NULL
1차원 배열 데이터
- 데이터가 일직선상에 저장
- 수능 국어 성적
2차원 배열 데이터
- 여러 주제에 대해 값을 모아놓은 데이터
- 수능 전 과목 성적
x <- c(1,2,3) # 숫자형 벡터
y <- c("a","b","c") # 문자형 벡터
z <- c(TRUE, TRUE, FALSE, TRUE) # 논리형 벡터
x
y
z
> x <- c(1,2,3) # 숫자형 벡터
> y <- c("a","b","c") # 문자형 벡터
> z <- c(TRUE, TRUE, FALSE, TRUE) # 논리형 벡터
> x
[1] 1 2 3
> y
[1] "a" "b" "c"
> z
[1] TRUE TRUE FALSE TRUE
주의할 점
- 동일한 자료형이 저장되어야 함
w <- c(1,2,3,"a")
w
> w <- c(1,2,3,"a")
> w
[1] "1" "2" "3" "a"
벡터 생성 (다른 방법)
v1 <- 50:90 # 50~90까지의 수
v2 <- seq(1,101,3) # 1~101까지 3간격
v3 <- rep(1,times=5) # 반복된 수
v1
v2
v3
> v1 <- 50:90 # 50~90까지의 수
> v2 <- seq(1,101,3) # 1~101까지 3간격
> v3 <- rep(1,times=5) # 반복된 수
> v1
[1] 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
[32] 81 82 83 84 85 86 87 88 89 90
> v2
[1] 1 4 7 10 13 16 19 22 25 28 31 34 37 40 43 46 49 52 55 58 61 64 67
[24] 70 73 76 79 82 85 88 91 94 97 100
> v3
[1] 1 1 1 1 1
score <- c(90,5,70)
score
names(score) # score에 저장된 값들의 이름 표시
names(score) <- c("A","B","C") # 값들에 이름 부여
names(score)
score # 이름과 함께 값이 출력력
> score <- c(90,5,70)
> score
[1] 90 5 70
> names(score) # score에 저장된 값들의 이름 표시
NULL
> names(score) <- c("A","B","C") # 값들에 이름 부여
> names(score)
[1] "A" "B" "C"
> score # 이름과 함께 값이 출력력
A B C
90 5 70
- 인덱스가 1부터 시작
d <- c(1,2,4,6,5,9)
d[1]
d[4]
d[7]
d[c(1,3,5)] # 1, 3, 5번째 값 출력
d[1:3] # 1~3번째 값 출력
d[seq(1,5,2)] # 1~5까지 2간격
d[-2] # 2번째 값 제외하고 출력
d[-c(3:5)] # 3~5번째 값은 제외하고 출력
> d <- c(1,2,4,6,5,9)
> d[1]
[1] 1
> d[4]
[1] 6
> d[7]
[1] NA
> d[c(1,3,5)] # 1, 3, 5번째 값 출력
[1] 1 4 5
> d[1:3] # 1~3번째 값 출력
[1] 1 2 4
> d[seq(1,5,2)] # 1~5까지 2간격
[1] 1 4 5
> d[-2] # 2번째 값 제외하고 출력
[1] 1 4 6 5 9
> d[-c(3:5)] # 3~5번째 값은 제외하고 출력력
[1] 1 2 9
이름으로 추출
d <- c(20, 24, 90)
names(d) <- c("A","B","C")
d
d[1]
d["A"]
d[c("B","C")]
> d <- c(20, 24, 90)
> names(d) <- c("A","B","C")
> d
A B C
20 24 90
> d[1]
A
20
> d["A"]
A
20
> d[c("B","C")]
B C
24 90
v1 <- c(1, 3, 5, 7, 11)
v1[2] <- 2 # 2번째 값을 2로 변경
v1
v1[c(1,5)] <- c(13, 17) # 1, 5번째 값을 13, 17로 변경경
v1
> v1 <- c(1, 3, 5, 7, 11)
> v1[2] <- 2 # 2번째 값을 2로 변경
> v1
[1] 1 2 5 7 11
> v1[c(1,5)] <- c(13, 17) # 1, 5번째 값을 13, 17로 변경경
> v1
[1] 13 2 5 7 17
벡터-숫자
d <- c(1,3,5,7,11)
2*d
d-5
3*d+4
d <- d-5 # 변경을 저장하려면 대입 필요
d
> d <- c(1,3,5,7,11)
> 2*d
[1] 2 6 10 14 22
> d-5
[1] -4 -2 0 2 6
> 3*d+4
[1] 7 13 19 25 37
> d <- d-5 # 변경을 저장하려면 대입 필요
> d
[1] -4 -2 0 2 6
벡터-벡터
d1 <- c(1,3,5,7,11)
d2 <- c(2,4,6,8,10)
d1+d2
d1*d2
d3 <- d1+d2
d3
> d1 <- c(1,3,5,7,11)
> d2 <- c(2,4,6,8,10)
> d1+d2
[1] 3 7 11 15 21
> d1*d2
[1] 2 12 30 56 110
> d3 <- d1+d2
> d3
[1] 3 7 11 15 21
논리연산
d1 <- c(1,3,5,7,11)
d>=5
d[d>5]
sum(d>5)
sum(d[d>=5])
d==5
condition <- d > 5 & d < 8 # 조건을 변수에 저장
d[condition] # 조건에 맞는 값들을 선택
> d1 <- c(1,3,5,7,11)
> d>=5
[1] FALSE FALSE FALSE FALSE TRUE
> d[d>5]
[1] 6
> sum(d>5)
[1] 1
> sum(d[d>=5])
[1] 6
> d==5
[1] FALSE FALSE FALSE FALSE FALSE
> condition <- d > 5 & d < 8 # 조건을 변수에 저장
> d[condition] # 조건에 맞는 값들을 선택
[1] 6
d1 <- c(1,3,5,7,11)
sum(d1) # 합
mean(d1) # 평균
median(d1) # 중앙값
max(d1) # 최댓값
min(d1) # 최솟값
var(d1) # 분산
length(d1) # 값둘의 개수
sd(d1) # 표준편차
range(d1) # 값들의 범위
sort(d1) # 정렬
sort(d1, decreasing = FALSE) # 오름차순
sort(d1, decreasing = TRUE) # 내림차순
> d1 <- c(1,3,5,7,11)
> sum(d1) # 합
[1] 27
> mean(d1) # 평균
[1] 5.4
> median(d1) # 중앙값
[1] 5
> max(d1) # 최댓값
[1] 11
> min(d1) # 최솟값
[1] 1
> var(d1) # 분산
[1] 14.8
> length(d1) # 값둘의 개수
[1] 5
> sd(d1) # 표춘편차
[1] 3.847077
> range(d1) # 값들의 범위
[1] 1 11
> sort(d1) # 정렬
[1] 1 3 5 7 11
> sort(d1, decreasing = FALSE) # 오름차순
[1] 1 3 5 7 11
> sort(d1, decreasing = TRUE) # 내림차순순
[1] 11 7 5 3 1
- 서로 다른 자료형의 값들을 저장하고 다룰 수 있게 하는 수단
ds <- c(90, 5, 70, 4)
my.info <- list(name="T", age=30, status=TRUE, score=ds)
my.info # 리스트에 저장된 내용을 모두 출력
my.info[[1]] # 리스트의 첫 번째 값 출력
my.info$name # 리스트에서 값의 이름이 name인 값을 출력
my.info[[4]] # 리스트의 네 번째 값을 출력력
> ds <- c(90, 5, 70, 4)
> my.info <- list(name="T", age=30, status=TRUE, score=ds)
> my.info # 리스트에 저장된 내용을 모두 출력
$name
[1] "T"
$age
[1] 30
$status
[1] TRUE
$score
[1] 90 5 70 4
> my.info[[1]] # 리스트의 첫 번째 값 출력
[1] "T"
> my.info$name # 리스트에서 값의 이름이 name인 값을 출력
[1] "T"
> my.info[[4]] # 리스트의 네 번째 값을 출력력
[1] 90 5 70 4
- 문자형 데이터가 저장된 벡터의 일종
- 저장할 문자값들이 몇 종류로 정해져 있을 때 팩터를 사용
- 혈액형, 성별, ...
bt <- c('A','B','B','O','AB','A') # 문자형 벡터 bt 정의
bt.new <- factor(bt) # 팩터 bt.new 정의
bt
bt.new
bt[5]
bt.new[5] # 팩터 bt.new의 5번째 값 출력
levels(bt.new) # 팩터에 저장된 값의 종류를 출력
as.integer(bt.new) # 팩터의 문자값을 숫자로 바꾸어 출력
bt.new[7] <- 'B' # 팩터 bt.new의 7번째에 'B' 저장
bt.new[8] <- 'C' # 팩터 bt.new의 번째에 'C' 저장, warning 발생생
bt.new
> bt <- c('A','B','B','O','AB','A')
> bt.new <- factor(bt)
> bt
[1] "A" "B" "B" "O" "AB" "A"
> bt.new
[1] A B B O AB A
Levels: A AB B O
> bt[5]
[1] "AB"
> bt.new[5]
[1] AB
Levels: A AB B O
> levels(bt.new)
[1] "A" "AB" "B" "O"
> as.integer(bt.new)
[1] 1 3 3 4 2 1
> bt.new[7] <- 'B'
> bt.new[8] <- 'C'
> bt.new
[1] A B B O AB A B <NA>
Levels: A AB B O
Warning message:
In `[<-.factor`(`*tmp*`, 8, value = "C") :
요인의 수준(factor level)이 올바르지 않아 NA가 생성되었습니다.
- levels()는 팩터에 저장된 값들의 종류를 알아냄
- as.integer()는 문자값을 숫자로 바꿈, 바꾸는 방법에 정해진 규칙 존재
- 팩터는 이미 지정된 값의 종류 외에 다른 값이 들어오는 것을 막음
- 그래서 C가 아닌 NA가 들어간 것을 확인할 수 있음
- 행, 관측값
- 2차원 데이터 테이블에서 가로줄 방향
- 열, 변수
- 세로줄 방향
- 셀
- 한 칸
설명
- 2차원 테이블 형태의 자료구조
- 모든 셀에 저장되는 값은 동일한 자료형
매트릭스 생성
z <- matrix(1:20, nrow=4, ncol=5)
z
> z <- matrix(1:20, nrow=4, ncol=5)
> z
[,1] [,2] [,3] [,4] [,5]
[1,] 1 5 9 13 17
[2,] 2 6 10 14 18
[3,] 3 7 11 15 19
[4,] 4 8 12 16 20
행 방향으로 채우기
z <- matrix(1:20, nrow=4, ncol=5, byrow=T)
z
> z <- matrix(1:20, nrow=4, ncol=5, byrow=T)
> z
[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 4 5
[2,] 6 7 8 9 10
[3,] 11 12 13 14 15
[4,] 16 17 18 19 20
기존 매트릭스에 벡터를 추가하여 새로운 매트릭스 생성
x <- 1:4
y <- 5:8
z <- matrix(1:20, nrow=4, ncol=5)
m1 <- cbind(x,y) # x와 y를 열 방향으로 결합하여 매트릭스 생성
m1
m2 <- rbind(x,y) # x와 y를 행 방향으로 결합하여 매트릭스 생성
m2
m3 <- rbind(m2, x) # m2와 벡터 x를 행 방향으로 결합
m3
m4 <- cbind(z,x) # 매트릭스 z와 벡터 x를 열 방향으로 결합
m4
> x <- 1:4
> y <- 5:8
> z <- matrix(1:20, nrow=4, ncol=5)
> m1 <- cbind(x,y) # x와 y를 열 방향으로 결합하여 매트릭스 생성
> m1
x y
[1,] 1 5
[2,] 2 6
[3,] 3 7
[4,] 4 8
> m2 <- rbind(x,y) # x와 y를 행 방향으로 결합하여 매트릭스 생성
> m2
[,1] [,2] [,3] [,4]
x 1 2 3 4
y 5 6 7 8
> m3 <- rbind(m2, x) # m2와 벡터 x를 행 방향으로 결합
> m3
[,1] [,2] [,3] [,4]
x 1 2 3 4
y 5 6 7 8
x 1 2 3 4
> m4 <- cbind(z,x) # 매트릭스 z와 벡터 x를 열 방향으로 결합
> m4
x
[1,] 1 5 9 13 17 1
[2,] 2 6 10 14 18 2
[3,] 3 7 11 15 19 3
[4,] 4 8 12 16 20 4