Berechnung von Veränderungen

Fragen zu Stata Syntax und Do-Files.

Berechnung von Veränderungen

Beitragvon Minna » Sa 24. Nov 2012, 00:54

Da mir vor kurzen schonmal so super hier geholfen wurde, hoffe ich, dass ihr mir auch diesmal helfen könnt. Ich habe die relevanten Variablen als Beispielsatz in den Anhang gepackt.

Mein Problem ist folgendes: Ich möchte zwei neue Variable erzeugen, die mir 1) die prozentuelle Veränderung und 2) die absolute Veränderung der Variable "preis" angeben.
Systematisch von oben beginnend aber mit einer Besonderheit, dass die Berechnung jeweils für für jedes "Produkt" und jeden "Benutzer" neu beginnt.

Dazu sei erklärt, im Datensatz befindet sich eine Zeitvariable nach der die Daten sortiert sind und ich möchte mir die Preisveränderungen über den verfügbaren Zeitraum anschauen aber die Preisentwicklung macht halt nur Sinn, wenn sie sich auf das gleiche Produkt aber vor allem auf den selben Benutzer bezieht.

Ich würde mich sehr freuen, wenn mir jemand helfen könnte!

LG
Dateianhänge
Datensatz.xlsx
Grunddatensatz
(9 KiB) 277-mal heruntergeladen
Minna
 
Beiträge: 12
Registriert: Do 15. Nov 2012, 19:35
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Berechnung von Veränderungen

Beitragvon daniel » Sa 24. Nov 2012, 13:57

Du hast die Zeitvariable, von der Du sprichst nicht in Deinem Beispieldaztensatz. Warum?

Ich werde in Kürze mal ein kleines Program posten, dass die Erstellung von Beispieldatensätzen vereinfacht.

Zu Deiner Frage vorab (bevor ich genauer reinschaue)

dass die Berechnung jeweils für für jedes "Produkt" und jeden "Benutzer" neu beginnt.


wird in Stata vermutlich in etwa übersetzet als

Code: Alles auswählen
bys <produkt> <benutzer> (<jahr>) : <berechnung>
Stata is an invented word, not an acronym, and should not appear with all letters capitalized: please write “Stata”, not “STATA”.
daniel
 
Beiträge: 1060
Registriert: Sa 1. Okt 2011, 17:20
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Berechnung von Veränderungen

Beitragvon Minna » Sa 24. Nov 2012, 15:19

Hi,

ich hab die Variable deshalb nicht reingepackt weil ich "glaubte" das sie für diese Geschichte nicht wirklich eine Rolle spielt. Es sind Datumangaben vonach im Vorfeld sortiert wird. Einfach das die Preise (halt bevor sich die Veränderung angeschaut wird) chronologisch sortiert sind.

Lieben gruß Minna
Minna
 
Beiträge: 12
Registriert: Do 15. Nov 2012, 19:35
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Berechnung von Veränderungen

Beitragvon daniel » Sa 24. Nov 2012, 15:49

Da die Lösung des Problems vermutlich über eine (neue) Sortierung (, die die im Vorfeld sortierte Ordnug ändert) erreicht wird, ist es wichtig, dass alle Variabeln, die mit der Sortierung zu tun haben, im Beispieldatensatz auftauchen.

Zur Erstellung eines Beispieldatensatzes aus Stata vgl.
add-ons-und-ado-files-f20/beispieldatensatze-erzeugen-t232.html
Stata is an invented word, not an acronym, and should not appear with all letters capitalized: please write “Stata”, not “STATA”.
daniel
 
Beiträge: 1060
Registriert: Sa 1. Okt 2011, 17:20
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Berechnung von Veränderungen

Beitragvon Minna » Sa 24. Nov 2012, 18:23

Ok... ich versuchs mal :)

Code: Alles auswählen
inp str9 produkt byte benutzer int preis str9 zeit
"Produkt_A"   1 1499 "April"
"Produkt_A"   1 1499 "April"
"Produkt_A"   1 1600 "Mai"
"Produkt_A"   2 1600 "Juni"
"Produkt_A"   2 1350 "Juli"
"Produkt_A"   3 1350 "August"
"Produkt_B"   4 1499 "April"
"Produkt_B"   5 1550 "Juni"
"Produkt_C"   5 1499 "September"
"Produkt_D"   6 1400 "Oktober"
end
Minna
 
Beiträge: 12
Registriert: Do 15. Nov 2012, 19:35
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Berechnung von Veränderungen

Beitragvon daniel » Sa 24. Nov 2012, 19:22

Guter Anfang.

