작성자: admin 작성일시: 2016-10-01 10:06:00 조회수: 509 다운로드: 52
카테고리: R 태그목록:

R의 난수 발생과 카운팅

R을 이용하여 데이터를 무작위로 섞거나 난수를 발생시키는 방법, 그리고 이렇게 발생한 난수나 데이터를 카운팅(counting)하는 법에 대해 알아본다.

시드 설정하기

컴퓨터 프로그램에서 무작위와 관련된 모든 알고리즘은 사실 무작위가 아니라 시작 숫자를 정해 주면 그 다음에는 정해진 알고리즘에 의해 마치 난수처럼 보이는 수열을 생성한다. 다만 출력되는 숫자들 간의 상관관계가 없어 보일 뿐이다.

또한 같은 알고리즘을 여러번 실행하더라도 다른 숫자가 나오도록 시작 숫자는 현재 시간 등을 사용해서 매번 바꿔준다. 이런 시작 숫자를 시드(seed)라고 한다.

따라서 시드를 사람이 수동으로 설정한다면 그 다음에 만들어지는 난수들은 예측할 수 있다.

R에서 시드를 설정하는 명령은 set.seed이다. 인수로는 0과 같거나 큰 정수를 넣어준다.

In:
set.seed(0)

이렇게 시드를 설정한 후 sample(replace=TRUE) 명령으로 5개의 난수를 생성해 보자. 다른 난수 관련 명령어를 실행하지 말고 바로 다음 명령을 실행해야 한다.

In:
sample(5, replace=TRUE)
  1. 5
  2. 2
  3. 2
  4. 3
  5. 5

몇번 더 난수를 생성한다.

In:
sample(10, replace=TRUE)
  1. 3
  2. 9
  3. 10
  4. 7
  5. 7
  6. 1
  7. 3
  8. 2
  9. 7
  10. 4
In:
sample(10, replace=TRUE)
  1. 8
  2. 5
  3. 8
  4. 10
  5. 4
  6. 8
  7. 10
  8. 3
  9. 7
  10. 2

이제 시드를 0으로 재설정하고 다시 난수를 발생시켜 본다.

In:
set.seed(0)
In:
sample(5, replace=TRUE)
  1. 5
  2. 2
  3. 2
  4. 3
  5. 5
In:
sample(10, replace=TRUE)
  1. 3
  2. 9
  3. 10
  4. 7
  5. 7
  6. 1
  7. 3
  8. 2
  9. 7
  10. 4
In:
sample(10, replace=TRUE)
  1. 8
  2. 5
  3. 8
  4. 10
  5. 4
  6. 8
  7. 10
  8. 3
  9. 7
  10. 2

아까와 같은 숫자가 나오는 것을 확인할 수 있다.

기존의 데이터의 순서 바꾸기

기존에 있는 데이터의 순서를 바꾸려면 sample 명령과 배열 인덱싱을 사용한다.

In:
x <- (1:10) * 10
x[sample(length(x))]
  1. 90
  2. 70
  3. 100
  4. 10
  5. 50
  6. 30
  7. 40
  8. 20
  9. 60
  10. 80

기존의 데이터에서 샘플링하기

이미 있는 데이터 집합에서 일부를 선택하는 것을 샘플링(sampling)이라고 한다. 샘플링에도 sample 명령을 사용한다.

sample(x, size, replace = FALSE, prob = NULL)

  • x : 배열이면 원래의 데이터, 정수이면 seq(x) 명령으로 데이터 생성
  • size : 정수. 샘플 숫자
  • replace : 불리언. TRUE 이면 한번 선택한 데이터를 다시 선택 가능
  • prob : 배열. 각 데이터가 선택될 수 있는 확률
In:
sample(5, 5)
  1. 4
  2. 2
  3. 3
  4. 1
  5. 5
In:
sample(5, 3)  # 3개만 선택
  1. 1
  2. 5
  3. 4
In:
sample(5, 10, replace=TRUE) # 반복해서 10개 선택
  1. 3
  2. 4
  3. 3
  4. 5
  5. 2
  6. 3
  7. 2
  8. 4
  9. 2
  10. 3
In:
sample(5, 10, replace=TRUE, prob=c(0.1, 0, 0.3, 0.6, 0))  # 선택 확률을 다르게 해서 10개 선택
  1. 3
  2. 4
  3. 3
  4. 4
  5. 3
  6. 4
  7. 4
  8. 4
  9. 3
  10. 3

난수 생성

R에서 정수가 아닌 난수를 생성할 때는 확률 분포 변수를 사용한다.

  • runif: 0부터 1사이의 균일 분포
  • rnorm: 가우시안 표준 정규 분포

runif 명령은 0부터 1사이에서 균일한 확률 분포로 실수 난수를 생성한다. 숫자 인수는 생성할 난수의 크기이다.

In:
runif(10)
  1. 0.389989543473348
  2. 0.777320698834956
  3. 0.960617997217923
  4. 0.434659484773874
  5. 0.712514678714797
  6. 0.399994368897751
  7. 0.325352151878178
  8. 0.757087148027495
  9. 0.202692255144939
  10. 0.711121222469956

rnorm 명령은 기댓값이 0이고 표준편차가 1인 가우시안 표준 정규 분포를 따르는 난수를 생성한다. 인수 사용법은 rand 명령과 같다.

In:
rnorm(10)
  1. -1.16657054708471
  2. -1.0655905803883
  3. -1.563782051071
  4. 1.15653699715018
  5. 0.83204712857239
  6. -0.227328691424755
  7. 0.266137361672105
  8. -0.376702718583628
  9. 2.44136462889459
  10. -0.795339117255372

정수 데이터 카운팅

이렇게 발생시킨 난수가 실수값이면 히스토그램 등을 사용하여 분석하면 된다.

만약 난수가 정수값이면 unique 명령이나 tabulate 명령 등으로 데이터 값을 분석할 수 있다

unique 명령은 데이터에서 중복된 값을 제거하고 중복되지 않는 값의 리스트를 출력한다.

In:
unique(c(11, 11, 2, 2, 34, 34))
  1. 11
  2. 2
  3. 34
In:
a = c('a', 'b', 'b', 'c', 'a')
unique(a)
  1. 'a'
  2. 'b'
  3. 'c'

그러나 unique 명령은 데이터에 존재하는 값에 대해서만 갯수를 세므로 데이터 값이 나올 수 있음에도 불구하고 데이터가 하나도 없는 경우에는 정보를 주지 않는다. 예를 들어 주사위를 10번 던졌는데 6이 한 번도 나오지 않으면 이 값을 0으로 세어주지 않는다.

따라서 데이터가 주사위를 던졌을 때 나오는 수처럼 특정 범위안의 수인 경우에는 tabulatenbins 인수를 설정하여 쓰는 것이 더 편리하다. 이 때는 1 부터 nbins까지의 숫자에 대해 각각 카운트를 한다. 데이터가 없을 경우에는 카운트 값이 0이 된다.

In:
tabulate(c(2,3,5), nbins=10)
  1. 0
  2. 1
  3. 1
  4. 0
  5. 1
  6. 0
  7. 0
  8. 0
  9. 0
  10. 0

질문/덧글

아직 질문이나 덧글이 없습니다. 첫번째 글을 남겨주세요!