Hard skills/SAS (12)


SAS를 통한 표본 추출


sample.csv


임의추출


코드


FILENAME REFFILE 'C:\Users\\sample.csv';

PROC IMPORT DATAFILE=REFFILE
    DBMS=CSV
    OUT=WORK.population;
    GETNAMES=YES;
RUN;

proc surveyselect data=population method=srs n=200
    out=Work.sample;
run;


결과


The SAS System

The SURVEYSELECT Procedure

Selection Method Simple Random Sampling

Input Data Set POPULATION
Random Number Seed 137581001
Sample Size 200
Selection Probability 0.13708
Sampling Weight 7.295
Output Data Set SAMPLE


표본 평균 계산



코드


proc surveymeans data=sample total=1459;
    var MSSubclass;
run;


결과


The SAS System

The SURVEYMEANS Procedure

Data Summary
Number of Observations 200

Statistics
Variable N Mean Std Error of Mean 95% CL for Mean
MSSubClass 200 59.450000 2.648750 54.2267810 64.6732190


  • 이 때, 표본 평균의 분산 추정량은 (N-n)/N * s^2/n 으로 계산된다. (유한 모집단이기 때문에 유한모집단 수정계수를 곱한다.)
  • 모분산(sigma^2)을 아는 경우에는 (N-n)/(N-1) * sigma^2/n이다.


표본 비율의 추정


코드


data new;
    set sample;
    bin=(MSZoning='RL');
run;


proc surveymeans data=new total=1459;
    var bin;
run;


결과


The SAS System

The SURVEYMEANS Procedure

Data Summary
Number of Observations 200

Statistics
Variable N Mean Std Error of Mean 95% CL for Mean
bin 200 0.760000 0.028124 0.70454146 0.81545854


층화 추출법


* LotShape라는 변수를 기준으로 층화추출한다. ;

proc sort data=population;
    by MasVnrType;
run;

proc freq data=population;
    tables MasVnrType;
run;



The SAS System

The FREQ Procedure

MasVnrType Frequency Percent Cumulative
Frequency
Cumulative
Percent
BrkCmn 10 0.69 10 0.69
BrkFace 434 29.75 444 30.43
NA 16 1.10 460 31.53
None 878 60.18 1338 91.71
Stone 121 8.29 1459 100.00


proc surveyselect data=population method=srs n=(5,5,5,5,5)
    out=sample2;
    strata MasVnrType;
run;


The SAS System

The SURVEYSELECT Procedure

Selection Method Simple Random Sampling
Strata Variable MasVnrType

Input Data Set POPULATION
Random Number Seed 132740001
Number of Strata 5
Total Sample Size 25
Output Data Set SAMPLE2





'Hard skills > SAS' 카테고리의 다른 글

SAS - 표본 추출  (0) 2017.12.07
SAS - SGPLOT을 통해 산점도와 히스토그램 그리기  (0) 2017.09.24
SAS - proc report 의 옵션들  (0) 2017.09.20
SAS - 상관분석 기초  (0) 2017.06.12
SAS - Signed Rank Sum Test  (0) 2017.04.02
SAS - Paired Sample에 대한 비모수 검정  (0) 2017.04.02

SAS - 산점도와 히스토그램


descriptive analysis에서 변수별로 기본적으로 해보는 것이 바로 산점도와 히스토그램이라고 할 수 있습니다. 산점도는 두 변수의 관계를 파악할 때 쓰이며, 히스토그램은 한 변수의 분포를 알아보기 위해 쓰입니다. 이번 포스팅에서는 SAS로 산점도와 히스토그램을 그리는 법을 정리해보았습니다.


기본 산점도


proc gplot data=data;
    plot var1*var2;
run;


  • 기본 산점도는 위와 같이 간단하게 구할 수 있습니다. 근데 분석을 하다보면, 산점도를 그려도 두 변수의 관계가 확실히 보이지 않을 때가 있습니다. 이 경우에는 선형 회귀 선을 함께 그림으로써 그 경향성을 더욱 잘 파악할 수 있는데요. 링크 에는 산점도와 함께 선형회귀선을 그리는 코드를 보여주고 있습니다.


산점도 with 선형회귀선


