Post on 12-Aug-2020
transcript
83
5. PROCEDURE SAS PER LA GESTIONE DI DATASET
5.1 Proc Print
Nelle pagine precedenti abbiamo già utilizzato la procedura che visualizza a terminale il contenuto di
un dataset SAS (proc print) e quella che permette di visualizza le caratteristiche del dataset e delle
variabili che lo compongono, elencate in ordine alfabetico (proc contents).
Come tutte le altre procedure presenti nel SAS anche queste possono essere personalizzate utilizzando
delle opportune opzioni. In queste dispense verranno esplicitamente considerate solo le procedure più
comuni, ma l’elenco completo e la loro descrizione è reperibile nel manuale online messo a
disposizione dal software.
La forma più semplice di sintassi della procedura che effettua la stampa a terminale è la seguente
proc print data=<nome_del_dataset>;
var <elenco delle variabili, separate da almeno uno spazio bianco>;
format <elenco delle variabili, ciascuna con l’indicazione del formato>;
in cui l’istruzione “data=” serve per specificare il dataset da stampare. Se questa istruzione viene
omessa il SAS, per default, stampa a terminale l’ultimo dataset creato.
L’istruzione “var” serve per specificare le variabili da stampare, che compariranno nell’ordine in cui
vengono elencate. La sua omissione fa sì che il programma stampi tutte le variabili contenute nel
dataset, nell’ordine in cui sono state lette.
L’istruzione “format” serve per specificare il formato di stampa delle variabili.
Considerato, per esempio, il dataset SAS “tassi”, contenuto nella directory “c:\es_MRS”, che riporta il
tasso di occupazione, il tasso di disoccupazione ed il tasso di attività di cinque comuni di una provincia
italiana, se si volessero visualizzare a terminale solo i tassi di occupazione e di disoccupazione, il primo
espresso da 2 cifre decimali ed il secondo espresso con 3 cifre decimali, si potrebbero utilizzare le
seguenti istruzioni
84
data tassi;
set "c:\es_MRS\tassi.sas7bdat";
proc print data=tassi;
var tasso_occup tasso_disocc;
format tasso_occup 8.2 tasso_disocc 8.3;
run;
che generano il seguente output
Oss tasso_occup tasso_disocc
1 0.49 0.085
2 0.52 0.074
3 0.54 0.094
4 0.49 0.100
5 0.65 0.089
Come in tutte le procedure che danno luogo a un output, anche la “proc print” dà la possibilità di
inserire una o più righe contenente i titoli che si vogliono assegnare all’output stampato a terminale
mediante la parola chiave “title” seguita dal numero della riga su cui deve comparire il titolo, da uno
spazio bianco e dal testo del titolo, racchiuso fra apici. La prima riga di titolo può essere indicata con
“title1” o, più semplicemente, con “title”, mentre i titoli successivi devono necessariamente
contenere l’indicazione numerica della riga corrispondente.
Così, per esempio, se si volessero stampare 3 titoli, su tre righe diverse, si potrebbero utilizzare le
istruzioni
title1 'testo del primo titolo';
title2 'testo del secondo titolo';
title3 'testo del terzo titolo';
Se, per esempio, si volesse stampare il dataset precedente inserendo le seguenti due righe
Comuni della provincia XXX
Tassi di occupazione e di disoccupazione
si potrebbe utilizzare le seguenti istruzioni
85
proc print data=tassi;
var tasso_occup tasso_disocc;
format tasso_occup 8.2 tasso_disocc 8.3;
title1 'Comuni della provincia XXX';
title2 'Tassi di occupazione e di disoccupazione';
run;
Va notato che le istruzioni relative ai titoli sono memorizzate in modo permanente dal SAS, nel senso
che restano valide fino a quando non viene chiusa la sessione di lavoro. Pertanto, una volta indicato un
titolo, sarà necessario modificarlo negli step successivi.
La proc print consente anche di stampare solo un certo numero di record, a partire dal primo o da
uno qualsiasi. Questo risultato viene utilizzando opportune opzioni racchiuse fra parentesi tonde, dopo
il nome del dataset da visualizzare.
Per stampare solo le prime k osservazioni l’opzione è
proc print data=<nome_del_dataset>(obs=k);
run;
in cui compare fra parentesi la parola chiave “obs=” che, seguita dal numero k (che il SAS colora
automaticamente in verde acqua), indica al software di stampare a terminale solo i primi k record.
Se invece si desidera stampare k record, ma a partire dal v-esimo, l’istruzione da utilizzare è la seguente
proc print data=<nome_del_dataset> (firstobs=v obs=v+k-1);
run;
In questo caso la parola chiave “firstobs=”, seguita dal numero v (che il SAS colora automaticamente
in verde acqua), indica al software che la prima osservazione da considerare corrisponde al v-esimo
record, mentre la parola chiave “obs” indica al software di stampare a terminale k record a partire dal
v-esimo.
Per esempio, nella prima proc print dell’esempio successivo si chiede al programma di stampare solo
i primi 2 record, mentre con la seconda proc print vengono visualizzati sempre 2 record, ma questa
volta a partire dal terzo.
86
Esempio 5.1.1
proc print data=tassi (obs=2);
proc print data=tassi (firstobs=3 obs=4);
run;
L’output ottenuto è infatti costituito dai due dataset seguenti
Oss tasso_occup tasso_disocc tasso_attiv
1 0.4861 0.0847 0.5320
2 0.5244 0.0741 0.5446
Oss tasso_occup tasso_disocc tasso_attiv
3 0.5367 0.0936 0.5939
4 0.4908 0.1004 0.5245
Un’altra opzione talvolta utile consiste nel chiedere al software di non stampare la variabile “OSS” che
è prevista per default e che compare sempre come prima variabile del dataset stampato a terminale,
come si è visto negli esempi precedenti. In questo caso si utilizza l’istruzione “noobs” prima del punto
e virgola che chiude l’istruzione in cui compare la “proc print”, come mostrato nel listato successivo
proc print data=tassi noobs;
run;
che fornisce il seguente dataset
tasso_occup tasso_disocc tasso_attiv
0.4861 0.0847 0.5320
0.5244 0.0741 0.5446
0.5367 0.0936 0.5939
0.4908 0.1004 0.5245
0.6468 0.0889 0.5892
87
In altre situazioni si può avere bisogno di ottenere la stampa di un dataset separata a seconda delle
determinazioni assunte da una variabile (quantitativa o qualitativa). Questo risultato si ottiene
inserendo l’istruzione “by” seguita dal nome della variabile in questione.
proc print data=<nome_del_dataset>;
var <elenco delle variabili, separate da almeno uno spazio bianco>;
by <nome della variabile rispetto alla quale si vogliono stampe separate >;
Va sottolineato il fatto che il dataset da stampare deve essere già ordinato a seconda di questa variabile.
Se questo ordinamento non è già presente, l’ordinamento va effettuato prima della “proc print” con
un’altra procedura, la “proc sort”, che verrà descritta più avanti.
Si consideri, per esempio, il dataset grano1.txt che si trova nella directory "c:\es_MRS” nel quale le
informazioni su una singola unità statistica sono contenute su 4 righe successive, la prima delle quali
riporta la varietà del grano, mentre le 3 seguenti riportano i valori di 3 diverse variabili quantitative. In
questo caso le modalità della variabile grano sono già elencate ordinatamente nel dataset in input.
Il programma successivo crea il file temporaneo “grano”, denomina le variabili varieta, x1, x2 e x3 ed
effettua la stampa del dataset separatamente per ciascuna varietà di grano
data grano;
infile 'c:\es_MRS\grano1.txt';
input varieta $ / x1 x2 x3;
proc print;
by varieta;
run;
L’output assume la forma successiva
88
varieta=Centauro
Oss x1 x2 x3
1 6.90 13.6 78.8
2 6.90 13.4 77.9
3 6.60 13.8 75.8
4 6.65 11.3 78.8
5 7.75 11.2 79.6
6 7.72 12.1 80.7
7 7.53 11.9 80.7
8 6.16 11.5 81.4
9 3.88 11.1 77.9
10 4.32 11.6 76.1
11 4.39 11.1 77.0
12 5.45 12.6 82.0
13 4.80 12.3 81.6
14 4.70 12.6 81.4
15 7.50 11.4 78.9
varieta=Eridano
Oss x1 x2 x3
16 9.00 14.3 83.5
17 7.90 13.4 79.1
18 7.90 14.6 80.1
19 5.20 11.5 79.8
20 6.10 11.6 80.1
21 7.10 11.8 81.3
22 7.10 12.3 82.4
23 7.33 12.5 83.1
24 7.27 11.6 83.8
25 4.47 11.7 80.6
26 4.86 12.0 77.9
27 4.44 12.2 78.8
28 4.15 12.8 84.2
29 4.45 12.7 83.7
30 5.60 13.0 83.8
89
varieta=Pandas
Oss x1 x2 x3
31 7.75 13.9 81.1
32 6.65 13.5 79.5
33 7.00 13.8 79.1
34 5.40 12.1 76.4
35 4.70 12.4 76.0
36 5.80 11.8 77.3
37 7.21 12.2 81.2
38 7.11 12.2 82.6
39 7.14 11.8 83.0
40 5.10 12.2 77.0
41 5.05 12.1 78.3
42 5.29 12.4 77.8
43 5.60 12.9 82.2
44 5.30 12.8 82.4
45 5.10 12.3 82.4
90
5.2 Proc Format
Questa procedura viene usata per creare una libreria di formati di variabili, che verranno utilizzati in
tutti i DATA STEP e/o nei PROC STEP successivi e che sono permanenti, nel senso che resteranno
validi per tutta la durata della sessione di lavoro.
La sua sintassi è
proc format <opzioni>;
invalue <elenco delle variabili in input e loro formato >;
value <elenco delle variabili in output e loro formato >;
dove si userà la parola chiave “invalue” e/o “value” a seconda che si voglia attribuire un formato alle
variabili in input e/o alle variabili in output.
Di seguito è riportato un esempio di questa procedura applicato al dataset “stud1” contenente alcune
variabili rilevate su 4 studenti universitari: matricola, sesso, se si tratta di studente in corso o fuori
corso, e una variabile dicotomica che indica se lo studente ha ottenuto almeno 100 CFU.
Esempio 5.2.1a
data stud1;
input matricola 6. @8 genere $1. @10 incorso 1. @12 almeno100CFU 1.;
cards;
101122 m 1 1
101132 f 2 1
101234 f 1 2
101321 m 2 1
;
proc format;
value $sesso 'm'='maschio'
'f'='femmina';
value si_no 1='sì'
2='no';
proc print;
format genere $sesso.
incorso si_no.
Almeno100CFU si_no.;
run;
Con le istruzioni contenute in questa proc format si fissano due diversi formati:
- quello denominato “$sesso” si potrà utilizzare per variabili alfanumeriche,
- quello denominato “si_no” si potrà utilizzare per variabili numeriche.
91
Nei “value” che compaiono all’interno della proc format, infatti, il primo carattere dei formati che si
riferiscono a variabili qualitative è sempre costituito dal simbolo “$”, mentre questo simbolo non deve
comparire nei formati riferiti a variabili quantitative.
In questo esempio si stabilisce che le determinazioni “m” e “f” corrispondono rispettivamente a
“maschio” e “femmina”. Come si nota, le determinazioni assunte da una variabile qualitativa e i loro
formati vanno indicati fra apici e sono evidenziati automaticamente in viola dal SAS.
Il formato denominato “si_no” è invece utilizzabile solo per variabili numeriche che assumono due
diversi valori: 1 oppure 2. In questo esempio si stabilisce che il valore 1 corrisponde a “sì”, mentre il
valore “2” corrisponde a “no”.
Le determinazioni assunte da una variabile quantitativa sono numeri, non vanno indicate fra apici e
sono evidenziati automaticamente in verde acqua dal SAS, mentre i formati corrispondenti sono invece
indicati fra apici ed evidenziati in viola dal SAS.
Nell’esempio considerato le istruzioni utilizzate nella proc format servono per stampare a terminale il
dataset in modo che alle determinazioni “m” e “f” assunte dalla variabile “genere” corrispondano i
formati “maschio” e “femmina”, mentre ai valori “1” e “2” delle variabili “incorso” e
“almeno100CFU” corrispondano rispettivamente le determinazioni “sì” e “no”, come si nota
dall’output ottenuto che è riportato qui di seguito.
Oss matricola genere incorso almeno40CFU
1 101122 maschio sì sì
2 101132 femmina no sì
3 101234 femmina sì no
4 101321 maschio no sì
Va sottolineato il fatto che quando si richiamano i formati fissati con la proc format il nome
assegnato al formato va seguito dal punto e viene colorato in verde acqua dal SAS, come accade per
“$sesso.” e “si_no.” nell’esempio appena considerato.
In questo caso l’assegnazione dei formati mediante la proc format è stata effettuata dopo il DATA
STEP ma in realtà, di solito, la proc format viene posizionata all’inizio del programma, così da
rendere chiaro che i formati stabiliti restano validi per tutta l’esecuzione del programma stesso.
92
Inoltre, nell’esempio, l’attribuzione dei formati alle tre variabili considerate è stata effettuata all’interno
della proc print, ma potrebbe essere effettuata anche all’interno del DATA STEP, se la proc format
fosse stata la prima istruzione del programma.
Il listato del programma riportato nell’esempio 5.2.1a, quindi, sarebbe potuto essere anche il seguente
Esempio 5.2.1b
proc format;
value $sesso 'm'='maschio'
'f'='femmina';
value si_no 1='sì'
2='no';
data stud1;
input matricola 6. @8 genere $1. @10 incorso 1. @12 almeno100CFU 1.;
format genere $sesso.
incorso si_no.
Almeno100CFU si_no.;
cards;
101122 m 1 1
101132 f 2 1
101234 f 1 2
101321 m 2 1
;
proc print;
run;
e l’output risultante sarebbe rimasto comunque invariato.
La proc format può essere utilizzata con obiettivi differenti come, per esempio, per costruire una
distribuzione in classi. Se nel dataset in input è presente una variabile numerica che assume molti valori
diversi, attraverso la proc format la si potrebbe trasformare in una variabile (numerica o
alfanumerica) che assume determinazioni diverse per diverse classi di valori della variabile originaria.
Nell’esempio successivo viene creato all’interno del programma un dataset che contiene la matricola e
il voto ad un esame di un gruppo di 5 studenti. Con la proc format si sostituisce la determinazione
“basso” a un voto universitario compreso nell’intervallo [18, 22], la determinazione “medio” a un voto
compreso nell’intervallo [23, 26] e la determinazione “alto” a un voto maggiore o uguale a 27.
Va osservato però che, in questo modo, la variabile originaria viene sovrascritta in fase di stampa
(anche se non vengono effettivamente sovrascritti nel dataset), per cui può essere preferibile costruire
una variabile diversa, per esempio attraverso un’opportuna sequenza di istruzioni “if”.
93
Esempio 5.2.2
proc format;
value voto_form 18-22='basso'
23-26='medio'
27-30='alto';
data voti;
input matricola voto;
cards;
101122 23
101132 22
101234 19
101321 26
101396 28
;
proc print;
format voto voto_form.;
run;
L’output ottenuto dall’esecuzione delle istruzioni precedenti risulta
Oss matricola voto
1 101122 medio
2 101132 basso
3 101234 basso
4 101321 medio
5 101396 alto
94
5.3 Proc Contents
Questa procedura, utilizzata in precedenza quando si è effettuato il cambio di variabile da numerica ad
alfanumerica e viceversa, serve per descrivere le caratteristiche di un dataset, restituendo il percorso
necessario per trovarlo, il suo nome (completo di estensione) e il formato delle variabili in esso
presenti.
La sua sintassi è
proc contents data=<nome_del_dataset>;
dove, se viene omesso il nome del dataset, per default il SAS prenderà in esame l’ultimo.
Se, per esempio si considerano le seguenti istruzioni
Esempio 5.3.1
data archivio;
input x y $ z;
format x comma12.3 y $7. z 1.;
cards;
3455.457 piccolo 0
7568.903 medio 1
11777.346 grande 1
;
proc contents;
run;
si otterranno le seguenti informazioni relative alle variabili
Elenco alfabetico di variabili e attributi
# Variabile Tipo Lungh Formato
1 x Num 8 COMMA12.3
2 y Alfanum 8 $7.
3 z Num 8 1.
Questa procedura può risultare molto utile quando si importa un dataset all’interno di un programma e
non se ne conosce la sua struttura.
95
5.4 Proc Export
La procedura Export serve per effettuare l’operazione opposta rispetto a quella analizzata nel paragrafo
relativo alla proc import, viene cioè utilizzata quando si desidera trasformare un dataset SAS in un
dataset di formato differente. La sintassi di questa procedura è
PROC EXPORT DATA=<libref.>SAS dataset <(SAS dataset option(s))>
OUTFILE="filename" | OUTTABLE="tablename"
<DBMS=identifier> <REPLACE> <LABEL>;
dove l’istruzione “dbms=” può assumere le determinazioni indicata nella tabella 3.5.1 del paragrafo 3.5.
Il programma seguente, per esempio, trasforma il dataset SAS denominato “studenti”, creato all’interno
del programma, in un dataset EXCEL permanente, denominato “stud.xls”, che si trova nella directory
"c:\es_MRS".
Esempio 5.4.1
data studenti;
input sesso $ voto;
cards;
m 23
f 19
m 18
m 22
f 25
f 26
;
proc export data=studenti
dbms=xls
outfile="c:\es_MRS\stud";
run;
Il file Excel così creato contiene le seguenti informazioni
sesso voto
m 23
f 19
m 18
m 22
f 25
f 26
96
Se invece si utilizzassero le seguenti istruzioni all’interno della “proc export”
proc export data=studenti
dbms=csv
outfile="c:\es_MRS\stud";
run;
si otterrebbe il seguente file permanente stud, sempre nella medesima directory, che è un file CSV
(Comma Separated Value) che può essere aperto, per esempio, con l’applicazione “blocco note”, ed è
costituito dai seguenti record
sesso,eta
m,23
f,19
m,18
m,22
f,25
f,26
Per generare invece un file delimitato (ossia con estensione .dlm) si deve specificare, oltre all’opzione
DBMS=DLM, il delimitatore che separa le singole determinazioni delle variabili. Tale delimitatore è,
per default, lo spazio bianco, ma può essere personalizzato aggiungendo l’istruzione
DELIMITER=“simbolo_delimitatore";
dove il simbolo di delimitazione deve essere racchiuso fra apici (o virgolette): Se, per esempio, si
desidera usare il simbolo “&”, l’istruzione assumerà la forma
DELIMITER='&';
Pertanto, se si utilizzassero le seguenti istruzioni
97
proc export data=studenti
outfile="c:\es_MRS\stud"
dbms=dlm
replace;
delimiter='&';
run;
dove l’opzione “replace” fa sì che il SAS sovrascriva l’archivio precedentemente creato, si otterrebbe
(sempre nella medesima directory) un file, denominato “stud” avente la forma seguente
sesso&eta
m&23
f&19
m&18
m&22
f&25
f&26
Se si volesse sostituire il delimitatore “&” con uno spazio bianco sarebbe sufficiente far eseguire al
SAS le seguenti istruzioni
proc export data=studenti
outfile="c:\es_MRS\stud"
dbms=dlm
replace;
run;
e in questo caso il file di testo “stud” avrebbe la forma seguente
sesso eta
m 23
f 19
m 18
m 22
f 25
f 26
98
5.6 La Proc SORT
Questa procedura esegue l'ordinamento dei record di un dataset a seconda delle determinazioni (che
possono essere sia valori numerici sia stringhe alfanumeriche) assunte da una o più variabili. Tale
ordinamento, effettuato sulla base del codice ASCII, per default è effettuato in modo non decrescente
ma, con un’opportuna istruzione descritta in seguito, può essere effettuata anche in modo non
crescente.
La sintassi è la seguente
PROC SORT DATA=<nome_del_dataset> <opzioni>;
BY [descending] <variabile/variabili>;
dove l'istruzione “BY” indica la variabile o le variabili da considerare per l’ordinamento. Questa
istruzione deve essere necessariamente specificata.
Quando si desidera ordinare i record sulla base delle determinazioni assunte da più variabili,
l'ordinamento viene fatto a partire dalla prima elencata dopo l’istruzione “by”. Se, per esempio, si
volessero ordinare i record a seconda delle determinazioni, ordinate in modo non decrescente, di una
variabile X e di una variabile Y, le istruzioni saranno del tipo
PROC SORT DATA=<nome_del_dataset> <opzioni>;
BY X Y;
e l’ordinamento verrà eseguito sulla base della variabile X e, all’interno di un gruppo di unità che
presentano una stessa determinazione di tale variabile, sulla base delle determinazioni assunte dalla Y.
L’opzione “descending” si utilizza quando si desidera un ordinamento a partire dalla determinazione
più alta fino alla più bassa (ossia in ordine non crescente). Questa istruzione va inserita prima del nome
della variabile rispetto alla quale si vuole stabilire l’ordinamento.
Per esempio, le istruzioni seguenti effettuano l’ordinamento delle osservazioni a seconda dei valori
ordinati in modo non crescente rispetto alla X e in base ai valori non decrescenti della Y
PROC SORT DATA=<nome_del_dataset> <opzioni>;
BY descending X Y;
99
Fra le possibili opzioni che possono essere considerate per questa procedura quella più utilizzata
assume la forma
OUT = <nome_del_data_set>
e viene usata per specificare il nome del dataset di uscita. In assenza di tale istruzione, il dataset
ordinato si sovrappone a quello originale (se il programma ha girato correttamente).
Esempio 5.6.1
Si consideri il dataset SAS “american_data”, contenuto nella directory “c:\es_MRS”, che contiene i dati
relativi a:
- la ditta di alcune aziende americane (“ditta”)
- i debiti espressi in migliaia di dollari (“debito”),
- l’identificativo associato a ciascun cliente (“numero_conto”)
- la città in cui opera l’azienda (“citta”)
Si vogliono ordinare i record presenti nell’archivio a seconda delle determinazioni assunte dalla
variabile “città” e, all’interno di questa, a seconda delle determinazioni assunte dalla “ditta”, seguendo
in entrambi i casi l’ordine non decrescente.
Il file creato, di tipo temporaneo, deve essere denominato “city_company” e va stampato a terminale,
con le seguenti due righe di titolo:
Clienti indebitati
elencati in ordine alfabetico all'interno di ciascuna città
Le variabili dovranno inoltre comparire nell’ordine specificato qui di seguito: citta, ditta, debito,
numero_conto.
Un programma SAS che soddisfa queste richieste è il seguente
data origine;
set 'c:\es_MRS\american_data.sas7bdat';
proc sort data=origine out=city_company;
by citta ditta;
proc print data=city_company;
var citta ditta debito numero_conto;
title 'Clienti indebitati';
title2 'elencati in ordine alfabetico all''interno di ciascuna città';
run;
100
dove il dataset SAS viene letto utilizzando l’istruzione “set” seguita dal percorso e dal nome completo
del file.
L’output assume la forma riportata di seguito
Clienti indebitati
elencati in ordine alfabetico all'interno di ciascuna città
Oss citta ditta debito numero_conto
1 Apex Apex Catering 37.95 9923
2 Apex Paul's Pizza 83.00 1019
3 Apex Peter's Auto Parts 65.79 7288
4 Apex Tina's Pet Shop 37.95 5108
5 Apex Watson Tabor Travel 37.95 3131
6 Garner Boyd & Sons Accounting 312.49 4762
7 Garner Deluxe Hardware 467.12 8941
8 Garner Elway Piano and Organ 65.79 5217
9 Garner World Wide Electronics 119.95 1122
10 Holly Springs Ice Cream Delight 299.98 2310
11 Holly Springs Tim's Burger Stand 119.95 6335
12 Morrisville Bob's Beds 119.95 4998
13 Morrisville Pauline's Antiques 302.05 9112
14 Morrisville Strickland Industries 657.22 1675
Esempio 5.6.2
Sulla base del medesimo dataset SAS dell’esempio precedente si consideri ora un programma SAS che
esegue l’ordinamento dei record a seconda della variabile città (ordinata in senso crescente), del debito
(in senso decrescente) e dell’identificativo (in senso crescente).
Il file creato, di tipo permanente, dovrà comparire nella medesima directory del file originario ed essere
denominato “city_company1”. Dovrà essere stampato a terminale, con le seguenti due righe di titolo:
Clienti indebitati
elencati per città e valori decrescenti del debito
101
Le variabili dovranno inoltre comparire nell’ordine specificato qui di seguito: citta, debito, ditta,
numero_conto.
Un programma SAS che soddisfa queste richieste è il seguente
libname libreria 'c:\es_MRS';
data origine;
set 'c:\es_MRS\american_data.sas7bdat';
proc sort data=origine out=libreria.city_company1;
by citta descending debito ditta;
proc print;
var citta debito ditta numero_conto;
title 'Clienti indebitati';
title2 'elencati per città e valori decrescenti del debito';
run;
e il corrispondente output assume la forma
Clienti indebitati
elencati per città e valori decrescenti del debito
Oss citta debito ditta numero_conto
1 Apex 83.00 Paul's Pizza 1019
2 Apex 65.79 Peter's Auto Parts 7288
3 Apex 37.95 Apex Catering 9923
4 Apex 37.95 Tina's Pet Shop 5108
5 Apex 37.95 Watson Tabor Travel 3131
6 Garner 467.12 Deluxe Hardware 8941
7 Garner 312.49 Boyd & Sons Accounting 4762
8 Garner 119.95 World Wide Electronics 1122
9 Garner 65.79 Elway Piano and Organ 5217
10 Holly Springs 299.98 Ice Cream Delight 2310
11 Holly Springs 119.95 Tim's Burger Stand 6335
12 Morrisville 657.22 Strickland Industries 1675
13 Morrisville 302.05 Pauline's Antiques 9112
14 Morrisville 119.95 Bob's Beds 4998
102
Esercizi riepilogativi
Esercizio 5.1
Considerato il file excel “occup.xls” nella directory “c:\es_MRS” creare un dataset SAS temporaneo di
nome “occup_FVG” che contenga le sole osservazioni relative al Friuli Venezia Giulia e, per ciascun
record, calcolare i seguenti tassi:
- di occupazione “tas_occ” (rapporto fra numero di occupati e popolazione di 15 o più anni)
- di disoccupazione “tas_dis” (rapporto fra numero di chi è cerca un’occupazione e forze lavoro)
- di attività “tas_att” (rapporto forze lavoro e popolazione di 15 o più anni)
Stampare a terminale solo la denominazione e i tre tassi, con 4 cifre decimali.
Soluzione
Il programma SAS potrebbe assumere la forma
proc import datafile="c:\es_MRS\occup.xls" dbms=xls out=occup;
data occup_FVG; set occup;
if reg=6;
tas_occ = occupati/Popolazione_di_15_anni_o_pi_;
tas_dis = In_cerca_di_occupazione/Forze_di_lavoro;
tas_att = Forze_di_lavoro/Popolazione_di_15_anni_o_pi_;
proc print;
var denominazione tas_occ tas_dis tas_att;
Format tas_occ 8.4 tas_dis 8.4 tas_att 8.4;
run;
e la stampa deve consistere nel seguente file
Oss Denominazione tas_occ tas_dis tas_att
1 CIVIDALE DEL FRIULI 0.4421 0.0920 0.4869
2 LATISANA 0.4645 0.0858 0.5081
3 SAN GIORGIO DI NOGARO 0.4460 0.0838 0.4868
4 TARVISIO 0.4904 0.0654 0.5248
5 TOLMEZZO 0.4640 0.0693 0.4985
6 UDINE 0.4644 0.0736 0.5013
7 GORIZIA 0.4568 0.0780 0.4955
8 MONFALCONE 0.4402 0.0820 0.4795
9 TRIESTE 0.4469 0.0745 0.4829
10 MANIAGO 0.4725 0.0699 0.5080
11 PORDENONE 0.4965 0.0711 0.5345
103
Esercizio 5.2
I seguenti dati
M 3 3 4 3
F 3 3 3 4
F 3 2 2 4
F 3 3 3 3
M 2 3 3 3
M 1 2 3 2
indicano il sesso e le modalità di risposta a 4 domande (D1, D2, D3 e D4) contenute nei questionari di
valutazione della didattica compilati da 6 studenti.
Creare il dataset all’interno del programma denominandolo “risposte” e stamparlo a terminale facendo
comparire la dicitura “maschio” e “femmina” per il sesso e le modalità di risposta elencate di seguito
per le 4 variabili D1, D2, D3 e D4:
1. Decisamente no;
2. Più no che sì;
3. Più sì che no;
4. Decisamente sì.
Soluzione
Il programma SAS potrebbe assumere la forma
data risposte;
input sesso $ D1-D4;
cards;
M 3 3 4 3
F 3 3 3 4
F 3 2 2 4
F 3 3 3 3
M 2 3 3 3
M 1 2 3 2
;
proc print;
proc format;
value $sex 'M' = 'maschio'
'F' = 'femmina';
value DOM 1 = 'Decisamente no'
2 = 'Più no che sì'
3 = 'Più sì che no'
4 = 'Decisamente sì';
proc print;
format sesso $sex. D1 DOM. d2 DOM. D3 DOM. D4 DOM.;
run;
e la stampa ottenuta è la seguente
104
Oss sesso D1 D2 D3 D4
1 maschio Più sì che no Più sì che no Decisamente sì Più sì che no
2 femmina Più sì che no Più sì che no Più sì che no Decisamente sì
3 femmina Più sì che no Più no che sì Più no che sì Decisamente sì
4 femmina Più sì che no Più sì che no Più sì che no Più sì che no
5 maschio Più no che sì Più sì che no Più sì che no Più sì che no
6 maschio Decisamente no Più no che sì Più sì che no Più no che sì
105
Esercizio 5.3
Considerato il dataset SAS “fratelli” presente nella directory “c:\es_MRS” si crei il file SAS
temporaneo, denominato “frat1”, contenente solo le variabili “l1” e “b1”. Si crei una variabile
alfabetica “l1a” che assume le determinazioni:
- “a” se l1 è maggiore di 162 e minore o uguale a 180,
- “b” se l1 è maggiore di 180 e minore o uguale a 190,
- “c” se l1 è maggiore di 190 e minore o uguale a 208,
e una variabile alfabetica “b1a” che assume le determinazioni:
- “a” se b1 è maggiore di 136 e minore o uguale a 146,
- “b” se b1 è maggiore di 146 e minore o uguale a 156,
- “c” se b1 è maggiore di 156 e minore o uguale a 168,
Tramite la “proc format” si utilizzino i seguenti formati:
- per “l1a” si creino le classi: 162 – 180, 180 – 190 e 190 – 208
- per “b1a” si creino le classi: 136 – 146, 146 – 156 e 156 – 168
Si stampi il dataset ottenuto in questo modo a terminale visualizzando solo le variabili ident, l1, l1a, b1
e b1a, in questo ordine, ed eliminando la variabile “OSS”.
Soluzione
libname libr1 "c:\es_MRS";
data frat1; set libr1.fratelli;
if 162 < l1 <= 180 then l1a='a';
else if 180 < l1 <= 190 then l1a='b';
else if l1> 190 then l1a='c';
if 136 < b1 <= 146 then b1a='a';
else if 146 < b1 <= 156 then b1a='b';
else if b1> 156 then b1a='c';
proc format;
value $l1a 'a'='162 – 180'
'b'='180 – 190'
'c'='190 – 208';
value $b1a 'a'='136 – 146'
'b'='146 – 156'
'c'='156 – 168';
proc print noobs;
var ident l1 l1a b1 b1a;
format l1a $l1a. b1a $b1a.;
run;
La stampa corrispondente, ottenuta a terminale, assume la forma seguente
106
ident l1 l1a b1 b1a
1 191 190 – 208 155 146 – 156
2 195 190 – 208 149 146 – 156
3 181 180 – 190 148 146 – 156
4 183 180 – 190 153 146 – 156
5 176 162 – 180 144 136 – 146
6 208 190 – 208 157 156 – 168
7 189 180 – 190 150 146 – 156
8 197 190 – 208 159 156 – 168
9 188 180 – 190 152 146 – 156
10 192 190 – 208 150 146 – 156
11 179 162 – 180 158 156 – 168
12 183 180 – 190 147 146 – 156
13 174 162 – 180 150 146 – 156
14 190 180 – 190 159 156 – 168
15 188 180 – 190 151 146 – 156
16 163 162 – 180 137 136 – 146
17 195 190 – 208 155 146 – 156
18 186 180 – 190 153 146 – 156
19 181 180 – 190 145 136 – 146
20 175 162 – 180 140 136 – 146
21 192 190 – 208 154 146 – 156
22 174 162 – 180 143 136 – 146
23 176 162 – 180 139 136 – 146
24 197 190 – 208 167 156 – 168
25 190 180 – 190 163 156 – 168
107
Esercizio 5.4
Considerato il dataset SAS “fratelli” presente nella directory “c:\es_MRS” si crei il file SAS
temporaneo, denominato “frat2”, contenente solo le variabili “ident”, “l2” e “b2”, ordinato in modo
crescente secondo il valore di l2 e in modo decrescente secondo il valore di b2.
Soluzione
libname libr1 "c:\es_MRS";
data frat1; set libr1.fratelli;
proc sort out=frat2;
by l2 descending b2;
proc print noobs;
var ident l2 b2;
run;
Il dataset stampato a terminale risulta il seguente (da cui, per brevità, sono state omesse alcune righe
centrali)
ident l2 b2
16 161 130
20 165 137
5 171 142
18 173 148
12 174 147
23 176 143
22 178 147
1 179 145
19 182 146
17 183 158
13 185 152
21 185 152
3 185 149
…. … ..
14 195 157
9 197 159
24 200 158
2 201 152
108
Esercizio 5.5
Si consideri il dataset “pottery.xls” presente nella directory “c:\es_MRS” relativo alla composizione
chimica della ceramica (rappresentata dalle variabili “Al”, “Fe”, “Mg”, “Ca” e “Na”) rilevata per
diverse località (variabile “site”). Si effettui la stampa separata del dataset a seconda delle
determinazioni assunte dalla variabile “site” eliminando la variabile “OSS”
Soluzione
Un programma che effettua le operazioni richieste è il seguente
proc import datafile="c:\es_MRS\pottery.xls" out=a dbms=xls replace;
proc print;
proc sort data=a;
by site;
proc print noobs;
by site;
run;
e l’output fornito dal SAS risulta quello riportato di seguito in cui, come si vede, il titolo di ogni tabella
indica la modalità assunta dalla variabile “site”
Site=AshleyRails
Al Fe Mg Ca Na
17.7 1.12 0.56 0.06 0.06
18.3 1.14 0.67 0.06 0.05
16.7 0.92 0.53 0.01 0.05
14.8 2.74 0.67 0.03 0.05
19.1 1.64 0.6 0.1 0.03
Site=Caldicot
Al Fe Mg Ca Na
11.8 5.44 3.94 0.3 0.04
11.6 5.39 3.77 0.29 0.06
109
Site=IsleThorns
Al Fe Mg Ca Na
18.3 1.28 0.67 0.03 0.03
15.8 2.39 0.63 0.01 0.04
18 1.5 0.67 0.01 0.06
18 1.88 0.68 0.01 0.04
20.8 1.51 0.72 0.07 0.1
Site=Llanedyrn
Al Fe Mg Ca Na
14.4 7 4.3 0.15 0.51
13.8 7.08 3.43 0.12 0.17
14.6 7.09 3.88 0.13 0.2
11.5 6.37 5.64 0.16 0.14
13.8 7.06 5.34 0.2 0.2
10.9 6.26 3.47 0.17 0.22
10.1 4.26 4.26 0.2 0.18
11.6 5.78 5.91 0.18 0.16
11.1 5.49 4.52 0.29 0.3
13.4 6.92 7.23 0.28 0.2
12.4 6.13 5.69 0.22 0.54
13.1 6.64 5.51 0.31 0.24
12.7 6.69 4.45 0.2 0.22
12.5 6.44 3.94 0.22 0.23
110
Esercizio 5.6
Il dataset “students.sas7bdat” presente nella directory “c:\es_MRS” si riferisce a un gruppo di studenti
di varie età su cui sono state rilevate le variabili “sesso” (f = femmina, m = maschio), “altezza” (in
pollici) e “peso” (in libbre). Si desidera:
- esprimere l’altezza in centimetri (1 pollice equivale a 2.54 cm.) denominando la variabile
“altezza_cm” e il peso in chilogrammi (1 libbra equivale a circa 0.453592 kg.) denominando la
variabile “peso_kg”.
- mantenere solo le variabili “sesso”, “altezza_cm” e “peso_kg”.
- ordinare le osservazioni mettendo prima tutti i file relativi ai maschi e successivamente quelli
relativi alle femmine ed esportare il file permanente, denominato “class” in formato Excel, con
estensione “.xls”.
Soluzione
Un programma in grado di effettuare tutte le operazioni richieste è riportato nel riquadro seguente
data a;
set "c:\es_MRS\students.sas7bdat";
/*effettuo la trasformazione delle variabili*/
altezza_cm=altezza*2.54;
peso_kg=peso*0.453592;
/*scarto le variabili non richieste*/
drop altezza peso;
/*ordino le osservazioni*/
proc sort;
by descending genere;
/*esporto il dataset in formato XLS*/
proc export outfile="c:\es_MRS\class" replace
dbms=xls;
run;
e il file ottenuto, presente nella directory “c:\es_MRS”, assume la forma seguente
111
genere altezza_cm peso_kg
m 158,75 51,0291
m 158,75 50,802304
m 149,86 47,173568
m 156,21 46,946772
m 168,91 50,802304
m 165,1 51,709488
m 156,21 63,50288
m 157,48 48,76114
m 150,622 39,462504
f 143,002 38,55532
f 158,242 47,62716
f 160,782 48,987936
f 149,86 41,730464
f 143,51 31,297848
f 157,48 42,864444
f 136,652 31,071052
f 156,21 47,173568
f 163,83 56,018612
f 148,082 42,184056
f 130,302 22,906396
f 149,352 40,369688