獨斷論

SAS 문법 - 9: 연속데이터의 기술통계 본문

과학과 기술/SAS

SAS 문법 - 9: 연속데이터의 기술통계

부르칸 2021. 9. 7. 03:08

SAS 라이브러리 파일을 내려받아 원하는 하드드라이브에 저장한다.

여기서는 d:\tmp에 저장하였다.

hem2.sas7bdat
0.05MB

1. CONTENTS와 PRINT

libname icdb "d:\tmp\";

proc contents data=icdb.hem2;
run;

proc print data=icdb.hem2 (obs=15);
run;

libname으로 저장된 디렉토리를 설정하고 hem2.sas7bat를 불러들이기 위해서 libname에 확장자를 제외한 SAS library 파일명을 사용한다. proc contents는 데이터의 개략적인 사항들을 보여주고 proc print는 데이터의 변수값들을 보여주는데 여기서 (obs = 15)라는 옵션을 사용하면 전체 observation 중에서 위에서 15개만 보여주게 된다.

 

2. PROC MEANS

모든 데이터변수의 observation갯수, 평균, 표준편차, 최소값, 최대값을 기본적으로 보여준다.

proc means data=icdb.hem2;
run;

원하는 변수만 보고자 한다면 var를 추가한다.

proc means data=icdb.hem2;
	var subj hosp wbc rbc;
run;

proc means에 statistical-keywords를 추가하면 median, sum, range 등등을 볼수 있는데 주로 사용할수 있는 statistica-keyword는 아래와 같다.

 

Descriptive Statistics

Keyword Description
CLM Two-sided confidence limit for the mean
CSS Corrected sum of squares
CV Coefficient of variation
KURT Kurtosis
LCLM One-sided confidence limit below the mean
MAX Maximum value
MEAN Average value
MIN Minimum value
N No. of observations with non-missing values
NMISS No. of observations with missing values
RANGE Range
SKEW Skewness
STD Standard deviation
STDERR Standard error of the mean
SUM Sum
SUMWGT Sum of the Weight variable values
UCLM One-sided confidence limit above the mean
USS Uncorrected sum of squares
VAR Variance

 

Quantile Statistics

Keyword Description
MEDIAN or P50 Median or 50th percentile
P1 1st percentile
P5 5th percentile
P10 10th percentile
Q1 or P25 Lower quartile or 25th percentile
Q3 or P75 Upper quartile or 75th percentile
P90 90th percentile
P95 95th percentile
P99 99th percentile
QRANGE Difference between upper and lower quartiles: Q3-Q1

 

Hypothesis Testing

Keyword Description
PROBT Probability of a greater absolute value for the t value
T Student's t for testing that the population mean is 0

 

이중에 median, range, sum만 구해보면

proc means data=icdb.hem2 median range sum;
	var subj hosp wbc rbc;
run;

결과는 아래와 같다.

각 그룹별로 구할수도 있는데  proc means 안에 class를 추가하면 된다.

예를들어 국립공원의 지역과 형태별로 박물관과 캠핑장소의 갯수를 구하고자 한다면 아래와 같다.

DATA parks;
     input ParkName $ 1-21 Type Region $ Museums Camping Price;
     DATALINES;
Dinosaur              1 West 2  6 15.6
Ellis Island          1 East 1  0 32.1
Everglades            2 East 5  2 12
Grand Canyon          2 West 5  3 19
Great Smoky Mountains 2 East 3 10 25 
Hawaii Volcanoes      3 West 2  2 13
Lava Beds             3 West 1  1 43
Statue of Liberty     4 East 1  0 14
Theodore Roosevelt    4 West 2  2 23
Yellowstone           4 West 9 11 34
Yosemite              4 West 2 13 19
	 ;
RUN;
 
PROC MEANS data=parks maxdec=0 sum;
	var museums camping;
	class type region;
RUN;

ParkName은 공원이름이고 Type은 공원의 형태인데 숫자로 나타내었다. Region은 어느지역에 있는지를 나타내는데 문자열로 나타내었다. 이때 Type과 Region에 따라 Meseums와 Camping의 합을 구하는 것인데 그 결과는 아래와 같다.

