Sunteți pe pagina 1din 61

Seminar 1 Programare SAS

Crearea seturilor de date SAS şi folosirea formatelor


Pe parcursul următoarelor seminarii se va lucra cu SAS Studio, care este complet
accesibil prin intermediul navigatoarelor Web si nu necesită nicio instalare.
Se vor folosi conturi de studenţi create conform instrucţiunilor de aici:
http://support.sas.com/software/products/ondemand-academics/#s1=2
Pentru exemplificare se va considera un cont de forma nume.prenume.
Pentru conectarea la SAS Studio, click pe :
https://odamid.oda.sas.com/SASLogon/login?service=https%3A%2F%2Fodamid.oda.sas.com%
2FSASStudio%2Fj_spring_cas_security_check

1. Citirea datelor din fişiere flat


Datele din fişierele flat pot fi regăsite sub formă de fişiere externe sau plasate ca linii de
date direct în programele SAS.
Atunci când încearcă să citească date din fişiere flat externe, SAS caută fişiere care au
valorile datelor separate prin delimitatori sau coloane fixe.
Datele trebuie salvate în fişiere de tip txt sau csv dacă delimitatorul este virgulă. Alte
tipuri de delimitatori sunt spaţiile libere, tab-urile, semnul punct şi virgulă etc.
Accesarea surselor de date într-un program SAS semnifică trecerea unui fişier de date flat
printr-un proces de conversie în interiorul unei secţiuni de date, având ca rezultat un set de date
SAS.
Rezultatele pot fi salvate ca fişiere externe sau exportate ca alte tipuri comune de fişiere
precum html, xls, txt, mdb etc.
Procesul de citire a fişierelor de date flat este prezentat în figura 1.

Proces de
Fişiere de date flat conversie -> Set de date SAS
Secţiunea de date

Figura 1. Accesaresurselor de date externe

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;

Figura 2.Interfaţa SAS Studio– importulfisierului txt

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ă.

Pentru fişierul de date:

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.

Considerăm fişierul produse4.txt, care conţine următoarele valori:


hartie 2 birotica
creioane10 birotica
apa 6 alimente
ceai 8 alimente
tricou 100haine

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;

2. Crearea seturilor de date permanente

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.

libname produse '/home/nume.prenume';


data produse.date_test;
input Nume $ 1-8
Pret 9-11
Categorie $ 12-20;
datalines;
hartie 2 birotica
creioane10 birotica
apa 6 alimente
ceai 8 alimente
tricou 100haine
run;

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.

Figura 3. Exemplu de bibliotecă SAS

Figura 4. Exemplu de fişier persistent creat în SAS Studio

Pentru vizualizarea informaţiilor referitoare la un set de date SAS, se pot folosi


procedurile CONTENTS şi PRINT.
PROC CONTENTS afişează descrierea datelor, în timp ce PROC PRINT afişează
datele. Următorul exemplu foloseşte procedura CONTENTS.
title "Descrierea datelor de test";
proc contents data=produse.date_test;
run;

Rezultatul rulării acestui script este un raport ce conţine numărul de variabile şi de


observaţii, numele, tipul şi dimensiunile variabilelor şi alte informaţii referitoare la setul de date
din fişier. Raportul este prezentat în figura 5.

Figura 5. Exemplu procedurăproc contents


Procedura PRINT poate fi folosită într-un program astfel:

title "Datele din fisierul date_test";


proc print data=produse.date_test;
run;

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.

Figura 6. Exemplu de aplicare a proceduriiproc print

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;

Pentru fiecare format definit de utilizator


Se precizează cuvântul cheie VALUE urmat de semnul dolar pentru variabilele
de tip caracter (pentru care se va aplica formatul).
Apoi este specificat numele formatului (gen) şi pentru fiecare valoare posibilă
(sau interval de valori) se precizează formatarea ('M' = 'Masculin'). Dacă rămân valori
nespecificate, şi nu se foloseşte nici clauza OTHER, atunci ele vor rămâne neformatate.

Î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.

Figura 7. Aplicarea formatelor definite-utilizator

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.

title "Frecventa de aparitie pentru gen";


proc FREQ data=note;
TABLES gen /nocum nopercent;
FORMAT gen $gen.;
run;

Figura 8. Procedura FREQ cu aplicare de formate pentru gen

Să se determine câţi studenţi au picat şi câţi au trecut examenul. Rezultatul rulării se


poate observa în figura 9.
proc format;
value nota low-4.4 = 'Examen Picat'
4.5-high = 'Examen trecut';
run;
title "Frecventa de aparitie pentru note";
proc FREQ data=note;
TABLES nota /nocum nopercent;
FORMAT nota nota.;
run;

Figura 9. Procedura FREQ cu aplicare de formate pentru nota

Pentru ca formatele să capete persistenţă, ele trebuie stocate în biblioteci definite prin
libname nume_biblioteca 'calea director…' şi apoi accesate astfel:

libname formate '/home/nume.prenume';


optionsfmtsearch=(formate);
proc format library = formate;
value pl low-10 = 'acceptabil'
11-high = 'peste limita';
run;
proc print data = formate.date_test1;
format pret pl.;
run;

Figura 10. Aplicarea unui format permanent

În cadrul procedurilor SAS pot fi aplicate o multitudine de formate predefinite.


În exemplul de mai jos se cere ca preţul să fie afişat având în faţă semnul „$”, iar data să fie
afişată în formatul ZZ-LL-AAAA. Observaţi şi analizaţi modul în care au fost citite datele de
intrare şi ce formate de citire au fost folosite!

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
;

*fara aplicarea formatelor de afisare;


proc print data=comenzi;
run;

*cu aplicarea formatelor de afisare;


proc print data=comenzi;
format Pret DOLLAR8.2 Data ddmmyyd10.;
run;

4. Fişiere JSON

Fişierele JSON (JavaScript Object Notation) reprezintă un format din ce în ce mai


