일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 파라미터 튜닝
- AutoML
- 하이퍼 파라미터 튜닝
- 커리어전환
- 주식데이터
- 데이터사이언스
- 데이터 사이언스
- 데이터사이언스학과
- 이력서 첨삭
- 데이터분석
- 대학원
- 머신러닝
- 데이터사이언티스트
- 베이지안 최적화
- 자기소개서
- 하이퍼 파라미터
- 경력 기술서
- 사이킷런
- pandas
- 데이터 사이언티스트
- 주가데이터
- 랜덤포레스트
- 코딩테스트
- 퀀트
- 판다스
- 경력기술서 첨삭
- 주요 파라미터
- 파이썬
- sklearn
- 퀀트 투자 책
- Today
- Total
GIL's LAB
scipy를 이용한 확률 분포 샘플링 본문
이번 포스팅에서는 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)
데이터 분석 서비스가 필요한 분은 아래 링크로!
'데이터사이언스 > 확률 통계' 카테고리의 다른 글
로또 추천이 말도 안되는 이유 (feat data) (0) | 2023.08.01 |
---|---|
반복측정 분산분석과 그리드 서치: 가장 중요한 파라미터 찾기 (0) | 2022.01.07 |