Python의 통계 시뮬레이션
통계 시뮬레이션은 무작위 행동을 보이는 복잡한 시스템을 모델링하고 분석할 수 있도록 확률 분포에서 무작위 표본을 생성하기 위해 컴퓨터 기반 방법을 사용하는 작업입니다. 이 기사에서는 Python에서 이 강력한 도구를 사용하여 예측을 수행하고 통찰력을 생성하며 통계 알고리즘의 성능을 평가하는 방법을 살펴보겠습니다.
통계 시뮬레이션에는 다음과 같은 다양한 유형이 있습니다.
몬테카를로 시뮬레이션 − 함수의 기대값을 추정하기 위해 확률 분포에서 무작위 샘플을 생성합니다.
부트스트랩 - 추정기의 샘플링 분포를 추정하는 데 자주 사용되는 리샘플링 기술입니다.
MCMC(Markov chain Monte Carlo) - 복잡한 확률 분포의 매개변수를 추정하는 데 사용되는 알고리즘 클래스입니다.
-
확률적 프로세스 시뮬레이션 − 시간 경과에 따른 무작위 동작 시뮬레이션. 주가나 날씨 패턴 예측 등이 그 예입니다.
통계 시뮬레이션은 금융, 공학, 물리학, 생물학, 사회과학을 포함한 광범위한 분야에서 복잡한 시스템을 모델링 및 분석하고, 예측하고, 통찰력을 생성하는 데 사용됩니다. 컴퓨터 기반 방법을 사용하면 수많은 시나리오를 효율적이고 정확하게 시뮬레이션할 수 있으며, 이를 통해 불확실성을 정량화하고 위험을 추정하며 데이터 기반 결정을 내릴 수 있습니다.
몬테카를로 시뮬레이션
몬테카를로 시뮬레이션은 함수의 기대값을 추정하거나 무작위 동작을 나타내는 복잡한 시스템을 모델링 및 분석하기 위해 확률 분포에서 무작위 샘플을 생성하는 통계 시뮬레이션입니다. "몬테카를로"라는 이름은 모나코에 위치한 몬테카를로 카지노에서 유래되었으며, 도박에서는 무작위성이 게임의 핵심 요소입니다.
몬테카를로 시뮬레이션의 정확도는 생성된 무작위 샘플 수와 분석 중인 모델 또는 시스템의 품질에 따라 달라집니다. 충분한 샘플과 좋은 모델을 갖춘 Monte Carlo 시뮬레이션은 귀중한 통찰력을 제공하고 의사 결정자가 정보에 입각한 선택을 내리는 데 도움이 될 수 있습니다.
예
import numpy as np
# Define the function to be evaluated
def function(x):
return x**2
# Generate random samples from a uniform distribution between 0 and 1
samples = np.random.uniform(0, 1, size=10000)
# Evaluate the function at each sample
values = function(samples)
# Compute the average of function values
mean_value = np.mean(values)
print("Mean value of the function: ", mean_value)
산출
Mean value of the function: 0.3326046914715845위의 코드는 몬테카를로 시뮬레이션을 사용하여 함수의 평균값을 추정하는 방법에 대한 매우 간단한 예를 보여줍니다. 다수의 무작위 샘플을 생성한 다음 각 샘플에서 함수를 평가함으로써 평균의 대략적인 값을 쉽게 얻을 수 있습니다. 추정의 정확성은 생성되는 샘플 수와 평가할 함수의 복잡성에 따라 크게 달라집니다.
부트스트랩
부트스트랩은 데이터를 복원하여 다시 샘플링하여 추정기의 샘플링 분포를 추정하는 통계적 방법입니다. 이는 추정량의 변동성을 추정하고 신뢰 구간을 구성하는 데 사용할 수 있는 강력한 기술입니다. 이 방법은 1979년 브래들리 에프론(Bradley Efron)에 의해 처음 소개되었습니다.
부트스트랩은 표본 크기가 작거나 모집단 분포가 알려지지 않았거나 복잡하고 중심 극한 정리와 같은 전통적인 방법을 적용할 수 없는 경우 특히 유용합니다.
부트스트랩의 기본 단계는 다음과 같습니다.
데이터 샘플을 수집합니다.
원본 샘플에서 엄청난 수의 부트스트랩 샘플(교체 포함)을 추출합니다.
-
각 부트스트랩 샘플에 대해 관심 있는 추정량(예: 평균, 표준 편차 등)을 계산합니다.
부트스트랩 표본에서 계산된 추정량 분포를 사용하여 모집단에 대해 추론합니다.
부트스트랩은 평균, 표준 편차, 회귀 계수 등을 포함한 광범위한 추정에 적용될 수 있습니다. 또한 모집단 매개변수에 대한 가설을 검정하는 데 사용할 수 있는 t-통계량과 같은 검정 통계량의 분포를 추정하는 데에도 사용할 수 있습니다.
다음은 부트스트랩 방법을 사용하여 데이터 샘플의 표준 편차를 추정하고 95% 신뢰 구간을 구성하는 방법의 예입니다.
예
import numpy as np
# original sample
data = [1, 2, 3, 4, 5]
# number of bootstrap samples
n_samples = 1000
# array to store the bootstrap samples standard deviation
std_devs = np.empty(n_samples)
# generate bootstrap samples
for i in range(n_samples):
sample = np.random.choice(data, size=len(data), replace=True)
std_devs[i] = np.std(sample)
# calculating the lower as well as upper bound of the confidence interval
alpha = 0.05
lower = np.percentile(std_devs, alpha/2*100)
upper = np.percentile(std_devs, (1-alpha/2)*100)
print(f'Confidence interval: [{lower}, {upper}]')산출
Confidence interval: [0.4898979485566356, 1.7435595774162693]이 예에서는 원래 샘플에서 1000개의 부트스트랩 샘플을 추출하고 각 샘플의 표준 편차를 계산합니다. 그런 다음 np.percentile() 함수를 사용하여 표준 편차 분포를 사용하여 95% 신뢰 구간의 하한과 상한을 계산합니다.
마르코프 체인 몬테카를로(MCMC)
MCMC(Markov Chain Monte Carlo)는 복잡한 확률 분포의 매개변수를 추정하는 데 사용되는 알고리즘 클래스입니다. 이러한 알고리즘은 원하는 확률 분포를 평형 분포로 갖는 마르코프 체인을 구성합니다. 체인을 시뮬레이션함으로써 이 분포에서 샘플을 생성할 수 있으며, 이는 통계적 추론에 사용될 수 있습니다.
MCMC의 기본 아이디어는 목표 분포를 고정 분포로 갖는 마르코프 체인을 구성하는 것입니다. 그런 다음 체인은 여러 단계에 걸쳐 실행되며 샘플은 정기적으로 수집됩니다. 그런 다음 이러한 표본을 사용하여 목표 분포의 모수를 추정합니다.
다음은 Metropolis-Hastings 알고리즘(MCMC의 하위 부분)을 사용하여 정규 분포에서 샘플링하는 방법의 예입니다.
예
import numpy as np
# target distribution
mean = 0
std = 1
target = lambda x: 1/(std * np.sqrt(2 * np.pi)) * np.exp(-(x - mean)**2 / (2 * std**2))
# proposal distribution
proposal_mean = 0
proposal_std = 2
proposal = lambda x: 1/(proposal_std * np.sqrt(2 * np.pi)) * np.exp(-(x - proposal_mean)**2 / (2 * proposal_std**2))
# initial state
x = 0
# number of samples
n_samples = 10000
# array to store the samples
samples = [x]
# Metropolis-Hastings algorithm
for i in range(n_samples):
x_new = np.random.normal(x, proposal_std)
acceptance_prob = min(1, target(x_new) / target(x))
if np.random.rand() < acceptance_prob:
x = x_new
samples.append(x)
# plot the samples
import matplotlib.pyplot as plt
plt.hist(samples, bins=50, density=True)
plt.show()
산출
이 스크립트는 Metropolis-Hastings 알고리즘을 사용하여 평균이 0이고 표준편차가 2인 정규 제안 분포를 사용하여 평균이 0이고 표준편차가 1인 정규 분포에서 샘플 시퀀스를 생성합니다. 이 경우 알고리즘은 초기 상태로 시작합니다. 0으로 설정한 다음 제안 분포에서 새 값을 제안하여 새 상태를 생성합니다. 새로운 값은 목표와 제안 분포의 비율을 기반으로 계산된 수락 확률에 의해 결정된 확률로 수락됩니다.
확률적 프로세스 시뮬레이션
확률론적 프로세스 시뮬레이션은 시간에 따른 무작위 동작 시뮬레이션을 포함하는 통계적 시뮬레이션 클래스입니다. 이는 주가, 날씨 패턴, 생물학적 인구와 같이 무작위성을 나타내는 복잡한 시스템을 모델링하고 분석하는 데 사용됩니다.
확률론적 프로세스는 동작이 무작위성의 영향을 받는 시스템을 설명하는 수학적 모델입니다.
예
import numpy as np
import matplotlib.pyplot as plt
# Parameters
p = 0.5 # probability of coin being a head
T = 10 # defining the number of time steps
# Initial state
x = 1
# Random number generator
np.random.seed(0)
# Array to store the states
states = [x]
# Simple stochastic process simulation
for t in range(T):
x = 1 if np.random.rand() < p else 0
states.append(x)
print(states)
# Plot the states
plt.step(range(T+1), states, where='post')
plt.xlabel('Time')
plt.ylabel('State')
plt.ylim(-0.5,1.5)
plt.show()
산출
[1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1]기타 기본 예
다음은 주사위 굴리기를 시뮬레이션하는 예입니다.
예
import numpy as np
# Generate random samples from a uniform distribution between 1 and 6
samples = np.random.randint(1, 7, size=10000)
# Compute the average and the standard deviation of the samples
sample_mean = np.mean(samples)
sample_std = np.std(samples)
print("Sample mean: ", sample_mean)
print("Sample standard deviation: ", sample_std)산출
Sample mean: 3.4946
Sample standard deviation: 1.7094358250604205결론
통계 시뮬레이션은 복잡한 시스템과 프로세스를 이해하고 분석하는 데 도움이 되는 강력한 도구입니다. Python은 통계 시뮬레이션을 쉽게 구현하고 수행할 수 있는 다양한 도구와 라이브러리를 제공합니다.
통계 시뮬레이션의 주요 이점은 복잡한 시스템과 프로세스를 모델링할 수 있을 뿐만 아니라 다양한 매개변수와 변수가 결과에 미치는 영향을 조사할 수 있다는 것입니다. 이 응용 프로그램은 거의 모든 분야에 유용합니다.
NumPy, SciPy 및 Pandas는 무작위 샘플 생성, 함수 평가 및 통계 분석 수행에 유용한 일부 라이브러리의 예입니다.
전반적으로 통계 시뮬레이션은 데이터 과학 또는 관련 분야에서 일하는 모든 사람에게 필수적인 도구이며 Python은 이러한 시뮬레이션을 구현하기 위한 유연하고 강력한 플랫폼을 제공합니다. 통계 시뮬레이션의 힘을 활용함으로써 우리는 복잡한 시스템과 프로세스에 대한 새로운 통찰력을 얻고 분석을 기반으로 더 많은 정보에 입각한 결정을 내릴 수 있습니다.