Die zweite Beobachtung ist identisch mit der ersten Beobachtung. Kommt das tatsächlich vor? Worauf soll sich in diesem Fall die Differenz des Preises beziehen?

Kannst Du die Zeit als tasächliche Zeit angeben? String Variablen werden nach Anfangsbuchstabe sortiert, sodass "April" vor "Januar" stehen würde. Ist das alles im selben Jahr, oder ist/kann "April" in Beobachtung 1 ein anderer "April" als in Beobachung 7 [sein]?

Die Zeit ist vermutlich eine der wichtigsten Variablen bei diesem Problem, weil Du hier vermutlich mit time series Operatoren (help time series operators) arbeiten solltest, statt mit subscripten wie _n und _N.
Stata is an invented word, not an acronym, and should not appear with all letters capitalized: please write “Stata”, not “STATA”.
daniel
 
Beiträge: 1060
Registriert: Sa 1. Okt 2011, 17:20
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Berechnung von Veränderungen

Beitragvon Minna » Sa 24. Nov 2012, 23:33

Das mit der Zeitvariablen stammte daher, das dort Labels drüber gelegt wurden... entschuldigung. Hinterlegt sind Unix Zeiten. Sie sind im Regelfall monatlich aber zu unterschiedlichen Tagen. Da im Vorfeld einige Überarbeitungen und Berechnungen laufen, wird der Datensatz abschließend nach benutzer - produkt - zeit über einen sort-Befehl sortiert.

Code: Alles auswählen
inp str9 produkt byte benutzer int preis str9 zeit
"Produkt_A"   1 1499 1189476000
"Produkt_A"   1 1499 1190253600
"Produkt_A"   1 1600 1191204000
"Produkt_A"   2 1600 1195783200
"Produkt_A"   2 1350 1197338400
"Produkt_A"   3 1350 1197338400
"Produkt_A"   3 1499 1207792800
"Produkt_B"   1 1550 1189476000
"Produkt_B"   1 1499 1190253600
"Produkt_B"   4 1400 1210471200
"Produkt_B"   4 1400 1210471200
end


In der zweiten Zeile ist was verschoben gewesen... vom Prinzip kann es halt sein, dass ein Benutzer über einen längeren Zeitraum das gleiche Produkt verwendet - dann stimmen Produkt und Benutzer überein, nicht aber der Zeitpunkt oder aber mehrere Benutzer greifen zeitgleich auf das selbe Produkt zu... dann sind Zeit und Produkt ident und der Benutzer ist abweichend.

Interessieren würde mich dann halt die Different zwischen den Preisen (von oben beginnend). Es soll also z.B. die Variable Prozent neu erstellt werden, die mir in der ersten Beobachtung anzeigt 0 und bei der Variable Absolut auch 0 (weil sich der Preis nicht verändert hat). In der nächsten Beobachtung dann in der Variablen Prozent 6.74 und in der Variablen Absolut 101. Das so lange, bis ein neuer Händler kommt. Ist ein Produkt durch, dann fängt das gleiche wieder von neuem an.
Minna
 
Beiträge: 12
Registriert: Do 15. Nov 2012, 19:35
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Berechnung von Veränderungen

Beitragvon daniel » So 25. Nov 2012, 01:37

Ich möchte nicht unhöflich sein, aber es macht wenig Spass mit diesen Vorgaben zu arbeiten.

Statt der ersten und zweiten Beobachtung sind in diesem Beispiel nun die letzten beiden Beobachtungen exakte Duplikate. Ich habe die letze Beobachtung gelöscht, weil ich verstehe, dass es keine exakten Duplikte in allen drei Variablen <benutzer>, <produkt> und <zeit> im Datensatz gibt.

Das mit der Zeitvariablen stammte daher, das dort Labels drüber gelegt wurden...


Das scheint mir unplausibel, wel <zeit> eine string variable ist, und Stata für diese Variablen keine labels zulässt.

in der ersten Beobachtung anzeigt 0 und bei der Variable Absolut auch 0 (weil sich der Preis nicht verändert hat). In der nächsten Beobachtung dann in der Variablen Prozent 6.74 und in der Variablen Absolut 101


Verstehe ich nicht. In den ersten beiden Beobachtungen ist der Preis gleich. Wieso sollte da in <Absolut> eine 101 stehen? Die steht in der dritten Beobachtung.

Das Problem ist, dass Du nach exakten Ergebnissen fragst, aber offenbar nicht allzuviel Energie investierst, um Dein Problem exakt und ohne Flüchtigkeitsfehler zu beschreiben.

Versuche

