1. sample, choice, choices 함수
지난 블로그에서 random 모듈의 random 함수를 이용해 난수를 추출하는 방법을 살펴보았다. 이번에는 random 모듈에서 리스트, 튜플 등 컨테이너 자료에서 일부를 랜덤하게 뽑아내는 작업을 수행해 보자.
랜덤하게 뽑아내는 작업을 표집(sampling)이라고 하고, 뽑힌 값들의 모임을 표본(sample)이라고 한다. 무작위 랜덤 표집 방법은 모집단의 대표성을 확보하도록 표본을 구성하는 방법으로 통계적으로 매우 중요하다.
파이썬 random 모듈에서 랜덤하게 표본을 뽑는 함수는 sample, choices, choice가 있다. sample은 중복 없이 원하는 수만큼 무작위로 출하는 방법이고, choices는 중복을 허용해서 랜덤하게 추출한다.
예를 들어 [1, 2, 3]에서 2개를 추출할 때 sample 함수를 쓰면 [1, 2], [1, 3], [2, 3] 등 서로 다른 수가 2개 뽑히지만, choices 함수로 추출하면 [2, 2]처럼 중복해서 뽑힐 수가 있다. 단수형 choice는 단순히 랜덤하게 하나의 값을 추출하라는 함수이다.
sample() 함수의 사용 방법은 sample(데이터, 추출 개수), choices() 함수는 파라미터에 랜덤하게 취득하고 싶은 객체의 개수를 k에 다음과 같이 choices(데이터, k=추출 개수)로 지정한다. choice() 함수는 하나의 값만 뽑기 때문에 choice(데이터)로 간단히 입력한다.
from random import * # random 모듈에 포함된 모든 함수 호출
li = [1, 2, 3, 4, 5]
choice(li) # li 리스트에서 값 하나만 랜덤하게 추출: (ex: 4)
sample(li, 3) # li 리스트에서 3개의 값을 랜덤하게 추출: (ex: [4, 1, 3])
choices(li, k= 6) # li 리스트에서 6개의 값을 중복해서 랜덤하게 추출: (ex: 1, 5, 3, 3, 2, 5])
추출함수는 문자열에서도 사용할 수 있다. ‘abcd’로 되어 있는 문자열서 원하는 개수만큼 알파벳이나 한글 문자를 뽑아낼 수 있다.
# 영어 문자열에서 문자 추출
from random import *
text_e = 'abcd'
choice(text_e) # d 등으로 추출
sample(text_e, 2) # ['a', 'c'] 등으로 추출
choices(text_e, k=5) # ['d', 'a', 'd', 'd', 'b'] 등으로 추출
# 한글 문자열에서 한글 추출
text_k = '파이썬'
choice(text_k) # 파 등으로 추출
sample(text_k, 2) # ['썬', '파'] 등으로 추출
choices(text_k, k=5) # ['썬', '파', '이', '이', '썬'] 등으로 추출
만약 리스트 자료가 [1, 1, 1, 2, 3, 4, 4, 4, 4]처럼 중복된 객체를 가지고 있는 경우 중복 없이 값을 추출할 수 있다. 먼저 중복된 리스트를 집합(set)으로 변환하면 중복된 값 중 하나만 남는다. 집합은 중복을 허용하지 않기 때문에 {1, 2, 2}와 {1, 2}는 같은 자료이다. 이를 이용하면 sample을 이용해 중복 없이 뽑을 수 있다.
from random import *
list_1 = [1, 1, 1, 2, 3, 4, 4, 4, 4]
sample(set(list_1), 3) # 리스틀 집합으로 바꿔서 중복값 없이 추출(ex: [1, 2, 4])
2. shuffle 함수
지금까지는 random 모듈을 이용한 무작위 추출 방법을 살펴보았다. 무작위로 뽑는 또 다른 방법이 있다. 바구니에서 제비 뽑기를 할 때 먼저 손으로 휘저어 섞은 후에 뽑듯이, 데이터를 무작위로 썩은 다음 차례대로 뽑으면 랜덤 효과가 발생한다. 순서를 섞는 함수는 shuffle()이고, 이 함수를 사용하면 데이터가 섞여서 자동 저장된다.
from random import *
list_2 = ['a', 'b', 'c', 'd', 'e']
shuffle(list_2) # list_2의 순서를 섞어서 list_2에 다시 저장
list_2[:3] # list_2에서 순서대로 3개를 추출
로또 공을 뽑을 때 셔플 방법이 그대로 사용된다. 1~45까지 번호 찍 공을 무작위로 섞어서 순서대로 하나씩 뽑으면, sample을 이용해 랜덤하게 6개를 뽑는 것과 같다.
from random import *
lott = list(range(1, 46)) # 1~45까지 리스트 자료를 만듦
shuffle(lott) # 순서를 섞어서 저장
print(lott[:6]) # 압에서부터 6개 숫자 출력(ex: [24, 16, 33, 28, 45, 22])
'파이썬' 카테고리의 다른 글
[ 코랩과 파이썬 ] 17. python 클래스(class) 오버라이딩(overriding)과 super() 함수 (0) | 2023.02.20 |
---|---|
[ 코랩과 파이썬 ] 1-1. 구글 코랩 Google Colab에 폴더 업로드 및 압축파일 zip 풀기 (0) | 2023.02.06 |
[ 코랩과 파이썬 ] 15. python random 모듈로 난수 생성하기(randint, uniform, randrange 포함) (0) | 2023.01.27 |
[ 코랩과 파이썬 ] 14. python 정렬 sorted 함수 (itemgetter 함수 포함) (0) | 2023.01.25 |
[ 코랩과 파이썬 ] 13. python 필터 filter 함수 (isinstance 함수 포함) (0) | 2023.01.25 |