options validvarname = any; %let path = D:\Chrome;
한글 변수를 사용할 수 있게 해준다.
path를 지정해준다.
data one; input a b $; cards; 1 a 2 b ; run;
가장 기본적인 방법으로 직접 쓰기.
$는 문자열에 추가해줘서 문자로 인식 할 수 있게끔.
proc import datafile = "&path\np_traffic.csv" dbms = csv replace out = traffic; getnames = yes; run;
proc import datafile = "&path\iris.xlsx" dbms = xlsx replace out = iris; getnames = yes; run;
외부파일을 불러온다.
앞에서 지정해놓은 path를 이용한다.
dbms
로 읽을 파일의 확장자 명을 알려주고replace
로 이미 있다면 덮어쓰게 한다.
out
으로 저장할 dataset의 이름을 지정한다.
getnames
으로 변수명까지 불러온다.
proc print data = iris(obs = 10); run;
10번째 행까지만 보여준다.
proc contents data = iris; run;
dataset의 구조를 보여준다.
단. 기초통계량은 아니다.
proc sort data = iris out = sorted_iris1; by Sepal_Length; run;
proc sort data = iris out = sorted_iris2; by descending Sepal_Length; run;
해당 변수를 기준으로 data를 정렬한다.
data iris_dummy1; set iris; if Species = "setosa" then dummy = 1; else dummy = 0; run;
또는
data iris_dummy1; set iris; dummy = (Species = "setosa"); run;
새로운 변수에 설정한 조건에 따라 값을 채워 넣는다.
data data_bind; set data1 data2; run;
set
에 두개의 dataset을 넣어주면 상하로 결합된다.
proc sort data = data1 out = data1_sorted; by Species; run;
proc sort data = data2 out = data2_sorted; by Species; run;
data data1_merge; merge data1_sorted data2_sorted; by Species; run;
하나의 변수를 기준으로 옆으로 결합 할 수 있다.
다만 해당변수에 대하여 순서대로 정렬이 선행되어야 한다.
정확히 기억은 안나는데 아마 by 뒤에 변수는 sort가 필수로 선행되어야 할꺼다.(for all procs)
proc export data = iris_merge dbms = xlsx replace outfile = "&path\iris_merge.xlsx"; run;
export dataset as excel
proc univariate data = iris; run;
dataset의 숫자로 되어있는 변수의 개수만큼의 결과가 나온다.
즉, 예를들어 총 변수가 5개이고 그중 4개는 numerical data라면 해당 4개의 변수펼 기초통계량이 나온다.proc univariate data = iris; class Species; run;
기본적으로 위와 같이 4개의 결과가 나오고 각 결과별로 class로 지정해준대로 group화 되어 나온다.
즉 unique(class)=n 이면 총 4n개의 결과가 나온다.
proc means data = iris max min mean maxdec = 1; run;
마찬가지로 기본적으로 각각의 numeric variable에 대한 설정해준 통계량.
https://support.sas.com/resources/papers/proceedings13/144-2013.pdf
이게 공식문서인듯 하다.
proc iml
을 이용하는데 행렬을 만드는 방법은 크게 두가지가 있는듯 하다.
proc iml; A = {2 1 1, 2 1 0, -1 -2 -1}; B = inv(A); A_prime = A`; print A, B, A_prime; run;
numpy랑 굳이 비교 하자면 np.array()로 감싸주는 것이 여기서는 {}이라고 보면 될듯.
data one; input x1 x2 x3@@; cards; 2 1 1 2 1 0 -1 -2 -1 ; run;
proc iml; use one; read all into A; B = inv(A); A_prime = A`; print A, B, A_prime; run;
one 이라는 dataset을 사용하여 다 모든 원소를 부른다.
서로 다른 dataset에 있으면 위아래로 합쳐 아래설명에 있는 submatrix을 이용하면 될듯.
proc iml; use one; read all into A; B = A[1,]; C = A[2,3]; D = A[1:2, 2:3]; print A, B, C, D; run;
다음과 같이 sub matrix를 만들 수 있으며 slicing방식은 numpy와 같다.
proc iml; reset print; use one; read all into A; call eigen(m, e, A); run;
이건 한번에 출력하고
proc iml; use one; read all into A; eigvals = eigval(A); print eigvals; create eignal_dat var {eigvals}; append; close eigval_dat; run;
이건 value를 dataset으로 저장하고
proc iml; use one; read all into A; eigvecs = eigvec(A); print eigvecs; create eigvecs_dat from eigvecs; append from eigvecs; close eigvecs_dat; run;
이건 vector를 dataset으로 저장한다.
proc import datafile = "&path\bird_data.xlsx" dbms = xlsx replace out = bird_data; getnames = yes; run;
data 읽고
proc print; run;
data 확인하고
proc contents data = bird_data; run;
dataset의 형태 보고
proc means data = bird_data mean max min maxdec = 1; run;
dataset의 통계량 보고
proc gplot data = bird_data; plot tail_length*wing_length; run;
산점도 그리고
proc univariate data = bird_data; var wing_length; histogram wing_length; run;
기초통계량보고
proc corr data = bird_data cov noprob; var tail_length wing_length; run;
공분산행렬본다.
data hw; input y1-y3; cards; 35 3.5 2.80 35 4.9 2.70 40 30.0 4.38 10 2.8 3.21 6 2.7 2.73 20 2.8 2.81 35 4.6 2.88 35 10.9 2.90 35 8.0 3.28 30 1.6 3.20 ; run;
dataset
data trans; set hw; z1=y1+y2+y3; z2=2*y1-3*y2+2*y3; z3=-y1-2*y2-3*y3; run; proc print; run;
각 변수를 선형변환
data Z; set trans; drop y1-y3; run; proc print; run;
원래 있던 거 버리기
proc corr data= z cov outp=Z_corr; run;
공분산, 상관계수행렬 만들고 둘다 dataset으로 저장하기
data cov; set Z_corr ; if _TYPE_='COV'; keep z1-z3; run;
공분산에 해당하는 행만 남기기
data corr; set Z_corr ; if _TYPE_='CORR'; keep z1-z3; run;
상관계수에 해당하는 행만 남기기
proc iml; use cov; read all into A; Det=det(A); Trace=trace(A); print(Det); print(Trace);
det와 trace 계산하기