popular, folosit pentru interschimburi de date. Este independent de limbajele de programare şi
are un format uşor de citit de către utilizatori sau de către limbajele de programare. Aceste tipuri
de fişiere conţin de obicei date de mari dimensiuni, nestructurate sau parţial structurate. Este
asociat adesea cu termenul de Big Data, reprezentând o sursă foarte bună de furnizare a unor
astfel de date.
Conţinutul unui astfel de fişier este practic alcătuit dintr-o multitudine de fraze în care de
obicei informaţia este căutată în funcţie de anumite cuvinte cheie.
Pentru exemplificare vom folosi fişierul clienti_daune.json în care datele referitoare la
daunele posesorilor de maşini, apar sub forma următoare:
{
"VIN":"X4ALT2S284AIPQ29AKJ106",
"Tara Producator":"United States",
"Regiune Producator":"North America",
"Marca":"FORD",
"Producator":"FORD MOTOR COMPANY",
"Model":"EXPLORER",
"An fabricatie":2010,
"Data Cerere":"2012-01-06",
"Geocode reprezentanta":"36.153889 -95.992500",
"Reprezentanta":"FORD OF TULSA",
"Zona Reprezentanta":"OK",
"Oras Reprezentanta":"Tulsa",
"Opera'ii realizate":"Replace Alternator",
"Componenta":"ELECTRICAL SYSTEM:ALTERNATOR/GENERATOR/REGULATOR",
"Dauna":"OPERATION:WILL NOT START",
"Cod":"Ah63ANFG224MN2-0974",
"Data vanzarii":"2010-10-07",
"Tara furnizor":"England",
"Furnizor":"Delphi Automotive Systems U K Ltd.",
"Zona Funizor":"Luton",
"Pret manopera":"$444.87",
"Pret Total":"$316.87",
"Valoare Dauna":"$761.74",
"Id_Client":9194439
},

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.

Extragerea datelor se face folosind următorul cod SAS:

filename daune '/home/nume.prenume/clienti_daune.json';


data daune_nou;
infile daune truncover scanover;
input @'Valoare Dauna":"' valoare $15.
@'Id_Client":' idclient 8.;
put valoare=;
put idclient=;
run;
Căutarea în fişier se face folosind declaraţiile TRUNCOVER şi SCANOVER în funcţie
de expresiile Valoare Dauna":" şi Id_Client":.
TRUNCOVER îi spune motorului SAS să se oprească din citit atunci când ajunge la
sfârşitul unei linii,
SCANOVER poziţionează pointerul în funcţie de o condiţie de căutare, apoi citeşte
normal din fişier. Rezultatele sunt expuse în figura 11.

Figura 11. Extragerea datelor din fişierul .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;

Sintaxa funcţiei substr este substr (variabilă,poziţia de început a extragerii, lungimea


subşirului)

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.

proc json out='/home/nume.prenume/daune_noi.json';


export WORK.interogare;
run;

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.

DATA interogare1 (drop= val);


Set interogare;
Valoare = input(val, DOLLAR10.2);
Run;

Seminar 2 Programare SAS


Procesare iterativă şi condiţională. Combinarea seturilor de date.
Crearea de subseturi. Funcţii SAS.
1. Operatori în SAS

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.

Operator Simbol Cod SAS (mnemonica)


Egal cu = EQ
Diferit de ^= or ~= or ¬= NE
Mai mic < LT
Mai mic sau egal <= LE
Mai mare > GT
Mai mare sau egal >= GE
Intr-o lista IN

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)

Operatorii logici AND, OR, NOT


Aceştia sunt utilizaţi în diferite combinaţii pentru a forma expresii complexe. În expresii, în lipsa
parantezelor, operaţiile sunt executate in ordinea precedenţei lor, astfel: NOT, AND şi OR
De exemplu:
if X and Y or Z;
este echivalentă cu
if (X and Y) or Z;
Pentru ca operatorul OR să aibă precedenţă înaintea lui AND trebuie utilizate paranteze, astfel:
if X and (Y or Z);
if X and not y or z;
este echivalentă cu
if (X and (not y)) or z;

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.

Operatori ce pot fi utilizaţi împreună cu instrucţiunea WHERE


Operator Descriere Exemplu
IS MISSING Verifică dacă este o valoare lipsă where varsta is missing
IS NULL Echivalent cu IS MISSING where varsta is null
BETWEEN AND Interval închis where varsta between 20 and 40
CONTAINS Găseşte un subşir where nume contains lex
LIKE Compară cu un şablon Where nume like A_e%

Exerciţiul 1. Am colectat o serie de date cu privire la studenţi pe baza următoarelor variabile:


 vârsta,
 sex (M sau F)
 proiect (nota la proiect)
 activitate (nota pentru activitatea de seminar)
 examen (nota la examenul final)
Pentru fişierul de date:
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
Să se creeze un set de date temporar numit Studenti
data Studenti;
length Sex $ 1;
input Varsta Sex Proiect Activitate Examen;
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";
proc print data=Studenti noobs;
run;

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:

title "Exemplu de operatori logici";


Instrucţiunea WHERE face selecţia
proc print data=work.studenti;
subsetului de date căutat.
where Sex eq 'F' and
(Proiect in (9 10) or
examen eq 10); Se specifică variabilele ce vor fi afişate în
var Sex Activitate Proiect Examen; raportul rezultat.
run;

2. Instrucţiunea IF
Sintaxa
 If conditie THEN actiune;

 IF conditie THEN actiune1


ELSE actiune2;

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ă.

Exerciţiul3: Folosind datele prezentate la exerciţiul 1, să se creeze o nouă variabilă care să


reprezinte grupe de vârstă.

data Studenti; Această funcţie returnează TRUE dacă argumentul


length Sex $ 1; lipseşte, respectiv FALSE dacă acesta nu lipseşte
input Varsta Sex Proiect Activitate Examen;
if Varsta lt 20 and not missing(Varsta) then GrupVarsta = 1;
else if Varsta ge 20 and Varsta lt 40 then GrupVarsta = 2;
else if Varsta ge 40 and Varsta lt 60 then GrupVarsta = 3;
else if Varsta ge 60 then GrupVarsta = 4;
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";
proc print data=Studenti noobs;
run;

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.

