9장. SAS 함수와 응용 단원이다.
엑셀에서 함수를 말하면 뭐라고 생각되는가?
연산을 위한 명령어가 아닐까?
책에는 엄청난 숫자의 함수가 적혀있다.
일단 뭐 적어보도록 하자.

1. 연산 함수
   ABS(argument): 절대값을 계산한다(돌려준다)
   DIM(ARRAY명): ARRAY문의 원소들의 수를 계산한다.
   HBOUND(ARRAY명): ARRAY에 사용된 원소들은 상한을 리턴한다.
   LBOUND(ARRAY명): ARRAY에 사용된 원소들의 하한을 리턴한다.
   MAX(argument, argument, ...): 최대값
   MIN(argument, argument, ...): 최소값
   MOD: 나눗셈에서의 나머지를 구한다
   SIGN: 변수의 부호 또는 0

2. Truncation(절단, 끝을 잘라냄) 함수
   CEIL(argument): 변수보다 큰 수이면서 제일 작은 정수 - 올림
   FLOOR(argument): 변수보다 적은 수이면서 제일 큰 정수 - 내림
   INT(argument): 정수 부분만을 취한다
   ROUND(argument, 반올림단위): 반올림의 값

3. 수학적 연산함수
   DIGAMMA: gamma 함수의 log 미분값
   ERF: error function (에러 기능)
   ERFC: error function의 complement (에러 기능 보충)
   EXP: 지수함수
   GAMMA: complete gamma function (완벽한 감마 기능 -_-;)
   LGAMMA: 주어진 값의 gamma function의 자연로그 계산
   LOG: 자연로그(base가 e)
   LOG2: base가 2인 log
   LOG10: 상용로그(우리가 일반적으로 쓰는 로그)

4. 삼각함수와 Hyperbolic(쌍곡선) 함수와 관련된 기능
   SIN(argument): sine 계산
   COS(argument): cosine 계산
   TAN(argument): tangent 계산
   ARSIN(argument): arc sine 계산
   ARCOS(argument): arc cosine 계산
   ATAN(argument): arc tangent 계산
   COSH(argument): hyperbolic cosine 계산
   SINH(argument): hyperbolic sine 계산
   TANH(argument): hyperbolic tangent 계산

5. 통계 관련 함수
   CSS(argument, argument, ...): 수정된 자승합
   CV(argument, argument, ...): 변이계수(Coefficient of Variation)
   KURTOSIS(argument, argument, ...): 첨도
   MAX(argument, argument, ...): 최대값
   MIN(argument, argument, ...): 최소값
   MEAN(argument, argument, ...): 산술평균값
   N(argument, argument, ...): 계산에 이용된 Missing이 아닌 자료의 수
   NMISS(argument, argument, ...): Missing 자료의 수
   RANGE(argument, argument, ...): 범위
   SKEWNESS(argument, argument, ...): 왜도
   STD(argument, argument, ...): 표준편차
   STDERR(argument, argument, ...): 표준오차
   SUM(argument, argument, ...): 합계
   USS(argument, argument, ...): 자승합

6. 통계적 확률분포와 관련된 함수
   POISSON(lamde, x): 모수 lamda인 Poisson 확률변수의 분포함수 값 F(x)를 계산한다.
   PROBBETA(x, a, b): 모수가 a, b인 베타분포의 분포함수 값 F(x)를 계산한다.
   PROBBNML(p, n, x): 모수가 n, p인 이항분포의 분포함수 값 F(x)를 계산한다.
   PROBCHI(x, df): 자유도가 df인 카이자승분포의 분포함수 값 F(x)를 계산한다.
   PROBF(x, ndf, ddf): 자유도가 ndf, ddf인 F 분포의 분포함수 값 F(x)를 계산한다.
   PROBGAM(x, a): shape parameter가 a인 감마분포의 분포함수 값 F(x)를 계산한다.
   PROBHYPR: 초기하분포의 분포함수의 값 F(x)를 계산한다.
   PROBNEGB: 이항분포의 분포함수의 값 F(x)를 꼐산한다.
   PROBNORM(x): 표준정규분포의 분포함수의 값 F(x)를 계싼한다.
   PROBT(x, df): 자유도가 df인 t 분포의 분포함수의 값 F(x)를 계산한다.

