big data analytics short courses - ssu.ac.kr

38
R \lX 0 Big Data Analytics Short Courses 5 Big Data Analytics Short Courses R \lX 0 5 1 / 37

Upload: others

Post on 21-Apr-2022

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Big Data Analytics Short Courses - ssu.ac.kr

R 프로그래밍의 기초

Big Data Analytics Short Courses

5

Big Data Analytics Short Courses R 프로그래밍의 기초 5 1 / 37

Page 2: Big Data Analytics Short Courses - ssu.ac.kr

R Programming

1 R Programming

2 카이사르 암호

3 Image Processing

Big Data Analytics Short Courses R 프로그래밍의 기초 5 2 / 37

Page 3: Big Data Analytics Short Courses - ssu.ac.kr

R Programming

Topic

1 R ProgrammingR Programming함수

반복

예제

Big Data Analytics Short Courses R 프로그래밍의 기초 5 2 / 37

Page 4: Big Data Analytics Short Courses - ssu.ac.kr

R Programming R Programming

R Programming

함수 : functionsse <- function(x) {

sum((x - mean(x))^2)}

반복 : for

x <- numeric(100)for (i in 2:length(x)) {

x[i] <- x[i - 1] + rnorm(1)}

조건 : if, elseif (is.numeric(x)) {

hist(x)} else {

barplot(table(x))}

Big Data Analytics Short Courses R 프로그래밍의 기초 5 3 / 37

Page 5: Big Data Analytics Short Courses - ssu.ac.kr

R Programming 함수

함수: 구조

수학 함수

f (x) = x + 1g(x , y) = x + y + 1

S(x) =n∑

i=1

(xi − x)2

R 함수f <- function(x) x + 1g <- function(x, y) x + y + 1S <- function(x) sum((x - mean(x))^2)

함수의 구성 요소: 함수 이름(name), 인자(parameter), 본체(body)

Big Data Analytics Short Courses R 프로그래밍의 기초 5 4 / 37

Page 6: Big Data Analytics Short Courses - ssu.ac.kr

R Programming 함수

함수: 리턴값

마지막으로 실행되는 표현의 값이 함수의 리턴값이 된다

명시적으로 return() 명령을 쓸 수도 있다

함수 리턴값은 반드시 하나이다. 여러 가지 값이라면 벡터, 리스트등으로 묶는다.

describe <- function(x) {m <- mean(x)s <- sd(x)med <- median(x)mad <- median(abs(x - median(x))) * 1.4826 #= mad(x)c(mean = m, sd = s, median = med, mad = mad)

}

> x <- c(3, 5, 7, 8, 6, 2, 0, 4, 7, 2)> describe(x)

mean sd median mad4.400000 2.633122 4.500000 3.706500

Big Data Analytics Short Courses R 프로그래밍의 기초 5 5 / 37

Page 7: Big Data Analytics Short Courses - ssu.ac.kr

R Programming 함수

함수: 리턴값

함수는 리턴값이 필요 없을 수도 있다.주어진 명령을 순서대로 실행하는 용도로 사용할 수 있다.

myhist <- function(x) {xs <- seq(min(x), max(x), length.out = 100)ys <- dnorm(xs, mean(x), sd(x))hist(x, breaks = sqrt(length(x)), probability = TRUE, ylim = range(ys))lines(xs, ys)

}

> x <- rnorm(100)> myhist(x)

Histogram of x

x

Den

sity

−3 −2 −1 0 1 2 3

0.00

0.10

0.20

0.30

Big Data Analytics Short Courses R 프로그래밍의 기초 5 6 / 37

Page 8: Big Data Analytics Short Courses - ssu.ac.kr

R Programming 반복

반복

for (i in 1:9) {print(rep(i, i))

}[1] 1[1] 2 2[1] 3 3 3[1] 4 4 4 4[1] 5 5 5 5 5[1] 6 6 6 6 6 6[1] 7 7 7 7 7 7 7[1] 8 8 8 8 8 8 8 8[1] 9 9 9 9 9 9 9 9 9

반복할 대상들의 목록: 1:9반복할 대상을 가리키는 변수: i,반복할 내용: print(rep(i, i))

Big Data Analytics Short Courses R 프로그래밍의 기초 5 7 / 37

Page 9: Big Data Analytics Short Courses - ssu.ac.kr

R Programming 반복

반복

par(mfrow = c(2, 2), mar = c(5, 4, 1, 1))for (cn in colnames(iris)[1:4]) {

hist(iris[, cn], main = cn)}

Sepal.Length

iris[, cn]

Fre

quen

cy

4 5 6 7 8