Figura 1. Raportul datelor studenţilor

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;

Rezultatul rulării acestui program este prezentat în figura 2.

Figura 2. Raport studenţi de sex feminin

Evitarea trunchierii valorilor la crearea de variabile noi


La crearea de noi variabile pornind de la expresii condiţionale, SAS stabileşte lăţimea noii
variabile în funcţie valoarea primei observaţii din tabelul rezultat. Mai ales pentru variabilele de
tip caracter, este posibil să aibă loc trunchieri în cazul în care valorile înregistrărilor următoare
trebuie stocate pe o lăţime mai mare decât a primei înregistrări. O soluţiepentru evitarea
trunchierilor este stabilirea în avans a lăţimii noii variabile create, asftel încât aceasta să fie
acoperitoare pentru toate valorile care se intenţionează a se memora.

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;

title "Proiecte companie - fara impunerea latimii coloanei Raportare";


proc print data=proiecte1 noobs;
format Prezentare ddmmyy10.;
format Valoare COMMA8.;
run;
title "Proiecte companie - cu impunerea latimii coloanei Raportare";
proc print data=proiecte2 noobs;
format Prezentare ddmmyy10.;
format Valoare COMMA8.;
run;
Instrucţiunea SET se poate utiliza cu opţiunea KEEP sau DROP pentru a păstra sau a
elimina anumite coloane din setul de date.
!Observaţi rezultatele obţinute şi rulaţi procedura de afişare a rezultatelor şi pentru setul
de date proiecte2. Rezultatul rulării celor două programe este disponibil în figura3.
Figura 3. Raport privind proiectele companiei în două variante

A alege între WHERE sau IF pentru selectarea înregistrărilor


Ambele intrucţiuni WHERE şi IF se pot folosi pentru a selecta înregistrările care vor fi incluse în
noul set de date. Fiecare dintre acestea are însă anumite limite în utilizare, şi anume:
- în secţiunile de proceduri se foloseşte numai instrucţiunea WHERE, nu şi IF;
- dacă WHERE se foloseşte în cadrul secţiunii de date, atunci expresiile sale condiţionale
trebuie să refere numai variabile din setul de date de intrare;
- WHERE nu poate folosi în expresii condiţionale bazate pe variabile create în secţiunea de
date prin declaraţii de atribuire.

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;

where Sex eq 'M';

NotaFinala=SUM(Proiect*0.3+Activitate*0.2+Examen*0.5);

if NotaFinala>7;

run;

Title "Lista studentilor de sex masculin cu nota finala peste 7";

proc print data=Studenti1 noobs;

run;

Rezultatul rulării acestui program este prezentată în figura 4.


Figura 4. Raport studenţi de sex masculin cu nota finala peste 7

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ă.

Exercitiul7.Rezolvaţicerinţa de la exerciţiul 1 folosind o expresie SELECT.

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;

Rezultatul rulării este ilustrat în figura 5.

Figura 5. Raport studenţi realizat cu SELECT

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

SUM Operaţia de adunare


Sintaxa
Variabilă + increment;

Observaţi că nu există semnul = în această instrucţiune. Se realizează următoarele:


- Se reţine variabila;
- Variabila este iniţializată cu 0;
- Valorile lipsă (NULL) sunt ignorate.

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

Bucla DO (buclă cu un număr cunoscut de iteraţii)


Sintaxa

DO contor=valoare_start to valoare_stop;
Set_instrucţiuni;
END;

O varianta alternativă a sintaxei permite precizarea valorii de incrementare a contorului astfel.

DO contor=valoare_starttovaloarestopbyvaloareincrementare;
Set_instrucţiuni;
END;

Atunci când valoarea de incrementare este omisă, valoarea implicită este 1.

De asemenea, contorul poate sărealizeze o actualizare descrescătoare, valoarea de incrementare


fiind un număr negativ. În această situaţie pentru fiecare iteraţie DO contorul este decrementat cu
valoarea specificată Atunci când contorul atinge o valoare mai mică decât valoarea de stop bucla
se întrerupe.

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.

Figura 8. Evoluţie investiţie

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;

Figura 9. Dublare venit

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>).

O listă completă a funcţiilor predefinite poate fi găsită aici:


http://support.sas.com/documentation/cdl/en/allprodslang/63337/HTML/default/viewer.htm#s
yntaxByType-function.htm

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

libname ad_data "/home/nume.prenume";


data work.venituri;
set ad_data.angajati;
prima=500;
vechime=YRDIF(DataAngajare,TODAY(), 'ACTUAL');
if vechime lt 5 then spor=0.05;
else if vechime ge 5 and vechime lt 10 then spor= 0.1;
else if vechime>=10 then spor =0.15;
Venit_total=sum(salariu*(1+spor),prima);
format Venit_total DOLLAR10.;
Luna_prima=month(DataAngajare);
run;

title "Venituri totale angajati";


Proc print data=work.venituri noobs;
var CodAngajat Nume Prenume Departament Venit_total Luna_prima;
run;
Rezultatul rulării programului se poate observa în figura 10.

Figura 10. Venituri totale angajati (rezultate parţiale)

Seminar 3Programare SAS

A. Combinarea seturilor de date

1. Concatenarea seturilor de date folosind declaraţia SET


Declaraţia SET cu un singur set de date în cadrul unei secţiuni de date permite citirea
şi modificarea unui set de date existent. Cu două sau mai multe seturi de date, pe lângă citire
şi modificare, declaraţia SET ajută la concatenarea datelor, adică la alipirea unui set de date la
altul. Aceasta este folositoare atunci când se doreşte combinarea unor seturi de date care au
toate sau majoritatea variabilelor identice, observaţiile fiind diferite. Se va crea un set de date
nou, cu un număr de observaţii egal cu suma observaţiilor din seturile de date de intrare.
Ordinea observaţiilor este determinată de ordinea în care seturile de date apar în declaraţia
SET. Dacă unul din seturile de date conţine o variabilă care nu se găseşte în alt set de date,
atunci observaţiile acestuia din urmă pentru variabila nouă vor conţine valori lipsă.

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.