7. Quantile(변위치) 함수
   BETAINV(p, a, b): 모수가 a, b인 베타확률분포에서 100p% 백분위수를 계산한다.
   CINV(p, df): 자유도가 df인 카이자승분포에서 100p% 백분위수를 계산한다.
   FINV(p, ndf, ddf): 자유도가 ndf, ddf인 F 분포에서 100p% 백분위수를 계산한다.
   GAMINV(p, a): 감마분포의 역함수
   PROBIT(p): 표준정규분포에서 100p% 백분위수를 계산한다.
   TINV(p, df): 자유도가 df인 t분포에서 100p% 백분위수를 계산한다.

8. 난수발생과 관련된 기능
   NORMAL(seed): 표준정규분포를 따르는 확룰변수의 난수를 만든다.
   RANBIN(seed): 모수(parameter)가 n, p인 이항분포의 난수를 만든다.
   RANCAU(seed): Location Parameter 값이 0이고, Scale Parameter 값이 1인 Cauchy 분포 f(x)=1(1+x2)를 따르는 난수를 만든다.
   RANEXP(seed): 모수의 값이 1인 지수분포 f(x)=exp(-x), x>0인 난수를 만든다.
   RANGAM(seed, a): Shape Parameter가 a인 감마분포의 난수를 만든다.
   RANNOR(seed): 표준정규분포를 따르는 난수를 만든다(Box-Muller)방법
   RANPOI(seed, lamda): 모수가 lamda인 Poisson 분포로부터 난수를 만든다.
   RANTBL(seed, p1, ... pn): Probability Mass Function 형태로 주어진 이산확률분포를 따르는 난수를 만든다.
   RANTRI(seed): (0, 1) 구간에서 Triangular 분포를 따르는 난수를 만든다.
   RANUNI(seed): (0, 1) 구간에서 Uniform Distribution을 따르는 난수를 만든다.
   UNIFORM(seed): (0, 1) 구간에서 Uniform Distribution을 따르는 난수를 만든다.

9. 문자 함수(Character Function)에 관한 기능
   BYTE(n): n에 해당되는 ASCII 코드를 리턴한다. n은 0부터 256까지이다.
   COMPRESS: 문자변수의 일부를 제거할 때 이용
   INDEX(source, 찾는 문자): source에서 찾는 문자의 위치를 계산한다.
   INDEXC(source, 찾는문자1, 찾는 문자2, ...): source에서 찾는 문자의 위치를 계산한다.
   LEFT(argument): 왼쪽의 빈칸을 제거
   LENGTH(argument): 인수로 주어진 변수의 길이를 계산한다.
   LOWCASE(argument): 대문자를 소문자로 변환한다.
   RANK(argument): 문자의 ASCII 코드를 반환한다.
   REVERSE(argument): 문자의 내용을 거꾸로 배열한다.
   RIGHT(argument): 오른쪽의 빈칸을 제거
   SUBSTR: 문자에서의 일부를 추출
   TRANSLATE(source, 새로운 문자, 원래 문자): Source에서 특정 문자 열을 바꾸고자 할 때
   TRIM: 빈칸을 제거
   UPCASE(argument): 소문자를 대문자로 변환
※ 예  a=COMPRESS(aa, ' ');  문자변수 aa에서 빈칸을 제거하여 변수 a에 저장
         a=substr(aa, 7, 3): 문자변수 aa 값에서 7번째 문자에 3개를 골라 변수 a에 저장

10. 날짜 계산과 관련된 기능
   DATE(): 현재의 날짜를 SAS Date 값으로 변환한다.
   DATEJUL(julian-date): julian-date를 SAS Date 값으로 변환한다.
   DATETIME(): 현재의 시간과 날짜를 계산한다.
   DAY(date): SAS Date 값으로부터 그 달의 날짜를 계산한다.
   DHMS(date, hour, minute, second): date, hour, minute, second로부터 SAS Datetime을 계산한다.
   이 외에도 다음과 같은 것들이 있는데 도움말을 참조하기 바란다고 씌여있다.
   DATEPART, DATETIME, HMS, HOUR, INTCK, INTNX, JULDATE, MDY, MINUTE, MONTH,
   QTR, SECOND, TIME, TIMEPART, TODAY, WEEKDAY, YEAR, YYQ