ods graphics off;
proc reg data=data;
   model y= x;
   ods output ParameterEstimates=PE;
run;

data _null_;
   set PE;
   if _n_ = 1 then call symput('Int', put(estimate, BEST6.));   
   else            call symput('Slope', put(estimate, BEST6.)); 
run;

title 'y*x';
proc sgplot data=data noautolegend;
   reg y=y x=x;
   inset "Intercept = &Int" "Slope = &Slope" /
         border title="Parameter Estimates" position=topleft;
run;


  • 코드를 정리하면 위와 같은데요. 선형회귀분석의 결과로 나온 파라미터들을 임시 데이터셋에 저장해놓고 이를 매크로변수에 저장하여 산점도를 그릴 때 불러오는 방식입니다. 만약 추정된 파라미터 값이 굳이 필요없으면 마지막 proc sgplot 만 실행하면 되고, reg y=y x=x; 라인만 추가하면 선형회귀선이 산점도에 나타나게 됩니다.



히스토그램 및 밀도함수(density plot)


  • 히스토그램과 밀도함수는 아래의 코드로 그릴 수 있습니다. histogram statement와 함께 density statement를 추가하며 적당한 밀도함수를 그려주게 되며, 정규분포 밀도함수를 함께 그려주어 해당 데이터가 정규분포와 얼마나 유사한지를 보여줄 수 있습니다.


proc sgplot data=data;
  histogram var_name ;
  density var_name / type=normal legendlabel='Normal' lineattrs=(pattern=solid);
  density var_name   / type=kernel legendlabel='Kernel' lineattrs=(pattern=solid);
  keylegend / location=inside position=topright across=1;
  xaxis display=(nolabel);
 run;







'Hard skills > SAS' 카테고리의 다른 글

SAS - 표본 추출  (0) 2017.12.07
SAS - SGPLOT을 통해 산점도와 히스토그램 그리기  (0) 2017.09.24
SAS - proc report 의 옵션들  (0) 2017.09.20
SAS - 상관분석 기초  (0) 2017.06.12
SAS - Signed Rank Sum Test  (0) 2017.04.02
SAS - Paired Sample에 대한 비모수 검정  (0) 2017.04.02

SAS Proc report 옵션들


/* 2017.9.20 by. 3months */


SAS Base programming 자격증 공부하다가 proc report 관련 정리를 하였습니다. proc report는 데이터셋을 통해 무언가를 report할 때 쓰이는 SAS의 프로시져입니다.


데이터 정의


data a;
 input a$ b;
 cards;
 a 1
 a 2
 a 3
 a 4
 c 5
 c 6
 b 7
 b 8
 b 9
 b 10
 ;
run;


proc report 프로시져


proc report data=a;
   column a; * 이 컬럼에 대한 리포트를 하겠다;
   define a/group; * 중복값을 제외하고 group으로 묶겠다 ;
run;

proc report data=a;
 column a;
 define a/across; * across 옵션은 갯수를 센다;
run;

proc report data=a;
 column b;
 define b/analysis; * b 컬럼 분석 sum을 낸다. ;
run;

proc report data=a;
 column b;
 define b/display; * 그냥 그대로 보여준다.;
run;



차례 대로 각각의 proc report에 대한 결과


The SAS System

a
a
b
c



The SAS System

a
a b c
4 4 2



The SAS System

b
55



The SAS System

b
1
2
3
4
5
6
7
8
9
10



출처


http://blog.naver.com/sonobono88/220271045853

'Hard skills > SAS' 카테고리의 다른 글

SAS - 표본 추출  (0) 2017.12.07
SAS - SGPLOT을 통해 산점도와 히스토그램 그리기  (0) 2017.09.24
SAS - proc report 의 옵션들  (0) 2017.09.20
SAS - 상관분석 기초  (0) 2017.06.12
SAS - Signed Rank Sum Test  (0) 2017.04.02
SAS - Paired Sample에 대한 비모수 검정  (0) 2017.04.02

SAS 코드


data corr;
input method1 method2;
cards;
132 130
138 134
144 132
146 140
148 150
152 144
158 150
130 122
162 160
168 150
172 160
174 178
180 168
180 174
188 186
194 172
194 182
200 178
200 196
204 188
210 180
210 196
216 210
220 190
220 202
;run;



