Skip to content

Latest commit

 

History

History
665 lines (547 loc) · 12.2 KB

220503.md

File metadata and controls

665 lines (547 loc) · 12.2 KB

빅데이터

기존의 데이터베이스 관리 도구의 역량을 넘어서는 데이터

빅데이터 특징

3V

  • 크기
  • 다양성
  • 속도

크기

  • 수십 테라 or 페타 바이트 이상
  • 큰 저장공간, 오랜처리 시간, 분석시간 필요

다양성

  • 정형화 정도에 따라 구분
  • 정형 데이터
    • 고정된 필드에 저장, 일정한 형식
  • 반정형 데이터
    • 고정된 필드에 저장되지 않지만 메타데이터나 구조정보 등을 포함
    • 일정한 구조는 없으나 구조를 파악할 수 있음
  • 비정형 데이터
    • 고정된 필드에 저장되지 않는 데이터

데이터 분석 과정

  1. 문제 정의 및 계획
    • 문제 정의가 구체적이고 명확할수록 데이터 분석이 효과적으로 진행될 수 있음
  2. 데이터 수집
    • 필요한 데이터 수집
  3. 데이터 정제 및 전처리
    • 수집된 데이터를 분석가능한 형태로 정돈하는 과정
  4. 데이터 탐색
    • 정돈된 데이터 자체를 이해하고 파악하는 과정
  5. 데이터 분석
    • 파악한 정보를 바탕으로 심화된 분석을 수행
    • 고급 분석 기법들이 동원
  6. 결과 보고
    • 내용을 정리해서 보고
    • 문제를 해결하는 데 도움이 되는 내용을 요약
    • 데이터 시각화가 중요

산술연산

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
      • 무한대

벡터

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