그룹별로 하나의 표에 위처럼 결과를 표시하려면  class를 사용하는데 각 그룹별로 따로 결과를 표시하려면 by를 사용하면 된다. by는 proc print를 사용하기전에 proc sort를 이용하여 데이터를 정렬해야만 한다.

PROC SORT data=parks out=srtparks;
	by type region;
RUN;
PROC MEANS data=srtparks maxdec=0 sum;
	var museums camping;
	by type region;
RUN;

proc sort를 이용하여 type과 region에따라 데이터를 정렬하여 이 데이터집합를 srtparks라 지정하였고(out=srtparks) srtparks를 type과 region에 따라서 museums과 camping의 합을 구하였다. 결과는 아래와 같다.

 

3. 결과를 데이터로 만들기

proc mean을 수행하여 그 결과를 데이터집합으로 만들때 proc mean안에 output이라는 statement를 사용한다.

기본문법은 아래와 같다.

  OUTPUT OUT=dsn keyword1=name1 keyword2=name2 ...;

dsn은 저정하고자 하는 데이터집합 이름이 들어간다. keyword1과 keyword2에는 mean, max, std, var, min과 같은 statistical-keyword가 들어가고 name1과 name2는 자신이 원하는 위 값들의 변수명을 넣는다.

 

예를들면

proc means data=icdb.hem2 mean median;
	var rbc wbc;
	class hosp;
run;

위와 같이 rbc와 wbc의 mean과 median을 hosp에 있는 각 그룹별로 구하였다고 할때 이를 데이터집합으로 저장하고자 한다면 proc means 안에 output이라는 문장을 넣어 데이터집합을 지정할수 있다.

proc means data=icdb.hem2 noprint;
    var rbc wbc;
    class hosp;
    output out=hospsummary 
           mean=meanRbc meanWbc
           median=medianRbc;
run;

proc print data=hospsummary;
run;

좀 다른 것은 proc means에 mean과 median을 생략해도 된는데 output에서 mean과 median을 구하라고 하였기때문이다. noprint는 proc means을 수행결과를 출력하지 말라는 의미이다.

output out=hospsummary라고 하였으므로 hospsummary라는 데이터집합이 만들어질것인데 그 안에 변수로는 meanRbc와 meanWbc가 들어가며 여기에 var rbc wbc의 순에 따라 평균값이 들어간다. 여기서 var에 선언된 rbc wbc의 순서대로 mean에 들어갈 meanRbc와 meanWbc가 계산된다는 것을 눈여겨 봐야 한다. 만약 var rbc wbc로 코딩한 후에 mean=meanWbc meanRbc라고 적으면 meanWbc에 rbc의 평균값이 들어가므로 주의해야 한다.

결과는 다음과 같다.

_FREQ_는 데이터 수를 말하고 _TYPE_이 1인건 하위그룹에서 계산하였다는 말이고 0은 전체그룹을 의미한다. icdb.hem2의 전체 observation수가 635이므로 _TYPE_=0일때 _FREQ_=635가 되었다.

 

proc means를 사용하지 않고 proc summary를 사용할수도 있는데 noprint 옵션이 필요없다.

proc summary data=icdb.hem2;
    var rbc wbc;
    class hosp;
    output out=hospsummary2
           mean=meanRbc meanWbc
           median=medianRbc;
run;

proc print data=hospsummary2;
run;

 

각 그룹별로 계산하라는 명령을 class를 이용하지 않고 by를 사용할수도 있다. 이때에는 꼭 proc sort를 먼저 수행해야만 한다.

proc sort data=icdb.hem2 out=srtHem2;
	by hosp;
run;

proc means data=srtHem2 noprint;
    var rbc wbc;
    by hosp;
    output out=hospsummary3
           mean=meanRbc meanWbc
           median=medianRbc;
run;

proc print data=hospsummary3;
run;

이 결과에서 _TYPE_ 변수가 모두 0이 된다.

Comments