*Crearea setului de date pentru intrarea din sud;


DATA intrare_sud;
INFILE '/home/nume.prenume/Sud.dat';
INPUT Intrare $ NrTichet DimGrup Varsta;
PROC PRINT DATA = intrare_sud;
TITLE 'Date Intrare Sud';
RUN;

*Crearea setului de date pentru intrarea din nord;


DATA intrare_nord;
INFILE '/home/nume.prenume/Nord.dat';
INPUT Intrare $ NrTichet DimGrup Varsta Lot;
PROC PRINT DATA = intrare_nord;
TITLE 'Date Intrare Nord';
RUN;
* Crearea setului de date concatenat si a unei variabile noi;
DATA concatenare;
SET intrare_sud intrare_nord;
IF Varsta = . THEN Plata = .;
ELSE IF Varsta < 3 THEN Plata = 0;
ELSE IF Varsta < 65 THEN Plata = 60;
ELSE Plata = 25;
PROC PRINT DATA = concatenare;
TITLE 'Ambele intrari';
RUN;

Figura 1. Listarea datelor concatenate

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.

*Crearea setului de date pentru Brasov;


data angajatiBV;
input Angajat $ Gen $ Judet$;
datalines;
Damian M Brasov
Popa F Brasov
Ionita M Brasov
;
run;

*Crearea setului de date pentru Cluj;


data angajatiCJ;
input Angajat $ Gen $ Zona$;
datalines;
Irimia M Cluj
Velicu F Cluj
;
run;

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;

Se aplică aceleaşi principii ale combinării datelor ca şi la concatenare, cu specificarea faptului


că înainte de interclasare observaţiile trebuie sortate anterior după variabila(le) prin clauza
BY.

Exerciţiul 3:Se consideră aceleaşi date referitoare la un parc de distracţii ca şi la Exerciţiul 1.


Se cere să se combine cele două seturi de date, crescător, în funcţie de numărul tichetului de
intrare. Rezultatele rulării codului de mai jos sunt prezentate în figura 2.

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;

* Interclasarea seturilor de date;


DATA interclasare;
SET intrare_sud intrare_nord;
BY NrTichet;
RUN;
PROC PRINT DATA = interclasare;
TITLE 'Ambele intrari in functie de numarul tichetului';
RUN;
Figura 2. Listareadatelorinterclasate

3. Fuziune pe baza unei corespondenţe unu-la-unu


În situaţiile în carese doreşte realizarea unei corespondenţe între observaţiile unor seturi de
date, în vederea combinării acestora, se poate folosi declaraţia MERGE în secţiunea de date.
Dacă se cunoaşte faptul că seturile de date sunt în exact aceeaşi ordine din punctul de vedere
al entităţilor pe care le descriu, atunci nu este necesară existenţa unei variabile comune. Însă,
de obicei, pentru a avea siguranţa existenţei unei corespondenţe, se urmăreşte prezenţa uneia
sau mai multor variabile care să definească în mod unic fiecare observaţie. De asemenea,
seturile de date de intrare trebuie să fie sortate în prealabil după variabila(le) comune.

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.

Exerciţiul 4: Un producător de ciocolată păstrează o evidenţă a vânzărilor sale zilnice pentru


fiecare tip de ciocolată vândut. Fişierul referitor la vânzări stochează codul produsului şi
numărul de unităţi vândute într-o zi, iar un alt fişier conţine informaţii despre fiecare produs,
în termeni de cod, denumire şi descriere. În scopul realizării unui raport privind vânzările
zilnice, se cere să se realizeze o fuziune între cele doua fişiere (fişierul cu descrierea
produselor este sortat după cod).

*Fuziunea bazata pe corespondenta unu-la-unu;


DATA descriere;
INFILE '/home/nume.prenume/Ciocolata.dat' TRUNCOVER;
INPUT Cod $ 1-4 Nume $ 6-14 Descriere $ 15-60;
RUN;
PROC SORT DATA = descriere;
BY Cod;
RUN;
DATA vanzari;
INFILE '/home/nume.prenume/Ciocolata_Vanzari.dat';;
INPUT Cod $ 1-4 UnitatiVandute 6-7;
PROC SORT DATA = vanzari;
BY Cod;
RUN;

*Fuziune dupa cod;


DATA ciocolate;
MERGE vanzari descriere;
BY Cod;
PROC PRINT DATA = ciocolate;
TITLE "Vanzarile de ciocolata de astazi &sysdate";
RUN;

Rezultatele rulării acestui cod sunt prezentate în figura 3.

Figura 3. Listarea raportului cu vânzările de ciocolată

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.

4. Fuziune pe baza unei corespondenţe unu-la-mulţi


Uneori este nevoie să se combine două seturi de date prin realizarea unei corespondenţe între
o înregistrare a unui set de date şi mai multe înregistrări ale altuia. Sintaxa pentru acest tip de
fuziune este identică cu cea întâlnită la corespondenţa unu-la-unu. Ordinea în care apar
seturile de date în declaraţia MERGE nu este relevantă. Ca şi în cazul anterior, seturile de date
trebuie sortate după una sau mai multe variabile comune.

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.

*Fuziunea bazata pe corespondenta unu-la-multi;


libname ad_data "/home/nume.prenume";
PROC SORT DATA = ad_data.Incaltaminte;
BY Sport;
RUN;
PROC SORT DATA = ad_data.Inc_reducere;
BY Sport;
RUN;
DATA Inc_preturi;
MERGE ad_data.Incaltaminte ad_data.Inc_reducere;
BY Sport;
Pret_Nou = ROUND(Pret - (Pret * Reducere), .01);
PROC PRINT DATA = Inc_preturi;
TITLE 'Lista preturilor pentru luna martie';
RUN;

5. Fuziunea între un raport statistic agregat şi datele iniţiale


Există situaţii în care este necesară combinarea rezultatelor unor analize statistice agregate cu
datele iniţiale, spre exemplu atunci când se doreşte compararea fiecărei observaţii cu media
grupului sau când vrem să calculăm un procent folosind un total de grup. În acest sens, se
poate utiliza procedura MEANS pentru a agrega datele, urmată de o fuziune a rezultatelor
acesteia cu datele iniţiale folosind o corespondenţă unu-la-mulţi.

Exerciţiul 6: Distribuitorul de încălţăminte sportivă de la exerciţiul 5 dispune de o situaţie a


vânzărilor din ultima săptămână pentru fiecare tip de încălţăminte (setul de date SAS
„inc_Vanzari” având coloanele Denumire, Sport,Vanzari). Departamentul de marketing
solicită realizarea unei analize a vânzărilor din această perioadă, evidenţiind, procentual, cu
cât a contribuit fiecare model vândut în totalul vânzărilor din categoria sa sportivă.

*Fuziunea intre un raport statistic agregat si datele initiale;


libname ad_data "/home/nume.prenume";
proc SORT data=ad_data.inc_vanzari;
BY Sport;
RUN;
PROC MEANS NOPRINT DATA = ad_data.Inc_vanzari;
VAR Vanzari;
BY Sport;
OUTPUT OUT = date_agregate SUM(Vanzari) = Total;
PROC PRINT DATA = date_agregate;
TITLE 'Setul de date agregat';
RUN;

* Fuziunea totalului cu datele initiale;


DATA Inc_agregare;
MERGE ad_data.inc_Vanzari date_agregate;
BY Sport;
Procent = Vanzari / Total * 100;
PROC PRINT DATA = Inc_agregare;
BY Sport;
ID Sport;
VAR Sport Vanzari Total Procent;
TITLE "Contributia in totalul vanzarilor pe categorii";
RUN;

6. Folosirea opţiunii IN= pentru urmărirea şi selectarea observaţiilor


Opţiunea IN= asociată unui set de date poate fi folosită pentru a urmări care din seturile de
date de intrare a contribuit cu valori la fiecare observaţie din setul de date nou creat. Se
utilizează cu precădere pentru a selecta observaţiile care au sau nu corespondent în cadrul
unui fuziuni.
Opţiunea IN= se specifică după numele fiecărui set de date şi este urmată de un nume de
variabilă temporară ales de utilizator (aceasta nu va fi inclusă în setul de date rezultat).
Variabilele temporare definite prin IN= iau valoarea 1 (adevărat) dacă setul de date la care se
referă contribuie la observaţia curentă din setul de date nou şi 0 (fals) în caz contrar. Deoarece
acestea nu fac parte dintr-un set de date, se va folosi declaraţia PUT pentru a le lista.
Exerciţiul 7: O firmă are un număr de colaboratori care lucrează pe diferite categorii de
posturi şi care sunt remuneraţi în funcţie de orele lucrate. În săptămâna 21-27 ianuarie, numai
o parte dintre aceştia au lucrat. Codul de mai jos evidenţiază folosirea opţiunii IN= în cazul
fuziunii seturilor de date cu informaţii despre colaboratori (Cod, Nume) şi a orelor lucrate
(Cod, Categorie, Ore).

***** Utilizarea optiunii IN= ;

data colaboratori;

INPUT Cod Nume$;

datalines;

1 Irimia
2 Popa

4 Radu

5 Ionita

7 Stoicea

data ore_lucrate;

INPUT Cod Categorie$ Ore;

datalines;

1 A 37

4 B 44

5 A 32

9 B 54

data nou;

merge colaboratori (IN=inColaboratori)

ore_lucrate (IN=inOre);

by Cod;

file print;

/* directionează iesirea care este produsă de PUT

în acelasi fisier ca iesirea care este produsă de DATA */


put Cod= inColaboratori= inOre= Nume= Categorie= Ore=;

RUN;

Exerciţiul 8:Pornind de la seturile de date de la exerciţiul anterior, să se afişeze lista


colaboratorilor care au lucrat în săptămâna 21-27 ianuarie, indicând şi onorariul lor, ştiind că
cei care lucrează pe poziţii din categoria A sunt platiţi cu 70 RON/oră, iar cei din categoria B
cu 50 RON/oră.
data onorarii;
merge colaboratori (IN=inColaboratori)

ore_lucrate (IN=inOre);

by Cod;

if inColaboratori and inOre;

if Categorie eq "A" then Onorariu = 70*Ore;

else if Categorie eq "B" then Onorariu = 50*Ore;

RUN;

title 'Onorarii datorate colaboratorilor in perioada 21-27 Ianuarie';

Proc PRINT data=onorarii;

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.

B. Proceduri specifice SQL


Se pot utiliza instrucţiuni SQL în programele SAS pentru a crea, citi şi modifica seturi de
date. Există două modalităţi de bază prin care se poate utiliza SQL împreună cu SAS:
- încorporarea de instrucţiuni SQL complete în procedura SQL;
- încorporarea declaraţiei WHERE pentru a selecta rânduri în secţiunile de date şi
proceduri SAS.
Ambele variante sunt disponibile cu Base SAS şi nu necesită software adiţional.
Sintaxa:

PROC SQL;
comandă _sql;
QUIT;

De reţinut că comandă_sqlpoate fi orice comandă de tipulALTER, CREATE, DELETE,


DESCRIBE, DROP, INSERT, SELECT sauUPDATEavând la sfârşit seminul “;”.Pot fi
definite oricâte comenzi SQL într-o procedură SQL. Este o bună practică să se plaseze QUIT
la finalul declaraţiei, nefiind însă obligatoriu.
Exerciţiul 9: O companie care comercializează aparate de aer condiţionat are filiale în diferite
judeţe ale ţării. Sunt disponibile date referitoare la numărul de aparate vândute în anul anterior
(cantitate)şi la agenţii comerciali pe care îi are fiecare filială. Codul SAS de mai jos
exemplifică folosirea diferitelor tipuri de joncţiuni folosind procedura SQL.

* Jonctiuni cu proceduri specifice SQL;

Data Filiale;

Input ID_fil Filiala$ Cantitate;

cards;

10 Cluj 150

20Iasi 170

30Timis 350

40 Dolj 140

50 Sibiu 180

run;

Data Personal;

Input ID_angNume$ ID_fil;

cards;

1Popescu30

2Matei 10

3Avram10

4Costache10
5 Ionescu 40
6 Enache 40
7 Anton 40
8 Codreanu
9Iftene 50

;
run;

*INNER JOIN;

PROC SQL;

Create table inner_join as

Select * fromFiliale as f, Personal as p

wheref.ID_fil = p.ID_fil;

QUIT;

*Cod alternativ;

PROC SQL;

Create table inner_join1 as

Select * fromFiliale as finnerjoin Personal as p

On f.ID_fil = p.ID_fil;

QUIT;

*LEFT JOIN;

PROC SQL;

Create table left_join as

Select * fromFiliale as fleft join Personal as p

On f.ID_fil = p.ID_fil;

QUIT;

*RIGHT JOIN;

PROC SQL;

Create table right_join as

Select * fromFiliale as frightjoin Personal as p

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;

*Utilizarea functiei SQL COALESCE care returneaza primul argument nenul;

procSQL;

select id_ang, f.id_fil,coalesce (p.ID_ang, f.ID_fil,5) as ID fromFiliale as ffull join


personal as p on f.id_fil = p.id_fil;

QUIT;

Exerciţiul 10: Un producător de echipamente sportive doreşte să trimită un reprezentant de la


vânzări pentru a contacta toţi clienţii care nu au plasat comenzi în primul trimestru al anului.
Se cere: a) să se creeze, cu ajutorul procedurilor SQL, două tabele SAS conţinând datele
clienţilor şi respectiv valoarea comenzilor plasate de aceştia în primul trimestru; b) un raport
care listează clienţii care trebuie contactaţi.

*Proceduri specifice SQL;

LIBNAME ad_data '/home/nume.prenume';

PROC SQL;

CREATE TABLE ad_data.client

(CodClient num,

Nume char(17),

Adresa char(20));

INSERT INTO ad_data.client

VALUES (101, 'Murphy''s Sports ', '115 Main St. ')

VALUES (102, 'Sun N Ski ', '2106 Newberry Ave. ')

VALUES (103, 'Sports Outfitters', '19 Cary Way ')

VALUES (104, 'Cramer & Johnson ', '4106 Arlington Blvd.')

VALUES (105, 'Sports Savers ', '2708 Broadway ');

TITLE 'Datele despre clientii sport';


SELECT *

FROM ad_data.client;

CREATE TABLE ad_data.comenzi

(CodClient num,

Valoare num );

INSERT INTO ad_data.comenzi

VALUES ( 102, 562)

VALUES ( 104, 254)

VALUES ( 102, 1242)

VALUES ( 101, 3497)

VALUES ( 102, 385);

TITLE 'Datele despre comenzile clientilor sport';

SELECT *

FROM ad_data.comenzi;

PROC SQL;

CREATE TABLE clienti_fara_comenzi as

SELECT * from ad_data.Client as x left join ad_data.comenzi as y

On x.CodClient = y.CodClient

WHERE y.CodClient is null;

TITLE 'Clienti sport fara comenzi in primul trimestru';

SELECT *

FROM clienti_fara_comenzi;

QUIT;

De lucru!!!!Folosind MERGE, să se creeze un raport similar celui de la punctul b) al


exerciţiului 10. Se vor folosi seturile de date permanente create în exerciţiul 10.
C. Lucrul cu masive în SAS

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.

Sintaxa simplificată pentru un masiv unidimensional:

ARRAY nume(n) $ lista_variabile;


unde:
- nume = numele masivului;
- n = numărul de elemente;
- $ = se foloseşte în cazul în care sunt referite variabile de tip caracter, de obicei când
acestea nu au fost definite;
- parantezele rotunde pot fi înlocuite cu paranteze pătrate sau acolade.
Această sintaxă poartă denumirea de masiv explicit, în care numărul de variabile este
specificat la definire. Pentru a referi o variabilă din masiv se va folosi sintaxa nume(index),
indexul unui masiv începând de la 1. În practică, există o multitudine de situaţii unde masivele
îşi pot demonstra utilitatea, două dintre acestea fiind exemplificate în continuare.

1. Executarea de calcule repetitive


În această situaţie, masivele ajută la creşterea eficienţei în programare, mai ales atunci când
se lucrează cu un număr mare de variabile.

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.

*Calcule repetitive cu masive;

DATA cursuri;

INFILE '/home/nume.prenume/Cursuri.txt';

Length Oras $9;


INPUT Oras$ Varsta ECON MRKT FINA CONT STAT MATE INFO;

ARRAY curs (7) ECON MRKT FINA CONT STAT MATE INFO;

DO i = 1 TO 7;

IF curs(i) = 0 THEN curs(i) = .;

END;

RUN;

PROC PRINT DATA = cursuri;

TITLE 'Sondaj cursuri economice';

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.

Folosirea abrevierilor pentru numele de liste de variabile

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_)).

Exerciţiul 12: Se cere ca pornind de la datele de la Exerciţiul 11, să se înlocuiască toate


valorile 0 cu valoarea lipsă, fără a afecta datele originale, prin crearea unor noi variabile
denumite Curs1-Curs7. Totodată, se cere să se determine media punctajelor acordate de
fiecare repondent.
*****Aplicatii cu liste abreviate si masive;

DATA cursuri;

INFILE '/home/nume.prenume/Cursuri.txt';

Length Oras $9;

INPUT Oras$ Varsta ECON MRKT FINA CONT STAT MATE INFO;

ARRAY nou (7) Curs1 - Curs7;

ARRAY vechi (7) ECON -- INFO;

DO i = 1 TO 7;

IF vechi(i) = 0 THEN nou(i) = .;

ELSE nou(i) =vechi(i);

END;

