GIL's LAB

scipy를 이용한 확률 분포 샘플링 본문

데이터사이언스/확률 통계

scipy를 이용한 확률 분포 샘플링

GIL~ 2022. 8. 14. 15:58

이번 포스팅에서는 scipy를 이용하여 확률 분포에서 샘플링하는 방법에 대해 알아보겠습니다.

 

확률 분포 샘플링이란?

샘플링(sampling)이란 특정한 확률 분포에서의 확률을 바탕으로 샘플을 추출하는 작업을 말합니다.

통계에서는 모집단에서 일부를 임의로 선택하는 작업을 샘플링이라 하지만, 여기서는 주어진 확률 분포에서의 샘플링으로 한정하겠습니다.

샘플링은 확률 분석 뿐만 아니라, 머신러닝 및 딥러닝 등에서도 자주 활용되는 개념입니다.

 

numpy.random.choice를 이용한 샘플링

간단히 예를 들어서 주사위를 던져서 나오는 숫자를 샘플링한다고 해보겠습니다.

이 숫자는 {1, 2, 3, 4, 5, 6} 중 하나를 취할 확률이 1/6인 확률 변수를 따릅니다.

참고로 확률 변수가 가질 수 있는 값의 집합을 상태 공간(state space)이라 합니다.

또한, 이처럼 각 값의 확률이 같은 분포를 이산 유니폼 분포(discrete uniform distribution)이라 합니다.

 

파이썬에서는 numpy의 random.choice를 이용해서 쉽게 구현할 수 있습니다.

이 함수의 주요 인자는 다음과 같습니다.

  • a: 샘플링할 상태 공간
  • size: 샘플링할 개수
  • p: 각 값을 선택할 확률 (입력하지 않으면 각 값을 선택할 확률을 같게 설정)

 

먼저, 상태 공간을 다음과 같이 S로 정의합니다.

S = [1,2,3,4,5,6]

다음으로 하나의 값을 선택해서 출력해보겠습니다.

import numpy as np
print(np.random.choice(S))

[실행 결과]

6

출력해보니 6이 나왔습니다.

참고로 시드를 고정하지 않는 한 출력할 때마다 결과가 다릅니다.

 

이번엔 100개의 값을 샘플링해보겠습니다.

print(np.random.choice(S, 100))

[실행 결과]

[4 2 4 1 5 1 1 4 2 3 2 6 3 6 1 6 3 3 6 2 2 2 4 3 1 5 3 6 6 4 5 1 5 1 4 4 1
 5 4 5 6 3 2 3 1 5 5 4 2 4 6 2 1 6 4 1 6 3 4 4 3 1 1 3 5 6 2 6 6 4 5 4 2 4
 1 5 3 4 4 3 5 6 1 2 6 5 5 6 6 5 4 6 2 1 6 4 3 1 2 5]

100개가 임의로 선택된 것을 알 수 있습니다.

이처럼 상태 공간을 정의해놓고 같은 확률로 각 요소를 선택할 때는 numpy.random.choice를 이용할 수 있습니다.

 

또한, p를 설정하면 우리가 원하는 이산 분포로 샘플링할 수 있습니다.

조작된 동전을 던지는 예제를 살펴보겠습니다.

이 동전은 조작되었기에 앞면이 나올 확률이 90%이고 뒷면이 나올 확률이 10%입니다.

S = ["앞면", "뒷면"]
print(np.random.choice(S, 100, p = [0.9, 0.1]))

[실행 결과]

['앞면' '앞면' '앞면' '앞면' '앞면' '앞면' '앞면' '앞면' '앞면' '앞면' '앞면' '앞면' '앞면' '앞면'
 '앞면' '앞면' '앞면' '앞면' '앞면' '앞면' '앞면' '앞면' '앞면' '앞면' '앞면' '앞면' '앞면' '앞면'
 '앞면' '앞면' '앞면' '앞면' '앞면' '앞면' '앞면' '뒷면' '앞면' '뒷면' '앞면' '앞면' '앞면' '앞면'
 '뒷면' '앞면' '앞면' '앞면' '앞면' '앞면' '앞면' '앞면' '앞면' '앞면' '앞면' '앞면' '앞면' '앞면'
 '앞면' '앞면' '앞면' '앞면' '앞면' '앞면' '앞면' '앞면' '앞면' '앞면' '뒷면' '앞면' '앞면' '앞면'
 '앞면' '앞면' '앞면' '앞면' '앞면' '앞면' '앞면' '앞면' '앞면' '앞면' '앞면' '앞면' '앞면' '앞면'
 '뒷면' '앞면' '앞면' '앞면' '앞면' '앞면' '앞면' '앞면' '뒷면' '앞면' '앞면' '앞면' '앞면' '앞면'
 '앞면' '앞면']

실행 결과를 살펴보면, 뒷 면이 거의 등장하지 않았음을 알 수 있습니다.

 

