R 을이용한시뮬레이션 Big Data Analytics Short Courses 2 Big Data Analytics Short Courses R 을이용한시뮬레이션 2 1 / 39
랜덤표본 : sample() 1 랜덤표본 : sample() 2 빈도 : table() 3 반복시행 : replicate() 4 논리연산 5 Chevalier de Méré s Problem 6 Birthday Problem Big Data Analytics Short Courses R 을이용한시뮬레이션 2 2 / 39
Topic 랜덤표본 : sample() 1 랜덤표본 : sample() sample() Big Data Analytics Short Courses R 을이용한시뮬레이션 2 2 / 39
sample() 랜덤표본 : sample() sample() sample() 주어진원소목록에서임의의원소를선택하는함수 주어진원소로임의의순열을생성 > sample(1:10) [1] 4 9 5 2 1 8 6 10 7 3 원소목록에서주어진개수만큼비복원추출 > sample(1:10, size = 5) [1] 10 2 3 1 7 원소목록에서주어진개수만큼복원추출 > sample(1:3, size = 10, replace = TRUE) [1] 2 3 3 1 1 3 3 3 3 1 원소들이서로다른확률을가질때 > sample(1:3, size = 10, replace = TRUE, prob = c(1/2, 1/3, 1/6)) [1] 1 2 3 1 2 1 1 2 2 1 Big Data Analytics Short Courses R 을이용한시뮬레이션 2 3 / 39
랜덤표본 : sample() 예제 : 원숭이타이피스트 sample() Monkey Typist 원숭이가키보드를무작위로두드린다. 모든키가입력될확률이동일할때원숭이가두드리는내용을시뮬레이션하면 > sample(letters, 6, replace = TRUE) [1] "e" "a" "d" "l" "t" "b" > sample(letters, 6, replace = TRUE) [1] "i" "p" "i" "j" "f" "e" 원숭이타이피스트가 banana 라고입력할확률은? 셰익스피어의햄릿을정확히타이핑할확률은? ( 참조 : Infinite Monkey Theorem at Wikipedia) Big Data Analytics Short Courses R 을이용한시뮬레이션 2 4 / 39
예제 : 항아리속공 랜덤표본 : sample() sample() 항아리속의공비복원추출 항아리안에까만색 4 개, 흰색 3 개, 초록색 2 개, 빨간색 1 개의공이들어있다. 3 개를비복원추출하는실험을시뮬레이션하면 > (urn <- rep(c("b", "W", "G", "R"), c(4, 3, 2, 1))) [1] "B" "B" "B" "B" "W" "W" "W" "G" "G" "R" > sample(urn, 3) [1] "B" "W" "B" > sample(urn, 3) [1] "B" "R" "B" 항아리속의공복원추출 동일한항아리에서 10 개를복원추출하는실험을시뮬레이션하면 > sample(urn, 10, replace = TRUE) [1] "G" "W" "B" "B" "B" "B" "B" "B" "B" "W" > sample(urn, 10, replace = TRUE) [1] "B" "G" "R" "R" "B" "W" "B" "B" "G" "B" Big Data Analytics Short Courses R 을이용한시뮬레이션 2 5 / 39
예제 : 항아리속공 랜덤표본 : sample() sample() 항아리속의공복원추출 항아리속의공은무한하고까망, 하양, 초록, 빨강의비율이 4:3:2:1 이라고생각하면 > sample(c("b", "W", "G", "R"), 10, replace = TRUE, prob = c(4, 3, 2, 1)) [1] "W" "B" "B" "G" "B" "B" "W" "B" "G" "R" > sample(c("b", "W", "G", "R"), 10, replace = TRUE, prob = c(4, 3, 2, 1)) [1] "W" "B" "B" "G" "W" "B" "B" "B" "G" "G" > sample(c("b", "W", "G", "R"), 10, replace = TRUE, prob = c(4, 3, 2, 1)/10) [1] "G" "R" "R" "R" "B" "R" "W" "G" "G" "B" > sample(c("b", "W", "G", "R"), 10, replace = TRUE, prob = c(4, 3, 2, 1)/10) [1] "R" "B" "W" "G" "R" "G" "B" "R" "W" "R" Big Data Analytics Short Courses R 을이용한시뮬레이션 2 6 / 39
Topic 빈도 : table() 2 빈도 : table() table() Big Data Analytics Short Courses R 을이용한시뮬레이션 2 7 / 39
table() 빈도 : table() table() table() 빈도표를계산하는함수 빈도표를작성 > table(c(1, 2, 2, 3, 2, 3, 3, 2, 2)) 1 2 3 1 5 3 > table(c("b", "B", "C", "C", "A", "B")) A B C 1 3 2 빈도에따라정렬 : sort() 이용 > freq <- table(c("b", "B", "C", "C", "A", "B")) > sort(freq) A C B 1 2 3 Big Data Analytics Short Courses R 을이용한시뮬레이션 2 8 / 39
prop.table() 빈도 : table() table() prop.table() 빈도를비율로변환 > freq <- table(c("b", "B", "C", "C", "A", "B")) > freq/sum(freq) A B C 0.1666667 0.5000000 0.3333333 > prop.table(freq) A B C 0.1666667 0.5000000 0.3333333 Big Data Analytics Short Courses R 을이용한시뮬레이션 2 9 / 39
예제 : 항아리속공 빈도 : table() table() 항아리속공복원추출결과 까망, 하양, 초록, 빨강공이 4:3:2:1 로들어있는항아리에서 1000 개를복원추출한결과의색깔별빈도를계산하면 > x <- sample(c("b", "W", "G", "R"), 1000, replace = TRUE, prob = c(4, 3, 2, 1)) > table(x) x B G R W 402 204 96 298 > plot(table(x)) table(x) 200 300 400 Big Data Analytics Short Courses R 을이용한시뮬레이션 2 10 / 39
예제 : 단어빈도 빈도 : table() table() Google 에서 "Alice In Wonderland Gutenberg" 로검색. Project Gutenberg 의 Alice s Adventures in Wonderland 선택 Plain Text UTF-8 선택 URL 주소를복사 텍스트파일읽기 > alice <- scan("http://www.gutenberg.org/cache/epub/11/pg11.txt", what = "", + quote = "") 단어빈도계산 > freq <- table(alice) 빈도순정렬 > sort(freq, decreasing = TRUE) Big Data Analytics Short Courses R 을이용한시뮬레이션 2 11 / 39
예제 : 단어빈도 빈도 : table() table() 고빈도 50 단어 > head(sort(freq, decreasing = TRUE), 50) alice the and to a of she said in it 1664 780 773 662 596 484 416 401 356 was you I as that Alice with at her 329 301 260 246 226 221 214 211 203 had all be on for or very not this 175 168 154 148 146 137 127 122 122 'I little they but so The out he his 121 117 109 105 104 100 97 96 93 about is what up were went one Project down 91 89 86 83 82 79 78 78 77 have Alice, like if by 77 76 74 73 72 Big Data Analytics Short Courses R 을이용한시뮬레이션 2 12 / 39
예제 : 단어빈도 빈도 : table() table() > top50 <- sort(freq, decreasing = TRUE)[1:50] > plot(top50, xlab = "Rank", ylab = "Frequency") Frequency 500 1000 1500 0 10 20 30 40 50 Rank Big Data Analytics Short Courses R 을이용한시뮬레이션 2 13 / 39
예제 : 단어빈도 빈도 : table() table() 빈도가 5 이상인것은몇단어? 빈도가 1 인단어의갯수는? Big Data Analytics Short Courses R 을이용한시뮬레이션 2 14 / 39
예제 : 단어빈도 빈도 : table() table() 빈도가 5 이상인것은몇단어? > sum(freq >= 5) [1] 791 > length(which(freq >= 5)) [1] 791 빈도가 1 인단어의갯수는? > sum(freq == 1) [1] 3738 > length(which(freq == 1)) [1] 3738 Big Data Analytics Short Courses R 을이용한시뮬레이션 2 15 / 39
Topic 반복시행 : replicate() 3 반복시행 : replicate() replicate() Big Data Analytics Short Courses R 을이용한시뮬레이션 2 16 / 39
replicate() 반복시행 : replicate() replicate() replicate() 함수는시뮬레이션여러번을반복할때사용할수있다. > replicate(5, sample(1:3)) [,1] [,2] [,3] [,4] [,5] [1,] 3 1 1 1 3 [2,] 2 3 3 2 1 [3,] 1 2 2 3 2 > replicate(5, sample(1:3, 5, replace = TRUE)) [,1] [,2] [,3] [,4] [,5] [1,] 1 3 1 1 3 [2,] 2 3 2 3 3 [3,] 3 2 2 3 2 [4,] 2 3 2 3 1 [5,] 2 3 2 2 2 > sample(1:3, 25, replace = TRUE) [1] 1 1 3 1 1 2 2 1 1 3 2 1 3 2 1 2 3 2 3 3 2 1 2 2 2 Big Data Analytics Short Courses R 을이용한시뮬레이션 2 17 / 39
반복시행 : replicate() 예제 : 원숭이타이피스트 replicate() 무작위 6 글자 > sample(letters, 6, replace = TRUE) [1] "q" "v" "d" "z" "m" "u" 한단어로합치기 : paste() 이용 > paste(sample(letters, 6, replace = TRUE), collapse = "") [1] "xkbapz" 반복 > replicate(10, paste(sample(letters, 6, replace = TRUE), collapse = "")) [1] "coeumb" "baguxz" "jnauas" "hqovxj" "ifnphw" "cslimx" "wbidnu" [8] "uvtoub" "pkgait" "zcvxjc" Big Data Analytics Short Courses R 을이용한시뮬레이션 2 18 / 39
Topic 논리연산 4 논리연산논리연산 Big Data Analytics Short Courses R 을이용한시뮬레이션 2 19 / 39
논리연산자 논리연산 논리연산 연산자 의미 예제 값! NOT!TRUE FALSE, OR TRUE FALSE TRUE &, && AND TRUE & FALSE FALSE Big Data Analytics Short Courses R 을이용한시뮬레이션 2 20 / 39
예제 : 단어출현위치 논리연산 논리연산 Alice 라는단어가등장하는위치와 Project 라는단어가등장하는위치 > par(mar = c(2, 2, 0, 0)) > plot(alice == "Alice", type = "h") 0.0 0.8 0 5000 10000 15000 20000 25000 30000 > plot(alice == "Project", type = "h") 0.0 0.8 0 5000 10000 15000 20000 25000 30000 Big Data Analytics Short Courses R 을이용한시뮬레이션 2 21 / 39
예제 : 단어출현위치 Cat, Cheshire 가등장하는위치 논리연산 논리연산 > par(mar = c(2, 2, 0, 0)) > plot(alice == "Cat", type = "h") 0.0 0.8 0 5000 10000 15000 20000 25000 30000 > plot(alice == "Cheshire", type = "h") 0.0 0.8 0 5000 10000 15000 20000 25000 30000 > plot(alice == "Cat" alice == "Cheshire", type = "h") 0.0 0.8 0 5000 10000 15000 20000 25000 30000 Big Data Analytics Short Courses R 을이용한시뮬레이션 2 22 / 39
any(), all() 논리연산 논리연산 any() : 하나라도참이면참, 아니면거짓 > x <- c(1, 1, 2, 3, 5, 8, 13) > x > 10 [1] FALSE FALSE FALSE FALSE FALSE FALSE TRUE > any(x > 10) [1] TRUE > any(x < 0) [1] FALSE all(): 모두참이면참, 아니면거짓 > all(x > 10) [1] FALSE > all(x > 0) [1] TRUE Big Data Analytics Short Courses R 을이용한시뮬레이션 2 23 / 39
예제 : 원숭이타이피스트 논리연산 논리연산 원숭이가엄청나게많이타이핑한다면햄릿을완벽하게쓰는일도생길수있다? ( 참조 : Infinite Monkey Theorem at Wikipedia) 원숭이가 yes 라고타이핑할확률은? 원숭이가 3 글자단어를 100000 번반복타이핑하고그안에 yes 라는단어가들어있는지확인해보자. 3 글자한단어 > paste(sample(letters, 3, replace = TRUE), collapse = "") [1] "dri" 100000 번반복 > words <- replicate(1e+05, paste(sample(letters, 3, replace = TRUE), collapse = "") yes 가있는가? > any(words == "yes") [1] TRUE Big Data Analytics Short Courses R 을이용한시뮬레이션 2 24 / 39
Topic Chevalier de Méré s Problem 5 Chevalier de Méré s Problem Chevalier de Méré s Problem Big Data Analytics Short Courses R 을이용한시뮬레이션 2 25 / 39
Chevalier de Méré Chevalier de Méré s Problem Chevalier de Méré s Problem 17 세기프랑스의작가이자아마추어수학자이자도박사인슈발리에드메레는두가지도박의승률이수학적으로동일하다고생각하였다. ( 게임 1) 동일한주사위를 4 번던져서그중한번이라도 1 의눈이나오면플레이어가이긴다. 그렇지않으면딜러가이긴다. 4 1 6 = 2 3 ( 게임 2) 주사위 2 개를 24 번던져서한번이라도 2 개주사위모두 1 의눈이나오면플레이어가이긴다. 그렇지않으면딜러가이긴다. 24 1 36 = 2 3 Big Data Analytics Short Courses R 을이용한시뮬레이션 2 26 / 39
파스칼과페르마 Chevalier de Méré s Problem Chevalier de Méré s Problem 드메레는경험적으로는게임 1 이플레이어에게더유리하다는의심을가지고있었음에도그이유를설명할수없었다. 드메레는이문제를메르센살롱에공개한다. 당대의유명한수학자파스칼과페르마는편지를주고받으며이문제를연구하고확률론의수학적기초가탄생한다. Big Data Analytics Short Courses R 을이용한시뮬레이션 2 27 / 39
Chevalier de Méré s Problem 파스칼과페르마의설명 Chevalier de Méré s Problem ( 게임1) 동일한주사위를 4번던져서그중한번이라도 1의눈이나오면플레이어가이긴다. 그렇지않으면딜러가이긴다. ( ) 5 4 1 0.5177469 6 > 1 - (5/6)^4 [1] 0.5177469 ( 게임2) 주사위 2개를 24번던져서한번이라도 2개주사위모두 1의눈이나오면플레이어가이긴다. 그렇지않으면딜러가이긴다. ( ) 35 24 1 0.4914039 36 > 1 - (35/36)^24 [1] 0.4914039 Big Data Analytics Short Courses R 을이용한시뮬레이션 2 28 / 39
시뮬레이션 : 게임 1 Chevalier de Méré s Problem Chevalier de Méré s Problem ( 게임 1) 동일한주사위를 4 번던져서그중한번이라도 1 의눈이나오면플레이어가이긴다. 그렇지않으면딜러가이긴다. 주사위 4 번던지기 > sample(1:6, 4, replace = TRUE) [1] 1 4 1 5 1 이있는가? > sample(1:6, 4, replace = TRUE) == 1 [1] FALSE FALSE FALSE FALSE 1 이하나라도있는가? > any(sample(1:6, 4, replace = TRUE) == 1) [1] FALSE Big Data Analytics Short Courses R 을이용한시뮬레이션 2 29 / 39
시뮬레이션 : 게임 1 Chevalier de Méré s Problem Chevalier de Méré s Problem 주사위 4 번던져서 1 이한번이라도있는지확인하는게임을 10000 번반복 > replicate(10000, any(sample(1:6, 4, replace = TRUE) == 1)) sum() 함수를사용하면이긴횟수. > sum(replicate(10000, any(sample(1:6, 4, replace = TRUE) == 1))) mean() 함수를적용하연이긴게임의비율. > mean(replicate(10000, any(sample(1:6, 4, replace = TRUE) == 1))) 논리값 (TRUE, FALSE) 에산술연산을적용하면 1, 0 으로계산된다. Big Data Analytics Short Courses R 을이용한시뮬레이션 2 30 / 39
시뮬레이션 : 게임 2 Chevalier de Méré s Problem Chevalier de Méré s Problem ( 게임 2) 주사위 2 개를 24 번던져서한번이라도 2 개주사위모두 1 의눈이나오면플레이어가이긴다. 그렇지않으면딜러가이긴다. 주사위 2 개던지기 > sample(1:6, 2, replace = TRUE) 두눈모두 1 인가? > all(sample(1:6, 2, replace = TRUE) == 1) 주사위 2 개던져두눈모두 1 인지확인하는시행을 24 번반복 > replicate(24, all(sample(1:6, 2, replace = TRUE) == 1)) Big Data Analytics Short Courses R 을이용한시뮬레이션 2 31 / 39
시뮬레이션 : 게임 2 Chevalier de Méré s Problem Chevalier de Méré s Problem 24 번중한번이라도 (1, 1) 이나왔는가? > any(replicate(24, all(sample(1:6, 2, replace = TRUE) == 1))) 게임을 10000 번반복 > replicate(10000, any(replicate(24, all(sample(1:6, 2, replace = TRUE) == 1)))) 이긴게임의횟수 > sum(replicate(10000, any(replicate(24, all(sample(1:6, 2, replace = TRUE) == + 1))))) 이긴게임의비율 > mean(replicate(10000, any(replicate(24, all(sample(1:6, 2, replace = TRUE) == + 1))))) Big Data Analytics Short Courses R 을이용한시뮬레이션 2 32 / 39
Chevalier de Méré s Problem 시뮬레이션 : 게임 1 vs 게임 2 Chevalier de Méré s Problem ( 게임 1) 동일한주사위를 4 번던져서그중한번이라도 1 의눈이나오면플레이어가이긴다. 그렇지않으면딜러가이긴다. > mean(replicate(10000, any(sample(1:6, 4, replace = TRUE) == 1))) [1] 0.5114 ( 게임 2) 주사위 2 개를 24 번던져서한번이라도 2 개주사위모두 1 의눈이나오면플레이어가이긴다. 그렇지않으면딜러가이긴다. > mean(replicate(10000, any(replicate(24, all(sample(1:6, 2, replace = TRUE) == + 1))))) [1] 0.4811 Big Data Analytics Short Courses R 을이용한시뮬레이션 2 33 / 39
Topic Birthday Problem 6 Birthday Problem Birthday Problem Big Data Analytics Short Courses R 을이용한시뮬레이션 2 34 / 39
Birthday Problem Birthday Problem Birthday Problem 우리강의실에생일이같은사람이있을확률은? ( 랜덤하게모였다고가정. 일년은 365 일로계산 ) 모두생일이다를확률을구하면 : ( 365 ) n n! 365 n = 365! 365 (365 n + 1) = (365 n)!365n 365 n 30 명일때 : 생일이같은사람이있을확률은약 70% > n <- 30 > 1 - exp(lfactorial(365) - lfactorial(365 - n) - n * log(365)) [1] 0.7063162 Big Data Analytics Short Courses R 을이용한시뮬레이션 2 35 / 39
시뮬레이션 Birthday Problem Birthday Problem 한강의실에생일이같은사람이있을확률은? ( 랜덤하게모였다고가정. 일년은 365 일 ) 1 365 숫자중 n 개를복원추출하였을때중복 1:365 에서 30 개의숫자복원추출 > sample(1:365, 30, replace = TRUE) 중복데이터가있는지확인 > any(duplicated(sample(1:365, 30, replace = TRUE))) 30 명씩복원추출하는시행을 1000 번반복 > replicate(1000, any(duplicated(sample(1:365, 30, replace = TRUE)))) 생일이같은사람이있는비율 > mean(replicate(1000, any(duplicated(sample(1:365, 30, replace = TRUE))))) [1] 0.71 Big Data Analytics Short Courses R 을이용한시뮬레이션 2 36 / 39
Birthday Problem Birthday Problem 시뮬레이션 : 2014 년도월별출생추이 월별출생수 (Birth Number Per Month): > bnpm <- c(4.12, 3.68, 3.8, 3.72, 3.57, 3.42, 3.64, 3.65, 3.78, 3.64, 3.23, 3.27) Big Data Analytics Short Courses R 을이용한시뮬레이션 2 37 / 39
시뮬레이션 Birthday Problem Birthday Problem 월별출생비율 (Birth Probability Per Month) > (bppm <- bnpm/sum(bnpm)) [1] 0.09466912 0.08455882 0.08731618 0.08547794 0.08203125 0.07858456 [7] 0.08363971 0.08386949 0.08685662 0.08363971 0.07421875 0.07513787 같은달에는매일출생수가동일하다고가정하면, > days <- c(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31) > bppm/days [1] 0.003053843 0.003019958 0.002816651 0.002849265 0.002646169 [6] 0.002619485 0.002698055 0.002705467 0.002895221 0.002698055 [11] 0.002473958 0.002423802 365 일매일의일별출생비율 (Birth Prob. Per Day) > bppd <- rep(bppm/days, days) Big Data Analytics Short Courses R 을이용한시뮬레이션 2 38 / 39
시뮬레이션 Birthday Problem Birthday Problem 일별출생비율을이용하여 30 명을뽑으면 > sample(1:365, size = 30, replace = TRUE, prob = bppd) [1] 47 29 288 304 22 138 245 11 320 207 260 7 102 79 125 242 26 [18] 22 285 220 272 138 179 191 60 185 1 270 76 274 30 명중생일같은사람이있는확인 > any(duplicated(sample(1:365, size = 30, replace = TRUE, prob = bppd))) 30 명씩뽑는시행을 1000 번반복하면 > replicate(1000, any(duplicated(sample(1:365, size = 30, replace = TRUE, prob = bpp 생일같은사람이있는비율은 > mean(replicate(1000, any(duplicated(sample(1:365, size = 30, replace = TRUE, + prob = bppd))))) [1] 0.701 Big Data Analytics Short Courses R 을이용한시뮬레이션 2 39 / 39