Explorați Cărți electronice
Categorii
Explorați Cărți audio
Categorii
Explorați Reviste
Categorii
Explorați Documente
Categorii
Proces de
Fişiere de date flat conversie -> Set de date SAS
Secţiunea de date
Cea mai uşoară modalitate de a citi fişiere externe este folosirea metodei input pentru
valorile care sunt separate prin unul sau mai multe spaţii.Aceasta reprezintă metoda cea mai
frecvent folosită pentru citirea datelor delimitate prin separatori în SAS.
Considerând că avem un fişier numit produse.txt care conţine numele, preţul şi categoria
a cinci produse, fiecare având valoarea separată printr-un spaţiu, acesta ar avea următoarea
formă:
hartie 2 birotica
creione 10 birotica
apa 6 alimente
ceai 8 alimente
tricou 100 haine
Presupunând că fişierul este stocat pe server în rădăcina utilizatorului, programul SAS
care citeşte date din acest fişier este:
data produse;
infile '/home/nume.prenume/produse.txt';
input Nume $ Pret Categorie $;
run;
Setul de date SAS care va fi creat poartă numele de produse, iar fişierul de date de intrare
este specificat folosind comanda infile.
Declaraţia input asociază datele cu nume de variabilă. Dacă o variabiă este de tip
caracter, numele acesteia se va încheia cu semnul $.
Atunci când lucrăm cu valori care sunt separate prin virgulă, se pot folosi fişiere txt sau
csv. În oricare dintre situaţii, comanda infile trebuie să aibă opţiunea dsd care schimbă
delimitatorul din spaţiu, în virgulă. De asemenea, dacă există două virgule una după alta, va
considera că este o valoare lipsă, fără a fi nevoie ca între virgule să existe un spaţiu. O altă
proprietate a acestei opţiuni este aceea că, pentru variabilele caracter, valorile pot fi specificate
între ghilimele în fişierul sursă.
hartie,2,birotica
creione,10,birotica
apa,6,alimente
ceai,8,alimente
tricou,100,haine
Se vor folosi următoarele declaraţii pentru a obţine setul de date din fişierul produse2.txt:
data produse;
infile '/home/nume.prenume/produse2.txt' dsd;
input Nume $ Pret Categorie $;
run;
Pentru orice alt tip de delimitatori, declaraţia infile trebuie folosită împreună cu opţiunea
dlm sau delimiter. Au aceeaşi semnificaţie, prima fiind abrevierea celeilalte. Exemplu:
infile '/home/nume.prenume/produse3.txt' delimiter='/'; sau
infile '/home/nume.prenume/produse4.txt' dlm='/';.
data produse;
infile '/home/nume.prenume/produse3.txt' dlm='/';
input Nume $ Pret Categorie $;
run;
Dacă valorile datelor nu sunt stocate într-un fişier extern, ele pot fi plasate în cadrul
programului, folosind declaraţia datalines.
data produse;
input Nume $ Pret Categorie $;
datalines;
hartie 2 birotica
creione 10 birotica
apa 6 alimente
ceai 8 alimente
tricou 100 haine;
Cel de-al doilea tip de fişiere externe pe care SAS poate să le citească sunt cele care
conţin date în coloane cu lăţime fixă.
Pentru acestea există două modalităţi de citire:
coloane de intrare (column input)
intrări formatate (formatted input).
Avantajul folosirii datelor în coloane cu lăţime fixă este acela că datele pot fi citite în
orice ordine este necesară, iar valorile lipsă pot fi specificate prin tot atâtea spaţii libere
cât are şi lăţimea coloanei.
Aşa cum se poate observa, numele are 8 caractere, preţul 3, iar categoria 8.
Metoda 1: Coloane de intrare foloseşte declaraţia input specificând pentru fiecare variabilă
numele său, semnul $ pentru variabilele caracter, precum şi poziţia de început şi de sfârşit a
fiecărei variabile în linia de date.
data produse;
infile '/home/nume.prenume/produse4.txt';
input Nume $ 1-8
Pret 9-11
Categorie $ 12-19;
run;
Metoda 2: Intrări formatate poate citi diferite tipuri de formate, cum ar fi monedă (numere
având semnul dolar sau euro), numerele cu zecimale, date în diferite formate.
Declaraţia input are umătoarele opţiuni:
semnul @ urmat de poziţia de început a variabilei în linia de date,
numele variabilei,
formatul variabilei, dacă acesta este necesar,
lăţimea coloanei asociată variabilei.
Considerăm datele anterioare la care adăugam semnul dolar în faţa preţurilor. Datele pot
fi citite direct din program sau din fişierul produse5.
data produse;
/*infile '/home/nume.prenume/produse5.txt'; */
input @1 Nume $8.
@9 Pret dollar4.
@13 Categorie $8.;
format Pret dollar6.0;
datalines;
hartie $2 birotica
creioane$10 birotica
apa $6 alimente
ceai $8 alimente
tricou $100haine
run;
Este important să se poată crea seturi de date permanente, deoarece astfel ele pot fi
accesate oricând de pe calculatorul personal sau de pe server fără a rula cod SAS. Sunt
economisite astfel resurse de calcul şi timp, în special atunci când se lucrează cu seturi mari de
date care sunt folosite de mai multe ori în proiecte SAS.
Atunci când se foloseşte declaraţia DATA este creat un set de date temporar. El va fi
şters când sesiunea curentă este închisă. Implicit este stocat temporar într-o bibliotecă referită
(libref) numită WORK. Pentru ca setul de date să fie stocat permanent trebuie ca biblioteca în
care se salvează să fie specificată explicit.
Biblioteca în care se vor stoca datele este specificată în declaraţia LIBNAME. În
exemplul următor este creată biblioteca produse, iar setul de date rezultat este date_test.
După rularea acestui script, fişierul persistent date_test.sas7bdat va fi creat pe server (aşa
cum se vede în figura 4), iar biblioteca Produse va fi creată împreună cu tabela de date SAS
date_test(figura 3). Acestea din urmă sunt temporare.
Rezultatul obţinut în urma rulării acestui script este un raport SAS ce conţine numele
variabilelor şiobservaţiile. Acest raport este obţinut în figura 6.
3. Formate şi etichete
Formatele (sau formatările) şi etichetele sunt folosite pentru a evidenţia informaţia într-un
mod mai atractiv şi pentru a explicita nişte denumiri abreviate. Etichetele pot fi create în
secţiunile DATA sau PROC.
De exemplu, se vor adăuga etichete pe un set de date referitoare la notele obţinute de
studenţi. Se foloseşte declaraţia LABEL urmată de numele variabilelor, semnul = şi eticheta
scrisă între ghilimele simple sau duble. O etichetă poate avea până la 256 de caractere.
DATA note_an3;
input cod $ Nota1-Nota3;
label cod = 'Cod Student'
Nota1 = 'Nota psw'
Nota2 = 'Nota SGBD'
Nota3 = 'Nota finante';
datalines;
1 10 10 8
2878
3644
;
Dacă etichetele sunt folosite în secţiunea DATA ele vor rămâne asociate variabilelor
respective. Dacă însă sunt folosite în secţiunea PROC, atunci ele vor fi valabile doar în cadrul
secţiunii respective.
Formatele sunt folosite pentru a îmbunătăţi modul în care datele sunt afişate. Există
formate predefinite SAS care pot fi folosite de exemplu pentru afişarea valutei sau pentru a pune
virgula de ordinul miilor la numere. De asemenea, pot fi construite formate de către utilizator,
care apoi să fie folosite pentru diferite valori sau grupuri de valori. De exemplu, M, F (valori
pentru variabila gen) să fie afişate Masculin, Feminin, iar notele sub 4,5 sa fie afişate ca Examen
Picat.
Formatele definite de utilizator se creează cu ajutorul procedurii FORMAT. Exemplul de
mai sus va fi transpus astfel în cod SAS:
proc format;
value $gen 'M' = 'Masculin'
'F' = 'Feminin'
other = 'format necoresp.';
value nota low-4.4 = 'Examen Picat';
4.5-high = 'Examen trecut';
run;
În general formatările sunt valabile doar pentru afişări şi nu pentru procesarea datelor.
Există însă şi câteva excepţii. De exemplu, procedura FREQ calculează frecvenţele de apariţie
ale valorilor formatate, dacă este aplicat un format.
În continuare aplicăm formatările nota şi gen pe setul de date note. Se observă că, la fel
ca la formatările predefinite SAS, atunci când acestea se aplică, numele lor trebuie urmat de
punct.
data note;
input nume$ 1-9 nota gen$;
datalines;
Ionescu 5.6 M
Popescu 4.3 F
Vasilescu 3.3 b
Georgescu 9.2 F
Iliescu 10 M
Samoila 5.9 M
Toma 7 F
;
title "Date despre exemenul de PSW";
proc print data=note;
var nume nota gen;
format nota nota.
gen $gen.;
run;
Rezultatul obţinut după aplicarea formatărilor se poate observa în figura 7. Pentru
variabila nota, formatul se aplică numai pentru valorile < 4.5, restul observaţiilor rămânând
nemodificate.
Se cere să se determine numărul de studenţi din fiecare gen şi numărul de studenţi care au
formatul necorespunzător. Se va folosi procedura FREQ care determină frecvenţa de apariţie a
valorilor variabilelor. Pentru variabila gen se va aplica formatul definit de utilizator, asftel încât
FREQ va număra valorile rezultate după aplicarea formatului. Rezultatul rulării se poate observa
în figura 8.
Pentru ca formatele să capete persistenţă, ele trebuie stocate în biblioteci definite prin
libname nume_biblioteca 'calea director…' şi apoi accesate astfel:
DATA comenzi;
input iD_Comanda ID_Produs :$4. Cantitate Pret Data :mmddyy.;
datalines;
102 1053 3 125 05/12/2018
103 243 25 30.7 05/15/2018
104 3052 1 106.83 06/21/2018
105 129 6 3.42 06/24/2018
;
4. Fişiere JSON
SAS nu oferă încă posibilitatea importării unor astfel de fişiere, ci doar o procedură
destinată exportului în fişiere JSON. Vom extrage din fişierul iniţial valoarea daunei şi clientul
într-un fişier de date SAS, care va fi ulterior exportat tot într-un fişier JSON.
Pentrua rafina datele preluate din fişierul .JSON este nevoie să edităm interogarea SQL
pe care se bazează tabela de date SAS interogare.
Valoarea daunei nu are o lungime fixă, de aceea ea trebuie curăţată. Verificăm dacă
valoarea extrasă se termină în cifre sau în “,
În cel de-al doilea caz, eliminăm caracterele incorecte. De asemenea, prin condiţia
valoare<>'",', eliminăm valorile vide.
Procedura PROC SQL permite scrierea de cod SQL, în cazul de faţă, crearea unei tabele
pe baza unei interogări.
Pentru condiţionarea alternativă am folosit clauza CASE.
PROC SQL;
CREATE TABLE WORK.interogare AS
SELECT CASE
WHEN substr(valoare,length(valoare)-1,2)='",'
THEN substr(valoare,1,length(valoare)-2)
ELSE valoare
END AS
val, idclient FROM WORK.DAUNE_NOU WHERE valoare<>'",' ;
RUN;
QUIT;
Pentru exportul datelor într-un fişier .JSON se foloseşte procedura JSON pentru care se
precizează fişierul în care se face exportul şi setul de date SAS de exportat.
Se poate observa că în interogarea de mai sus, variabila val este de tip caracter, ceea ce
înseamnă că asupra ei nu pot fi efectuate în SAS operaţii numerice. Se doreşte crearea unei noi
tabele, îm care variabila valoare să stocheze valori numerice. În acest sens, se va folosi funcţia
INPUT pentru a converti o valoare de tip caracter la o valoare numerică şi a stoca valoarea
acesteia într-o nouă variabilă. De asemenea, se va folosi formatul de intrare DOLLAR10.2
pentru a indica faptul că datele de intrare au în faţă semnul $ urmat de un număr cu două
zecimale.
Operatori de comparaţie
SAS permite utilizarea operatorilor de comparaţie cunoscuţi, într-o formă specifică. În
tabelul de mai jos putem observa sintaxa SAS pentru fiecare operator.
Operatorul IN (lista-valori)
Putem folosi acest operator ca alternativă la scrierea a multiple condiţii legate prin OR.
In cadrul listei definite cu IN putem folosi atât valori numerice cât şi caractere, ele fiind separate prin
virgulă sau spaţiu.
Exemplu. : Nota IN ( ‘A’ ‘B-’ ‘B+’ ‘C’)
Nota IN ( ‘A’ ,‘B-’,‘B+’,‘C’)
Nota IN ( 10 9 8 7)
Nota IN ( 10,9,8,7)
Valoare IN (10,15,20:30)
2. Instrucţiunea WHERE
Dacă se citesc date dintr-un set de date SAS, se poate utiliza instrucţiunea WHERE
pentru crearea unui subset de date.
De asemenea, se poate utiliza această instrucţiune în cadrul unei proceduri SAS, pentru a
crea subseturi ale datelor procesate.
Crearea de subseturi poate fi realizată şi cu instrucţiunea IF, dar WHERE oferă o serie
de avantaje cum ar fi un număr mai mare de operatori ce pot fi folosiţi, precum şi posibilitatea ca
utilizarea acestei instrucţiuni să fie mai eficientă atunci când se lucrează cu un set de date de
intrare indexat. De asemenea, instrucţiunea IF nu este permisă în cadrul unei proceduri SAS.
Unde Noobs face să nu se afişeze numărul curent al înregistrărilor din setul de date
Exerciţiul 2.Să se afişeze din setul de date creat la exerciţiul anterior, toate persoanele de sex
feminin care au la proiect nota 9 sau 10, sau au luat nota 10 la examen:
2. Instrucţiunea IF
Sintaxa
If conditie THEN actiune;
Atunci când expresia logică este evaluată ca fiind adevărată,se execută instrucţiunile ce
urmează cuvântului cheie THEN. Dacă expresia nu este adevărată, programul continuă să
proceseze următoarele instrucţiuni, sau ramura ELSE dacă aceasta există.
Atenţie! Valorile numerice lipsă sunt tratate logic ca cel mai negativ număr ce poate fi
referit, astfel încât atunci când o astfel de valoare este testată într-o expresie IF, programul va
evalua rezultatul testării ca fiind TRUE.
Atunci când se doreşte verificarea mai multor condiţii printr-o succesiune de clauze IF
este recomandată utilizarea variantei IF...ELSE...IF. Acest lucru duce la o evaluare mai eficientă
a programului, deoarece SAS nu mai testează condiţiile ELSE rămase atunci când identifică o
ramură IF a cărei condiţie este evaluată ca adevărată.
Rezultatul rulării acestui exemplu este un raport ce conţine, pe lângă datele introduse,
grupa de vârstă a fiecărui student, aşa cum se observă în Figura 1.
Selectarea observaţiilor
Dacă se doreşte extragerea unui subset de date dintr-un fişier de date sau dintr-un set de
date SAS existent, se poate utiliza o formă specială a instrucţiunii IF care permite preluarea
exclusiv a acelor rânduri din setul iniţial care îndeplinesc o condiţie specificată.
Sintaxa:
IF conditie; /*Atentie! Lipseşte Then*/
unde ‘conditie’ este o expresie SAS.
Dacă condiţia este adevărată, pasul ‘DATA’ continuă să proceseze observaţia. Dacă
condiţia este falsă nu se mai procesează nimic, controlul revenind la începutul pasului ‘DATA’
pentru procesarea următorului rând.
Exerciţiul 4. Folosind setul de date anterior, să se afişeze exclusiv datele studenţilor de sex
feminin.
data Femei;
length Sex $ 1;
input Varsta Sex Proiect Activitate Examen;
Dacă valoarea variabilei Sex este ‘F’, atunci se ajunge la
if Sex eq 'F';
finalul pasului DATA şi are loc un output automat, dacă
datalines;
valoarea este diferită de ‘F’, se revine la inceputul pasului
21 M 8 9 8
.F999 DATA.
35 M 8 8 8
48 F . . 7
59 F 9 7 9
15 M 8 . 9
67 F 9 8 9
.M676
35 F 7 7 8
49 M 5 5 8
;
title "Date studente";
proc print data=Femei;
run;
Exercitiul 5.
Se cunosc datele referitoare la proiectele anuale desfăşurate în cadrul unei companii.
Pentru proiectele a căror buget este mai mic sau egal cu 10.000, se va realiza o raportare lunară a
rezultatelor, iar pentru cele a căror bugetul depaşeşte această sumă, raportarea va fi bilunară.
Se va adăuga o nouă variabilă pentru a evidenţia frecvenţa raportării.
De asemenea, se va evidenia printr-o variabilă nouă faptul că prima categorie de proiecte va avea
ca termen de prezentare a rezultatelor în cadrul consiliului de administare data de 17 decembrie
2018, iar cea de-a doua categorie data de 20 decembrie 2018.
data proiecte;
length Departament $ 9;
input CodProiect Departament $ Valoare;
datalines;
312 Productie 8720
313 Achizitii 12570
314 Productie 39750
315 Desfacere 7380
316 Desfacere 18390
;
run;
*/fara stabilirea latimii frecventei de raportare;
data proiecte1;
set proiecte;
if Valoare le 10000 then
do;
Raportare="Lunara";
Prezentare='17dec2018'd;
end;
else
do;
Raportare="Bilunara";
Prezentare='20dec2018'd;
end;
run;
*/cu stabilirea latimii frecventei de raportare;
data proiecte2;
set proiecte;
length Raportare $8;
if Valoare le 10000 then
do;
Raportare="Lunara";
Prezentare='17dec2018'd; *constanta de tip data;
end;
else
do;
Raportare="Bilunara";
Prezentare='20dec2018'd;
end;
run;
Exerciţiul 6.Să se creeze pornind de la setul de datede la exerciţiul 1, un nou set de date care
conţine toate persoanele de sex masculin care au nota finală peste 7, ştiind că nota finală se
calculează ca medie ponderată între cele trei note obţinute, cu ponderile de 20%, 30% şi
respectiv 50%.
data Studenti1;
set Studenti;
NotaFinala=SUM(Proiect*0.3+Activitate*0.2+Examen*0.5);
if NotaFinala>7;
run;
run;
3. Instrucţiunea SELECT
Această instrucţiune poate fi utilizată ca o alternativă la o serie de instrucţiuni IF ELSE IF.
Sintaxa
SELECT (expresie_de_selectie);
WHEN (expresie_WHEN1) instructiune 1;
WHEN (expresie_WHEN2) instructiune 2;
…..
OTHERWISE instrucţiune_implicită;
END;
Expresia de selecţie este comparată cu fiecare expresie din WHEN. Dacă rezultatul
comparării este TRUE, atunci se execută instrucţiunea corespunzătoare şi controlul programului
trece la finalul instrucțiunii SELECT. Dacă comparaţia nu este adevărată, se evaluează
următoarea ramură WHEN. Dacă nici una dintre comparaţiile cu expresiile WHEN nu rezultă ca
fiind adevărate, atunci se execută OTHERWISE. Atentie! Aceasta poate fi şi null.
Exemplu:
Expresie_de_selectie
SELECT (GrupVarsta);
WHEN (1) Limit = 110; Expresie_WHEN
WHEN (2) Limit = 120;
Instrucţiune
WHEN (3) Limit = 130;
OTHERWISE ; NULL pe ramura
OTHERWISE
END;
Observatie! Dacă nu se include ramura OTHERWISE, iar toate comparaţiile anterioare sunt
false, execuţia programului se încheie.
Dacă nu este precizată o expresie de selecţie, fiecare ramură WHEN este evaluată pentru
a vedea dacă expresie_WHEN este adevărată sau falsă.
data Studenti2;
length Sex $ 1;
input Varsta Sex Proiect Activitate Examen;
SELECT;
WHEN (missing(Varsta)) GrupVarsta=.;
WHEN (Varsta lt 20) GrupVarsta=1;
WHEN (Varsta lt 40) GrupVarsta=2;
WHEN (Varsta lt 60) GrupVarsta=3;
OTHERWISE GrupVarsta=4;
END;
datalines;
21 M 8 9 8
.F999
35 M 8 8 8
48 F . . 7
59 F 9 7 9
15 M 8 . 9
67 F 9 8 9
.M676
35 F 7 7 8
49 M 5 5 8
;
title "Date studenti introduse cu SELECT";
proc print data=Studenti2;
run;
4. Structuri repetitive
Structurile repetitive permit execuţia unui set de instrucţiuni în mod repetat, cât timp este
îndeplinită o anumită condiţie sau până se atinge un număr prestabilit de iteraţii. În SAS putem
realiza acest lucru folosind grupurile DO, bucla DO sau instrucţiunile DO WHILE şi DO
UNTIL.
Grupul DO
Sintaxa
Do
Instrucţiune 1;
Instrucţiune 2;
...
Instrucţiune n;
End;
Instrucţiunile cuprinse în cadrul unei structuri Do poartă numele de “grup Do”. Acest
mod de lucru este mai eficient decât utilizarea mai multor instrucţiuni IF.
Exercitiul 8. Folosind datele cunoscute, să se adauge două variable noi, GrupVarsta şi Medie
calculate după cum urmează: dacă vârsta este mai mică de 39 de ani, valoarea pt GrupVarsta va
fi ‘grup1’ iar Media se va calcula ca media ponderată între proiect (40%) şi Examen (60%). Dacă
vârsta este mai mare sau egală cu 39 GrupVarstă=’grup2’, iar media se calculează ca medie
aritmetică.
data Medii;
length Sex $ 1 Datele au fost încarcate pe server într-un
GrupVarsta $ 13; fisier text numit ‘dateSAS’
infile '/home/nume.prenume/datesas.txt' missover;
input Varsta Sex Proiect Activitate Examen;
if missing(Varsta) then delete;
if Varsta le 39 then
do;
GrupVarsta = 'Grup1';
Medie = .4*Proiect + .6*Examen;
end;
else if Varsta gt 39 then
do; Grup DO
GrupVarsta = 'Grup2';
medie = (Proiect + Examen)/2;
end;
run;
title "Raportul Mediilor Studentilor";
proc print data=medii noobs;
run;
În cazul în care se întâlneşte o valoare NULL pentru variabila Vârstă, funcţia MISSING
returnează valoarea TRUE. Instrucţiunea DELETE împiedică adăugarea valorii curente la setul
de date şi forţează întoarcerea la începutul pasului DATA. Rezultatul rulării programului poate fi
observat în Figura 6.
Figura 6. Raportul mediilor studentilor
Exerciţiul 9. Dacă se doreşte calculul încasărilor dintr-o săptămână, la sfârşitul fiecărei zile a
săptămânii, putem folosi SUM.
data Venit;
input
Zi : $8.
venit : dollar6.;
Total + Venit;
format Venit Total dollar8.;
datalines;
Luni $1,000
Marti $1,500
Miercuri .
Joi $2,000
Vineri $3,000
title "Incasari saptamanale";
proc print data=venit noobs;
run;
După citirea celor două variabile cunoscute, cu formatul specificat se calculează valoarea
variabilei Total, ca sumă între Totalul existent şi Venitul curent. Dacă valoarea curentă a
variabilei venit este NULL, ea va fi ignorată. Rezultatul rulării programului se poate observa în
figura 7.
Figura 7. Incasări săptămânale
DO contor=valoare_start to valoare_stop;
Set_instrucţiuni;
END;
DO contor=valoare_starttovaloarestopbyvaloareincrementare;
Set_instrucţiuni;
END;
Exerciţiul 10. Calculaţi suma de care veţi dispune la finalul a trei ani, plecând de la o
investiţieiniţială de 100$, cu o dobândă anuală de 3.75%.
data Dobanda_Investitie;
Dobanda = .0375;
Total = 100;
do An = 1 to 3;
Total + Dobanda*Total;
output;
end;
format Total dollar10.2;
run;
title "Evoluţie investiţie";
proc print data=Dobanda_Investitie noobs;
run;
Comanda OUTPUT introdusă în cadrul buclei DO este o instrucţiune pentru SAS de a
scrie o valoare în setul de date de ieşire.
Un OUTPUT are loc de obicei la sfârşitul unui pas de tip DATA, dar în acest caz dorim
ca el să aibă loc de fiecare dată când este calculat un nou total.
Atunci când includem o comanda OUTPUT în cadrul unui pas DATA (oriunde ar fi
inclusă), SAS nu mai execută o scriere automată la finalul pasului DATA.
Rezultatul rulării codului de mai sus se observă în figura 8.
DO WHILE, DO UNTIL
În loc de a alege o valoare de oprire pentru o buclă iterativă DO, putem să întrerupem iteraţiile
atunci când o condiţie este îndeplinită. DO...WHILE este o structură cu verificare anterioară, pe
când DO...UNTIL realizează o verificare posterioară.
Sintaxa
DO WHILE condiţie
Set_instrucţiuni;
END;
DO UNTIL (condiţie)
Set_instrucţiuni;
END;
Observaţie! Atunci când se lucrează cu structura DO UNTIL este foarte important ca
condiţia verificată să devină adevărată la un moment dat, pentru a se evita intrarea într-o buclă
infinită. O posibilitatea de a evita această situaţie este să combinăm o buclă DO obişnuită cu
UNTIL.
Exerciţiul 11. Folosind cele două variante DO, aflaţicâţi ani sunt necesari pentru dublarea
investiţiei, dacă suma iniţială este de 100$ şi dobânda este de 3,75%.Rezultatul rulării
programului se poate observa în figura 9.
DO WHILE
data Dublare_venit;
Dobanda = 0.0375;
Total = 100;
do until (Total ge 200);
An + 1;
Total = Total + Dobanda*Total;
output;
end;
format Total dollar10.2;
run;
title "Dublare venit";
proc print data=Dublare_venit noobs;
run;
DO UNTIL
data Dublare_venit;
Dobanda = .0375;
Total = 100;
do while (Total le 200);
An + 1;
Total = Total + Dobanda*Total;
output;
end;
format Total dollar10.2;
run;
proc print data=Dublare_venit noobs;
title "Dublare venit";
run;
5. Funcţii SAS
Funcţiile SAS pot fi folosite pentru a calcula expresii ce stau la baza definirii sau
modificării variabilelor SAS. Funcţiile pot lua unul sau mai multe argumente, iar numărul
argumentelor este fix sau variabil. Argumentele pot fi constante, variabile sau expresii.
Acesteatrebuie incluse în paranteze şi separate prin virgulă.
Exerciţiul 12.
Se consideră datele referitoare la angajaţii unei companii aeriene.
Acestea se regăsesc în setul de date SAS Angajaţi.
Se cere să se folosescă funcţii SAS pentru a determina veniturile totale anuale încasate de
către fiecare angajat, precum şi luna în care angajaţii primesc prima, cunoscând că:
- toţi angajaţii primesc o primă de 500 de dolari în luna în care au fost angajaţi în
companie;
- în funcţie vechimea angajatului, se mai oferă un extra bonus cuprins între 5% si 15%
din salariul anual.
Pentru rezolvarea problemei se vor utiliza trei funcţii SAS:
SUM(argument1, argument2,…. ),
MONTH(data_SAS)
YRDIF(data_inceput, data_sfarsit, <baza>).
Funcţia SUM() returnează suma argumentelor sale şi ignoră valorile lipsă, fiind
preferabilă din acest motiv operatorului de adunare care, atunci când primeşte un argument
NULL, returnează valoarea NULL.
Funcţia MONTH() extrage luna dintr-o dată calendaristică pe care o are ca argument.
Funcţia YRDIF() returnează diferența în ani dintre două date calendaristice în funcție
de convenţiile de numărare a zilelor sau poate returna vârsta / vechimea unei persoane.
Mai multe detalii despre această funcţie se găsesc aici:
http://support.sas.com/documentation/cdl/en/lefunctionsref/63354/HTML/default/view
er.htm#p1pmmr2dtec32an1vbsqmm3abil5.htm
Sintaxa:
DATAset_date_nou;
SETset_date_1 set_date_2 ...;
Exerciţiul 1: Un parc de distracţii are două intrări (sud şi nord) prin intermediul cărora
colectează date despre clienţi. Aceste date se referă la numărul tichetului de trecere,
dimensiunea grupului din care face parte clientul, vârsta, iar pentru intrarea de nord se
colectează şi date referitoare la lotul în care clientul a parcat maşina. Se cere să se combine
cele două seturi de date şi să se creeze o variabilă nouă care calculează preţul tichetului de
intrare pentru fiecare client în funcţie de vârstă. Rezultatele rulării codului de mai jos sunt
prezentate în figura 1.
Redenumirea variabilelor
Există situaţii în care coloane din două seturi de date conţin aceeaşi informaţie, numai că
numele coloanelor diferă, în aceest caz neputându-se realiza combinarea seturilor de date în
mod corect. Pentru a schimba numele uneia sau mai multor variabile, se poate folosi opţiunea
RENAME= în secţiunea de date.
Sintaxa:
Set_date (RENAME =(nume_vechi_1=nume_nou_1
nume_vechi_2=nume_nou_2
....
nume_vechi_n=nume_nou_n))
Opţiunea RENAME= trebuie specificată imediat după setul de date asociat acesteia. De
remarcat setul de paranteze externe care încadrează întreaga opţiune şi setul de paranteze
interne în cadrul căruia se specifică una sau mai multe variabile care vor fi redenumite.
Exerciţiul 2. O companie are două filiale în Braşov şi Cluj. Se cere să se realizeze un set de
date combinat cu date referitoare la angajaţii din cele două filiale. În codul de mai jos sunt
exemplificate concatenarea fără redenumirea variabilelor, cu redenumirea unei variabile sau a
mai multor variabile.
data angajati;
set angajatiBV angajatiCJ;
run;
PROC PRINT DATA = angajati;
TITLE 'Setul de date combinat fara redenumirea variabilelor';
RUN;
data angajati;
set angajatiBV angajatiCJ (RENAME=(Zona=Judet));
run;
PROC PRINT DATA = angajati;
TITLE 'Setul de date combinat cu redenumirea unei variabile';
RUN;
data angajati;
set angajatiBV (RENAME =(Angajat=Nume Gen=Sex))
angajatiCJ (RENAME=(Angajat=Nume Gen = Sex Zona=Judet));
run;
PROC PRINT DATA = angajati;
TITLE 'Setul de date combinat cu redenumirea mai multor variabile';
RUN;
2. Interclasarea seturilor de date folosind declaraţia SET
Dacă seturile de date sunt deja sortate (prin intermediul procedurii SORT) după o variabilă
relevantă, atunci doar simpla concatenare a acestora poate produce un set de date nesortat.
Totuşi, combinarea seturilor de date sortate, numită interclasare, se poate realiza similar
concatenării prin adăugarea clauzei BY.
Sintaxa:
DATAset_date_nou;
SETset_date_1 set_date_2 ...;
BY listă_variabile;
DATA intrare_sud;
INFILE '/home/nume.prenume/Sud.dat';
INPUT Intrare $ NrTichet DimGrup Varsta;
PROC SORT DATA = intrare_sud;
BY NrTichet;
RUN;
DATA intrare_nord;
INFILE '/home/nume.prenume/Nord.dat';
INPUT Intrare $ NrTichet DimGrup Varsta Lot;
PROC SORT DATA = intrare_nord;
BY NrTichet;
RUN;
Sintaxa:
DATAset_date_nou;
MERGEset_date_1 set_date_2;
BY listă_variabile;
Atenţie! Dacă vor fuziona două seturi de date care au variabile cu acelaşi nume (altele decât
cele din clauza BY), atunci variabilele din cel de-al doilea set de date vor suprascrie orice
variabilă care are acelaşi nume în primul set de date.
Atenţie! Observaţi că în setul de date final există o valoare lipsă pentru cea de-a şaptea
observaţie. De aici putem deduce că în setul de date final sunt incluse toate înregistrările din
datele de intrare, indiferent dacă acestea au sau nu corespondent.
Atenţie! Dacă nu se defineşte nicio variabilă în clauza BY, SAS realizează o simplă joncţiune
a observaţiilor din seturile de date în funcţie de poziţia acestora în fiecare set, cu alte cuvinte
are loc o fuziune unu-la-unu fără corespondenţă.
Exerciţiul 5:Un distribuitor de încălţăminte sportivă oferă reduceri pentru toate produsele sale
faţă de preţul iniţial. Compania are la dispoziţie două fişiere: unul care conţine detalii despre
încălţăminte (Denumire, Sport, Pret)în setul de date SAS “Incaltaminte” şi altul cu coeficienţii
de reducere pentru luna martie (Sport, Reducere) în setul de de date SAS „Inc_reducere”. Se
cere să se creeze un set de date combinat din cele două care să conţină şi preţul final de
vânzare rotunjit la două zecimale.
data colaboratori;
datalines;
1 Irimia
2 Popa
4 Radu
5 Ionita
7 Stoicea
data ore_lucrate;
datalines;
1 A 37
4 B 44
5 A 32
9 B 54
data nou;
ore_lucrate (IN=inOre);
by Cod;
file print;
RUN;
ore_lucrate (IN=inOre);
by Cod;
RUN;
RUN;
De lucru!!!!
Pornind de la exemplul de precedent, prin intermediul unei proceduri de fuziune, identificaţi
care colaboratori au lucrat în perioada 21-27 ianuarie, dar ale căror detalii de identificare nu
se regăsesc în setul de date corespunzător.
Pentru aceştia, recalculaţi şi afişaţi din nou onorariile datorate colaboratorilor, ştiind că atunci
cînd se depăşeşte nivelul de 40 de ore pe săptămână, orele peste acest nivel se plătesc dublu.
PROC SQL;
comandă _sql;
QUIT;
Data Filiale;
cards;
10 Cluj 150
20Iasi 170
30Timis 350
40 Dolj 140
50 Sibiu 180
run;
Data Personal;
cards;
1Popescu30
2Matei 10
3Avram10
4Costache10
5 Ionescu 40
6 Enache 40
7 Anton 40
8 Codreanu
9Iftene 50
;
run;
*INNER JOIN;
PROC SQL;
wheref.ID_fil = p.ID_fil;
QUIT;
*Cod alternativ;
PROC SQL;
On f.ID_fil = p.ID_fil;
QUIT;
*LEFT JOIN;
PROC SQL;
On f.ID_fil = p.ID_fil;
QUIT;
*RIGHT JOIN;
PROC SQL;
On f.ID_fil = p.ID_fil;
QUIT;
*FULL JOIN;
PROC SQL;
Create table full_join as
Select * fromFiliale as ffulljoin Personal as p
On f.ID_fil = p.ID_fil;
QUIT;
procSQL;
QUIT;
PROC SQL;
(CodClient num,
Nume char(17),
Adresa char(20));
FROM ad_data.client;
(CodClient num,
Valoare num );
SELECT *
FROM ad_data.comenzi;
PROC SQL;
On x.CodClient = y.CodClient
SELECT *
FROM clienti_fara_comenzi;
QUIT;
Masivele sunt utile în SAS atunci când se doreşte repetarea aceleiaşi secvenţe de paşi pentru
mai multe variabile. Un masiv reprezintă un grup ordonat de elemente similare. În SAS,
acesta reprezintă un grup de variabile, toate de tip numeric sau de tip caracter. Pot fi variabile
existente în setul de date cu care se lucrează sau variabile noi.
Exerciţiul 11: Se doreşte realizarea unui sondaj prin intermediul căruia să se măsoare gradul
de satisfacţie al cursurilor din domeniul economic oferite de o platformă de e-learning.
Respondenţii pot acorda calificative de la 1 la 5, iar în situaţia în care nu au urmat un curs sau
nu doresc să acorde un calificativ, se va introduce valoarea 0. Au fost culese şi date referitoare
la oraşul de reşedinţă al repondenţilor şi vârsta acestora. Se cere să se înlocuiască valoarea 0
cu valoarea lipsă pentru toate variabilele care conţin calificative.
DATA cursuri;
INFILE '/home/nume.prenume/Cursuri.txt';
ARRAY curs (7) ECON MRKT FINA CONT STAT MATE INFO;
DO i = 1 TO 7;
END;
RUN;
RUN;
Atenţie!!! Observaţi că membrii masivului de la curs(1) la curs(7) nu vor face parte din setul
de date, dar variabila “i” este inclusă în acesta. Folosiţi o opţiune potrivită pentru a o
îndepărta din setul de date.
O listă abreviată de nume de variabile poate fi plasată în orice expresie unde apare şi o listă de
variabile specificate în detaliu. Ca şi parametri ai funcţiilor, listele abreviate vor fi precedate
de cuvântul cheie OF, spre exemplu, SUM (OF val1-val12). Existătreitipuri de listeabreviate,
şi anume:
Liste cu valori numerice, în care variabilele încep cu aceleaşi caractere şi se termină
cu numere consecutive ( INPUT Tip1- Tip8; ).
Listele cu domeniu denumit depind de ordinea internă, sau de poziţia, variabilelor în
setul de date. Spre exemplu, lista abreviată s – prefer variabilele care au fost definite
prin declaraţia INPUT s t o p; .
Listele cu nume speciale, _ALL_ , _CHARACTER_ , _NUMERIC_ , pot fi plasate
orinde dorim să specificăm fie toate variabilele, fie numai pe cele numerice sau de tip
caracter (SUM(OF _NUMERIC_)).
DATA cursuri;
INFILE '/home/nume.prenume/Cursuri.txt';
INPUT Oras$ Varsta ECON MRKT FINA CONT STAT MATE INFO;
DO i = 1 TO 7;
END;
RUN;
RUN;
DATA raspunsuri;
SET ad_data.RASPUNSURI;
DO i = 1 TO dim (var_caracter);
IF var_caracter(i) NOT IN ('a' 'b' 'c' 'd' 'A' 'B' 'C' 'D') then
call missing(var_caracter(i));
END;
DROP i;
RUN;
RUN;
Atenţie!!! A fost definit un masiv fără a specifica numărul de elemente (prin semnul *) şi
care conţine doar variabilele de tip caracter. La parcurgerea masivului se foloseşte funcţia
dim () pentru a determina numărul de elemente ale acestuia. Call missing reprezintă o rutină
prin care se asignează o valoare lipsă oricărei variabile din lista de argumente.
DATA competente;
01 EA GA SB
02 FA EB EB
03 SA GB EC
04 EA FA GB
05 SB EB GB
RUN;
DATA competente_nou;
SET competente;
CO=CO1;
CO=CO2;
CO=CO3;
KEEP ID CO;
RUN;
DATA competente_nou;
SET competente;
DO i=1 to 3;
CO=COARRAY[i];
END;
KEEP ID CO;
RUN;
TABLES CO /NOCUM;
RUN;
Exerciţiul 14: De-a lungul anului 2018 trei echipe de voluntari au participat la plantarea de
puieţi într-o pepinieră, în patru etape. Se cunoaşte numărul de puieţi plataţi de fiecare echipă
în fiecare etapă. Se cere să se determine numărul mediu de puieţi plantaţi în 2018 de către
fiecare echipă şi să realizeze un raport al plantărilor de puieţi în anul 2018, per echipă şi per
total .
DATA echipe;
INFILE '/home/nume.prenume/Echipe.txt';
RUN;
DATA echipe_timp;
SET echipe;
ARRAY A [4];
DO timp = 1 TO 4;
Puieti = A[timp];
OUTPUT;
END;
RUN;
BY CODE;
SUM puieti;
RUN;
Sintaxa:
PROC PRINT DATA = set_date NOOBS LABEL;
- NOOBS suprimă afişarea numărului observaţiei.
- LABEL afişează eticheta, în loc de numele variabilei.
O serie de declaraţii opţionale sunt utile la creare de raporte de detaliu:
- BY lista_variabile; Declaraţia BY iniţiază în rezultate o nouă secţiune pentru fiecare
valoare nouă a variabilelor de grupare şi scrie valorile variabilelor de grupare în partea de
sus a fiecărei secţiuni. Datele trebuie să fie sortate în prealabil după variabilele de grupare.
- ID lista_variabile; Când se utilizează declaraţia ID, numerele observaţiilor nu vor fi
afişate. În schimb, variabilele din lista_variabile vor apărea în partea stângă a paginii.
- SUM lista_variabile; Declaraţia afişează sume ale valorilor variabilelor din listă.
- VAR lista_variabile; Specifică variabilele afişate şi ordinea acestora.
Exerciţiul 1: Pentru a-şi suplimenta fondurile destinate unei excursii şcolare, elevii claselor a
III-a A şi a III-a B au decis să participe la câteva evenimente din cadrul unei campanii de
încurajare a cititului în rândurile copiilor, prin vânzarea de semne de carte cu mesaje
motivaţionale create de ei. Copiii au câştigat câte 3 lei pentru un semn de carte pe suport de
hârtie sau textil. În fişierul „micii_cititori.txt” au fost stocate date referitoare la elevul care a
participat la eveniment, tipulsemnelor de carte vânduteşicantitatea. Se cere să se realizeze un
raport privind sumele cu care a contribuit fiecare elev, totalul pe fiecare clasă şi totalul
general.
DATA cititori;
INFILE "/home/nume.prenume/micii_cititori.txt";
INPUT Nume $ Clasa $ DataParticipare MMDDYY10. Suport $ Cantitate;
Castig= Cantitate*3;
RUN;
PROC SORT DATA=cititori;
BY Clasa;
PROC PRINT DATA=cititori;
BY Clasa;
SUM Castig;
TITLE 'Fondurile stranse de fiecare clasa';
RUN;
De lucru!!!!Modificaţi codul SAS de mai sus pentru a personaliza raportul obţinut astfel încât
pentru câştigul fiecărei clase şi per total să se precizeze etichete. Adăugaţi codul:
sumlabel='Total #byval(Clasa)' grandtotal_label='Total'ca opţiune a procedurii PRINT,
după numele setului de date care se afişează. Formataţi data de participare folosind formatul
SAS DATE9..
Procedura UNIVARIATE, parte a BASE SAS, este folosită în principal pentru examinarea
distribuţiei datelor pentru o singură variabilă, incluzând o evaluarea a normalităţii datelor şi
identificarea valorilor extreme. Pe lângă calcularea unor indicatori statistici de bază (care se
vor regăsi şi în procedra MEANS), UNIVARIATE poate include şi reprezentări grafice
necesare pentru a analiza datele.
Sintaxa simplificată:
PROC UNIVARIATE<optiuni>;
VARlistă_variabile;
BY listă_variabile;
ID variabilă;
HISTOGRAM <listă_variabile>;
Fără declaraţia VAR, procedura va genera statistici pentru toate variabilele numerice ale
setului de date. Trei opţiuni uzuale care se pot specifica împreună cu declaraţia procedurii
sunt:DATA, NORMAL, FREQ şi PLOT. Prin opţiunea NORMAL sunt realizate teste de
normalitate, FREQ generează tabele de frecvenţă ale variabilelor, iar PLOT produce trei tipuri
de grafice: diagrama ramură-frunză (stem-leaf), diagramabox plot şi diagrama distribuţiei
normale. Se poate folosi declaraţia BY pentru a obţine analize separate pe grupe de valori.
Declaraţia ID denumeşte variabila care identifică observaţiile în locul numărului observaţiei,
iar HISTOGRAM construieşte un grafic de tip histogramă.
Exerciţiul 2:Se consideră datele referitoare la notele obţinute de o grupă de studenţi la un test
(fişierul“note.txt”). Din rezultatele afişate prin aplicarea procedurii UNIVARIATE se cere să
se determine media notelor studenţilor, dacă au existat valori în afara intervalului 0-100 şi
care este, cu aproximaţie,punctajul în jurul căruia se concentrează majoritatea notelor
studenţilor.
*Statistici descriptive cu UNIVARIATE;
DATA note;
INFILE "/home/nume.prenume/note.txt";
INPUT Punctaj @@;
RUN;
PROC UNIVARIATE DATA=note PLOT;
VAR Punctaj;
TITLE;
RUN;
Implicit, procedura afişează cinci dintre valorile cele mai mici şi mai mari ale variabilei
analizate şi numărul observaţiei care are aceste valori extreme.
Se poate utiliza opţiunea NEXTROBS= pentru a afişa un alt număr de valori extreme.
Pentru a afişa cele mai mici şi mai mari valori distincte, se va utiliza opţiunea NEXTRVAL=
, iar pentru a suprima afişarea tabelei cu observaţiile extreme, opţiunea NEXTROBS=0.
Exerciţiul 3: Fişierul “amenzi.txt” conţine numărul de amenzi date pentru depăşirea vitezei în
fiecare stat din SUA. Se cere:
a) să seanalizeze aceste date şi să se identifice valorile extreme ale numărului de amenzi cu
evidenţierea codului statului în loc de numărul înregistrării;
b) să se reprezinte grafic o histogramă a numărului de amenzi;
c) să se identifice cele mai mici şi cele mai mari cinci valori extreme distincte pentru
variabila numerică.
Procedura MEANS are rolul de a crea rapoarte agregate prin generarea de diferiţi indicatori
statistici pentru variabilele de tip numeric. De asemenea, poate fi folosită pentru a crea seturi
de date agregate care pot fi ulterior analizate cu ajutorul altor secţiuni de date sau proceduri.
Sintaxa:
PROC MEANSindicatori;
Unde indicatori reprezintă tipuri de indicatori statistici. Exemple de indicatori care pot fi
utilizaţi:
Uneori este necesară salvarea statisticilor agregate într-un set de date pentru analize ulterioare
sau pentru combinarea cu alte date.
Sintaxa:
OUTPUT OUT =set-date lista-statistici-iesire;
unde:
- set-dateeste setul de date care va conţine rezultatele;
- lista-statistici-iesire conţine indicatorii statistici care se vor calcula şi numele variabilelor
asociate cu aceştia.
Un format posibil pentru această listăde ieşire este:
statistica (lista_variabile)=lista_nume
- statistica = unul dintre indicatorii statistici disponibili cu procedura MEANS;
- lista_variabile = pentru ce variabile se vor calcula indicatorii;
- lista_nume = noile nume de variabile asociate indicatorilor statistici.
Prin folosirea opţiunii NOPRINT rezultatele nu se vor mai afişa pe ecran, ci vor fi
direcţionate doar către setul de date de ieşire.
Exerciţiul 5:Se doreşte agregarea datelor de la exerciţiul 4, astfel încât să avem o singură
observaţie pentru fiecare client, care să conţină suma, media şi numărul de bulbi cumpăraţi de
acesta.
*Scrierea statisticilor agregate intr-un set de date;
DATA vanzari1;
SET ad_data.flori;
BY IDClient;
BY IDClient;
RUN;
Intervale de încredere
Dacă nu se specifică nicio opţiune, procedura MEANS va calcula media, numărul de
valori nenule, abaterea standard, valoarea minimă şi maximă a fiecărei variabile numerice.
Prin adăugarea oricărui indicator, procedura nu va mai calcula indicatorii impliciţi, aceştia
trebuind adăugaţi.
Intervalul de încredere implicit pentru calculul mediei este acela al nivelului de
semnificaţie 0.05, adică 95%. Dacă se doreşte specificarea unui alt interval de încredere, acest
lucru trebuie realizat folosind opţiunea ALPHA împreună cu indicatorul CLM (limitele
intervalului de încredere).
Exerciţiul 6:O tânără scriitoare aspirantă de cărţi pentru copii doreşte să realizeze un studiu în
vederea publicării unei cărţi ilustrate de poveşti. Fiind interesată în special de numărul de
pagini pe care ar trebui să îl aibă o astfel de carte, tânăra vizitează o librărie şi numără
paginile unei selecţii aleatore de cărţi similare. Folosind datelestocateîn fişierul “carti.txt”,
realizaţi un raport care să îi fie folositor scriitoarei în luarea deciziei.
*Intervale de incredere pentru medie;
DATA PaginiCarte;
INFILE "/home/nume.prenume/carti.txt";
RUN;
RUN;
De lucru!!!!Interpretaţi rezultatele obţinute!
Sintaxa:
PROC FREQ DATA = date_intrare<optiuni>;
TABLES combinatii_variabile<optiuni>;
DeclaraţiaTABLES este cea care defineşte variabilele pentru care se creează tabele de
frecvenţe. Pentru tabelele de frecvenţe unidimensionle, se specifică numele variabilei, iar
pentru tabele de frecvenţe unidimensionale se scrie o expresie de tipul var1*var2*...*varn.
Următoarele reprezintă opţiuni care controlează modul de afişare:
LIST – afişează tabelele multidimensionale în format listă, nu tabelar;
MISSING – include valorile lipsă în statistici;
NOCOL – suprimă afişarea procentelor coloanelor în tabelele de frecvenţă;
NOROW– suprimă afişarea procentelor rândurilor în tabelele de frecvenţă;
NOCUM – suprimă afişarea frecvenţelor şi procentelor cumulate în tabelele unidmensionale;
NOPERCENT – suprimă afişarea tuturor procentelor în tabelele de frecvenţe.
OUT = set_date – scrie un set de date care conţine frecvenţele.
Exerciţiul 7:Un proprietar al unei cafenele ţine o evidenţă a vânzărilor sale şi înregistrează
fiecare tip de cafea vândută (cappuccino, frappe, espresso şi latte macchiatto), împreună cu
locaţia unde a avut loc vânzarea: în interiorul magazinului (-i-) sau la fereastra expres pentru
vânzare rapidă (-x-). Se cere să se realizeze un raport privind numărul de cafele vândute în
cele două puncte de vânzare per total şi pe fiecare tip de cafea.
PROC FORMAT;
value $zona
'i' = 'interior'
'x' = 'exterior';
RUN;
DATA comenzi;
INPUT cafea $ zona $ @@;
DATALINES;
esp i cap x cap i fra i lat i fra x esp x fra i lat x esp x
cap i esp x cap x fra x . x fra i esp x cap i lat i fra i
fra i fra i lat x esp x fra i esp x esp i fra i cap i fra i
;
RUN;
Title "Tabele de frecventa pentru zona si zona/cafea";
PROC freq DATA=comenzi;
format zona $zona.;
TABLES zona zona*cafea;
RUN;
Exerciţiul 8:O companie aeriană doreşte să facă o analiză a salariilor anuale exprimate în
dolari ale angajaţilor săi şi să determine câte dintre salarii se găsesc în următoarele intervale
de valori, per total companie şi pentru fiecare departament: a) mai mic decât 40.000 (mic); b)
între 40.000 şi 60.000 (mediu); c) între 60.000 şi 100.000 (mare); d) peste 100.000 (executiv).
Datele se găsesc în setul de date SAS “angajati”.
*Determinarea frecventelor datelor grupate;
PROC FORMAT;
40000-<60000='Mediu'
60000-100000='Mare'
other = 'Executiv';
RUN;
RUN;
RUN;
Sintaxa:
PROC GCHART DATA = set_date;
HBAR | HBAR3D | VBAR | VBAR3D lista_var_grafic / <optiuni>;
PIE | PIE3D | DONUT lista_var_grafic / <optiuni>;
STAR lista_var_grafic / <optiuni>;
Declaraţiile care urmează după numele procedurii definesc tipul de grafic construit,
astfel:
HBAR – Grafic cu bare orizontale
HBAR3D – Grafic cu bare orizontale 3D
VBAR – Grafic cu bare verticale
VBAR3D – Grafic cu bare verticale 3D
PIE – Grafic de tip Pie
PIE3D – Grafic de tip Pie 3D
DONUT– Grafic de tip inel
STAR– Grafic de tip stea
Exerciţiul 9:Un distribuitor de biciclete a înregistrat vânzările sale (exprimate în mii de
dolari) pentru diferite tipuri de biciclete în patru ţări. Folosind datele cuprinse în setul de date
“Biciclete”, se ceresă se realizezedouăgraficeverticale care aratăfrecvenţelepentruţarăşi
model.
LIBNAME ad_data "/home/nume.prenume";
GOPTIONS reset=all;
RUN;
QUIT;
De lucru!!!!Să se modifica programul anterior pentru a realiza un grafic de tip pie care arată
frecvenţele pentru modelul de bicicletă.
Exerciţiul 10: Folosind setul de date “Biciclete”, să se creeze un grafic cu bare vertical pentru
VanzarileTotale. Se vo adăuga opţiuni prin care se specifică limitele valorilor numerice
reprezentate şi punctele central pentru barele graficului. Folosiţi pentru punctele central
limitele de la 0 la 12.000, cu interval de 2.000.
* grafic cu bare pentru variabile continue;
TITLE "Distributiavanzarilor totale";
PATTERNvalue=solid;
PROC GCHART data=ad_data.biciclete;
vbarVanzariTotale / midpoints= 0 to 12000 by 2000;
RUN;
QUIT;
Procedura GCHART permite crearea unor grafice în care înălţimea unei bare reprezintă
anumiţi indicatori statistici precum media sau suma, pentru fiecare variabilă de clasificare. Se
pot folosi următoarele opţiuni:
SUMVAR – arată variabilele pentru care se calculează indicatorul statistic;
TYPE – tipul de indicator statistic.
Exerciţiul 11: Folosind setul de date “Biciclete”, să se creeze un grafic cu bare vertical pentru
VanzarileTotale pentru fiecare ţară.
* grafic cu bare care reprezinta sume;
TITLE "Suma vanzarilor totale pe tara";
PATTERN value=L1;
*definirea unei axe cu valori ordonate;
AXIS1 order =("Franta" "Italia" "SUA" "Marea Britanie");
PROC GCHART data=ad_data.biciclete;
VBAR Tara / sumvar=VanzariTotale
type=sum
maxis=axis1;
RUN;
QUIT;
Există două modalităţi prin care se pot adăuga noi variabile pe una din axele unui graphic şi
anume prin intermediul opţiunilor GROUP= şi SUBGROUP=. Opţiunea GROUP grupează
datele în funcţie de valorile variabilei de clasificare pe care o referă, în timp ce opţiunea
SUBGROUP foloseşte şabloane diferite încadrul fiecărei coloane pentru a reprezenta valorile
variabilei adăugate.
Exerciţiul 12: Folosind datele cuprinse în setul de date “Biciclete”, să se creeze un grafic cu
bare verticale care arată frecvenţa distribuţiei pentru ţară şi, încadrul fiecărei coloane,
distribuţia pentru model.
*grafic cu a doua variabila ca subgrup;
TITLE "Distribuita vanzarilor in functie tara şi de model";
PATTERN value = solid;
PROC GCHART data=ad_data.Biciclete;
VBAR Tara / subgroup=Model;
RUN;
QUIT;
Pentru a construi un grafic care arată legătura între două variabile (cunoscut sub denumirea de
diagramă de corelaţie – scatter plot) se poate folosi procedura GPLOT.
Sintaxa:
PROC GPLOT DATA = set_date;
PLOT variabila_Y*variabila_X / <optiuni>;
Declaraţia PLOT specific cele două variabile care se reprezintă pe axele graficului. Prin
declaraţia SYMBOL se pot adăuga anumite simboluri care să reprezinte intersecţia valorilor
variabilelor şi se pot conecta punctele prin linii drepte sau curbe. Opţiunea INTERPOL=
(prescurtat I=) ajută la conectarea punctelor şi poate lua valori precum join (uneşte cu liniid
repte) sau sm (uneşte prin linie continuă), în timp ce opţiunea WIDTH= controlează lăţimea
liniei.
Exerciţiul 13: Setul de date SAS “Actiuni” conţine preţul unei acţiuni cotate la bursă în
fiecare zi din luna ianuarie. Se cere să se reprezinte grafic evoluţia în timp a preţului acţiunii
folosind diferite opţiuni ale procedurii GPLOT.
Procedura CORR, inclusăîn BASE SAS, are rolul de a calcula corelaţii între două variabile,
prin intermediul coeficienţilor de corelaţie.
Sintaxa:
PROC CORRDATA = set_date;
VAR lista_variabile;
WITH lista_variabile;
Fără declaraţiile VAR şi WITH, procedura calculează corelaţii între toate variabilele
numerice care se găsesc în setul de date SAS cel mai recent utilizat. Variabilele specificate în
declaraţia VAR vor apărea înpartea de sus a tabelului de corelaţie, iar cele din declaraţia
WITH în stânga tabelului. Implicit, procedura CORR calculează coeficientul de corelaţie al
lui Pearson. Se pot adăuga opţiuni prin care se pot calcula alţi coeficienţi, precum
SPEARMAN sau KENDALL.
Exerciţiul 14: Studenţii dintr-o grupă au susţinut un test practic la o disciplină de programare
şi au notat rezultatul obţinut la test, precum şi numărul de ore, din săptămâna anterioară
testului, în care au urmărit producţii TV, împreună cu orele în care au exersat pentru test. Se
cere să se evalueze influenţa orelor petrecute la televizor şi a celor în care au exersat asupra
notei obţinute.
*Analiza de corelatie;
DATA grupa_studenti;
INPUT Punctaj Televiziune Exercitii @@;
DATALINES;
56 6 2 78 7 4 84 5 5 73 4 0 90 3 4
44 9 0 76 5 1 87 3 3 92 2 7 75 8 3
85 1 6 67 4 2 90 5 5 84 6 5 74 5 2
64 4 1 73 0 5 78 5 2 69 6 1 56 7 1
87 8 4 73 8 3 100 0 6 54 8 0 81 5 4
78 5 2 69 4 1 64 7 1 73 7 3 65 6 2
;
RUN;
PROC CORR DATA = grupa_studenti;
VAR Televiziune Exercitii;
WITH Punctaj;
TITLE 'Corelatie intre punctajul la test';
TITLE2 'Si orele petrecute la televizor sau exarsand';
RUN;
7. Procedura REG – analiza de regresie
Procedura REG (parte a modulului SAS/STAT) este potrivită pentru a realize modele de
regresie liniară.
Sintaxa:
PROC REGDATA = set_date;
MODEL dependenta = independenta;
PLOT dependenta * independenta;
În declaraţia MODEL, variabila dependentă este plasată în stânga semnului “=”, iar
variabila(le) independente în partea dreaptă. Declaraţia PLOT este una dintre multele opţiuni
ale procedurii prin intermediul acesteia realizându-se diferite diagrame de corelaţie.
ANOVA (parte a SAS/STAT) este una dintre procedurile disponibile în SAS pentru
efectuarea de analize dispersionale. Procedura este special proiectată pentru a lucra cu date
echilibrate, unde există acelaşi număr de observaţii pentru fiecare variabilă de clasificare.
Sintaxa:
PROC ANOVADATA = set_date;
CLASS listă_variabile;
MODEL dependenta = explicative;
MEANSexplicative /optiuni;
Exerciţiul 16: Pornind de la datele de la exerciţiul 15, comerciantul intenţionează să afle dacă
vânzările de băuturi răcoritoare din acea locaţie (L1) diferă semnificativ faţă de vânzările
înregistrate în aceeaşi perioadă în alte două locaţii pe care acesta le deţine (L2 şi L3). Se va
folosi fişierul “locatii.txt” ce conţine două coloane care memorează vânzările şi locaţia.
*Analiza dispersionala;
DATA locatii;
INFILE "/home/nume.prenume/locatii.txt";
INPUT Vanzari Locatie$;
RUN;
PROC ANOVA DATA=locatii;
CLASS Locatie;
MODEL Vanzari = Locatie;
MEANS Locatie / SCHEFFE;
TITLE "Vanzarile de racoritoare in cele trei locatii";
RUN;