Wprowadzenie do Systemu SAS i programowania w SAS 4GL Henryk Maciejewski hmac@pwr.wroc.pl 1 Plan System SAS - wprowadzenie SAS: moduły i aplikacje Środowisko SAS Organizacja danych w środowisku SAS Programowanie w SAS 4GL język do przetwarzania danych 2
System SAS - wprowadzenie Historycznie SAS = Statistical Analysis System Obecnie, (a) system do budowania rozwiązań DSS (moduły do pobierania danych, analiz, raportowania), (b) specjalizowane rozwiązania DSS Moduły np. Base SAS core (język, procedury) STAT procedury analizy statystycznej ACCESS pobieranie danych ze źródeł zewn. GRAPH AF, webaf budowa aplikacji EIS... OR, QC, ETS,... Procedury: operations research, quality control, time series forecasting, itd. Enterprise Miner Data Warehouse Administrator 3 System SAS - wprowadzenie Rozwiązania biznesowe dla wspomagania decyzji (decision support) w środowiskach z duŝymi zasobami danych np. Data warehousing Data mining IT resources management Human resources management Financial management Web portal usage analysis Data analysis in pharmaceutical industry CRM, SRM (=Supplier RM), etc. 4
Środowisko programowania MVA (MultiVendor Architecture): programy przenośne: VMS, CMS, OS/390, Unix, Windows, OS/2 Organizacja danych w środowisku SAS Pliki SAS (SAS files) Np., SAS data sets, views, MDDBs Umieszczane w bibliotekach SAS (SAS libraries) referencja (LIBREF) do folderu, kartoteki itp. systemu operacyjnego np. LIBNAME fhh c:\data\fhh ; 5 Środowisko programowania - biblioteki Biblioteki tworzone automatycznie SASHELP SASUSER WORK -- SAS system files -- user profile files -- biblioteka tymczasowa kasowana po zamknięciu systemu SAS, pozostałe są permanentne Nazwy plików SAS kwalifikowane: libraryname.filename, np. fhh.abc abc -- plik w bibliotece fhh -- plik w bibliotece WORK 6
Środowisko programowania zbiory danych Zbiory danych SAS - typy: DATA tablica fizycznie przechowująca dane VIEW nie zawiera fizycznie danych, a jedynie kod ( query ) realizujący dostęp do danych. VIEW widziane jest przez identycznie jak DATA set (na ogół) Konwencja nazw Wiersze to obserwacje Kolumny to zmienne (variables) Zbiory danych (data set) składają się z: deskryptora - atrybuty zbioru i zmiennych danych 7 Środowisko programowania zbiory danych Wyświetlamy deskryptor DATA set: PROC CONTENTS DATA=fhh.abc; RUN; -----Alphabetic List of Variables and Attributes----- # Variable Type Len Pos Format Informat Label ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ 1 sex Char 2 16 $3. $3. sex 4 teach_duration Num 8 8 11. 11. teach_duration 2 teacher_code Num 8 0 11. 11. teacher_code 3 titel_code Char 12 18 $12. $12. titel_code Typy zmiennych w SAS character numeric Atrybuty zmiennych Length - długości zmiennych: numeric: 3-8, character 1-32767 (MS Windows) Format - jak drukować wartość zmiennej Informat - jak konwertować input string do wartości zmiennej Label - opis zmiennej 8
Środowisko programowania zbiory danych Drukuj wartości zapisane w DATA set: PROC PRINT DATA=fhh.abc; RUN; Obs sex teacher_code titel_code teach_duration 1 M 1 006 1 2 M 2 502 1 3 M 3. 4 M 4 1 5 M 5 022 1 6 M 6 006 1 7 W 7 1 8 M 8 006 1 Missing value Wskazuje Ŝe w danej obserwacji nie ma wartości zmiennej missing numeric values reprezentowane przez. (kropka) missing character values reprezentowane przez puste miejsce 9 Plan System SAS - wprowadzenie SAS: moduły i aplikacje Środowisko SAS Organizacja danych w środowisku SAS Programowanie w SAS 4GL język do przetwarzania danych 10
Programowanie w SAS SAS 4GL język umoŝliwiający realizację: Dostępu do danych ( retrieval from external sources ) Przetwarzanie danych ( cleaning, transforming, combining ) Analizę danych Raportowanie Inne języki programowania w środowisku SAS SCL (object oriented SAS Component Lang.) SAS macro language 11 Przykład pierwszy program data abc; teachers=283; students=853; all=teachers+students; s_per_t=students/teachers; DATA STEP Utwórz data set abc Utwórz zmienne w abc Wykonaj data step proc print data=abc; PROC STEP Drukuj data set abc Data Set WORK.ABC Obs teachers students all s_per_t 1 283 853 1136 3.01413 12
Przetwarzanie w SAS SAS Data Set Raport Raw data file DBMS tables (e.g.,.mdb)... DATA Step PROC Step... DATA Step... External file SAS Data Set Remote access (ftp, TCP/IP socket, etc.) Program w SAS SAS Log 13 DATA Step, PROC Step DATA Step Wczytuje dane wejściowe Np. data sets, Pliki, itd. Przetwarza (modyfikuje) dane Produkuje dane wyjściowe Np. data sets, Pliki Raporty PROC Step Analiza danych w data setach, Tworzenie raportów (tekstowe, graficzne) 14
Algorytm DATA Step data students; input name $ sex $ note1 note2; avg=mean(note1,note2); datalines; Anna F 4 5 Ian M 3. Eva F 1 4 ; Obs name sex note1 note2 avg 1 Anna F 4 5 4.5 2 Ian M 3. 3.0 3 Eva F 2 1 1.5 15 Algorytm DATA Step - podumowanie Główna pętla DATA step: data step czyta jedną obserwację, Dane umieszczane w PDV = Program Data Vector; PDV inicjownany wartościami missing na początku kaŝdej iteracji Wykonywanie poleceń (statements) zapisanych w DATA step na danej obserwacji, Zapis obserwacji do wynikowego data set (implicit OUTPUT) UWAGA: Implicit OUTPUT nie działa jeśli jawnie uŝyjemy polecenia OUTPUT w DATA step Informacja wejściowa dla DATA step-u: SET statement pobieraj dane z data set-u INPUT statement pobieraj po linii danych z pliku zewn. (podanego w poleceniu INFILE) 16
Programowanie w data step Idiomy programisty Wybór obserwacji z data set Wybór zmiennych Tworzenie nowych / modyfikacja zmiennych OUTPUT statement tworzenie wielu zbiorów Łączenie data set-ów ( stacking, merging ) BY-group processing Czytanie/pisanie plików zewnętrznych 17 Wybór obserwacji data male; if sex= F then delete; Wyślij na wyjście wybrane obserwacje UŜywając subsetting IF: usuń obserwacje jest wyraŝenie if jest prawdą; data male; if sex= M ; lub: data male; where sex= M ; przetwarzaj dalej obserwację jeśli warunek jest prawdą; UŜywając WHERE (statement lub data set option) WHERE statement data male; set students (where=(sex= M )); WHERE data set option 18
Wybór obserwacji data male; if sex= F then delete; data male; if sex= M ; lub: data male; where sex= M ; Obs name sex note1 note2 avg 1 Anna F 4 5 4.5 2 Ian M 3. 3.0 3 Eva F 2 1 1.5 Obs name sex note1 note2 avg 1 Ian M 3. 3 data male; set students (where=(sex= M )); 19 Wybór zmiennych data avg_only; drop sex note1 note2; Wyślij na wy tylko wybrane zmienne UŜywając DROP, KEEP statements DROP statement data avg_only; keep name avg; lub: data avg_only; set students (drop= sex note1 note2); KEEP statement UŜywając DROP, KEEP data set options DROP data set option data avg_only; set students (keep= name avg); KEEP data set option 20
Wybór zmiennych data avg_only; drop sex note1 note2; data avg_only; keep name avg; lub: data avg_only; set students (drop= sex note1 note2); Obs name sex note1 note2 avg 1 Anna F 4 5 4.5 2 Ian M 3. 3.0 3 Eva F 2 1 1.5 Obs name avg 1 Anna 4.5 2 Ian 3.0 3 Eva 1.5 data avg_only; set students (keep= name avg); 21 Tworzenie nowych zmiennych data pass (drop= sex note1 note2 avg); if avg < 2 then result='passed'; else result='failed'; Obs name sex note1 note2 avg 1 Anna F 4 5 4.5 2 Ian M 3. 3.0 3 Eva F 2 1 1.5 Obs name result 1 Anna failed 2 Ian failed 3 Eva passed 22
Tworzenie nowych zmiennych Uwaga nie rób tak: data pass; set students (drop= sex note1 note2 avg); if avg < 2 then result='passed'; else result='failed'; UWAGA: w tym przykładzie sex, note1,2 i avg nie są wczytywane ze zbioru we, stąd wartość avg jest niezainicjowana (czyli missing) Obs name sex note1 note2 avg 1 Anna F 4 5 4.5 2 Ian M 3. 3.0 3 Eva F 2 1 1.5 Obs name avg result 1 Anna. passed 2 Ian. passed 3 Eva. passed 23 OUTPUT Statement data males females; if sex='f' then output females; if sex='m' then output males; drop sex; Zapisuje bieŝącą obserwację do wyjściowego data set UŜyteczna przy tworzeniu kilku zbiorów z jednego data set-u UWAGA: jeśli OUTPUT jest jawnie uŝyty w DATA step, implicit OUTPUT nie działa (p. algorytm DATA step) Obs name sex note1 note2 avg 1 Anna F 4 5 4.5 2 Ian M 3. 3.0 3 Eva F 2 1 1.5 females males 1 Anna 1 Ian 2 Eva 24
OUTPUT Generacja danych data generator; do x=1 to 100; y=rannor(-1); output; end; UWAGA: nie ma instrukcji specyfikującej dane wejściowe (np. SET albo INPUT), więc będzie wykonana tylko jedna iteracja głównej pętli DATA steo-u (DATA step main loop) Wynik: 100 wartości losowych z rozkładu N(0,1) Obs x y 1 1 0.52813 2 2 0.51177...... 99 99-0.23971 100 100 0.92665 25 Łączenie data set-ów (instrukcja SET) data all; set males females; data all2; set males(in=m) females(in=f); if m then sex= M ; if f then sex= F ; Łącznie data set-ów (stacking): przetwarzaj obserwacje z pierwszego data set, potem drugiego itd.. Z którego zbioru we pochodzi dana obserwacja? zrób tak: males(in=m) tworzy automatic variable m (m=1 dla obserwacji ze zbioru males; m=0 poza tym) UWAGA: zmienne automatyczne (tu: m i f) nie są zapisywane do wyjściowego zbioru danych Obs name note1 note2 avg sex 1 Ian 3. 3.0 M 2 Anna 4 5 4.5 F 3 Eva 2 1 1.5 F 26
Łączenie data set-ów (MERGE) data lib; input name $ @8 date yymmdd10. title $20. ; datalines; Anna 2000/12/14 Hamlet Anna 2000/12/14 SAS Programming Witek 2001/07/12 XML ; proc sort data=students out=students_sort; by name; data st_books; merge students_sort lib; by name; keep name sex title; Operacja match-merging data set-ów: Data set STUDENTS: Obs name sex note1 note2 avg 1 Anna F 4 5 4.5 2 Ian M 3. 3.0 3 Eva F 2 1 1.5 Data set LIB: Obs name date title 1 Anna 2000-12-14 Hamlet 2 Anna 2000-12-14 SAS Programming 3 Witek 2001-07-12 XML Wynikowy data set: Obs name sex title 1 Anna F Hamlet 2 Anna F SAS Programming 3 Eva F 4 Ian M 5 Witek XML 27 BY-group Processing w DATA Step data best_note worst_note; set exam; by st_code; if first.st_code then output best_note; if last.st_code then output worst_note; keep st_code sem note; BY-group jest podzbiorem obserwacji z ustaloną wartością zmiennej podanej w poleceniu BY (zbioór musi być posortowany po tej zmiennej) UŜycie polecenia BY w DATA step tworzy zmienne automatyczne, np. FIRST.st_code LAST.st_code ustawione przez DATA step na 1 tylko dla pierwszej (ostatniej) obserwacji w grupie BY-group Data set EXAM: st_code sem note 1 WS96/97 1 1 WS96/97 4 1 WS95/96 6 2 WS99/00 1 2 WS00/01 3 3 WS99/00 1 3 WS99/00 1... BY-group BY-group 28
Zmienne automatyczne Np. kontrola błędów na wejściu: data results err_log; infile C:\temp\results.txt ; input name $ jump date yymmdd8.; if _error_ then output err_log; else output results; Tworzone przez DATA step; nie są częścią Program Data Vector; nie są zapisywane do wyjściowych data setów, np.: _N_ - numer iteracji DATA step-u _ERROR_ - ustawiany na 1 jeśli wystąpił błąd w przetwarzaniu dancych (input data error, math error, itd. ) FIRST.by_variable LAST. by_variable zobacz BY-group processing 29 Czytanie plików zewnętrznych data results err_log; infile C:\temp\results.txt ; input name $ 1-10 jump @24 date yymmdd8.; if _error_ then output err_log; else output results; Polecenie INFILE podaj plik, z którego będą czytane dane (podajemy w postaci fizycznej ścieŝki lub FILEREF utworzony przez polecenie FILENAME, np. FILENAME fileref path ; Polecenie INPUT Czyta (co najmniej jedną) linię z pliku Konwertuj linię do wartości zmiennych wg: Specyfikacji zmiennych, np. name $ - character variable jump, date numeric variables Specyfikacji kolumn, np. name $ 1-10 zakres kolumny Informat-ów, np. date yymmdd. informat dla zmiennej date 30
Czytanie plików zewnętrznych data xy; input x y; datalines; 1 2 3 4 5 6 7 8 ; data xy_ok; input x y @@; datalines; 1 2 3 4 5 6 7 8 ; Obs x y 1 1 2 2 4 5 Obs x y 1 1 2 2 3 4 3 5 6 4 7 8 Modyfikujemy zachowanie INPUT: INPUT var1 var2 var3 @@; Ten INPUT nie zaczyna czytać nowej linii dopóki ma dane w buforze wejściowym, które moŝe konwertować na zmienne UWAGA: polecenie INFILE moŝe mieć opcje: INFILE spec_pliku <opcje>; np. DML=, ; separator tokenów w linii FIRSTOBS=3; zacznij czytać plik od 3 l. i wiele innych... 31 Zapis do plików zewnętrznych data _null_; *no data set; set fhh.exam; file 'c:\temp\exam.txt'; put student_code 1-4 ', ' sem @24 note 3.1 ; Polecenie FILE podaj plik do którego będzie zapis danych Polecenie PUT zapisz jedną linię do pliku wyjściowego, uŝywając atrybutów FORMAT przypisanych zmiennym lub podanych w poleceniu PUT data _null_ - data step nie będzie tworzył wyjściowego data set-u 32
Jawne konwersja funkcje PUT i INPUT data a; t=1234.56; n=put(t,8.1); n2=put(t, comma8.1); t2=input(n2,comma8.2); Zmienna_znakowa = PUT(zmienna, format); Zmienna numeryczna lub znakowa = INPUT(zmienna, informat); proc print; Obs t n n2 t2 1 1234.56 1234.6 1,234.6 1234.6 33 Instrukcja RETAIN data wzrosty_miesieczne; set gielda; *data kurs mies; BY mies; RETAIN pocz; IF FIRST.mies then pocz=kurs; IF LAST.mies then DO; Wzrost=kurs-pocz; Output; end; Składnia polecenia RETAIN: RETAIN var initial_val; Zmienna var nie będzie inicjowana na missing na początku kolejnych iteracji DATA step (wartość będzie zachowana z poprzedniej iteracji) RównieŜ: var+expression; Co jest równowaŝne: RETAIN var 0; var=sum(var,expression); 34
Perspektywy (VIEW) data pracv bledy(keep=id)/view=pracv; INFILE pracownicy.txt missover; INPUT nr data yymmdd8. nazwisko $ kwota; IF kwota=. then OUTPUT bledy; ELSE OUTPUT stview; VIEW utworzone za pomocą DATA stepu Nie zawiera danych a jedynie kod pozwalajścy na uzyskanie danych Jest zbiorem tylko do odczytu UWAGA!!! Zbiór bledy nie zostanie utworzony zaraz po wykonaniu programu, ale dopiero po pierwszym odwołaniu do perspektywy pracv, np. przez: proc print data=pracv; 35 Tablice (polecenie ARRAY) data a; INPUT skok1 skok2 skok3; ARRAY s(3) skok1 skok2 skok3; DO i=1 TO 6; IF s(i)=0 then s(i)=.; END; Tablica jest referencją do istniejących zmiennych, zgrupowanych pod wspólną nazwą Polecenie ARRAY nie tworzy nowych zmiennych) lub: ARRAY x(*) _NUMERIC_: Ale uwaga ten wariant tworzy zmienne tymczasowe: Wszystkie zmienne numeryczne w data stepie ARRAY y(100) _TEMPORARY_ (100*.); Zmienne te nie są zapisywane do zbioru wyjściowego Są automatycznie RETAINED 36
Język makr makrozmienne %LET swieta= 24dec2002'd; %LET zbior=klasa; TITLE Raport dla zbioru &zbior ; Ile_dni = &swieta today(); put Do Swiat zostało ile_dni dni; Makrozmienne: - przechowują jedynie teksty; - wartości makrozmiennych są ustalane przed kompilacją programu; - wartości są rozwijane w, nie są w - %LET w open source (poza definicją makroprogramu) tworzy globalną makrozmienną 37 Język makr makroprogramy %macro import(rawfile, ds); data &ds; infile &rawfile; input t @; %do i=1 %to &N; input v&i %eval(&kol+&i) @; %end; %mend import; W makroprogramach moŝemy uŝywać wyraŝeń i funkcji wykonywanych przez makroprocesor, np. - %if %then %else ; - %do %to %end; - %eval() - %sysevalf() %let rf= t.txt'; %import(&rf,t); 38
Interfejs makr i DATA step ZauwaŜ, Ŝe w poniŝszym (błędnym) kodzie makrozmienna foot nie chce zaleŝeć od wartości zmiennej w DATA stepie... data a;... if full then do; %let foot= pełne ; end; else do; %let foot= puste ; end; Wartości makrozmiennych są ustawiane przed kompilacją programu stąd kod obok jest błędny... proc print; footnote &foot ; /*zawsze będzie napis puste!!!*/ Wydrukuj ostatnio utworzony data set... 39 Interfejs makr i DATA step Teraz kod jest poprawny data a;... if full then do; call symput( foot, pełne ); end; else do; call symput( foot, puste ); end; proc print; footnote &foot ; /* napis zaleŝy od full */ SYMPUT / SYMGET interfejs pomiędzy językiem makr a DATA stepem SYMPUT ustawia wartość makrozmiennej w czasie wykonywania DATA stepu SYMGET pobiera wartość makrozmiennej, ustawionej przez SYMPUT CALL SYMPUT( total, total); CALL SYMPUT( POS left(_n_), pos); pos=symget( POS left(_n_)); 40
Interfejs makr i DATA step data _null_; if 0 then set history nobs=count; call symput('num', left(put(count,8.))); stop; data _null_; put "Ilosc obserwacji w zbiorze history = &num"; Przykład podaj ile jest obserwacji w data set Opcja nobs polecenia set ustawia w zmiennej count ilość obserwacji w zbiorze. Robi to w czasie kompilacji data stepu. Polecenie STOP w celu uniknięcia zapętlenia (jest polecenie SET, a nigdy nie będzie spełniony warunek końca danych) 41