R 프로그래밍의기초 Big Data Analytics Short Courses 5 Big Data Analytics Short Courses R 프로그래밍의기초 5 1 / 37
R Programming 1 R Programming 2 3 Big Data Analytics Short Courses R 프로그래밍의기초 5 2 / 37
Topic R Programming 1 R Programming R Programming 함수반복예제 Big Data Analytics Short Courses R 프로그래밍의기초 5 2 / 37
R Programming R Programming R Programming 함수 : function sse <- 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, else if (is.numeric(x)) { hist(x) } else { barplot(table(x)) } Big Data Analytics Short Courses R 프로그래밍의기초 5 3 / 37
함수 : 구조 R Programming 함수 수학함수 f (x) = x + 1 g(x, y) = x + y + 1 n S(x) = (x i x) 2 i=1 R 함수 f <- function(x) x + 1 g <- function(x, y) x + y + 1 S <- function(x) sum((x - mean(x))^2) 함수의구성요소 : 함수이름 (name), 인자 (parameter), 본체 (body) Big Data Analytics Short Courses R 프로그래밍의기초 5 4 / 37
함수 : 리턴값 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 mad 4.400000 2.633122 4.500000 3.706500 Big Data Analytics Short Courses R 프로그래밍의기초 5 5 / 37
함수 : 리턴값 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 Density 0.00 0.10 0.20 0.30 3 2 1 0 1 2 3 x Big Data Analytics Short Courses R 프로그래밍의기초 5 6 / 37
반복 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
반복 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) } Frequency 0 10 20 30 Sepal.Length Frequency 0 10 25 Sepal.Width 4 5 6 7 8 2.0 2.5 3.0 3.5 4.0 iris[, cn] iris[, cn] Petal.Length Petal.Width Frequency 0 10 30 Frequency 0 10 20 30 1 2 3 4 5 6 7 0.0 0.5 1.0 1.5 2.0 2.5 iris[, cn] iris[, cn] 반복대상이일련의숫자일필요는없다. 위 for 문에서반복대상은 > colnames(iris)[1:4] [1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" Big Data Analytics Short Courses R 프로그래밍의기초 5 8 / 37
반복 R Programming 반복 반복이전단계에의존하는구조를가질수있다. x <- numeric(100) for (i in 2:length(x)) { x[i] <- x[i - 1] + rnorm(1) } plot(x, type = "l") x 10 5 0 Big Data0Analytics 20 Short Courses 40 60 80 R 프로그래밍의 100 기초 5 9 / 37
예제 R Programming 예제 120개의 CSV 파일이 sensdat 디렉토리에있다. 어떤센서에서수집한데이터이다. 한센서가한파일을생성한다. 파일명은익명화된아이디이다. 구형센서는문자로신형센서는숫자로기록한다. 각파일은 time, value 두컬럼으로구성되어있다. 구형데이터는 value가문자, 신형데이터는 value가숫자이다. 각파일을읽어서 value가숫자인경우에는히스토그램 value가문자인경우에는막대그래프를그려라. 그래프는한페이지에 5행 3열로배열하여 PDF 파일로출력하여라. Big Data Analytics Short Courses R 프로그래밍의기초 5 10 / 37
예제 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$value if (is.numeric(val)) { hist(val) } else { barplot(table(val)) } } dev.off() Big Data Analytics Short Courses R 프로그래밍의기초 5 11 / 37
Topic 2 Big Data Analytics Short Courses R 프로그래밍의기초 5 12 / 37
Video: Caesar Cipher At Khan Academy Big Data Analytics Short Courses R 프로그래밍의기초 5 13 / 37
c = (p + k) mod 26 A 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 2 D E F G H I J K L M N... Y Z A B C Big Data Analytics Short Courses R 프로그래밍의기초 5 14 / 37
영문자를숫자로 영문자대문자 / 소문자변환 > 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
영문자를숫자로 편의상모든영문자를대문자로바꾼후 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
함수 : encode.caesar() 메시지와암호키를받아암호화된메시지를만드는함수를작성하자 encode.caesar <- function(msg, key) { msg <- toupper(msg) base <- as.integer(chartoraw("a")) code <- as.integer(chartoraw(msg)) - base encoded <- (code + key)%%26 rawtochar(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
함수 : 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
암호깨기 : 모든가능한해독 암호키 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" Big Data Analytics Short Courses R 프로그래밍의기초 5 19 / 37
암호깨기 : 문자빈도함수 문자의빈도를이용하면통계적으로암호를깰수있다. 우선문자열이주어지면문자빈도를계산하는함수를작성하자. 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 Z 1 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
암호깨기 : 영어의문자빈도 영어의일반적인문자빈도와유사한빈도를가지는해독문을답으로선택하려고한다. 우선영어의일반적인문자빈도가필요하다. > alice <- scan("http://www.gutenberg.org/files/11/11.txt", what = "", quote = "") > engtab <- prop.table(charfreq(alice)) > plot(engtab) engtab 0.00 0.08 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
암호깨기 : 카이제곱검정 암호화된메시지 > (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)$statistic X-squared 41.20674 Big Data Analytics Short Courses R 프로그래밍의기초 5 22 / 37
암호깨기 : 카이제곱검정 암호키를바꾸어가며카이제곱값을계산. 가장작은것이해답. > (dmsg <- decode.caesar(cmsg, key = 1)) [1] "EQOGDCEMJQOG" > chisq.test(charfreq(dmsg), p = engtab)$statistic X-squared 79.95696 > (dmsg <- decode.caesar(cmsg, key = 2)) [1] "DPNFCBDLIPNF" > chisq.test(charfreq(dmsg), p = engtab)$statistic X-squared 42.85796 > (dmsg <- decode.caesar(cmsg, key = 3)) [1] "COMEBACKHOME" > chisq.test(charfreq(dmsg), p = engtab)$statistic X-squared 33.48315 Big Data Analytics Short Courses R 프로그래밍의기초 5 23 / 37
암호깨기 : 함수 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
암호깨기 : 함수 > (cmsg <- encode.caesar("comebackhome", 3)) [1] "FRPHEDFNKRPH" > decipher.caesar(cmsg, engtab) key dmsg x2 3 3 COMEBACKHOME 33.48315 25 25 GSQIFEGOLSQI 40.51544 9 9 WIGYVUWEBIGY 41.03667 26 26 FRPHEDFNKRPH 41.20674 19 19 MYWOLKMURYWO 41.80172 2 2 DPNFCBDLIPNF 42.85796 17 17 OAYQNMOWTAYQ 43.35923 15 15 QCASPOQYVCAS 48.56365 23 23 IUSKHGIQNUSK 49.35341 12 12 TFDVSRTBYFDV 62.87022 1 1 EQOGDCEMJQOG 79.95696 21 21 KWUMJIKSPWUM 86.76777 7 7 YKIAXWYGDKIA 116.67189 13 13 SECURQSAXECU 118.97761 24 24 HTRJGFHPMTRJ 168.17965 22 22 JVTLIHJROVTL 197.87433 10 10 VHFXUTVDAHFX 379.43202 20 20 LXVNKJLTQXVN 423.33367 Big Data Analytics Short Courses R 프로그래밍의기초 5 25 / 37
Topic 3 Big Data Analytics Short Courses R 프로그래밍의기초 5 26 / 37
LCD 모니터의픽셀 : RGB Big Data Analytics Short Courses R 프로그래밍의기초 5 27 / 37
(http://radio.feld.cvut.cz/matlab/techdoc/matlab_prog/ch12_ n11.html) Big Data Analytics Short Courses R 프로그래밍의기초 5 28 / 37 이미지데이터 : RGB Array
이미지파일읽기 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
RGB Array > image(mandrill[,, 1]) Big Data Analytics Short Courses R 프로그래밍의기초 5 30 / 37
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
회색조로변환 mandrill.gr <- apply(mandrill, c(1, 2), mean) writepng(mandrill.gr, "mandrill_gr.png") Big Data Analytics Short Courses R 프로그래밍의기초 5 32 / 37
흑백으로변환 mandrill.bw <- ifelse(mandrill.gr > 0.5, 1, 0) writepng(mandrill.bw, "mandrill_bw.png") Big Data Analytics Short Courses R 프로그래밍의기초 5 33 / 37
16 단계회색조로변환 mandrill.gr16 <- round(mandrill.gr * 16)/16 writepng(mandrill.gr16, "mandrill_gr16.png") Big Data Analytics Short Courses R 프로그래밍의기초 5 34 / 37
회색조변환의비교 원래의명암을그대로사용한경우색의수 16 단계회색조만사용한경우 시각적인차이가있는가? > length(table(mandrill.gr)) [1] 681 > length(table(mandrill.gr16)) [1] 15 Big Data Analytics Short Courses R 프로그래밍의기초 5 35 / 37
노이즈 추가 mandrill.noise <- mandrill n <- 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
모자이크효과 mandrill.mos <- mandrill w <- 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