2012/10/11

PDL, PDL::Stats 예제 이항분포

앞서 올린 PDL, PDL::Stats 로 기본 통계량 계산하기 에 이어 이항분포에 대한 예를 들어보면 다음과 같다.

이항분포는  연속된 n번의 독립적 시행에서 각 시행이 확률 p를 가질 때의 확률분포를 말하는데 말로 하는 것 보다 다음 그림을 보면 그 의미가 명확해진다.

위 틀의 꼭대기에서 구슬을 떨어뜨리면 각 층에서 좌우로 갈 확률p는 반반(1/2)으로 각층을 통과 하며(독립시행) 구슬이 제각각의 칸으로 떨어지게 되는데 아래 구슬이 쌓인 모양이 바로 이항분포가 되는 것이다.

 그러면 n=30, p=0.5 일때 이항분포의 확률질량함수 PMF[Probability Mass Function](연속확률변수의 PDF에 해당), 누적분포함수 CDF[Cumulative Distribution Function] 의 예를 코딩해 보면 다음과 같다.

#!/usr/bin/env perl
use 5.010;
use PDL;
use PDL::Stats;
use PDL::GSL::CDF;
use Math::GSL::Randist qw/gsl_ran_binomial_pdf/;
use PDL::Graphics::PGPLOT::Window;

my $win1 = pgwin();
my $x = sequence(30);
$win1->env(0,30,0,1,{Title=>'binomial distribution'});
$win1->hold();

#CDF
# gsl_cdf_binomial_P는 PDL::Stats에 포함된 PDL::GSL::CDF 모듈의 함수
$win1->bin($x, gsl_cdf_binomial_P($x, 0.5, 30),{COLOR=>'RED'});

#PMF
# Math::GSL::Randist의 gsl_ran_binomial_pdf 함수를 사용
# PDL용 함수가 아니라서 piddle을 계산하지 못하므로 map으로 piddle $x내부의 값을
# map 함수를 사용하여 리스트를 순회하며 적용
$win1->bin($x, [ map { gsl_ran_binomial_pdf($_, 0.5, 30) } $x->list ], {COLOR=>'BLUE'});
# PDL::Stats::Distr의 pmf_binomial 함수를 사용할 시
# $win1->bin($x, $x->pmf_binomial(30, 0.5), {COLOR=>'BLUE'}); 

#동전을 30번 던졌을때 12번 앞면이 나올 확률
# PMF 그래프 가로축 12일때 세로축의 값
say gsl_ran_binomial_pdf(12, 0.5, 30) * 100, " %";
#say piddle(12)->pmf_binomial(30, 0.5) * 100, " %"; # pmf_binmoial 함수를 사용할 시
#동전을 30번 던졌을때 12번 이하로 앞면이 나올 확률
# CDF 그래프 가로축 12일때 세로축의 값
# 결론적으로 12까지의 PMF그래프 값을 누적한(적분) 것
say gsl_cdf_binomial_P(12, 0.5, 30) * 100, " %";


<결과>


8.05530929937956 %
18.0797304026779 %

위 그래프에서 파란색이 PMF이고 빨간색이 CDF이다. PMF그래프 아래의 면적을 구하면 1이 되고 CDF는 0에서 시작하여 1까지 증가한다는 사실을 보면 확률의 분포와 누적확률이 시각적으로 느껴질 것이라고 본다.

댓글 없음:

댓글 쓰기