PCTN und Proc Tabulate
Verfasst von Tobander am 27 November, 2009 - 11:08
Hallo zusammen,
ich habe ein Problem mit der Prozenterechnung in PROC TABULATE:
Basis ist eine Tabelle, die folgendermaßen aussieht:
Produkt|Verkauf
LCD-TV_|1
LCD-TV_|1
LCD-TV_|0
Plasma_|1
Der Code für PROC TABULATE ist:
proc tabulate data=PRODUKT;
class produkt;
var verkauf;
table
Produkt,
N verkauf;
run;
class produkt;
var verkauf;
table
Produkt,
N verkauf;
run;
Das Ergebnis sieht so aus:
______|N_|Verkauf
LCD-TV | 3 | 2
Plasma | 1 | 1
Ist es möglich prozentual Verkauf:N anzuzeigen?
______|N_|Verkauf|%
LCD-TV | 3 | 2____|67
Plasma | 1 | 1____|100
Bisher schaffe ich es nur prozentual Verkauf:Verkauf oder Verkauf:Sum(N) anzuzeigen.
»
- Anmelden oder Registrieren um Kommentare zu schreiben

Verkauf als Class Variable definieren
Hallo,
statt Verkauf als Analysevariable zu definieren, muss man Verkauf als Klassenvariable definieren. Dann kann man die prozentualen Anteile von Verkauft und Nicht verkauft berechnen.
class produkt verkauf;
table
Produkt ,
verkauf * pctn
;
run;
Schöne Grüße
Jan
Prozent für nur eine Ausprägung der Variablen
Hallo Jan,
vielen Dank für deine schnelle Antwort.
Das Problem bei der Definition von "verkauf" als CLASS Variable ist,
dass nun die Prozentualen-Anteile für beide Ausprägungen von "verkauf" angezeigt werden:
_______________|1__0__|
______|N_|Verkauf|__%__|
LCD-TV | 3 | 2____|67_|33|
Plasma | 1 | 1____|100|0_|
Es gibt zwar eine Möglichkeit, wie in dem Beitrag von Monamia beschrieben, eine Spalte auszublenden, dies verhindert jedoch dann,
dass ich am Ende eine korrekte Summenzeile anzeige. (die Prozentwerte werden einfach addiert, anstelle Verkauf/N zu berechnen)
Hallo, um eine korrekte
Hallo,
um eine korrekte Summenzeile zu bekommen, muss die Summe bereits im ersten Tabulate-Statement berechnet werden. In diesem Beispiel ist die Struktur so einfach, dass man die Aufgabe besser mit Proc Sql löst.
Da ich nicht weiß, ob du dich mit Sql auskennst, habe ich mal beide Möglichkeiten geschrieben.
input Produkt$ Verkauf;
cards;
LCD-TV_ 1
LCD-TV_ 1
LCD-TV_ 0
Plasma_ 1
run;
/* Erste Möglichkeit Proc tabulate */
ods _all_ close;
proc tabulate
data = Produkt
out = Produkt1 (where = (Verkauf ne 0))
;
class Produkt Verkauf ;
table
Produkt all = "Alle Produkte" ,
n Verkauf*n Verkauf * pctn
;
run;
data Produkt2;
length Produkt $20;
set Produkt1;
if missing(Verkauf) then NProdukt = N;
else NVerkauf = N;
if missing(Produkt) then Produkt = "Alle Produkte";
Proz = coalesce(Pctn_10,Pctn_00);
run;
ods html;
proc tabulate
data = Produkt2
format = 12.0
;
class Produkt /order=data;
var NProdukt NVerkauf Proz;
table
Produkt="" ,
(NProdukt="N" NVerkauf="Verkauf" Proz="%" * f=numx12.1) * max=""
/box="Produkt"
;
run;
proc delete data=Produkt1 Produkt2; run;
/* zweite Möglichkeit Proc Sql */
proc sql;
select
Produkt,
count(*) as Anz "N" format = 12.0,
sum(Verkauf=1) as Verkauf format = 12.0,
calculated Verkauf/calculated Anz *100 as Proz "%" format = numx12.1
from Produkt
group by Produkt
union all
select
"Alle Produkte",
count(*),
sum(Verkauf=1),
calculated Verkauf/calculated Anz *100
from Produkt
;
quit;
ods html close;
Beide Möglichkeiten liefern ein identisches Ergebnis, dass nur in der Formatierung voneinander abweicht.
Schöne Grüße
Jan
Vielen Dank für deine
Vielen Dank für deine Mühe,
so hatte ich mir das vorgestellt. Damit erhalte ich nun nur die gewünschten Prozentwerte.
Jetzt muss ich nur bei der Formatierung umdenken, da ich die Summenzeile ja nun nicht mehr direkt
ansprechen kann.
Ich schau mir gleich mal deine Alternative mit SQL an. Vielleicht bekomme ich es so
auch einfacher hin.
Viele Grüße
Tobias