Code: Alles auswählen
destring zeit ,replace
drop in `c(N)'
bys benutzer produkt (zeit) : g Absolut = cond((_n == 1), 0, preis - preis[_n - 1])


Wenn dieser code Deinen Wünschen entspricht, solltest Du, nach gleichem Muster, selbst in der Lage sein, die absoluten Werte in prozentuale Angaben umzurechnen.
Stata is an invented word, not an acronym, and should not appear with all letters capitalized: please write “Stata”, not “STATA”.
daniel
 
Beiträge: 1060
Registriert: Sa 1. Okt 2011, 17:20
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Berechnung von Veränderungen

Beitragvon Minna » So 25. Nov 2012, 09:45

Guten Morgen,

erstmal danke! Ich hab das jetzt mit den absoluten Werten durchlaufen lassen und das passt super!!

Bei dem Versuch die prozentuelle Veränderung berechnen zu lassen bekomme ich aber Ergebnisse raus, die ich mir nicht ganz erklären kann. Ich hab den Datensatz nun nach der zeitlichen Sortierung unter einem neuen Namen abgespeichert, so das die beiden neuen Variablen die ersten Berechnungen mit dem Datensatz wären. Ich hab aus dem Grunddatensatz nun einfach mal für das gleiche Produkt und den gleichen Benutzer einige Zeilen kopiert, da es nun wirklich nur um die Variable "preis" geht.

Code: Alles auswählen
inp str8 produkt int benutzer long zeit float preis
"2577A011"   6859   1231984800   1269.9
"2577A011"   6859   1232071200   1269.9
"2577A011"   6859   1232157600   1269.9
"2577A011"   6859   1232244000   1269.9
"2577A011"   6859   1232330400   1269.9
"2577A011"   6859   1232503200   1269.9
"2577A011"   6859   1256954400   1367.99
"2577A011"   6859   1258077600   1338.99
"2577A011"   6859   1258509600   1315
"2577A011"   6859   1258682400   1314.99
"2577A011"   6859   1259114400   1314.97
"2577A011"   6859   1259287200   1314.95
"2577A011"   6859   1259546400   1314.86
"2577A011"   6859   1259805600   1314
"2577A011"   6859   1260756000   1566.21
"2577A011"   6859   1260928800   1478.09
"2577A011"   6859   1262138400   1478.09
"2577A011"   6859   1262311200   1313.98
"2577A011"   6859   1262397600   1313.97
"2577A011"   6859   1262484000   1313.96
"2577A011"   6859   1262570400   1313.95
"2577A011"   6859   1262829600   1313.92
"2577A011"   6859   1262916000   1313.92
"2577A011"   6859   1193104800   1313.92
"2577A011"   6859   1193191200   1313.92
"2577A011"   6859   1193364000   1313.92


Genutzt hab ich dann
Code: Alles auswählen
bys benutzer produkt ( zeit ) : g Absolut_preis = cond((_n == 1), 0, preis - preis [_n - 1])
und
Code: Alles auswählen
bys benutzer produkt ( zeit ) : g Prozent_preis = cond((_n == 1), 0, (preis * 100 / preis [_n - 1]))-100


Ich versteh ja noch das ich bei der ersten Beobachtung dann -100 bei Prozent_preis angezeigt bekomme... das könnte ich noch nachträglich ändern - was ich nicht verstehe ist, dass ich bei den Beobachtungen wo sich der preis tatsächlich ändert die richtigen Ergebnisse angezeigt bekomme, aber wenn der preis gleich bleibt, dann erhalte ich mal bei Prozent_preis das richtige Ergebnis "0" und mal ein wenig sonderliche Zahlenergebnisse - so z.B. bei der 5. Beobachtung von 1.421e-14

So früh am Morgen ist es ja eigentlich nichtmehr, aber wodran liegt das :?:
Minna
 
Beiträge: 12
Registriert: Do 15. Nov 2012, 19:35
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Berechnung von Veränderungen

Beitragvon daniel » So 25. Nov 2012, 13:06

Ich versteh ja noch das ich bei der ersten Beobachtung dann -100 bei Prozent_preis angezeigt bekomme... das könnte ich noch nachträglich ändern

Ja, oder Du könntest es direkt ändern. Ersetze Deinen code mit

Code: Alles auswählen
g pct = cond((_n - 1), 0, (preis - preis[_n - 1])/preis[_n - 1] * 100)


Woher die "krummen" Ergebnisse kommen, kann ich momentan auch nicht nachvollziehen. Mag ein precision Problem sein.
Stata is an invented word, not an acronym, and should not appear with all letters capitalized: please write “Stata”, not “STATA”.
daniel
 
Beiträge: 1060
Registriert: Sa 1. Okt 2011, 17:20
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Nächste

Zurück zu Stata Syntax

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste