hochrechnung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
jo_hb
User
Beiträge: 72
Registriert: Donnerstag 26. April 2007, 09:21

Donnerstag 10. Juli 2008, 18:24

Hallo Leute,

Ich habe diesmal eine inhaltliche Frage - wie würdet ihr an dieses Problem rangehen?

Es geht um folgendes: Ich muss Einsätze von Mitarbeitern planen anhand von Einsatzplänen aus der Vergangenheit - Die Einsätze finden mehr oder weniger regelmässig statt. Ich habe nun eine Liste aus Listen, etwa wie folgt:

Code: Alles auswählen

Termine = [[730934, 8],
        [731263,10],
        [731501, 8],
        [731664, 6],
        [731824, 4],
        [732061, 10],
        [732124, 10],
        [732131, 6],
        [732313, 5],
        [732544, 10],
        [732593, 10],
        [732678, 27],
        [732859, 21],
        [733048, 15],
        [733055, 10],
        [733149, 1],
        [733216, 15]]
Die erste Zahl stellt jeweils ein Datum in der ordinalen Form dar, also hier Daten zwischen dem 25.3.2002 und dem 23.6.2008. Die zweite Zahl gibt die Dauer des Einsatzes an, der zu dem jeweiligen Datum stattgefunden hat, und zwar in 'mandays'.

Ich überlege jetzt wie ich daraus am geschicktesten errechne, wann der nächste Einsatz stattfinden müsste. Wäre super wenn jemand dazu eine Idee / einen Ansatz wüsste...

Danke schonmal, und Gruss,
Joerg

PS achja, ich denke ich müsste in einem ersten Schritt die Einsätze, die sehr nah beieinander stattgefunden haben, jeweils zu einem zusammenfassen - das kommt nämlich eigentlich nur vor wenn ein Einsatz nicht wie geplant fertig geworden ist und verlängert werden musste...

Absolut super wäre übrigens wenn ich mehrere Varianten errechnen könnte, zB einweder Einsatz an Tag 733412 mit 10 mandays ODER Einsatz an Tag 733452 mit 14 mandays... so in etwa...

Hoffe es ist klar geworden worum's geht, erkläre das sonst gern noch näher.
DasIch
User
Beiträge: 2450
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Donnerstag 10. Juli 2008, 18:29

Schau dir mal das Datetime Modul in der Doku an. Damit kann man mit Zeiten rechnen.
jo_hb
User
Beiträge: 72
Registriert: Donnerstag 26. April 2007, 09:21

Donnerstag 10. Juli 2008, 18:32

Jau, hab ich schon gemacht, daher komme ich ja auf die ordinalen datumsangaben... Was mir fehlt ist eine zündende Idee für einen Algorithmus. Was ich bisher hier so mache scheint mir irgendwie alles umständlich...
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Donnerstag 10. Juli 2008, 18:37

jo_hb hat geschrieben: ich müsste in einem ersten Schritt die Einsätze, die sehr nah beieinander stattgefunden haben, jeweils zu einem zusammenfassen
Dann müsstest du mal präzisieren, was "sehr nah" bedeutet. :wink:
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Donnerstag 10. Juli 2008, 18:38

jo_hb hat geschrieben:Jau, hab ich schon gemacht, daher komme ich ja auf die ordinalen datumsangaben... Was mir fehlt ist eine zündende Idee für einen Algorithmus. Was ich bisher hier so mache scheint mir irgendwie alles umständlich...
Wo kommen denn deine Originaldaten her? Welches Format haben die ursprünglich?
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Donnerstag 10. Juli 2008, 19:14

Eine interessante Fragestellung. Was ich noch nicht verstehe: Musst Du nur die Zeitpunkte extrapolieren oder auch die Einsatzdauer? Wenn man auch die Einsatzdauer vorhersagen soll: Wie sind die beiden korreliert?

Und außerdem: Sind das alle Daten oder nur ein Auszug?
jo_hb
User
Beiträge: 72
Registriert: Donnerstag 26. April 2007, 09:21

Donnerstag 10. Juli 2008, 23:41

Erstmal allgemein: Wir haben ne ganze Menge Kunden, das Beispiel beinhaltet alle Einsätze, die wir bei _einem_ dieser Kunden hatten.

@numerix: Im Normalfall finden die Einsätze alle 3, 6 oder 12 Monate statt, der 'Rythmus' ist von Kunde zu Kunde anders, bei jedem Kunden jedoch mehr oder weniger fix. 'Sehr nah' bedeutet also würde ich sagen unter acht Wochen auseinander.
Die Daten kommen aus einer access-datenbank -> export nach excel, dort überflüssige spalten gelöscht -> CSV-textfile. Ursprünglich wollte ich diese Vorhersage mal direkt in die DB einbauen, aber dafür kenne ich mich mit access nicht gut genug aus, dann lieber ein bisschen workaround und das ganze mit Python. :)

@CM: Ich müsste beides extrapolieren. Die Korrelation ist bei jedem Kunden verschieden und steckt ja in dem bisherigen Verlauf - man kann sagen dass quasi bei jedem Kunden pro Tag, der zwischen den Einsätzen vergeht, die Arbeit um eine feste Menge x mehr wird. Diese Menge x allerdings kann sich über die Zeit (= über die Jahre) langsam ändern.

Ich hab mir jetzt das Beispiel nicht ganz exakt angeguckt, es kann schon sein dass es dabei nicht so genau hinkommt mit der 'festen Menge pro Tag', das liegt dann daran dass die Leute, die wir jeweils einsetzen unterschiedlich schnell arbeiten... Achja, und es kann auch daran liegen dass die Daten in der Datenbank einfach ein Start- und ein Enddatum sowie die Anzahl der eingesetzten Leute angeben - daraus mache ich dann mandays, wobei ich Wochenenden rausschmeisse, Feiertage jedoch nicht, also könnten die Feiertage das ganze ein bisschen verfälschen (was aber nicht soo dramatisch wäre, so viele Feiertage gibts ja dann auch wieder nicht...)

Und was ich also am Ende brauche ist eine Aussage darüber wann der einzelne Kunde wieder 'dran' wäre und mit wievielen Tagen arbeit man ca. rechnen müsste.
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Freitag 11. Juli 2008, 08:03

Wenn die Ereignisse relativ regelmäßig sind, dann könntest du es mit einer linearen Regression versuchen. Vielleicht bietet es sich an, nur die letzten k Einsätze zu verwenden um spätere Verschiebungen auszugleichen, da müsstest du ein wenig experimentieren. Testdaten scheinst du ja genug zu haben.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Freitag 11. Juli 2008, 08:18

Für mich passt das Datenbeispiel oben nicht mit deinen sonstigen Angaben zur Eigenschaft der Daten zusammen. Für obiges Beispiel ergibt sich mittels

Code: Alles auswählen

for n in range(len(termine)-1):
    print "Nach %3i Tagen: %2i mandays" %(termine[n+1][0]-termine[n][0],termine[n+1][1])

Code: Alles auswählen

Nach 329 Tagen: 10 mandays
Nach 238 Tagen:  8 mandays
Nach 163 Tagen:  6 mandays
Nach 160 Tagen:  4 mandays
Nach 237 Tagen: 10 mandays
Nach  63 Tagen: 10 mandays
Nach   7 Tagen:  6 mandays
Nach 182 Tagen:  5 mandays
Nach 231 Tagen: 10 mandays
Nach  49 Tagen: 10 mandays
Nach  85 Tagen: 27 mandays
Nach 181 Tagen: 21 mandays
Nach 189 Tagen: 15 mandays
Nach   7 Tagen: 10 mandays
Nach  94 Tagen:  1 mandays
Nach  67 Tagen: 15 mandays
Wenn ich dich richtig verstanden habe, dann müsste ein längerer Zeitraum zwischen zwei Einsätzen auch mehr mandays zur Folge haben, weil die zu erledigende Arbeit in der Zwischenzeit gewachsen ist. Das lässt sich so aber anhand der Daten nicht nachvollziehen.

Und: Wenn zwei (oder mehr) Einsätze "relativ dicht" beieinander liegen, dann sind sie nach deiner Aussage als ein Einsatz anzusehen. Die von dir genannte 8 Wochen Frist erscheint mir da ebenfalls problematisch: Bei 7 Tagen ist es klar, aber was ist mit 49 Tagen (< 8 Wochen) oder 63 Tagen (> 8 Wochen)?

