사이트맵  |  Contact Us
 
홈 > SAS Tech & Tip > SAS Programming
[SAS 프로그래밍] Mixture 분포 생성 실습 2019.07.31
박세훈 65 0
http://www.mysas.co.kr/sas_tiptech/a_question.asp?b_no=11154&cmd=content&bd_no=5

Mixture Distribution

 

1. Introduction

안녕하세요 박세훈입니다. 지난 시간 우리는 Mixture Distribution을 통해 새로운 분포를 만들어 Median값을 예측해 보았습니다.

 

 통계학과 관련한 일을 하시는 분들이라면분포에 대해 많은 얘기들을 들어오셨을 겁니다. 모집단은 정규분포를 가정한다. 어떤 샘플은 OO분포로 이루어져 있다. 등등 처럼요. 그런데 사실 실생활 데이터는 어느 한 가지의 분포로 정의될 수 없습니다. 세상엔 무수히 많은 변수들이 존재하기 때문이죠. 이번에는 Mixture 분포에 대한 실습을 진행해보도록 하겠습니다.

 

예를 들어 콜센터에서 통화에 응답하는데 필요한 시간을 모델링한다고 가정합니다. 통화의 종류에 따라 분포가 다를 것이기에 이를 전부 반영하고 싶습니다. 아래에선 3가지의 통화 종류로 구분하여 보았습니다.

 

2. Data

통화 유형별 모델링을 통해 각각의 분포를 가정합니다.

  1. 받기 쉬운 전화’, ‘Easy Calls’ 의 경우 N(4,1)의 정규분포를 따름. 모든 전화 중 50%

  2. ‘Specialized Calls’의 경우 N(8,2)의 정규 분포를 따름. 모든 전화 중 30%

  3. ‘Hard Calls’ 의 경우 N(10,3)의 정규 분포를 따음. 모든 전화 중 20%

만약 여러분이 이 콜센터를 모델링하고 싶다면, 각각의 분포와 비율을 적용하여 샘플링을 합니다.

<code1>

 

/* 혼합 분포 샘플링 */

%let N = 250;

data Calls(drop=i);

call streaminit(12345);

array prob [3] _temporary_ (0.5 0.3 0.2); /* 비율 적용 */

do i = 1 to &N;

   type = rand("Table", of prob[*]);

   if type=1 then      Time = rand("Normal", 4, 1); /* easy calls */

   else if type=2 then Time = rand("Normal", 8, 2); /* specialized */

   else                Time = rand("Normal", 10, 3); /* hard */            

   output;

end;

run;

샘플링 250개의 데이터는 다음과 같습니다.

 

3. Visualization

proc univariate data=Calls;

ods select Histogram;

histogram Time / vscale=proportion

         kernel(lower=0 c=SJPI); /* 히스토그램에 곡선 생성 */             

run;

그래프를 보시면 세 개의 정규분포가 합쳐진 것을 확인할 수가 있습니다. 각각의 비율에 따라 분포 비율도 정해진 것이 보입니다.

 

4. Advacned

때떄로, 분포는 데이터에 따라 3가지가 아니라 수십가지가 될 수도 있습니다. 그럴 땐 IML 행렬을 이용하여 작성하면 손쉽게 샘플링을 할 수 있습니다.

<code3>

proc iml;

N = &N;

call randseed(12345);

prob = {0.5 0.3 0.2};/* 비율 지정*/

Type = j(N, 1); /* 벡터 할당*/

call randgen(Type, "Table", prob); /* 비율별로 type 1, 2, 3 랜덤생성 */

mean = {4 8 10};

sd   = {1 2  3};

Time = j(N,1); /* 벡터 할당*/

do i = 1 to ncol(prob);

   idx = loc(Type=i); /* 범주 식별*/

   if ncol(idx) > 0 then do;

      x = j(ncol(idx),1);

      call randgen(x, "Normal", mean[i], sd[i]);

      Time[idx] = x; /* 시간 데이터 생성*/

   end;

end;

 

5. Conclusion

이번 포스팅으로 알아 두면 좋은 것들은 다음과 같습니다.

  • 모든 범주는 RANDGEN 호출을 통해 전부 생성 가능하다.

  • LOC함수로 범주를 식별할 수 있다. (색인)

  • 생성하고자 하는 Time 값은 전부 독립적인 정규분포로부터 생성한다.

  • 위의 시뮬레이션 한 분포는 통화 유형별로 예상 호출 수를 처리하기 위한 모델링 준비 과정에 이용할 수 있다.

 

 
 
휴대폰 번호
휴대폰 인증번호
 
 [SAS 프로그래밍] Hessian Matrix 추출 및 생성 실습
 [SAS 프로그래밍] Monte-Carlo 와 Traditional 방법론의 중위수 탐색 성능 비교