010

2030

Sepal.Width

iris[, cn]

Fre

quen

cy

2.0 2.5 3.0 3.5 4.0

010

25

Petal.Length

iris[, cn]

Fre

quen

cy

1 2 3 4 5 6 7

010

30

Petal.Width

iris[, cn]

Fre

quen

cy

0.0 0.5 1.0 1.5 2.0 2.5

010

2030

반복 대상이 일련의 숫자일 필요는 없다. 위 for 문에서 반복 대상은

> colnames(iris)[1:4][1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width"

Big Data Analytics Short Courses R 프로그래밍의 기초 5 8 / 37

Page 10: Big Data Analytics Short Courses - ssu.ac.kr

R Programming 반복

반복

반복이 전 단계에 의존하는 구조를 가질 수 있다.

x <- numeric(100)for (i in 2:length(x)) {

x[i] <- x[i - 1] + rnorm(1)}plot(x, type = "l")

0 20 40 60 80 100

−10

−5

0

Index

x

Big Data Analytics Short Courses R 프로그래밍의 기초 5 9 / 37

Page 11: Big Data Analytics Short Courses - ssu.ac.kr

R Programming 예제

예제

120개의 CSV 파일이 sensdat 디렉토리에 있다.어떤 센서에서 수집한 데이터이다.한 센서가 한 파일을 생성한다. 파일명은 익명화된 아이디이다.구형 센서는 문자로 신형 센서는 숫자로 기록한다.각 파일은 time, value 두 컬럼으로 구성되어 있다.구형 데이터는 value가 문자, 신형 데이터는 value가 숫자이다.각 파일을 읽어서 value가 숫자인 경우에는 히스토그램value가 문자인 경우에는 막대그래프를 그려라.그래프는 한 페이지에 5행 3열로 배열하여 PDF 파일로 출력하여라.

Big Data Analytics Short Courses R 프로그래밍의 기초 5 10 / 37

Page 12: Big Data Analytics Short Courses - ssu.ac.kr

R Programming 예제

예제

현재 작업 디렉토리 아래 sensdat 디렉토리를 놓고 실행한다.

pdf("dist.pdf", width = 8, height = 12)par(mfrow = c(5, 3))for (filename in list.files("sensdat/")) {

dat <- read.csv(filename)val <- dat$valueif (is.numeric(val)) {

hist(val)} else {

barplot(table(val))}

}dev.off()

Big Data Analytics Short Courses R 프로그래밍의 기초 5 11 / 37

Page 13: Big Data Analytics Short Courses - ssu.ac.kr

카이사르 암호

Topic

2 카이사르 암호

카이사르 암호

Big Data Analytics Short Courses R 프로그래밍의 기초 5 12 / 37

Page 14: Big Data Analytics Short Courses - ssu.ac.kr

카이사르 암호 카이사르 암호

카이사르 암호

Video: Caesar Cipher At Khan Academy

Big Data Analytics Short Courses R 프로그래밍의 기초 5 13 / 37

Page 15: Big Data Analytics Short Courses - ssu.ac.kr

카이사르 암호 카이사르 암호

카이사르 암호

c = (p + k) mod 26A B C D E F G H I J ... V W X Y Z

plain: 0 1 2 3 4 5 6 7 8 9 ... 21 22 23 24 25| | | | | | | | | | | | | | |

cipher: 3 4 5 6 7 8 9 10 11 12 ... 24 25 0 1 2D E F G H I J K L M N ... Y Z A B C

Big Data Analytics Short Courses R 프로그래밍의 기초 5 14 / 37

Page 16: Big Data Analytics Short Courses - ssu.ac.kr

카이사르 암호 카이사르 암호

영문자를 숫자로

영문자 대문자/소문자 변환

> tolower("Hello")[1] "hello"> toupper("Hello")[1] "HELLO"

문자열을 아스키 코드 숫자 벡터로

> charToRaw("Hello")[1] 48 65 6c 6c 6f> as.integer(charToRaw("Hello"))[1] 72 101 108 108 111

아스키 코드 숫자 벡터를 문자열로

> as.raw(c(72, 101, 108, 108, 111))[1] 48 65 6c 6c 6f> rawToChar(as.raw(c(72, 101, 108, 108, 111)))[1] "Hello"

Big Data Analytics Short Courses R 프로그래밍의 기초 5 15 / 37

Page 17: Big Data Analytics Short Courses - ssu.ac.kr

카이사르 암호 카이사르 암호

영문자를 숫자로

편의상 모든 영문자를 대문자로 바꾼 후

A → 0, B → 1, C → 2, . . . , Z → 25 로 바꾸자열쇠를 k , 문자 번호를 c라고 하면

암호화된 문자의 번호는 (c + k) mod 26

> msg <- "Hello"> key <- 3> (msg <- toupper(msg))[1] "HELLO"> (base <- as.integer(charToRaw("A")))[1] 65> (code <- as.integer(charToRaw(msg)) - base)[1] 7 4 11 11 14> (encoded <- (code + key)%%26)[1] 10 7 14 14 17> rawToChar(as.raw(encoded + base))[1] "KHOOR"

Big Data Analytics Short Courses R 프로그래밍의 기초 5 16 / 37

Page 18: Big Data Analytics Short Courses - ssu.ac.kr

카이사르 암호 카이사르 암호

함수: encode.caesar()

메시지와 암호키를 받아 암호화된 메시지를 만드는 함수를 작성하자

encode.caesar <- function(msg, key) {msg <- toupper(msg)base <- as.integer(charToRaw("A"))code <- as.integer(charToRaw(msg)) - baseencoded <- (code + key)%%26rawToChar(as.raw(encoded + base))

}

함수를 사용하여 보자

> encode.caesar("hello", 3)[1] "KHOOR"> encode.caesar("comebackhome", 3)[1] "FRPHEDFNKRPH"

Big Data Analytics Short Courses R 프로그래밍의 기초 5 17 / 37

Page 19: Big Data Analytics Short Courses - ssu.ac.kr

카이사르 암호 카이사르 암호

함수: decode.caesar()

암호화된 문자가 c , 암호키가 k라면 원문은

p = (c − k) mod 26

암호화하는 알고리즘과 형식이 동일하다.암호를 푸는 함수는 내용을 새로 작성할 필요가 없다

decode.caesar <- function(msg, key) {encode.caesar(msg, -key)

}

함수를 사용하여 보자

> decode.caesar("FRPHEDFNKRPH", 3)[1] "COMEBACKHOME"

Big Data Analytics Short Courses R 프로그래밍의 기초 5 18 / 37

Page 20: Big Data Analytics Short Courses - ssu.ac.kr

카이사르 암호 카이사르 암호

암호깨기: 모든 가능한 해독암호키 k를 모른다면? 모든 가능한 암호키를 이용한 결과를 출력해 보자.> cmsg <- "YQQFYQMFZUZQ"> for (key in 1:25) print(decode.caesar(cmsg, key))[1] "XPPEXPLEYTYP"[1] "WOODWOKDXSXO"[1] "VNNCVNJCWRWN"[1] "UMMBUMIBVQVM"[1] "TLLATLHAUPUL"[1] "SKKZSKGZTOTK"[1] "RJJYRJFYSNSJ"[1] "QIIXQIEXRMRI"[1] "PHHWPHDWQLQH"[1] "OGGVOGCVPKPG"[1] "NFFUNFBUOJOF"[1] "MEETMEATNINE"[1] "LDDSLDZSMHMD"[1] "KCCRKCYRLGLC"[1] "JBBQJBXQKFKB"[1] "IAAPIAWPJEJA"[1] "HZZOHZVOIDIZ"[1] "GYYNGYUNHCHY"[1] "FXXMFXTMGBGX"[1] "EWWLEWSLFAFW"[1] "DVVKDVRKEZEV"[1] "CUUJCUQJDYDU"[1] "BTTIBTPICXCT"[1] "ASSHASOHBWBS"[1] "ZRRGZRNGAVAR"

Big Data Analytics Short Courses R 프로그래밍의 기초 5 19 / 37

Page 21: Big Data Analytics Short Courses - ssu.ac.kr

카이사르 암호 카이사르 암호

암호깨기: 문자 빈도 함수

문자의 빈도를 이용하면 통계적으로 암호를 깰 수 있다.우선 문자열이 주어지면 문자 빈도를 계산하는 함수를 작성하자.

charFreq <- function(s) {table(factor(unlist(strsplit(s, "")), LETTERS))

}

문자 빈도 함수를 사용해 보자.

> charFreq("COMEBACKHOME")

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z1 1 2 0 2 0 0 1 0 0 1 0 2 0 2 0 0 0 0 0 0 0 0 0 0 0

Big Data Analytics Short Courses R 프로그래밍의 기초 5 20 / 37

Page 22: Big Data Analytics Short Courses - ssu.ac.kr

카이사르 암호 카이사르 암호

암호깨기: 영어의 문자 빈도

영어의 일반적인 문자 빈도와 유사한 빈도를 가지는 해독문을 답으로

선택하려고 한다.우선 영어의 일반적인 문자 빈도가 필요하다.

> alice <- scan("http://www.gutenberg.org/files/11/11.txt", what = "", quote = "")> engtab <- prop.table(charFreq(alice))> plot(engtab)

0.00

0.08

engt

ab

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

Big Data Analytics Short Courses R 프로그래밍의 기초 5 21 / 37

Page 23: Big Data Analytics Short Courses - ssu.ac.kr

카이사르 암호 카이사르 암호

암호깨기: 카이제곱 검정

암호화된 메시지

> (cmsg <- encode.caesar("COMEBACKHOME", 3))[1] "FRPHEDFNKRPH"

영어 문자 비율 정보를 이용하여 카이제곱검정

> chisq.test(charFreq(cmsg), p = engtab)

Chi-squared test for given probabilities

data: charFreq(cmsg)X-squared = 41.2067, df = 25, p-value = 0.02183

카이제곱값만 필요

> chisq.test(charFreq(cmsg), p = engtab)$statisticX-squared41.20674

Big Data Analytics Short Courses R 프로그래밍의 기초 5 22 / 37

Page 24: Big Data Analytics Short Courses - ssu.ac.kr

카이사르 암호 카이사르 암호

암호깨기: 카이제곱 검정

암호키를 바꾸어 가며 카이제곱값을 계산. 가장 작은 것이 해답.

> (dmsg <- decode.caesar(cmsg, key = 1))[1] "EQOGDCEMJQOG"> chisq.test(charFreq(dmsg), p = engtab)$statisticX-squared79.95696

> (dmsg <- decode.caesar(cmsg, key = 2))[1] "DPNFCBDLIPNF"> chisq.test(charFreq(dmsg), p = engtab)$statisticX-squared42.85796

> (dmsg <- decode.caesar(cmsg, key = 3))[1] "COMEBACKHOME"> chisq.test(charFreq(dmsg), p = engtab)$statisticX-squared33.48315

Big Data Analytics Short Courses R 프로그래밍의 기초 5 23 / 37

Page 25: Big Data Analytics Short Courses - ssu.ac.kr

카이사르 암호 카이사르 암호

암호깨기: 함수

decipher.caesar <- function(cmsg, ptab) {dmsg <- character(26)x2 <- numeric(26)for (key in 1:26) {

dmsg[key] <- decode.caesar(cmsg, key)x2[key] <- chisq.test(charFreq(dmsg[key]), p = ptab)$statistic

}

out <- data.frame(key = 1:26, dmsg, x2)out[order(out$x2), ]

}

Big Data Analytics Short Courses R 프로그래밍의 기초 5 24 / 37

Page 26: Big Data Analytics Short Courses - ssu.ac.kr

카이사르 암호 카이사르 암호

암호깨기: 함수

> (cmsg <- encode.caesar("COMEBACKHOME", 3))[1] "FRPHEDFNKRPH"

> decipher.caesar(cmsg, engtab)key dmsg x2

3 3 COMEBACKHOME 33.4831525 25 GSQIFEGOLSQI 40.515449 9 WIGYVUWEBIGY 41.0366726 26 FRPHEDFNKRPH 41.2067419 19 MYWOLKMURYWO 41.801722 2 DPNFCBDLIPNF 42.8579617 17 OAYQNMOWTAYQ 43.3592315 15 QCASPOQYVCAS 48.5636523 23 IUSKHGIQNUSK 49.3534112 12 TFDVSRTBYFDV 62.870221 1 EQOGDCEMJQOG 79.9569621 21 KWUMJIKSPWUM 86.767777 7 YKIAXWYGDKIA 116.6718913 13 SECURQSAXECU 118.9776124 24 HTRJGFHPMTRJ 168.1796522 22 JVTLIHJROVTL 197.8743310 10 VHFXUTVDAHFX 379.4320220 20 LXVNKJLTQXVN 423.3336711 11 UGEWTSUCZGEW 522.3486014 14 RDBTQPRZWDBT 522.427575 5 AMKCZYAIFMKC 527.412264 4 BNLDAZBJGNLD 563.1115816 16 PBZRONPXUBZR 2065.249056 6 ZLJBYXZHELJB 2204.5175718 18 NZXPMLNVSZXP 2302.185648 8 XJHZWVXFCJHZ 2437.67220

Big Data Analytics Short Courses R 프로그래밍의 기초 5 25 / 37

Page 27: Big Data Analytics Short Courses - ssu.ac.kr

Image Processing

Topic

3 Image ProcessingImage Processing

Big Data Analytics Short Courses R 프로그래밍의 기초 5 26 / 37

Page 28: Big Data Analytics Short Courses - ssu.ac.kr

Image Processing Image Processing

LCD 모니터의 픽셀: RGB

Big Data Analytics Short Courses R 프로그래밍의 기초 5 27 / 37

Page 29: Big Data Analytics Short Courses - ssu.ac.kr

Image Processing Image Processing

이미지 데이터: RGB Array

(http://radio.feld.cvut.cz/matlab/techdoc/matlab_prog/ch12_n11.html)Big Data Analytics Short Courses R 프로그래밍의 기초 5 28 / 37

Page 30: Big Data Analytics Short Courses - ssu.ac.kr

Image Processing Image Processing

이미지 파일 읽기

png 패키지 이용

> library(png)

PNG 파일 읽기

> mandrill <- readPNG("mandrill.png")

크기 확인

> dim(mandrill)[1] 512 512 3

RGB Array

> mandrill[, , 1] # RED Intensity Matrix> mandrill[, , 2] # GREEN Intensity Matrix> mandrill[, , 3] # BLUE Intensity Matrix

Big Data Analytics Short Courses R 프로그래밍의 기초 5 29 / 37

Page 31: Big Data Analytics Short Courses - ssu.ac.kr

Image Processing Image Processing

RGB Array

> image(mandrill[, , 1])

Big Data Analytics Short Courses R 프로그래밍의 기초 5 30 / 37

Page 32: Big Data Analytics Short Courses - ssu.ac.kr

Image Processing Image Processing

RGB Array

par(mfrow = c(1, 3))image(mandrill[, , 1], col = rgb((0:255)/255, 0, 0))image(mandrill[, , 2], col = rgb(0, (0:255)/255, 0))image(mandrill[, , 3], col = rgb(0, 0, (0:255)/255))

Big Data Analytics Short Courses R 프로그래밍의 기초 5 31 / 37

Page 33: Big Data Analytics Short Courses - ssu.ac.kr

Image Processing Image Processing

회색조로 변환

mandrill.gr <- apply(mandrill, c(1, 2), mean)writePNG(mandrill.gr, "mandrill_gr.png")

Big Data Analytics Short Courses R 프로그래밍의 기초 5 32 / 37

Page 34: Big Data Analytics Short Courses - ssu.ac.kr

Image Processing Image Processing

흑백으로 변환

mandrill.bw <- ifelse(mandrill.gr > 0.5, 1, 0)writePNG(mandrill.bw, "mandrill_bw.png")

Big Data Analytics Short Courses R 프로그래밍의 기초 5 33 / 37

Page 35: Big Data Analytics Short Courses - ssu.ac.kr

Image Processing Image Processing

16단계 회색조로 변환

mandrill.gr16 <- round(mandrill.gr * 16)/16writePNG(mandrill.gr16, "mandrill_gr16.png")

Big Data Analytics Short Courses R 프로그래밍의 기초 5 34 / 37

Page 36: Big Data Analytics Short Courses - ssu.ac.kr

Image Processing Image Processing

회색조 변환의 비교

원래의 명암을 그대로 사용한 경우 색의 수

16단계 회색조만 사용한 경우시각적인 차이가 있는가?

> length(table(mandrill.gr))[1] 681> length(table(mandrill.gr16))[1] 15

Big Data Analytics Short Courses R 프로그래밍의 기초 5 35 / 37

Page 37: Big Data Analytics Short Courses - ssu.ac.kr

Image Processing Image Processing

노이즈 추가

mandrill.noise <- mandrilln <- round(0.3 * prod(dim(mandrill)[1:2])) # 노이즈 비율 30%xrand <- sample(1:512, n, replace=TRUE)yrand <- sample(1:512, n, replace=TRUE)for(i in 1:n) mandrill.noise[xrand[i], yrand[i], ] <- runif(3)

writePNG(mandrill.noise, "mandrill_noise.png")

Big Data Analytics Short Courses R 프로그래밍의 기초 5 36 / 37

Page 38: Big Data Analytics Short Courses - ssu.ac.kr

Image Processing Image Processing

모자이크 효과

mandrill.mos <- mandrillw <- 16 # 모자이크 조각의 가로 세로 크기for(i in seq(1, 512, w)) {for(j in seq(1, 512, w)) {for(k in 1:3) {mandrill.mos[i:(i+w-1), j:(j+w-1), k] <- mean(mandrill[i:(i+w-1), j:(j+w-1), k])

}}

}writePNG(mandrill.mos, "mandrill_mosaic.png")

Big Data Analytics Short Courses R 프로그래밍의 기초 5 37 / 37