2012/10/12

PDL, PDL::Stats 예제 정규분포

정규분포(가우스분포)는 앞서 올린 이항분포의 n이 아주 커질 경우 근사적으로 따르게되는 확률분포이며(참고) 통계학에서 기본이 되는 연속확률변수 이다. 평균과 표준편차가 다른 많은 정규분포가 존재할 수 있으나 z점수를 통해 평균 0, 표준편차 1 인 표준정규분포로 변환해서 계산가능하다. 계산기 및 컴퓨터가 발달하지 않았던 옛날에는 주로 미리 계산된 표를 통해서 계산했지만 요즘에서는 굳이 그럴 필요없이 컴퓨터에 미리정의된 함수를 활용하면 간단하다.

다음은 표준정규분포의 확률밀도함수(PDF)와 누적분포함수(CDF)를 그리고 정규분포을 이용해서 몇가지 예에 대해 계산하는 코드이다.

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

# 정규분포
my $win = pgwin();
my $x = zeroes(100)->xlinvals(-4, 4);
$win->env(-4,4,0,1,{Title=>'standard normal(gaussian) distribution'});
$win->hold();
#CDF
$win->line($x, gsl_cdf_gaussian_P($x,1), {COLOR=>'RED'});
#PDF
$win->line($x, [ map { gsl_ran_gaussian_pdf($_, 1) } $x->list ], {COLOR=>'BLUE'});
# PDL::Stats::Distr의 pdf_gaussian 함수 사용시
#$win->line($x, $x->pdf_gaussian(0, 1), {COLOR=>'BLUE'});

# 시험결과 학생들의 성적이 평균이 63점 분산이 100인 정규분포를 따른다고 하면
# 50점 미만의 학생은 몇 %인가 ?
# Z = (50-63)/sqrt(100) 이므로
say gsl_cdf_gaussian_P((50-63)/sqrt(100), 1)*100, " %";

# 상위 10%에게 A를 주면 A를 받기 위해서 몇점 이상이 되어야 하는가?
my $Z = gsl_cdf_gaussian_Pinv(0.9, 1); # 표준정규분포에서 하위(100-10)=90% 위치의 Z값
# Z = (X-63)/sqrt(100) 이므로 점수X는
say $Z*sqrt(100)+63


<결과>
9.68004845856103 %
75.815515655446


그래프에서 파란색이 PDF, 빨간색이 CDF의 그래프이다. 표준정규분포의 확률변수구간은 음의무한대에서 양의 무한대 까지이나 -4~4구간만 그렸으며 PDF아래의 면적이1 CDF는 PDF를 구간별로 적분한 값으로 0에서 1에 수렴한다.

댓글 없음:

댓글 쓰기