11. 기타 특별한 기능
   LAG<n>(argument): SAS에서는 두 변수의 함과 차이는 쉽게 구할 수 있다. 그러나 현재의 관측치와 이전의 관측치의 합이나 차이는 쉽게 구할 수 없다. 바로 앞의 자료를 구하는 것이 LAG() 함수이다. LAG(x)하면 변수 x의 바로 이전 자료를 구하고, LAG2(x)하면 두 번째 앞의 자료를 구할 수 있다.
   DIF<n>(argument): DIF() 함수는 현재의 자료와 이전 자료 Lag"n"과의 차이를 계산한다.
   INPUT(source, informat.): SAS 작업을 하다보면 문자변수를 숫자변수로 바꾸어야 할 필요가 종종 생기게 되는데 이때 유용하게 사용되는 것이 INPUT() 함수이다.
   PUT(source, format.): INPUT과는 반대로 숫자변수를 문자변수로 바꾸어야 할 경우에는 PUT() 함수를 사용한다.

이걸 어찌 다 알겠는가.. 통계학 전공도 아니라서 대체 뭔소리를 하는건지 전혀 모르는 것도 많다.
따로 공부를 해야 하는걸까... 후덜덜덜..

뒤로는 다 예제이다. 실습을 통해 알아보도록 하자.
♥♥♥♥♥
DATA a1;INPUT x y1 y2 y3 z;CARDS;                                                                                                      
-1 10 20 30 112                                                                                                                        
DATA b1;SET a1;                                                                                                                        
xabs=ABS(x);                      /*  xabs변수에 절대값 1   */                                                                         
ARRAY yyy y1-y3 z;                                                                                                                     
ydim=DIM(yyy);                    /*   ARRAY의 개수 4   */                                                                             
yhbound=HBOUND(yyy);              /*   ARRAY의 상한 4   */                                                                             
ylbound=LBOUND(yyy);              /*   ARRAY의 하한 1   */                                                                             
ymax=MAX(x,y1,y2,z); ymin=MIN(x,y1,y2,z);                                                                                              
                   /* ymax는 최대값 112, ymin은 최소값 -1 */                                                                           
zmod=mod(z,100);   /* 112를 100으로 나눈 나머지  12       */                                                                           
xsign=SIGN(x); zsign=SIGN(z);                                                                                                          
                   /* SIGN함수는 값이 음수인 경우 -1, 양수인 경우  1을 나타냄  */                                                      
PROC PRINT;VAR xabs ydim yhbound ylbound ymax ymin zmod xsign zsign;                                                                   
                                                                                                                                       
DATA a1;                                                                                                                               
xceil=CEIL(3.2);  yceil=CEIL(-3.2);                                                                                                    
       /* 3.2 올림은 4, -3.2 올림은 -3    */                                                                                           
xfloor=FLOOR(3.7);yfloor=FLOOR(-3.7);                                                                                                  
        /* 3.7 내림은 3, -3.7 내림은 -4    */                                                                                          
xint=INT(3.7);    yint=INT(-3.7);                                                                                                      
        /* 3.7 정수는 3, -3.7 정수는 -3    */                                                                                          
xround1=ROUND(3.7);xround2=ROUND(3.2);                                                                                                 
        /* 3.7 반올림은 4, 3.2 반올림은 3  */                                                                                          
yround1=ROUND(-3.7);yround2=ROUND(-3.2);                                                                                               
        /* -3.7 반올림은 -4, -3.2 반올림은 -3*/                                                                                        
PROC PRINT;                                                                                                                            
RUN;
♥♥♥♥♥
                                                        SAS 시스템            2007년 02월 21일 수요일 오후 06시22분36초   1

                    OBS    xabs    ydim    yhbound    ylbound    ymax    ymin    zmod    xsign    zsign

                     1       1       4        4          1        112     -1      12       -1       1

                                                        SAS 시스템            2007년 02월 21일 수요일 오후 06시22분36초   2

           OBS    xceil    yceil    xfloor    yfloor    xint    yint    xround1    xround2    yround1    yround2

            1       4        -3        3        -4        3      -3        4          3          -4         -3

♥♥♥♥♥
여기서 간혹 실수를 범하는 경우가 있는데 변수의 합계를 구하고자 할 때, 예를 들어 sumx=x1+x2+x3; 으로 하면 x1, x2, x3중 하나가 Missing이 있는 경우에는 sumx가 Missing이 되는데 sumx=sum(x1-x3); 으로 하면 Missing 자료를 0으로 간주하여 계산되므로 주의를 해야하며, 이 경우 mean()의 경우에도 마찬가지이다.


