Tips og tricks til Proc Means Per Andersen Senior IM Consultant Dong Energy, Group IT, Trading IT, Analytics
ENERGI I FORANDRING Marts 2012
DONG Energy er en af Nordeuropas førende energikoncerner med hovedsæde i Danmark Vores forretning er baseret på at fremskaffe, producere, distribuere og handle energi og tilknyttede produkter i Nordeuropa. Vi beskæftiger omkring 6.000 medarbejdere og omsatte for 57 mia. kr. (EUR 7,6 mia.) i 2011. EXPLORATION & PRODUCTION WIND POWER THERMAL POWER ENERGY MARKETS SALES & DISTRIBUTION 3
Omsætning og resultater i 2011 Omsætningen udgjorde 56,8 mia. kr. i 2011 mod 54,6 mia. kr. i 2010. Stigningen på 4% skyldtes højere produktion af olie og gas samt højere energipriser. EBITDA udgjorde 13,8 mia. kr. i 2011 mod 14,1 mia. kr. i 2010. Et fald på 3%. Årets resultat udgjorde 2,9 mia. kr. og var 1,6 mia. kr. lavere end i 2010. Faldet skyldtes især lavere avance ved salg af virksomheder og højere skat i Norge.
Tips og tricks til Proc Means Ideen til dette indlæg har jeg fra Andrew H. Karp Sierra Information Services Inc. California US Andrew holdt et tilsvarende indlæg på SUGI 27 (2002) og SAS Global Forum 2007 5
Tips og tricks til Proc Means Denne præsentation vil vise 13 (forhåbentlige) gode tips til Proc Means (kan også bruges i Proc Summary). Mange af de viste tips indeholder V8/V9 features i Proc Means Denne præsentation vil: vise hvordan det er muligt at: Reducere antal gange Proc Means skal kører Benytte endnu flere analyse værdier Tilføj mere output information Reducere processing overhead med Proc Means og store datamængder 6
Tips og tricks til Proc Means Proc Means og Proc Summary Begge procedure er en del af Base SAS software Blev i SAS V6 ens procedurer (det er lang tid siden (1991)) Er begge meget effektfulde til at summere og analysere data Forskel: Proc Means danner SAS output (default) Proc Summary danner SAS-dataset (default) 7
Syntax: MEANS Procedure PROC MEANS <option(s)> <statistic-keyword(s)>; BY <DESCENDING> variable-1 < <DESCENDING> variable-n><notsorted>; CLASS variable(s) </ option(s)>; FREQ variable; ID variable(s); OUTPUT <OUT=SAS-data-set> <output-statistic-specification(s)> <id-group-specification(s)> <maximum-id-specification(s)> <minimum-id-specification(s)> </ option(s)> ; TYPES request(s); VAR variable(s) < / WEIGHT=weight-variable>; WAYS list; WEIGHT variable; 8
Tips og tricks til Proc Means Eksempel data Kundedata 227.362 rækker Mulige klassifikationsvariable Postnr (503 unikke værdier) Salgskontor (3 unikke værdier) Grossist (38 unikke værdier) Kundetype (3 unikke værdier) Koen (2 unikke værdier) Region (1 unik værdi) 9
Tips og tricks til Proc Means Eksempel data Mulige analysevariable antal Pris_ialt enhpris 10
Tips og tricks til Proc Means Simpelt eksempel Beregn sum på Antal Pris_ialt Pr. Salgskontor grossist 11
Tips og tricks til Proc Means title1 "Simpel eksempel på brug af Proc Means"; Proc Means data=sugdk.kundedata2 noprint missing; class salgskontor grossist; var antal pris_ialt; output out=ny sum=total_ant total_pris; run; proc print data=ny; run; Bemærk længere kolonnenavne (nyt i V8) 12
Tips og tricks til Proc Means Simpel eksempel på brug af Proc Means Obs salgskontor grossist _TYPE FREQ_ total_ant total_pris 1 0 227362 244.190.840 17.575.580.941,96 2 1 41470 36.677.704 2.047.815.352,91 3 02 1 3361 3.781.584 286.442.916,86 4 03 1 2228 2.919.052 230.607.268,69 5 07 1 9511 6.247.742 308.320.483,88 6 10 1 367 388.230 26.073.099,12 7 14 1 1046 1.235.458 89.382.530,87 8 15 1 42990 37.882.250 2.219.534.949,87 9 17 1 13394 16.049.759 1.191.245.931,35 10 18 1 1354 1.331.341 93.629.917,89 11 21 1 7697 10.308.929 803.214.017,47 12 24 1 6165 6.452.709 469.047.449,30 13 34 1 2781 2.715.126 188.555.412,51 Type = 0 total niveau Type = 1 ialt pr. grossist Der er også type = 2 og 3 13
Tips og tricks til Proc Means Hvad skete der? Der blev dannet et SAS dataset i work med summer indenfor de analysevariable der var angivet i CLASS-statementet. Der bliver dannet 2 variable fra PROC MEANS _type_ angiver summeringsniveau _freq_ antal rækker der er summeret i dette summeringsniveau 14
Tip #1 Benyt Proc Means til at beregne Quantiler Proc Means kan nu også beregne Quantiler Percentiler Median m.m. Det betyder at du er fri for at benytte Proc Univariate til dette Proc Tabulate og Proc Report har også disse muligheder 15
Tip #1 Benyt Proc Means til at beregne Quantiler Beregn sum på Pris_ialt Pr. grossist 16
Tip #1 Benyt Proc Means til at beregne Quantiler title; title1 "Tip 1, Benyt Proc Means til at beregne Quantiler"; Proc Means data=sugdk.kundedata2 noprint missing; class grossist; var pris_ialt; output out=ny2 sum=median_pris mean=total_pris p50=mean_pris; run; proc print data=ny2; run; 17
Tip #1 Benyt Proc Means til at beregne Quantiler Tip 1, Benyt Proc Means til at beregne Quantiler Obs grossist _TYPE FREQ_ median_pris total_pris mean_pris 1 0 227362 17.575.580.941,96 77.302,19 5.248,80 2 1 41470 2.047.815.352,91 49.380,65 5.141,82 3 02 1 3361 286.442.916,86 85.225,50 4.681,80 4 03 1 2228 230.607.268,69 103.504,16 6.949,00 5 07 1 9511 308.320.483,88 32.417,25 1.851,93 6 10 1 367 26.073.099,12 71.043,87 6.771,20 7 14 1 1046 89.382.530,87 85.451,75 6.507,64 8 15 1 42990 2.219.534.949,87 51.629,10 3.382,72 9 17 1 13394 1.191.245.931,35 88.938,77 7.162,58 10 18 1 1354 93.629.917,89 69.150,60 4.292,87 11 21 1 7697 803.214.017,47 104.354,17 8.294,40 12 24 1 6165 469.047.449,30 76.082,31 4.884,22 Hvad er der galt med dette dataset? Pga. tastaturproblemer er der angivet forkerte kolonnenavne 18
Tip #2 Autoname og Autolabel En metode til at undgå fejlagtige kolonnenavne er at benytte Autoname og Autolabel options. Disse options hører til Output statement og giver automatisk kolonnenavne der indeholder det oprindelige kolonnenavn + oplysning om hvilken statistik der er benyttet. 19
Tip #2 Autoname og Autolabel title1 "Tip 2, Brug AUTONAME og AUTOLABEL options"; Proc Means data=sugdk.kundedata2 noprint missing; label pris_ialt = 'Total pris'; class grossist; var pris_ialt; output out=ny3 sum= mean= p50= /autolabel autoname; run; 20
Tip #2 Autoname og Autolabel Tip 2, Brug AUTONAME og AUTOLABEL options Obs grossist _TYPE FREQ_ pris_ialt_sum pris_ialt_mean pris_ialt_p50 1 0 227362 17.575.580.941,96 77.302,19 5.248,80 2 1 41470 2.047.815.352,91 49.380,65 5.141,82 3 02 1 3361 286.442.916,86 85.225,50 4.681,80 4 03 1 2228 230.607.268,69 103.504,16 6.949,00 5 07 1 9511 308.320.483,88 32.417,25 1.851,93 6 10 1 367 26.073.099,12 71.043,87 6.771,20 7 14 1 1046 89.382.530,87 85.451,75 6.507,64 8 15 1 42990 2.219.534.949,87 51.629,10 3.382,72 9 17 1 13394 1.191.245.931,35 88.938,77 7.162,58 10 18 1 1354 93.629.917,89 69.150,60 4.292,87 11 21 1 7697 803.214.017,47 104.354,17 8.294,40 12 24 1 6165 469.047.449,30 76.082,31 4.884,22 21
Tip #2 Autoname og Autolabel proc contents data=ny3 noprint out=ny4 (keep=name label); run; proc print data=ny4; run; proc print data=ny3 l; run; 22
Tip #2 output fra PROC CONTENTS Tip 2, Brug AUTONAME og AUTOLABEL options Obs NAME LABEL 1 _FREQ_ 2 _TYPE_ 3 grossist Grossist 4 pris_ialt_mean Total pris_mean 5 pris_ialt_p50 Total pris_p50 6 pris_ialt_sum Total pris_sum 23
Tip #2, output fra Proc Print Tip 2, Brug AUTONAME og AUTOLABEL options Obs Grossist _TYPE FREQ_ Total pris_sum Total pris_mean Total pris_p50 1 0 227362 17.575.580.941,96 77.302,19 5.248,80 2 1 41470 2.047.815.352,91 49.380,65 5.141,82 3 02 1 3361 286.442.916,86 85.225,50 4.681,80 4 03 1 2228 230.607.268,69 103.504,16 6.949,00 5 07 1 9511 308.320.483,88 32.417,25 1.851,93 6 10 1 367 26.073.099,12 71.043,87 6.771,20 7 14 1 1046 89.382.530,87 85.451,75 6.507,64 8 15 1 42990 2.219.534.949,87 51.629,10 3.382,72 9 17 1 13394 1.191.245.931,35 88.938,77 7.162,58 10 18 1 1354 93.629.917,89 69.150,60 4.292,87 11 21 1 7697 803.214.017,47 104.354,17 8.294,40 12 24 1 6165 469.047.449,30 76.082,31 4.884,22 24
Tip #3 Dan flere output dataset i en PROC MEANS En metode der ofte er overset, men meget effektfuld Proc Means skal kun køres 1 gang Der er mulighed for at benytte _type_ til at styre output Værdien i _type_ svarer til det binære talsystem 25
Tip #3 Dan flere output dataset i en PROC MEANS title1 "Tip 3, Dan flere output dataset i en Proc Means"; Proc Means data=sugdk.kundedata2 noprint missing; class postnr salgskontor grossist kundetype; var antal pris_ialt; output out=tip3 sum=; run; Outputdataset indeholder 16.842 kolonner Her er 4 class-kolonner, giver _type_ fra 0 til 15, eller binært 0000 til 1111 26
Tip #3 Dan flere output dataset i en PROC MEANS I version 6 var der mulighed for at bruge where på _type_ i outputstatement Og senere mulighed for at benytte bit-testing f.eks where _type_ = 1001 b; (9) 27
Tip #3, binære værdier på _type_ 0000 = grandtotal 0001 = pr. kundetype 0010 = pr. grossist 0011 = grossist og kundetype 0100 = pr. salgskontor 0101 = salgskontor og kundetype 0110 = salgskontor og grossist 0111 = salgskontor, grossist og kundetype 1000 = pr. postnr 1001 = postnr og kundetype 1010 = postnr og grossist 1011 = postnr, grossist og kundetype 1100 = postnr og salgskontor 1101 = postnr, salgskontor og kundetype 1110 = postnr, salgskontor og grossist 1111 = alle kombinationer 28
Tip #3 Dan flere output dataset i en PROC MEANS data testtyp9; set tip3; where _type_=9; run; * eller ; data testtyp9a; set tip3; if _type_='1001'b; /* bemærk at where ikke kan benyttes med BIT expression */ run; 29
Tip #3 Dan flere output dataset i en PROC MEANS Eller direkte i PROC MEANS Proc Means data=sugdk.kundedata2 noprint missing; class postnr salgskontor grossist kundetype; var antal pris_ialt; output out=tip3a sum=; output out=tip3b(where=(_type_ = 9)) sum=; run; Her bliver der dannet flere output dataset Kan dette løses med Proc SQL? 30
Tip #3 Dan flere output dataset i en PROC MEANS I version 8 er der kommer en ny option CHARTYPE. Her bliver den numeriske værdi at _type_ ændret til karakterkolonne med binære værdier (0 eller 1) 31
Tip #3 Dan flere output dataset i en PROC MEANS Proc Means data=sugdk.kundedata2 noprint chartype missing; class postnr salgskontor grossist kundetype; var antal pris_ialt; output out=tip3c sum=; output out=tip3d (where=(_type_ = '1001')) sum=; run; 32
Tip #3 Dan flere output dataset i en PROC MEANS Proc Means data=sugdk.kundedata2 noprint chartype missing; class postnr salgskontor grossist kundetype; var antal pris_ialt; output out=tip3e sum=; output out=tip3f(where=(_type_ in('0000','1001'))) sum=; run; 33
Tip #4 Brug DESCENDTYPES Proc Means sorterer efter _type_ i stigende orden Med options DESCENDTYPES kommer outputtet i faldende orden efter _type_, dvs, grandtotal kommer til sidst. 34
Tip #4 Brug DESCENDTYPES title1 "Tip 4, Brug descendingtypes"; Proc Means data=sugdk.kundedata2 noprint descendtypes missing; class grossist kundetype; var antal pris_ialt; output out=tip4 sum=; run; proc print data=tip4; run; 35
Tip #4 Brug DESCENDTYPES 84 62 10 2265 2.468.200 181.810.312,81 85 67 10 2263 3.571.814 366.372.484,32 86 72 10 2737 3.730.721 308.677.783,37 87 73 10 14123 16.720.898 1.335.244.601,97 88 76 10 496 542.618 23.716.175,04 89 77 10 159 235.817 21.043.513,15 90 81 10 3294 3.364.326 206.759.553,54 91 82 10 1261 1.642.204 141.717.459,57 92 83 10 2004 2.985.943 285.086.627,14 93 86 10 1735 2.320.620 189.384.940,00 94 88 10 1375 1.875.553 173.310.194,31 95 90 10 234 228.115 13.396.213,86 96 91 10 2012 2.806.402 244.162.387,64 97 92 10 7902 10.053.114 862.025.962,58 98 93 10 372 387.480 19.771.046,25 99 94 10 4545 6.518.325 610.846.775,40 100 95 10 1829 2.717.730 265.600.349,81 101 96 10 912 1.113.660 90.060.062,61 102 98 10 835 1.023.052 84.733.144,29 103 D 01 4240 7.683.521 819.938.404,89 104 H 01 181652 199.829.615 14.707.827.184,16 105 I 01 41470 36.677.704 2.047.815.352,91 106 00 227362 244.190.840 17.575.580.941,96 36
Tip #5 Brug TYPES statement til at begrænse kombination af CLASS TYPES Statement er nyt, må ikke forveksles med _type_. TYPES bruges til angivelse af kombinationer af CLASS variable Bruges især når der er mange CLASS variable 37
Tip #5 Brug TYPES statement til at begrænse kombination af CLASS Eksempel: class postnr salgskontor grossist kundetype; Følgende kombinationer ønskes: Grandtotal (_type_ = 0) Grossist * kundetype (_type_ = 3) postnr * salgskontor (_type_ = 12) postnr * salgskontor * grossist (_type_ = 14) Dette kan løses på følgende måde 38
Tip #5 Brug TYPES statement til at begrænse kombination af CLASS title1 "Tip 5, Brug TYPES Statement til at begrænse class-kombination"; Proc Means data=sugdk.kundedata2 noprint missing; class postnr salgskontor grossist kundetype; types () /* giver grandtotal */ grossist * kundetype postnr * salgskontor postnr * salgskontor * grossist; var antal pris_ialt; output out=tip5 sum=; run; 39
Tip #5 Brug TYPES statement til at begrænse kombination af CLASS Tip 5, Brug TYPES Statement til at begrænse class-kombination The FREQ Procedure Cumulative Cumulative _TYPE_ Frequency Percent Frequency Percent ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ 0 1 0.02 1 0.02 3 64 1.40 65 1.43 12 831 18.24 896 19.67 14 3660 80.33 4556 100.00 40
Tip #6 Brug DESCENDING og CLASS DESCENDING sorterer i faldende orden på _type_ Class variablerne indenfor hver _type_ kommer i stigende orden 41
Tip #6 Brug DESCENDING og CLASS options nocenter nodate; title1 "Tip 6, Brug DESCENDING og CLASS"; Proc Means data=sugdk.kundedata2 noprint descending missing; class postnr salgskontor grossist kundetype; types () grossist * kundetype postnr * salgskontor postnr * salgskontor * grossist; var antal pris_ialt; output out=tip6 sum=; run; 42
Tip #6 Brug DESCENDING og CLASS Tip 6, Brug DESCENDING og CLASS The FREQ Procedure Cumulative Cumulative _TYPE_ Frequency Percent Frequency Percent ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ 0 1 0.02 1 0.02 3 64 1.40 65 1.43 12 831 18.24 896 19.67 14 3660 80.33 4556 100.00 43
Tip #7 Brug IDGROUP til at danne rækker med Extreme værdier fra input datasettet Ny option til OUTPUT statementet Kombinerer ID og IDMIN options i PROC MEANS statement og MAXID/MINID options i OUTPUT statement. OUT [n] options controllerer antal extremer der ønskes pr. række 44
Tip #7 Brug IDGROUP til at danne rækker med Extreme værdier fra input datasettet Opgave: Lav analyse i faldende orden på salgskontor og Stigende orden på kundetype Beregn mean og sum Find de 2 største og 2 mindste værdier af antal Output til SAS-tabel 45
Tip #7 Brug IDGROUP til at danne rækker med Extreme værdier fra input datasettet options nocenter nodate; title1 "Tip 7, Brug IDGROUP til at danne rækker med"; title2 "Extreme værdier fra input datasettet"; Proc Means data=sugdk.kundedata2 noprint missing; class salgskontor/descending; class kundetype; var startdato; output out=tip7 idgroup (max(startdato) out[2] (startdato)= maxstdato) idgroup (min(startdato) out[2] (startdato)= minstdato) sum= mean= /autoname; run; 46
Tip #7 Brug IDGROUP til at danne rækker med Extreme værdier fra input datasettet Tip 7, Brug IDGROUP til at danne rækker med Extreme værdier fra input datasettet S S t t a s m m m m a r a a a i i r t l k x x n n t d g u s s s s d a s n t t t t a t k d d d d d t o o e T F a a a a o _ n t Y R t t t t _ M O t y P E o o o o S e b o p E Q u a s r e 1 2 1 2 m n 1 0 227362 2009-03-27 2009-03-27 1995-07-25 1995-07-27 ********** 2004-05-25 2 D 1 4240 2009-03-27 2009-03-27 1996-01-30 1996-01-30 ********** 2005-01-06 3 H 1 181652 2009-03-27 2009-03-27 1995-07-25 1995-07-27 ********** 2004-06-15 4 I 1 41470 2009-03-27 2009-03-27 1995-08-17 1995-08-29 ********** 2004-02-03 5 02002 2 97379 2009-03-27 2009-03-27 1995-07-25 1995-07-27 ********** 2004-03-22 6 02001 2 24906 2009-03-27 2009-03-27 1995-08-17 1995-09-19 ********** 2004-09-09 7 02000 2 105077 2009-03-27 2009-03-27 1996-01-30 1996-01-30 ********** 2004-06-28 8 02002 D 3 1671 2009-03-27 2009-03-27 1996-01-30 1996-01-30 ********** 2004-11-22 9 02002 H 3 78677 2009-03-27 2009-03-27 1995-07-25 1995-07-27 ********** 2004-03-29 10 02002 I 3 17031 2009-03-26 2009-03-26 1995-08-29 1995-09-08 ********** 2004-01-31 11 02001 D 3 439 2009-03-27 2009-03-24 1996-02-01 1996-02-01 ********** 2005-04-01 12 02001 H 3 17932 2009-03-27 2009-03-27 1995-09-19 1996-01-30 ********** 2004-10-17 13 02001 I 3 6535 2009-03-26 2009-03-26 1995-08-17 1996-01-30 ********** 2004-05-13 14 02000 D 3 2130 2009-03-27 2009-03-26 1996-01-30 1996-02-21 ********** 2005-01-23 15 02000 H 3 85043 2009-03-27 2009-03-27 1996-01-30 1996-01-30 ********** 2004-07-30 47 16 02000 I 3 17904 2009-03-27 2009-03-27 1996-01-30 1996-01-30 ********** 2004-01-01
Tip #7 Brug IDGROUP til at danne rækker med Extreme værdier fra input datasettet Som I kan se i outputtet Er der 2 værdier på max/min pr. række 48
Tip #8 Brug PRELOADFMT og COMPLETETYPES Formater bliver knyttet til Class-variable efter Proc Means har beregnet analysen. Hvis der ingen værdier er til et formatværdi, bliver der ikke dannet en række 49
Tip #8 Brug PRELOADFMT og COMPLETETYPES PRELOADFMT options placeres på CLASS statementet, og fortæller PROC MEANS at formatet skal i memory før analysen. COMPLETETYPES i PROC MEANS statement, sørger for at alle værdier i formatet vises, selv om der ikke data til rækken. 50
Tip #8 Brug PRELOADFMT og COMPLETETYPES title1 "Tip 8, Preloadfmt og Completetypes"; proc format; value $salgskontor '02000' = '02000 Roskilde' '02001' = '02001 Greve' '02002' = '02002 Køge' '02003' = '02003 Solrød' '02004' = '02004 Havdrup' ; 51
Tip #8 Brug PRELOADFMT og COMPLETETYPES Proc Means data=sugdk.kundedata2 noprint missing; class salgskontor/preloadfmt; var antal ; format salgskontor $salgskontor.; output out=tip8 sum= mean= /autoname; run; proc print data=tip8; run; 52
Tip #8 Brug PRELOADFMT og COMPLETETYPES Tip 8, Preloadfmt og Completetypes Obs salgskontor _TYPE FREQ_ antal_sum antal_mean 1 0 227362 244.190.840 1.074 2 02000 Roskilde 1 105077 114.964.367 1.094 3 02001 Greve 1 24906 25.278.340 1.015 4 02002 Køge 1 97379 103.948.133 1.067 53
Tip #8 Brug PRELOADFMT og COMPLETETYPES Der var 5 værdier i formatet, men der bliver kun vist de 3 værdier der var data til. PROC MEANS sorterer de viste rækker efter format-værdierne. Brug PRELOADFMT og COMPLETETYPES til at vise alle værdier, vi kan også ændre præsentationsrækkefølgen ved at bruge ORDER= options. 54
Tip #8 Brug PRELOADFMT og COMPLETETYPES title1 "Tip 8, Preloadfmt og Completetypes"; proc format; value $salgskontora '02000' = 'Roskilde' '02001' = 'Greve' '02002' = 'Køge' '02003' = 'Solrød' '02004' = 'Havdrup' ; 55
Tip #8 Brug PRELOADFMT og COMPLETETYPES Proc Means data=sugdk.kundedata2 noprint completetypes missing; class salgskontor/preloadfmt order=freq; var antal ; format salgskontor $salgskontora.; output out=tip8a sum= mean= /autoname; run; proc print data=tip8a; run; 56
Tip #8 Brug PRELOADFMT og COMPLETETYPES Tip 8, Preloadfmt og Completetypes Obs salgskontor _TYPE FREQ_ antal_sum antal_mean 1 0 227362 244.190.840 1.074 2 Roskilde 1 105077 114.964.367 1.094 3 Køge 1 97379 103.948.133 1.067 4 Greve 1 24906 25.278.340 1.015 5 Solrød 1 0.. 6 Havdrup 1 0.. 57
Tip #9 Brug Ways statement Ways statement kan give dig Besparelse i kodetid Besparelse i processor tid Forskellige kombinationsmuligheder på CLASS-variable Ways 3 giver alle 3-way kombinationer Ways 2 giver alle 2-way kombinationer Ways 2 3 giver alle 2- og 3-ways kombinationer Ways 1 giver alle 1-way kombinationer 58
Tip #9 Brug Ways statement options nocenter nodate; title1 "Tip 9, Brug WAYS"; Proc Means data=sugdk.kundedata2 noprint missing; class postnr salgskontor grossist kundetype; ways 3; var antal pris_ialt; output out=tip9 sum=; run; proc freq data=tip9; tables _type_; run; 59
Tip #9 Brug Ways statement Tip 9, Brug WAYS The FREQ Procedure Cumulative Cumulative _TYPE_ Frequency Percent Frequency Percent ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ 7 177 2.23 177 2.23 11 2887 36.45 3064 38.69 13 1196 15.10 4260 53.79 14 3660 46.21 7920 100.00 60
Tip #10 Brug Multilabel format Multilabel Format Ny feature i Proc Format Overlab på formater Kan bruges i Means/Summary/Tabulate/Report procedurerne MLF option i CLASS statement skal benyttes 61
Tip #10 Brug Multilabel format options nocenter nodate; title "Tip #10 Multilabel format"; proc format; value $postnra (multilabel) 0001-4999 = 'København/Sjælland' 5000-5999 = 'Fyn' 6000-9999 = 'Jylland' ; value $postnrb (multilabel) 0001-4999 = 'København/Sjælland' 5000-5999 = 'Fyn' 6000-9999 = 'Jylland' 3700-3799 = 'Bornholm'; run; 62
Tip #10 Brug Multilabel format proc means data=sugdk.kundedata2 noprint completetypes nway missing; class postnr/preloadfmt MLF order=formatted; var antal; output out=tip10 sum=; format postnr $postnra.; run; proc print data=tip10; run; 63
Tip #10 Brug Multilabel format Tip #10 Multilabel format Obs Postnr _TYPE FREQ_ antal 1 Fyn 1 230 222.117 2 Jylland 1 2237 1.805.372 3 København/Sjælland 1 224895 242.163.351 64
Tip #10 Brug Multilabel format proc means data=sugdk.kundedata2 noprint completetypes nway; class postnr/preloadfmt MLF order=formatted; var antal; output out=tip10b sum=; format postnr $postnrb.; run; proc print data=tip10b; run; 65
Tip #10 Brug Multilabel format Tip #10 Multilabel format Obs Postnr _TYPE FREQ_ antal 1 Bornholm 1 62 55.280 2 Fyn 1 230 222.117 3 Jylland 1 2237 1.805.372 4 København/Sjælland 1 224895 242.163.351 66
Tip #11 Brug Class Dataset Næsten sidste eksempel og ny facilitet CLASSDATA dataset I et CLASSDATA dataset er der mulighed for at have alle sine analyseværdier, disse værdier vil så komme med i output, selv om der ingen rækker er i analysedatasettet 67
Tip #11 Brug Class Dataset data salgskontor; length salgskontor $5; input salgskontor; cards; 02000 02001 02002 02003 02004 ; run; 68
Tip #11 Brug Class Dataset options nocenter nodate; title1 "Tip 11, Brug CLASSDATA dataset"; proc means data=sugdk.kundedata2 classdata=salgskontor noprint missing; class salgskontor; var antal; output out=tip11 sum=; run; proc print data=tip11; run; 69
Tip #11 Brug Class Dataset Tip 11, Brug CLASSDATA dataset Obs salgskontor _TYPE FREQ_ antal 1 0 227362 244.190.840 2 02000 1 105077 114.964.367 3 02001 1 24906 25.278.340 4 02002 1 97379 103.948.133 5 02003 1 0. 6 02004 1 0. 70
Tip #12 Brug Formater til summering Proc Means (Summary og Tabulate) fungerer rigtig godt sammen med formater. Lav en summation på kundetype og startdato Hvor startdato er på formatet yyq6. Benyt pris_alt som beregningsvariabel 71
Tip #12 Brug Formater til summering title1 "Eksempel 12, brug formater til summering"; proc means data=sugdk.kundedata2 noprint; class kundetype startdato; var pris_ialt; format startdato yyq6.; output out=eks12 sum=/autolabel autoname; run; 72
Tip #12 Brug Formater til summering Eksempel 12, brug formater til summering The FREQ Procedure Cumulative Cumulative _TYPE_ Frequency Percent Frequency Percent ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ 0 1 0.46 1 0.46 1 54 24.66 55 25.11 2 3 1.37 58 26.48 3 161 73.52 219 100.00 73
Tip #12 Brug Formater til summering I output datasettet har _type_ 4 forskellige værdier. 0 = grandtotal 1 = total pr. kvartal 2 = total pr. kundetype 3 = total pr. kundetype kvartal Kan SQL generere 1 dataset med disse summeringer? 74
Tip #13 Brug NWAY option Når der summeres på forskellige variabler er det sjældent at alle summeringsniveauer skal med i output. Det kan løses på flere forskellige måder: Types statement Flere output statement (med where) Hvis det er totaler på højeste _type_ niveau der ønskes, kan NWAY option benyttes. 75
Tip #13 Brug NWAY option title1 "Eksempel 13, NWAY option"; proc means data=sugdk.kundedata2 noprint nway; class kundetype startdato; var pris_ialt; format startdato yyq6.; output out=eks13 sum=/autolabel autoname; run; 76
Tip #13 Brug NWAY option Eksempel 13, NWAY option The FREQ Procedure Cumulative Cumulative _TYPE_ Frequency Percent Frequency Percent ƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒƒ 3 161 100.00 161 100.00 77
Tip #13 Brug NWAY option I output datasettet har _type_ en værdi. 3 = total pr. kundetype kvartal 78
Andre muligheder med Proc Means Where statement kan benyttes Dataset options kan benyttes på input og output Formater kan benyttes, især effektiv på Class-variable Flere output dataset Output bliver sorteret efter class-variablerne, mulighed for at ændre dette Mange statistiske muligheder (31) 79
Lidt om performance Hvis du kan benytte TYPES statement for du den bedste performance Hvis du bruger where _type_ = på output, skal SAS kalkulere alt = dårlig performance 80
Tips og tricks til Proc Means Lær mere: SAS online-doc SAS-kurser Prøv jer frem (hvis I har tid)!! 81
Tips og tricks til Proc Means? 82
Kontakt oplysninger Per Andersen Senior IM Consultant DONG Energy Oil & Gas A/S, Group IT/Trading IT/CMBI&DA Nesa alle 1 2820 Gentofte tlf: +45 99 55 25 90 peand@dongenergy.dk 83