M.E. müsste das zunächst geklärt werden, dann müsste man einen Algorithmus zur "Datenglättung" entwerfen (zusammenlegen von Einsätzen die als ein einzelner Einsatz gelten sollen) und erst danach kann man sich an das extrapolieren machen, sofern das bei der Datenlage überhaupt sinnvoll ist.
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Freitag 11. Juli 2008, 09:00

Code: Alles auswählen

for a, b in zip(termine, termine[1:]):
	print "Nach %3i Tagen: %2i mandays" % (b[0]-a[0],b[1])
;-)
jo_hb
User
Beiträge: 72
Registriert: Donnerstag 26. April 2007, 09:21

Freitag 11. Juli 2008, 09:04

Hm, da hast Du Recht, das sieht ein bisschen seltsam aus in dem Beispiel... Also eigentlich hätte es so sein sollen, wie ich beschrieben habe. Wundert mich jetzt auch, wie das hier aussieht, da muss ich wohl nochmal drübergucken...

Achso, was neben Feiertagen und unterschiedlichen Arbeitsgeschwindigkeiten auch ein Problem sein könnte ist dass ich leider nur die Daten habe, für wann die Einsätze geplant waren - nicht aber die Daten, wielange die Einsätze dann _tatsächlich_ gedauert haben... Stimmt schon, Datenlage ist irgendwie mangelhaft... :)

Naja, jedenfalls schonmal Danke, ich meld mich dann wieder wenn ich das irgendwie konkreter zusammenbekommen habe.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Freitag 11. Juli 2008, 09:14

EyDu hat geschrieben:

Code: Alles auswählen

for a, b in zip(termine, termine[1:]):
	print "Nach %3i Tagen: %2i mandays" % (b[0]-a[0],b[1])
;-)
Angeber ... :)
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Freitag 11. Juli 2008, 09:32

EyDu hat geschrieben:Wenn die Ereignisse relativ regelmäßig sind, dann könntest du es mit einer linearen Regression versuchen.
Nicht zwingend, wie numerix in dem darauffolgenden Post zeigte. Ich dachte erst an Verfahren der multivariaten Statistik, denke jetzt aber viel profaner:

Für mich sieht es so aus, als seien die beiden Daten lose negativ miteinander korreliert. Ich spekuliere mal: Ein Gerät / Maschine wird installiert und läuft erst einmal reibungslos. Nach einem knappen Jahr wird der erste Einsatz fällig. Das Gerät altert weiter und in immer kürzeren Abständen werden Einsätze fällig, die immer länger dauern. Um eine gute Datenbasis zu erhalten, könnten Daten zu einem Gerät von versch. Kunden zusammengefasst werden - unter der Annahme, dass alle Geräte einer Serie ähnlich altern. Welche Funktion dann zu fitten ist, können wir hier gar nicht sagen: Die Daten des Beispiels streuen zu sehr. Wenn Du Glück hast, jo_hb, reicht ein einfaches, immer noch interpretierbares Polynom ;-). (Es kann helfen Daten zusammenzufassen: Kurz aufeinanderfolgende Einsätze können ja auch auf Unterbrechungen durch Feiertage (hatten wir schon) oder sonstigem organisatorischen Unbill beruhen.)

Zu den Einsatzlängen: Man sollte erst einmal den ersten Teil der Analyse machen. Aber es sieht auf den ersten Blick so aus das es zwar eine schwache Korrelation gibt, aber Schätzwerte werden mit einem großen Fehler behaftet sein.

Mein Tipp: Tee brauen, Statistikbuch lesen, brüten - dann erst programmieren. (Durchaus ernst gemeint, ich jedenfalls verfahre ähnlich ;-) .)

Gruß,
Christian
BlackJack

Freitag 11. Juli 2008, 09:55

@CM: Ich "hijack"e hier mal. Tee kann ich mir selber aussuchen, aber welches Statistikbuch oder -Bücher würdest Du dem interessierten Laien empfehlen?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Freitag 11. Juli 2008, 11:03

BlackJack hat geschrieben:@CM: Ich "hijack"e hier mal. Tee kann ich mir selber aussuchen, aber welches Statistikbuch oder -Bücher würdest Du dem interessierten Laien empfehlen?
Auch wenn ich nicht direkt angesprochen war:
Ich empfehle Walter Krämer: Statistik verstehen

Wer dann Lust auf mehr (Mathematik) hat, könnte zu
Karl Bosch: Elementare Einführung in die angewandte Statistik
greifen.
Antworten