♥♥♥♥♥
DATA binomial;
binprob1=PROBBNML(0.1,10,4); /* 불량율이 0.1 일때, 10개중에 4개 까지 불량일  확률     */
binprob2=PROBBNML(0.1,10,3); /* 불량율이 0.1 일때, 10개중에 3개 까지 불량일  확률     */
binprob=binprob1-binprob2;   /* 불량율이 0.1 일때, 10개중에 4개 불량일 확률           */
PROC PRINT;
DATA normal;
norprob=PROBNORM(1.96);     /* 표준정규분포에서 1.96시그마에 해당되는 누적확률 0.975 */
norvalue=PROBIT(0.975);     /* 표준정규분포에서  누적확률 0.975에 해당되는 값  1.96  */
PROC PRINT;
RUN;
DATA t;
tprob=PROBT(1.812,10);       /* t분포에서 자유도가 10 일때 1.812 보다 적을 확률, 0.95 */
tvalue=TINV(0.95,10);        /* t분포에서 자유도가 10 일때 누적확률 0.95일때의 t 값,  1.81246  */
PROC PRINT;
RUN;
DATA chi;
chiprob=PROBCHI(3.94,10);    /* 카이자승분포에서 자유도가 10 일때 3.94 보다 적을 확률, 0.05 */
chivalue=CINV(0.05,10);      /* 카이자승분포에서 자유도가 10 일때 누적확률 0.05일때의 카이자승 값, 3.94030 */
PROC PRINT;
RUN;
DATA f;
fprob1=PROBF(3.33,5,10);     /* F분포에서 자유도가 5, 10 일때 3.33 보다 적을 확률, 0.95          */
fvalue1=FINV(0.95,5,10);     /* F분포에서 자유도가 5, 10 일때 누적확률 0.95 일때의 F 값, 3.32583 */
fvalue2=FINV(0.05,10,5);     /* F분포에서 자유도가 10, 5 일때 누적확률 0.95 일때의 F 값, 0.30068 */
fvalue3=1/fvalue2;           /* F분포에서 자유도가 10, 5 일때 누적확률 0.95 일때의 F 값의 역수 , 3.32583 */
PROC PRINT;
RUN;

♥♥♥♥♥
                                                        SAS 시스템            2007년 02월 21일 수요일 오후 06시22분36초   3

                                          OBS    binprob1    binprob2     binprob

                                           1      0.99837     0.98720    0.011160

                                                        SAS 시스템            2007년 02월 21일 수요일 오후 06시22분36초   4

                                                OBS    norprob    norvalue

                                                 1     0.97500     1.95996

                                                        SAS 시스템            2007년 02월 21일 수요일 오후 06시22분36초   5

                                                 OBS     tprob      tvalue

                                                  1     0.94996    1.81246

                                                        SAS 시스템            2007년 02월 21일 수요일 오후 06시22분36초   6

                                                OBS     chiprob    chivalue

                                                 1     0.049987     3.94030

                                                        SAS 시스템            2007년 02월 21일 수요일 오후 06시22분36초   7

                                      OBS     fprob1    fvalue1    fvalue2    fvalue3

                                       1     0.95017    3.32583    0.30068    3.32583

♥♥♥♥♥
결과 값이 나온다는 것과,
해당 함수가 서로 반대의 성향을 안다는 것 까지는 알겠다.
하지만 통계학적 지식이 없고서는 이해하기 힘든 것 같다.
표준정규분포와 t분포는 따로 의미를 공부하도록 링크를 걸었다.
하지만 나머지는 찾기가 쉽지 않았다.


카이자승 검정은 오른쪽에 ppt 파일을 참고하는게 그나마 가장 나은 것 같다.
그리 기대는 하지 말고 보시길 바란다. 왜냐면 나도 잘 이해가 가지 않는다.

다음은 평균이 150이고 표준편차가 20인 정규분포를 따르는 표본 50개를 만들어 이것이 정규분포를 따르는 것인지 체크해보는 프로그램이다....라고 적혀있다.
뭔소린지;
일단 적어본다.

