글
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쪽밖에 되지 않지만, 알 수 없는 함수와 통계적인 마인드 때문에 너무 어려웠던 것 같다.
그래도 뭉실하게나마 머릿속에 무언가 떠다니는 것은 행복한 것이다.
잡지 못하든 잡든 무언가가 있다는 것은 확실하니까.
아무것도 없는 텅빈 머릿속이라면 얼마나 외로울까... 그런 생각이 든다.
하루하루 열심히 살자.
모두 뱌뱌시~