MedieCalif = MEAN (OF Curs1 - Curs7);

RUN;

PROC PRINT DATA = cursuri;

TITLE 'Sondaj cursuri economice cu media calificativelor';

RUN;

Exerciţiul 13: Au fost memorate răspunsurile date de studenţi la un test. Se cere să se


înlocuiască toate răspunsurile care nu corespund caracterelor a,b, c, d (litere mari sau mici) cu
valoarea lipsă şi să se transforme toate valorile variabilelor de tip caracter în litere mari.

*Aplicatii cu nume speciale de liste SAS;

libname ad_data "/home/nume.prenume";

DATA raspunsuri;

SET ad_data.RASPUNSURI;

ARRAY var_caracter {*} _character_;

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));

ELSE var_caracter(i)= upcase (var_caracter(i));

END;

DROP i;

RUN;

PROC PRINT DATA = raspunsuri;

TITLE 'Raspunsurile studentilor la test';

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.

2. Transformarea structurii seturilor de date


Transformarea structurii seturilor de date presupune schimbarea perspectivei asupra datelor,
spre exemplu atunci când dorim să creăm observaţţii multiple din observaţii singulare sau
viceversa. Aceste restructurări sunt utile la numărarea frecvenţelor, la procesarea folosind
variabile de grupare sau ca necesitate a anumitor reprezentări grafice sau analize statistice.
Transformarea cu ajutorul masivelor este o alternativă mai flexibilă faţă de folosirea
procedurii SAS TRANSPOSE. Exemplele următoare ilustrează crearea unui set de date cu
mai multe observaţii per subiect (set de date lung) dintr-un set de date cu o singură observaţie
per subiect (set de date lat).

Exerciţiul 13:O companie doreşte să întocmească un raport privind nivelurile de competenţă


relevante ale fiecărui angajat în cunoaşterea limbilor engleză (E), franceză (F), spaniolă (S) şi
germană (G), nivelurile de competenţă variind de la A la C. Se cere să se determine câţi
angajaţi cunosc cele patru limbri străine la fiecare nivel.

*Transformarea seturilor de date cu masive;

DATA competente;

INPUT ID CO1 $ CO2 $ CO3$;


datalines;

01 EA GA SB

02 FA EB EB

03 SA GB EC

04 EA FA GB

05 SB EB GB

RUN;

*varianta fara folosirea masivelor;

DATA competente_nou;

SET competente;

CO=CO1;

IF not missing(CO) THEN OUTPUT;

CO=CO2;

IF not missing(CO) THEN OUTPUT;

CO=CO3;

IF not missing(CO) THEN OUTPUT;

KEEP ID CO;

RUN;

*varianta cu folosirea masivelor;

DATA competente_nou;

SET competente;

ARRAY COARRAY[3] CO1-CO3;

DO i=1 to 3;
CO=COARRAY[i];

IF not missing (CO) THEN OUTPUT;

END;

KEEP ID CO;

RUN;

*Determinarea numerului de cunoscatori de limbi straine per nivel;

Title "Numarul de angajati pentru fiecare nivel de competenta in limbile straine";

PROC FREQ DATA=competente_nou;

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';

INPUT CODE $ A1 A2 A3 A4;

Medie = MEAN (of A1 - A4);

RUN;

DATA echipe_timp;

SET echipe;

ARRAY A [4];

DO timp = 1 TO 4;

Puieti = A[timp];
OUTPUT;

END;

KEEP CODE timp puieti;

RUN;

Title "Plantarile de puieti in anul 2018 per echipa si per total";

PROC PRINT DATA = echipe_timp noobs

sumlabel='Total #byval(CODE) ' grandtotal_label='Total General';

BY CODE;

SUM puieti;

VAR timp puieti;

RUN;

Seminar 4 Programare SAS

Prelucrarea datelor prin crearea de rapoarte şi aplicarea de analize


statistice

1. Procedura PRINT - realizarea de rapoarte detaliate


Procedura PRINT este probabil cea mai utilizată procedură SAS, fiind folosită pentru
afişarea datelor cu sau fără grupare. În forma sa cea mai simplă, procedura listează toate
variabilele şi toate observaţiile dintr-un set de date.

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..

2. Procedura UNIVARIATE – generarea de statistici descriptive

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;

Identificarea valorilor extreme

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ă.

*Valori extreme si histograma cu UNIVARIATE;


LIBNAME sem4 "/home/nume.prenume";
*punctul a);
PROC UNIVARIATE DATA=sem4.amenzi_viteza;
VAR Amenzi;
ID Stat;
Title "Indicatori statistici pentru amenzile de viteza";
RUN;
*punctul b);
PROC UNIVARIATE DATA=sem4.amenzi_viteza noprint; *nu fiseaza tabelele de
iesire;
VAR Amenzi;
HISTOGRAM Amenzi;
Title "Histograma pentru amenzile de viteza";
RUN;
*punctul c);
PROC UNIVARIATE DATA=sem4.amenzi_viteza NEXTRVAL=5 NEXTROBS=0;
VAR Amenzi;
ID Stat;
Title "Indicatori statistici cu valori limita distincte pentru amenzile de viteza";
RUN;

3. Procedura MEANS – crearea de rapoarte agregate

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:

MAX – valoarea maximă


MIN – valoarea minimă
MEAN – media
N – numărul de valori nenule
NMISS – numărul de valori lipsă
SUM – suma

Se pot adăuga următoarele declaraţii opţionale:


- BY lista_variabile – realizează analize separate pentru fiecare nivel al variabilelor din
listă. Datele trebuie să fie în prealabil sortate în aceeaşi ordine în care apar variabilele din
lista_variabile.
- CLASSlista_variabile – realizează tot analize separate pentru fiecare nivel al variabilelor,
însă rezultatele sunt prezentate mai compact faţă de declaraţia BY, iar datele nu trebuie
sortate.
- VARlista_variabile – specifică variabile analizate.

Exerciţiul 4: Un distribuitor de bulbi de flori doreşte să realizeze un raport agregat al