scipy.stats을 이용한 샘플링

scipy.stats에는 정규 분포, 푸아송 분포, 베르누이 분포 등 다양한 분포를 따르는 확률 변수를 만들 수 있는 클래스가 있습니다. 

확률 변수 목록은 다음과 같으며, 자세한 내용은 https://docs.scipy.org/doc/scipy/reference/stats.html 에서 확인할 수 있습니다.

Discrete distributions

bernoulli A Bernoulli discrete random variable.
betabinom A beta-binomial discrete random variable.
binom A binomial discrete random variable.
boltzmann A Boltzmann (Truncated Discrete Exponential) random variable.
dlaplace A Laplacian discrete random variable.
geom A geometric discrete random variable.
hypergeom A hypergeometric discrete random variable.
logser A Logarithmic (Log-Series, Series) discrete random variable.
nbinom A negative binomial discrete random variable.
nchypergeom_fisher A Fisher's noncentral hypergeometric discrete random variable.
nchypergeom_wallenius A Wallenius' noncentral hypergeometric discrete random variable.
nhypergeom A negative hypergeometric discrete random variable.
planck A Planck discrete exponential random variable.
poisson A Poisson discrete random variable.
randint A uniform discrete random variable.
skellam A Skellam discrete random variable.
yulesimon A Yule-Simon discrete random variable.
zipf A Zipf (Zeta) discrete random variable.
zipfian A Zipfian discrete random variable.

 

Continuous distributions

alpha An alpha continuous random variable.
anglit An anglit continuous random variable.
arcsine An arcsine continuous random variable.
argus Argus distribution
beta A beta continuous random variable.
betaprime A beta prime continuous random variable.
bradford A Bradford continuous random variable.
burr A Burr (Type III) continuous random variable.
burr12 A Burr (Type XII) continuous random variable.
cauchy A Cauchy continuous random variable.
chi A chi continuous random variable.
chi2 A chi-squared continuous random variable.
cosine A cosine continuous random variable.
crystalball Crystalball distribution
dgamma A double gamma continuous random variable.
dweibull A double Weibull continuous random variable.
erlang An Erlang continuous random variable.
expon An exponential continuous random variable.
exponnorm An exponentially modified Normal continuous random variable.
exponweib An exponentiated Weibull continuous random variable.
exponpow An exponential power continuous random variable.
f An F continuous random variable.
fatiguelife A fatigue-life (Birnbaum-Saunders) continuous random variable.
fisk A Fisk continuous random variable.
foldcauchy A folded Cauchy continuous random variable.
foldnorm A folded normal continuous random variable.
genlogistic A generalized logistic continuous random variable.
gennorm A generalized normal continuous random variable.
genpareto A generalized Pareto continuous random variable.
genexpon A generalized exponential continuous random variable.
genextreme A generalized extreme value continuous random variable.
gausshyper A Gauss hypergeometric continuous random variable.
gamma A gamma continuous random variable.
gengamma A generalized gamma continuous random variable.
genhalflogistic A generalized half-logistic continuous random variable.
genhyperbolic A generalized hyperbolic continuous random variable.
geninvgauss A Generalized Inverse Gaussian continuous random variable.
gibrat A Gibrat continuous random variable.
gompertz A Gompertz (or truncated Gumbel) continuous random variable.
gumbel_r A right-skewed Gumbel continuous random variable.
gumbel_l A left-skewed Gumbel continuous random variable.
halfcauchy A Half-Cauchy continuous random variable.
halflogistic A half-logistic continuous random variable.
halfnorm A half-normal continuous random variable.
halfgennorm The upper half of a generalized normal continuous random variable.
hypsecant A hyperbolic secant continuous random variable.
invgamma An inverted gamma continuous random variable.
invgauss An inverse Gaussian continuous random variable.
invweibull An inverted Weibull continuous random variable.
johnsonsb A Johnson SB continuous random variable.
johnsonsu A Johnson SU continuous random variable.
kappa4 Kappa 4 parameter distribution.
kappa3 Kappa 3 parameter distribution.
ksone Kolmogorov-Smirnov one-sided test statistic distribution.
kstwo Kolmogorov-Smirnov two-sided test statistic distribution.
kstwobign Limiting distribution of scaled Kolmogorov-Smirnov two-sided test statistic.
laplace A Laplace continuous random variable.
laplace_asymmetric An asymmetric Laplace continuous random variable.
levy A Levy continuous random variable.
levy_l A left-skewed Levy continuous random variable.
levy_stable A Levy-stable continuous random variable.
logistic A logistic (or Sech-squared) continuous random variable.
loggamma A log gamma continuous random variable.
loglaplace A log-Laplace continuous random variable.
lognorm A lognormal continuous random variable.
loguniform A loguniform or reciprocal continuous random variable.
lomax A Lomax (Pareto of the second kind) continuous random variable.
maxwell A Maxwell continuous random variable.
mielke A Mielke Beta-Kappa / Dagum continuous random variable.
moyal A Moyal continuous random variable.
nakagami A Nakagami continuous random variable.
ncx2 A non-central chi-squared continuous random variable.
ncf A non-central F distribution continuous random variable.
nct A non-central Student's t continuous random variable.
norm A normal continuous random variable.
norminvgauss A Normal Inverse Gaussian continuous random variable.
pareto A Pareto continuous random variable.
pearson3 A pearson type III continuous random variable.
powerlaw A power-function continuous random variable.
powerlognorm A power log-normal continuous random variable.
powernorm A power normal continuous random variable.
rdist An R-distributed (symmetric beta) continuous random variable.
rayleigh A Rayleigh continuous random variable.
rice A Rice continuous random variable.
recipinvgauss A reciprocal inverse Gaussian continuous random variable.
semicircular A semicircular continuous random variable.
skewcauchy A skewed Cauchy random variable.
skewnorm A skew-normal random variable.
studentized_range A studentized range continuous random variable.
t A Student's t continuous random variable.
trapezoid A trapezoidal continuous random variable.
triang A triangular continuous random variable.
truncexpon A truncated exponential continuous random variable.
truncnorm A truncated normal continuous random variable.
truncweibull_min A doubly truncated Weibull minimum continuous random variable.
tukeylambda A Tukey-Lamdba continuous random variable.
uniform A uniform continuous random variable.
vonmises A Von Mises continuous random variable.
vonmises_line A Von Mises continuous random variable.
wald A Wald continuous random variable.
weibull_min Weibull minimum continuous random variable.
weibull_max Weibull maximum continuous random variable.
wrapcauchy A wrapped Cauchy continuous random variable.