♥♥♥♥♥
DATA rannormal; /* rannormal이라는 데이터셋을 만들자 */                                                                                
DO i=1 to 50;   /* i는 1에서 시작해서 반복을 하는데, 50까지 하며, 1회당 1씩 증가한다 */                                                
randy=150+20*RANNOR(0);  /* randy 변수의 값은 150 + 20 x 표준정규분포를 따르는 난수이다. */                                            
OUTPUT;  /* 결과를 내어라 */                                                                                                           
END;     /* DO문 다시 돌아가서 연산하라 */                                                                                             
PROC PRINT;  /* DO문 끝나면 출력한다 */                                                                                                
PROC UNIVARIATE NORMAL;VAR randy;                                                                                                      
RUN;                                                                                                                                   
/* UNIVERATE문: 자료의 평균, 표준편차, 분산, 중앙값, 사분위수, 최대, 최소, 극단값들, 분포 형태 그림 */                                 
/* UNIVERATE NORMAL: 정규성 검정을 위한 검정 통계량 값 계산 */                                                                         
/* VAR randy: 분석하고자 하는 변수는 randy이다 */

♥♥♥♥♥
                                                        SAS 시스템            2007년 02월 21일 수요일 오후 06시22분36초   8

                                                   OBS     i     randy

                                                     1     1    109.041
                                                     2     2    146.441
                                                     3     3    156.604
                                                     4     4    159.197
                                                     5     5    128.559
                                                     6     6    150.116
                                                     7     7    153.480
                                                     8     8    182.038
                                                     9     9    139.066
                                                    10    10    156.331
                                                    11    11    157.290
                                                    12    12    146.304
                                                    13    13    134.685
                                                    14    14    164.597
                                                    15    15    141.367
                                                    16    16    119.476
                                                    17    17    151.596
                                                    18    18    144.663
                                                    19    19    167.141
                                                    20    20    136.217
                                                    21    21    139.646
                                                    22    22    173.649
                                                    23    23    116.832
                                                    24    24    134.611
                                                    25    25    122.686
                                                    26    26    137.305
                                                    27    27    174.072
                                                    28    28    101.571
                                                    29    29    146.519
                                                    30    30    136.310
                                                    31    31     95.089
                                                    32    32    135.032
                                                    33    33    154.091
                                                    34    34    148.381
                                                    35    35    186.334
                                                    36    36    133.084
                                                    37    37    166.362
                                                    38    38    137.690
                                                    39    39    126.317
                                                    40    40    126.118
                                                    41    41    141.523
                                                    42    42    154.968
                                                    43    43    176.442
                                                    44    44    129.590
                                                    45    45    184.207
                                                    46    46    152.146
                                                    47    47    144.686
                                                    48    48    143.962
                                                    49    49    129.463
                                                    50    50    173.504

                                                        SAS 시스템            2007년 02월 21일 수요일 오후 06시22분36초   9

                                                    UNIVARIATE 프로시저
                                                       변수:  randy

                                                           적률

                                  N                   50    가중합                     50
                                  평균         145.32803    관측치 합           7266.4015
                                  표준편차     20.352418    분산               414.220919
                                  왜도        -0.0816375    첨도               0.05896251
                                  제곱합      1076308.64    수정 제곱합         20296.825
                                  변동계수    14.0044684    평균의 표준오차    2.87826656


                                                      기본 통계 측도

                                          위치측도                  변이측도

                                      평균     145.3280     표준편차        20.35242
                                      중위수   144.6747     분산           414.22092
                                      최빈값      .         범위            91.24481
                                                            사분위 범위     21.99328


                                                   위치모수 검정: Mu0=0

                                     검정            --통계량---    -------p-값-------

                                     스튜던트의 t    t  50.49151    Pr >  |t|   <.0001
                                     부호            M        25    Pr >= |M|   <.0001
                                     부호 순위       S     637.5    Pr >= |S|   <.0001


                                                       정규성 검정

                                검정                  ----통계량----    -------p-값-------

                                Shapiro-Wilk          W     0.985687    Pr < W      0.8007
                                Kolmogorov-Smirnov    D     0.059245    Pr > D     >0.1500
                                Cramer-von Mises      W-Sq  0.031641    Pr > W-Sq  >0.2500
                                Anderson-Darling      A-Sq  0.226445    Pr > A-Sq  >0.2500


                                                      분위수(정의 5)

                                                  분위수           추정값

                                                  100% 최대값     186.334
                                                   99%            186.334
                                                   95%            182.038
                                                   90%            173.861
                                                   75% Q3         156.604
                                                   50% 중위수     144.675
                                                   25% Q1         134.611
                                                   10%            121.081
                                                    5%            109.041
                                                    1%             95.089
                                                    0% 최소값      95.089



                                                        SAS 시스템            2007년 02월 21일 수요일 오후 06시22분36초  10

                                                    UNIVARIATE 프로시저
                                                       변수:  randy

                                                         극 관측치

                                        ----작은값부터---        -----큰값부터----

                                              값   관측치              값   관측치

                                          95.089       31         174.072       27
                                         101.571       28         176.442       43
                                         109.041        1         182.038        8
                                         116.832       23         184.207       45
                                         119.476       16         186.334       35

