scipy.stats
파이썬의 모듈 scipy.stats는 이산변수와 연속변수에 대한 거의 모든 확률분포를 나타낼 수 있는 질량(밀도)함수, 누적함수, 기본통계량, 모멘트 등의 함수들을 제공합니다. 표 1는 scipy.stats 모듈에서 제공하는 확률분포와 각 클래스 명칭을 나타낸 것입니다.
종류 | 클래스 이름 | 확률분포 |
---|---|---|
이산 | bernoulli | 베르누이분포 |
binom | 이항 분포 | |
연속 | uniform | 균일 분포 |
norm | 가우시안 정규 분포 | |
beta | 베타 분포 | |
gamma | 감마 분포 | |
t | 스튜던트 t 분포 | |
chi2 | 카이 제곱 분포 | |
f | F 분포 | |
dirichlet | 디리클리 분포 | |
multivariate_normal | 다변수 가우시안 정규 분포 |
표 1의 각 클래스는 분포의 다양한 통계량들을 계산하기 위한 메서드들을 포함합니다(표 2). 또한 확률 분포의 객체를 생성하기 위해 전달할 모수(parameter)는 표 3과 같습니다. 메서드마다 요구되는 모수가 다르므로 scipy.stats의 각 분포의 설명을 참조합니다. 예를 들어 정규분포의 경우는 scipy.stats.norm 참조합니다.
메서드 | 기능 |
---|---|
rvs | 분포에 부합하는 랜덤 샘플 생성 (random variable sampling) |
pmf | 확률 질량 함수 (probability mass function) |
확률 밀도 함수 (probability density function) | |
logpmf, logpdf | 로그확률 밀도 함수 |
cdf | 누적 분포 함수 (cumulative distribution function) |
logcdf | 누적분포함수의 로그화 값 |
sf | 생존함수(survial function)=1-cdf |
ppf | 누적확률에 해당하는 값을 반환 |
isf | 생존함수의 역수 |
moment | 각 분포의 모멘트를 계산 |
stats | 기술 통계량 반환(descriptive statistics) |
expect | pdf를 인수로 하여 기대값을 계산 |
median | 분포의 중간값 계산 |
mean | 분포의 평균값 계산 |
var | 분포의 분산값 계산 |
std | 분포의 표준편차 계산 |
interval | 신뢰구간 계산(confidence interval) |
fit | 모수 추정 (parameter estimation) |
모수 또는 인수 | 의미 |
---|---|
n | 샘플 수 |
p | 단일 시행에서의 확률 |
loc | 분포의 이동(shift)에 관계된 인자로 연속분포에서는 기댓값(평균), 이산분포의 경우는 변수의 중심이동(x - loc)을 나타냄 |
scale | 분포의 퍼짐에 관계된 인자로 일반적으로 분포의 표준편차 |
size | 샘플 생성시 생성될 샘플의 크기 |
random_state | 랜덤 샘플의 재현을 위해 정수를 지정 |
평균이 2, 분산이 3인 정규분포를 작성해 봅니다. 이 조건에 부합하는 랜덤 샘플을 생성합니다. 생성된 객체의 정규분포를 작성하기 위해서는 객체를 올림차순으로 정렬할 필요가 있습니다. 그러므로 np.sort() 함수를 적용하여 정렬합니다.
from scipy.stats import norm
x=np.sort(norm.rvs(loc=2, scale=np.sqrt(3), size=1000, random_state=3)) x[:5]
array([-3.168388 , -3.1565323 , -3.05020593, -2.65074465, -2.63587099])
y=norm.pdf(x, loc=2, scale=np.sqrt(3)) y[:5]
array([0.00268444, 0.00273977, 0.00328297, 0.00626267, 0.00640851])
다음 코드는 위 코드에서 생성한 확률변수들에 대한 확률분포에 대한 그래프를 파이썬의 패키지 matplotlib를 사용하여 작성한 것입니다. 이 패키지를 사용하여 그래프를 작성하기 위해서는 matplotlib.pyplot.figure() ~ matplotlib.pyplot.show()의 내부에 그림의 내용을 작성합니다.
코드 내의 인수 figsize=(가로, 세로)를 지정하여 그림의 크기를 지정합니다. 히스토그램을 작성하기 위해 .hist()
함수, 선그래프를 작성하기 위한 함수 .plot()
을 사용하였습니다(그림 1).
import matplotlib.pyplot as plt plt.figure(figsize=(5,3)) plt.hist(x, bins=10, density=True, alpha=0.2, rwidth=0.8) plt.plot(x, y, color="r") plt.xlabel("x", size="13") plt.ylabel("Prob.Density", size="13") plt.show()
이 분포의 기술 통계는 scipy.stats.describe()
에 의해 산출됩니다.
stats.describe(x)
DescribeResult(nobs=1000, minmax=(-3.168388003127273, 8.412845780424881), mean=2.0299373428977434, variance=3.053676846877514, skewness=-0.007269929512761972, kurtosis=-0.06928694200380514)
위의 기술통계량과는 다른 종류를 반환하는 pandas의 메소드 .describe()를
적용할 수 있습니다.
pd.Series(x).describe()
count 1000.000000 mean 2.029937 std 1.747477 min -3.168388 25% 0.814664 50% 2.067637 75% 3.270925 max 8.412846 dtype: float64
댓글
댓글 쓰기