이들 클래스는 모두 rvs라는 샘플링 메서드를 지원합니다.

간단한 예제를 통해 살펴보겠습니다.

 

정규 분포 샘플링

정규 분포는 norm 클래스를 이용해 만들 수 있습니다.

이 클래스의 인자는 loc와 scale이 있으며, 각각 정규 분포의 평균과 표준편차라고 보시면 됩니다.

 

평균이 10이고 표준편차가 1인 정규 분포를 따르는 확률 변수 X를 만들어보겠습니다.

from scipy.stats import norm
X = norm(10, 1)

다음으로 rvs 메서드를 이용해서 100개의 샘플을 추출해보겠습니다.

참고로 이 메서드의 인자로 입력하는 것은 추출할 샘플 수 입니다.

X.rvs(10)

[실행 결과]

array([ 9.731279  ,  8.62316881,  9.28807333, 10.95364959,  9.86614275,
       10.7165034 ,  8.9126215 ,  9.82230952, 11.19247648, 10.17635509])

 

푸아송 분포 샘플링

푸아송 분포는 poisson 클래스를 이용해 만들 수 있습니다.

이 클래스의 인자는 mu가 있으며, 모양 파라미터입니다.

mu에 따른 확률 질량 함수를 표현하면 다음과 같습니다 (참고로 아래 그림에선 뮤를 람다라고 표현했습니다).

 

뮤가 10인 푸아송 분포를 따르는 확률 변수 X를 만들어보겠습니다.

from scipy.stats import poisson
X = poisson(10)

다음으로 이 확률 변수를 따르는 100개의 샘플을 추출해보겠습니다.

X.rvs(100)

[실행 결과]

array([11, 14,  8,  8,  6, 10,  9, 12, 14, 11, 14,  7, 13, 11, 10,  5, 11,
       10, 11,  9,  8, 16, 14, 16, 10,  6, 13, 11,  9,  5,  9,  6,  6,  8,
       11,  9, 13, 16, 10, 13, 11, 12, 15,  9,  8,  7,  7, 14,  5, 10,  8,
       15, 16, 11,  9,  9,  8, 13,  8,  7, 10, 11, 12,  9, 13, 12,  8, 12,
        9, 12,  8, 13,  6,  6, 11,  8,  6,  9, 15, 13, 10, 10, 11,  7,  9,
        6,  9,  9, 11, 12,  4,  9, 15, 11,  8, 11,  9, 13,  9,  5],
      dtype=int64)

 


데이터 분석 서비스가 필요한 분은 아래 링크로! 

https://kmong.com/gig/374194 

 

데이터사이언스 박사의 데이터 분석 서비스 드립니다. | 150000원부터 시작 가능한 총 평점 5점의 I

78개 총 작업 개수 완료한 총 평점 5점인 데이터사이언스박사의 IT·프로그래밍, 데이터 분석·시각화 서비스를 68개의 리뷰와 함께 확인해 보세요. IT·프로그래밍, 데이터 분석·시각화 제공 등 150

kmong.com

 

Comments