♥♥♥♥♥
점점 뭔소린지 모르는 미궁속으로 들어가고 있다.
결과도 중요하겠지만, 내용을 이해할 수 있어야 하지 않나...


♥♥♥♥♥
DATA a1;
bbb=BYTE(65);              /* bbb에는 문자 A 가 저장 (ASCII 코드로 65는 영어 대문자 A이다)*/
ccc="안녕 하세요";         /* 안녕 하세요 가운데 빈칸이 하나 있다 */
nccc=COMPRESS(ccc,' ');    /* 빈칸이 없어진다                     */
size1=LENGTH(ccc);         /* 길이가 11; 한글 5글짜에 빈칸 하나   */
size2=LENGTH(nccc);        /* 빈칸이 없어졌으므로 길이가 10       */
size3=LENGTH(bbb);         /* 길이가 1                            */
large=UPCASE('Good Morning');  /* GOOD MORNING 으로 바뀜          */
small=LOWCASE('Good Morning'); /* good morning 으로 바뀜          */
str=SUBSTR(large,2,4);         /* 변수 large의 2번째부터 4문자를 선택  */
PROC PRINT;
RUN;

♥♥♥♥♥
                                                        SAS 시스템            2007년 02월 21일 수요일 오후 06시22분36초  11

         OBS    bbb        ccc           nccc       size1    size2    size3       large           small        str

          1      A     안녕 하세요    안녕하세요      11       10       1      GOOD MORNING    good morning    OOD
♥♥♥♥♥


♥♥♥♥♥
DATA a1;
nalja1=DATE();      /* 현재의 날짜를 SAS Date의 값으로 변환   */
nalja2=DATETIME();  /* 현재의 시간을 SAS Datetime 값으로 번환 */
nalja3=TIME();
nalja4=TODAY();     /* DATE() 와 같다 */
nal_sec1=SECOND(nalja1);
nal_min1=MINUTE(nalja1);
nal_hr1=HOUR(nalja1);
nal_date1=DAY(nalja1);  /* 2002년 7월 22일이면  22    */
nal_mon1=MONTH(nalja1); /* 2002년 7월 22일이면   7    */
nal_qtr1=QTR(nalja1);
nal_yr1=YEAR(nalja1);   /* 2002년 7월 22일이면  2002  */
nal_sec2=SECOND(nalja2); /* 초단위 */
nal_min2=MINUTE(nalja2); /* 현재의 몇분인가? */
nal_hr2=HOUR(nalja2);    /* 현재 몇시인가? 오후 3시이면 15   */
nalja3=DHMS(nalja1,15,33,0);  /* SAS Date를 SAS Datetime으로 바꾼다 */
PROC PRINT;
RUN;

♥♥♥♥♥

사용자 삽입 이미지

♥♥♥♥♥

참 갈길이 멀다. 아무래도 통계학 원론을 공부하고 하는게 좋을까 생각되는 하루이다.
이렇게 전혀 감도 못 잡고 공부하는 것은 체질상 맞지도 않고...

SAS 함수 이용 예제가 나온다. 이건 좀 쉬워보이는데?
오늘 위에 것 어려웠다면 다 잊어버리고 이거라도 즐겁게 해보자.
^______^ 인생 스마일모드다!

① 여러 개의 변수를 Missing 처리하기 (DIM 사용)
자 DIM을 사용한단다. DIM 뭔지 기억 나시는 분? 그렇다 변수의 갯수를 세는 명령어였다.
뭘 어떻게 쓴다는 것인지 보도록 하자!

ARRAY kkk x1-x5 y1-y3 zzz;
DO OVER i=1 to 9;
  IF kkk(i) = 99999 THEN kkk(i)=. ;
END;

배열 kkk는 x1 x2 x3 x4 x5 y1 y2 y3 zzz 변수로 만들어진다.
i는 1에서 시작 9까지 반복한다. 반복되는 내용은 다음과 같다.
만약 배열 kkk(i번째 변수) 값이 99999 이면 kkk(i)를 .로 처리해라. (Missing 처리)
DO문 끝. 반복하러 올라감

ARRAY kkk x1-x5 y1-y3 zzz;
DO OVER i=1 to DIM(kkk);
 IF kkk(i)=99999 THEN kkk(i)=.;
END;

반복되는 횟수는 변수의 수 만큼인데, 일일이 지정하지 않아도 자동으로 변수의 개수를 계산해주는 것을 알 수 있다.

② 중복된 자료를 제거하고자 할 때
중복된 자료가 있을 때 이를 제거하는 방법은 여러가지가 있는데, 가장 간단한 방법을 소개하고자 한다.

♥♥♥♥♥
DATA a1; INPUT code x; CARDS; /* a1 데이터셋을 만들자; 변수는 code와 x이다; 자료들; */                                                 
111 45                                                                                                                                 
123 56                                                                                                                                 
123 56                                                                                                                                 
132 46                                                                                                                                 
119 55                                                                                                                                 
;                                                                                                                                      
PROC SORT; BY CODE;  /* 정렬한다; CODE 변수를 기준으로 한다 */                                                                         
DATA a1; SET a1;     /* a1 데이터셋을 만든다; 변수는 a1 데이터셋과 같다 */                                                             
IF code=LAG(code) THEN DELETE;  /* 만약 code값이 이전 code값과 같다면 삭제해라 */                                                      
PROC PRINT;   /* 출력하라 */                                                                                                           
RUN;
♥♥♥♥♥
                                                        SAS 시스템            2007년 02월 21일 수요일 오후 06시22분36초  13

                                                     OBS    code     x

                                                      1      111    45
                                                      2      119    55
                                                      3      123    56
                                                      4      132    46

♥♥♥♥♥
123 56 데이터가 2개였는데 1개로 줄은것을 알 수 있다.

③ 날짜 자료에서 연, 월, 일을 구하고자 할 때
날짜 색인에서 일별, 월별 색인을 구하고자 할 때는 나머지를 구하는 MOD와 정수값을 취하는 INT 함수를 이용하면 할 수 있다고 한다.

♥♥♥♥♥
DATA a1; INPUT nal; CARDS;                                                                                                             
19981211                                                                                                                               
20030102                                                                                                                               
;                                                                                                                                      
DATA a1; SET a1;                                                                                                                       
day=mod(nal, 100);                                                                                                                     
mon=int(nal/100);                                                                                                                      
mon1=mod(mon, 100);                                                                                                                    
yr=int(nal/10000);                                                                                                                     
PROC PRINT;                                                                                                                            
RUN;
♥♥♥♥♥
                                                        SAS 시스템            2007년 02월 21일 수요일 오후 06시22분36초  14

                                     OBS       nal      day      mon     mon1     yr

                                      1     19981211     11    199812     12     1998
                                      2     20030102      2    200301      1     2003
♥♥♥♥♥
일단 일(day) 부분은 전체를 100으로 나눠서 남은 나머지(mod 함수의 기능이다)로 처리했다.
즉 19981211 에서 100을 나누면 11만 남게된다.
mon변수는 100을 나눈 값을 구해서(199812) 정수부분만을 취한다. 왜냐구?
19981211을 100으로 나누면 답은 199812.11 이 나오기 때문이다. 뒤에 11을 없애기 위해서 int함수를 쓴다.
같은 방법으로 월(mod1)을 뽑아낸다. 100으로 나누면 12만 남고, 이것은 월이된다.
같은 방법으로 년(yr)을 뽑아낸다. 100으로 나누고 int함수로 정수 부분만 뽑아낸다.
이렇게 해서 결과를 출력하게 하면, 원하는 값이 딱딱 떨어져 나오게 된다.

함수는 꼭 산술적인 처리만 하는데 쓰이는 것은 아니다.
머리를 요리 굴리고, 조리 굴리면 일반 자료 처리에서도 멋진 방법을 제공해준다.

오늘 사실 책은 10쪽밖에 되지 않지만, 알 수 없는 함수와 통계적인 마인드 때문에 너무 어려웠던 것 같다.
그래도 뭉실하게나마 머릿속에 무언가 떠다니는 것은 행복한 것이다.
잡지 못하든 잡든 무언가가 있다는 것은 확실하니까.
아무것도 없는 텅빈 머릿속이라면 얼마나 외로울까... 그런 생각이 든다.

하루하루 열심히 살자.
모두 뱌뱌시~

by Joe & Soohy 2007. 2. 21. 15:22