vânzărilor din fiecare lună. Setul de date SAS “flori” conţine codul clientului, data vânzării şi
bulbii de lalele, gladiole şi zambile vânduţi.
libnamead_data "/home/nume.prenume";
DATA vanzari;
SET ad_data.flori;
Luna = MONTH(DataVanzare);
PROC SORT DATA =vanzari;
BY Luna;
* Calculeaza media vanzarilor lunare de bulbi de flori;
PROC MEANS DATA = vanzari;
BY Luna;
VAR Lalele Gladiole Zambile;
TITLE 'Raportul vanzarilor lunare de bulbi de flori';
RUN;

Scrierea statisticilor agregate într-un set de date

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;

PROC SORT DATA = vanzari1;

BY IDClient;

PROC MEANS NOPRINT DATA = vanzari1;

BY IDClient;

VAR Lalele Gladiole Zambile;

OUTPUT OUT = totaluri MEAN(Lalele Gladiole Zambile) =

MedieLalele MedieGladiole MedieZambile

SUM(Lalele Gladiole Zambile) = Lalele Gladiole Zambile;

PROC PRINT DATA = totaluri;


TITLE 'Raport privind bulbii de flori vanduti fiecarui client';

FORMAT MedieLalele MedieGladiole MedieZambile 3.;

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";

INPUT NrPagini @@;

RUN;

PROC MEANS DATA=PaginiCarte N MEAN MEDIAN CLM ALPHA=.10;

TITLE "Raport privind numarul de pagini al cartilor ilustrate";

RUN;
De lucru!!!!Interpretaţi rezultatele obţinute!

4. Procedura FREQ – calcularea distribuţiei de frecvenţe


Scopul principal al procedurii FREQ (parte a BASE SAS) este acela de a crea tabele
care arată distribuţia valorilor datelor categorice, dar totodată poate identifica şi nereguli în
date.

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;

LIBNAME sem4 "/home/nume.prenume";

PROC FORMAT;

value nivel low-<40000='Mic'

40000-<60000='Mediu'

60000-100000='Mare'
other = 'Executiv';

RUN;

PROC FREQ DATA=sem4.angajati ;

TABLES Salariu /nocum ;

FORMAT Salariu nivel.;

TITLE "Raport privind nivelul salariului anual";

RUN;

PROC FREQ DATA=sem4.angajati;

TABLES Departament * Salariu/ nocol norow nopercent;

FORMAT Salariu nivel.;

TITLE "Raport privind nivelul salariului anual pe departament";

RUN;

5. Procedurile GCHART şi GPLOT – realizarea de grafice


Pentru realizarea de grafice cu opţiuni mai avansate în SAS este necesar modulul
SAS/GRAPH. Şi BASE SAS permite construirea de grafice (prin procedurile CHART şi
PLOT), însă acestea au doar opţiuni de bază în ceea ce priveşte modul de prezentare. Afişarea
graficelor este controlată prin opţiuni grafice globale precum GOPTIONS, SYMBOL sau
PATTERN, al căror effect rămâne valabil între prelucrări şi care sunt aditive (spre exemplu,
dacă setăm două elemente grafice şi, ulterior, modificăm unul dintre ele, celălalt element
rămâne valabil).

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";

TITLE 'Distributia vanzarilor in functie de tara si model';

GOPTIONS reset=all;

* grafic cu bare pentru variabile discrete;

PROC GCHART data=ad_data.biciclete;

VBAR Model Tara;

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.

*grafice care arata corelatia intre variabile;


*diagrama de corelatie standard;
TITLE "Evolutia in timp a pretului actiunii - Grafic standard";
PROC GPLOT data=ad_data.actiuni;
PLOT DATA * Pret;
RUN;
QUIT;
*diagrama de corelatie cu puncte;
SYMBOLvalue=dot;
TITLE "Evolutia in timp a pretului actiunii - Grafic cu puncte";
PROC GPLOT data=ad_data.actiuni;
PLOT Data * Pret;
RUN;
QUIT;
*diagrama de corelatie cu linie continua;
SYMBOL value=dot i=sm;
TITLE "Evolutia in timp a pretului actiunii - Grafic cu linie continua";
PROC GPLOT data=ad_data.actiuni;
PLOT Data * Pret;
RUN;
QUIT;

6. Procedura CORR – analiza de corelaţie

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.

Exerciţiul 15: Un comerciant doreşte să prognozeze vânzările de băuturi răcoritoare în unul


din punctele sale de vânzare. Pentru aceasta a notat vânzările din primele douăzeci şi cinci de
zile ale lunii iunie, precum şi temperaturile înregistrate în aceste zile. Se cere să se determine
dacă există corelaţie semnificativă între vânzările de răcoritoare şi temperatură şi să se
estimeze vâzările din ziua de 26 iunie, dacă temparatura prognozată este de 32 grade. Datele
să găsesc în fişierul “racoritoate.txt”.
*Analiza de regresie;
DATA racoritoare;
INFILE "/home/nume.prenume/racoritoare.txt";
INPUT Data: MMDDYY. Vanzari Temperatura;
RUN;
PROC PRINT data=racoritoare;
FORMAT data DDMMYY.;
RUN;
PROC CORR data=racoritoare;
VAR Temperatura;
WITH Vanzari;
TITLE "Corelatia intre vanzarile de racoritoare";
RUN;
PROC REG data=racoritoare;
MODEL Vanzari=Temperatura;
PLOT Vanzari*Temperatura;
TITLE "Rezultatele analizei de regresie";
RUN;

8. Procedura ANOVA – analiza dispersională

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;

Declaraţia CLASS trebuie scrisă înainte de MODELşi defineşte variabila(le) de clasificare.


Declaraţia MODEL defineşte variabila dependentă şi variabilele explicative. MEANS
calculează media variabilei dependente pentru oricare din variabilele explicative speficate în
MODEL. Se pot efectua mai multe tipuri de teste de comparaţie pentru medii, precum
SCHEFFE sau testul t al lui Bonferroni (BON).

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;

S-ar putea să vă placă și