상관계수 출력 및 모상관계수=0을 검정


proc corr;
var method1 method2 ;
run;



상관계수 출력 및 모상관계수=0.98을 피셔의 방법으로 검정


proc corr fisher(rho0=0.98);
var method1 method2 ;
run;

SAS - Signed Rank Sum Test



Dataset


아래 데이터는 대두콩군과 천식군 내에 CD3+ T-cell의 개수를 나타낸 데이터이다.

대두콩군과 천식군의 CD3+ T-cell에 유의미한 차이가 있는지 알아보자.


Code


proc import datafile = '/folders/myshortcuts/myFolders/data/asthma.txt' out=asthma replace;
run;
proc univariate data =asthma normal;
run;
proc npar1way data=asthma wilcoxon;
 class group;
 exact wilcoxon;
 var x;
run;



결과



proc univariate 로 정규성 검정결과 표본이 정규분포를 따르지 않는다고 결론내린다. 또한 두 그룹이 독립적이므로 Wilcoxon rank sum test를 한다.




proc npar1way는 비모수 검정을 위한 프로시져이다. 결과는 위와 같다.

signed rank sum test의 귀무가설은 '그룹간의  값들의 중위수에는 차이가 없다.'이다.

p-value가 0.05보다 작으므로 유의수준 5% 내에서 귀무가설을 기각하고, 그룹간에 유의미한 차이가 있다고 결론 내린다. 



SAS를 통한 비모수 검정


1. Paired Sample에 대한 Sign Test와 Signed Rank Test 



위 데이터셋은 특정 공군부대에 배치된 14명 신병들의 치주에서 부착상실을 보인 위치들에 대한 백분율을 비교한 자료이다.

치료전(before)과 치료후(after)의 변화를 보고 해당 치료법이 부착상실을 치료하는 효과가 있는지를 평가해보자. 이 경우 한 사람에 대해 Before과 After를 측정했으므로 해당 sample은 paired 되어있다고 말한다.


two-related sample에 대한 비모수 검정은 sign test signed-rank test가 있다. 이 두 가지 검정을 모두 하는 PROC UNIVARIATE 프로시져를 사용한다. 


proc import datafile = '/folders/myshortcuts/myFolders/data/attachment.txt' out=attachment replace;
run;
data attachment;
 set attachment;
 diff = before-after;
run;
proc univariate data=attachment normal;
 var diff;
run


proc univariate 의 normal 옵션을 주면 data에 대한 정규성 검정을 한다. 정규성 검정의 결과를 보면 p-value < 0.05로 매우 작으므로 유의수준 5% 내에서 정규분포를 따르지 않는다. (p-value가 낮다는 것은 그만큼 귀무가설을 기각하는 쪽으로 힘이 실린다.) 표본이 정규분포를 따르지 않으므로 모수적 검정보다는 비모수적 검정을 하는 것이 좋다.

two-related sample에 대한 비모수 검정은 sign test와 signed-rank test가 있다.


univariate 내부에 var diff; 를 입력하면 diff에 대한 비모수 검정을 하게된다. (diff = before-after)

'부호'라고 표시된 부분이 sign test이고 '부호 순위'라고 표시된 부분이 signed-rank test이다.


sign test와 signed-rank test의 귀무가설은 diff의 중위수 = 0 이다. 이 때의 p 값은 sign test에서 0.0923이고 signed-rank test에서 0.0942 이므로 두 개의 검정 모두 유의수준 5% 내에서 귀무가설을 기각하지 못한다.





Data set



위의 Data set에서 age가 0~10일 때는 1, 10~20일 때는 2 ... 90~100 일 때는 9인 새로운 범주형 변수를 생성하고자 한다.


Code


/* 연령 category */
data workshop.data3(replace=yes);
    set workshop.data3;
    do i = 0 to 9;
        if age >= i*10 & age < i*10+10 then cage = i;
    end;
    drop i;
run;




Do end문과 if then 문을 통하여 위와 같이 간단하게 구현할 수 있다. 마지막으로 SAS 는 임시변수도 Data set 내부에 변수로 저장하므로 drop i; 를 통해 임시변수를 없애준다.




Data set



Code


/* Get Age */
data workshop.data3;
    set workshop.data3;
    birth = input(substr(regnum,1,6), YYMMDD6.);
    today = today();
    age  = int((today-birth)/365.25);
    drop birth today;
run;


  • 우선 substr 함수를 사용해 주민등록번호의 앞자리만 자른 후, 이것을 input 함수를 이용해  YYMMDD6. Informat으로 읽어들여 Numeric으로 변환하여 birth 변수에 저장한다. 
  • today 함수는 오늘 날짜를 numeric으로 돌려준다. 이 숫자 변수는 1960년 1월 1일부터 현재까지의 날짜의 차이를 뜻한다.
  • age는 오늘 날짜에서 출생날짜를 뺀 후 365.25로 나누어준다. 그리고 만 나이이므로 int 함수를 통해 소숫점을 잘라내서 정수로 만들어 준다.
  • 마지막으로 사용한 임시변수 birth, today를 drop해준다.




titanic.csv


SAS - (4) PROC FREQ 빈도 분석


PROC FREQ는 빈도분석을 할 때 쓰인다. 


데이터 읽고 솔팅하기


FILENAME REFFILE '/folders/myfolders/titanic.csv';

PROC IMPORT DATAFILE=REFFILE
    DBMS=CSV
    OUT=WORK.titanic;
    GETNAMES=YES;
RUN;

proc sort data = titanic;
    by sex;
run;



PROC FREQ


문법은 아래와 같다.


PROC FREQ DATA = Dataset ;
TABLES Variable_1 ;
BY Variable_2 ;



예제 


proc FREQ data=titanic;
    tables survived; 
    by sex;
run;


결과


FREQ 프로시저

Survived빈도백분율누적
빈도
누적
백분율
08125.808125.80
123374.20314100.00

FREQ 프로시저

Survived빈도백분율누적
빈도
누적
백분율
046881.1146881.11
110918.89577100.00


참고


https://www.tutorialspoint.com/sas/sas_frequency_distributions.htm

/*

(3) Standard Deviation 구하기

날짜 : 2017.3.8

*/



데이터 읽기


FILENAME REFFILE '/folders/myfolders/titanic.csv';

PROC IMPORT DATAFILE=REFFILE
    DBMS=CSV
    OUT=WORK.titanic;
    GETNAMES=YES;
RUN;



표준편차 구하기


표준편차도 PROC MEANS 프로시져로 구할 수 있다. 옵션으로 STD를 주면 되며, 산술 평균 구하는 것과 마찬가지로 그루핑 할 수도 있다.

 

PROC MEANS data=work.titanic STD MAXDEC=2;
RUN;



MEANS 프로시저

변수표준편차
PassengerId
Survived
Pclass
Age
Parch
Fare
257.35
0.49
0.84
13.00
0.81
49.69

SORTING


우선 SEX로 그루핑하여 AGE의 Standard Deviation을 구하기에 앞서 SORTING을 먼저한다. 


proc sort data=work.titanic;
    by sex;
run;




PROC SUVEYMEANS


조금 더 Advanced 된 것으로 PROC SURVEYMEANS 프로시져가 있다. 아래는 SEX로 Grouping하여 age의 Standard Deviation을 구하는 예제이다. ods output을 통해 결과를 table로 내보낼 수 있다.


proc surveymeans data=work.titanic STD;
var age;
BY sex; /* 이 때 sex로 sorting이 되어 있어야 한다. */
ods output statistics=rectangle;
run;

proc print data=rectangle;
run;


The SURVEYMEANS Procedure

Data Summary
Number of Observations314
Statistics
VariableStd Error
of Sum
Age228.303304

The SURVEYMEANS Procedure

Distribution of Age

The SURVEYMEANS Procedure

Data Summary
Number of Observations577
Statistics
VariableStd Error
of Sum
Age312.416021

The SURVEYMEANS Procedure

Distribution of Age

OBSSexVarNameStdDev
1femaleAge228.303304
2maleAge312.416021



참고


https://www.tutorialspoint.com/sas/sas_standard_deviation.htm