summaryrefslogtreecommitdiff
path: root/doc/document.asciidoc
blob: cd921f625cbfd1812970cacf6c0bd63f7c27ee82 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
Datamining-Cup 2012 - TeamFK
============================
:author: Jan Klemkow, Benjamin Franzke
:lang: de
:doctype: book
// a2x: --dblatex-opts="-P latex.encoding=utf8"
// a2x: --dblatex-opts "-P latex.output.revhistory=0"
// a2x: --dblatex-opts "-P doc.publisher.show=0"

Programme und Datenvorverarbeitung
----------------------------------
Zur Verarbeitung der Daten wurde das Programm Octave benutzt.
Dieses ist eine Open-Source alternative zu MATLab.
In dem Programm wurden die Daten in Form von Matrizen dagestellt.
Alle in diesem Projekt implementierten Verfahren werden durch das script
'run_tests.m' ausgeführt, welches ein Vergleich der jeweiligen Fehlerwerte liefert.
Das Script 'get_products.m' liest die Trainings- und Klasifikationsdatein
die von einem sed-script für die Benutzung in Octave vorbearbeitet wurden:

[source,sh]
----
#!/bin/sed -f

# Delete the header line, which is on line 1
1d
# Replace every | with a space
s/|/ /g
# Eliminate carriage return
s/\r//
----

Das Octave-Script erstellt zwei Matrizen, je eine für die Preise und Quantitäten.
Dabei hat jede Matrix 570 Spalten, jedes Produkt wird in einer eigenen Spalte gespeichert.
Die Zeilennummer ist der index für den Tag.
Damit ergibt sich eine Zeilengröße von 42 für die Quantitätsmatrix, und 56 für die Preismatrix,
da diese zusätzlich die Klassifikationsdaten enthält:

[source,octave]
----
include::../get_products.m[]
----

Die resultierenden Matrizen, die von allen implementierten Verfahren verwendet
wird, haben folgendes Schema:

.Preis-Matrix
[latexmath]
++++++++++++++++++++++++++++++++++++++++++++
\[ P = 
\begin{pmatrix}
price_{day1,product1}  & price_{day1,product2}  & \cdots & price_{day1,product570} \\
price_{day2,product1}  & price_{day2,product2}  & \cdots & price_{day2,product570} \\
\vdots                 & \vdots                 & \ddots & \vdots \\
price_{day56,product1} & price_{day56,product2} & \cdots & price_{day56,product570}
\end{pmatrix}
\]
++++++++++++++++++++++++++++++++++++++++++++

.Quantitaets-Matrix
[latexmath]
++++++++++++++++++++++++++++++++++++++++++++
\[ Q = 
\begin{pmatrix}
quant_{day1,product1}  & quant_{day1,product2}  & \cdots & quant_{day1,product570} \\
quant_{day2,product1}  & quant_{day2,product2}  & \cdots & quant_{day2,product570} \\
\vdots                 & \vdots                 & \ddots & \vdots \\
quant_{day42,product1} & quant_{day42,product2} & \cdots & quant_{day42,product570}
\end{pmatrix}
\]
++++++++++++++++++++++++++++++++++++++++++++

Vorbetrachtung der Daten
------------------------
Zu Beginn des Datamining-Cups wurden die Daten mit verschieden Diagrammen
visualisiert um erste Eindruecke und Ideen zu gewinnen.
Dabei fand ein Brainstorming statt, bei dem Folgende Ideen entstanden sind.

Zeitintervalle
~~~~~~~~~~~~~~
Dabei wurde die Summe aller Verkaeuft ueber einen Tag fuer alle 42 Tage
abgetragen.
Die sich daraus ergebene Kurve gab den inspiration fuer das Sevenday-Verfahren.
Da deutlich wurde, das der Absatz sich periodisch schwank.

Mittelwert und Lineare-Approximation
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Bei der Approximation der Quantitätskurve zu einer geraden, wird versucht einen
allgemein steigenden oder fallenden Trend eines Produktes zu erkennen.
Hierbei wird davon ausgegangen, dass sich ein Produkt über eine größeren
Zeitraum im mittelveränder.
Anders als beim Mittelwertverfahren, welches von einer immer gleichbleibenden
Grundabsatzmenge ausgeht, wird hier ein Trend mit bedacht.

Der Verlauf der Quantität über die Trainingsdaten wird linear angenähert und
für den die Vorhersage benutzt.

Das Ergebniss dieses Verfahrens lieferte für einige Produkte z. B. dem Ersten
eine etwas besseres Ergebniss als der Reine Mittelwert.
Für andere allerdings einen viel zu steilen Anstieg, der ziemlich große
Fehlerwerte verussachte.

Verfahren zur Vorhersage
------------------------

[[anchor-middle]]
Mittelwert
~~~~~~~~~~
Beim Mittelwertverfahren wird für jedes Produkte über die Trainingsmenge
der Mittelwert gebildet und für den unbekannten Zeitraum Vorhergesagt.
Dabei wurde eine Fehlerpunktzahl von 489 erreicht.

.Mitterte aller Produkte ueber zwei Wochen
image::image/mean_pred.svg[scaledwidth="75%"]

<<<
[[anchor-sevenday]]
Sevenday-Verfahren
~~~~~~~~~~~~~~~~~~
Wenn man die Summe über dem Absatz alle Produkte für alle 42 Tage in einem
Diagram abträgt, sieht man eine sehr deutliche periodische Schwankung der
Werte.

.Quantitätssumme
image::image/q_sum.svg[scaledwidth="75%"]

Diese Schwanken in einem Sieben-Tage-Rhythmus.
Unter der Anahme, das dieses Verhalten jedem oder zumindest in den meisten
Produkte zu grunde liegt, wurde das Sevenday-Verfahren entwickelt.
Der Ansazt geht davon aus, dass der Absatz im mittel über eine Woche immer
gleich ist und sich nur über Absatzstarke und -schwache Tage verteilt.

Beim Sevenday-Verfahren wird für jeden Wochentag ein Mittelwert gebildet und
Vorhergesagt.
In der Summer versucht man also über sieben Tage einen mittlere Schwingung
der Sieben-Tage-Schankung zu erzeugen und dieses dann für den unbekannten
Zeitraum vorherzusagen.

.Quantitätssumme mit Sevenday-Vorhersage
image::image/sevenday_pred.svg[scaledwidth="75%"]

In diesem Diagramm ist die mittlere kurve in den Vorhersagezeitraum abgetragen
worden.
Das Ergebniss sieht optisch gut aus, aber enttäuscht in der Fehlerzahl von 484
Punken.
Wenn für ein Produkt an einem Tage ein zu hoher Wert vorhergesagt wird und
für ein anderes Produkt ein zu niedriger im Vergleich zu den Realwerten,
dann gleichen sich die Negativen- und Positvenabstände in der Summer wieder
aus.
Daher kann das Verhalten der Siebentagesschwankung nicht alleine Auschlaggebend
für den Absatz eines Produktes sein.

[[anchor-regress]]
Lineare-Regression Preis -> Quantität
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Angenommen wurde, dass ein direkter Zusammenhang, zwischen dem Preis und der
verkauften Menge besteht.
Dazu wurde eine allgemeine Polynomapproximation n-ten Grades implementiert,
die zu einer gegeben Liste von Preisen und Quantitäten eine approximierte
Polynom-Funktion latexmath:[quantity = f(price)] n-ten Grades berechnet.
Die gegeben Preise der vorherzusagenden Quantitäten wird in die errechnete
Funktion einsetzt.
Dabei wurde der Grad des Polynoms variert; mit einem latexmath:[Polynomgrad >= 2]
konnten nur für wenige Produkte Verbesserungen erzielt werden, der globale
Fehlerwert stieg jedoch. Die Benutzung einer zusätzlichen logarithmischen
Vorverarbeitung latexmath:[quantity = f(log(price))] führte zu dem Kleinsten für
reine Regressions-Verfahren erzielten Fehlerwert.

<<<
Lineare-Regression mit Vorfilterung von Frequenzen
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Am Produkt Nr. 335 kann man examplarisch sehr gut erkennen, dass der Absatz
von den beiden Einflussgrößen Siebentage-Schwankung sowie der Preisänderung
abhängt.
Im folgenden Diagramm wird die Quantitaet vom Prodkt 335 blau, sowie der Preis
in rot abgetragen.
Die Werte des Preises sind mit 50 Multipliziert worden, um sie besser im
Quantitaetsdiagramm sichtbar zu machen.

.Product 335
image::image/prod_335.svg[scaledwidth="75%"]

Mit diesem Verfahren wird versucht beide Einflussgrößen bei der Vorhersage
zu beachten.
Die Grundidee besteht darin eine Vorverarbeitung der Testdaten vorzunehmen,
um dann ein besseres funktionales Verhältnis zwischen Preis und Quantität
errechnen zu können.

Dabei wurde zunächst eine Fourie-Analyse der Kurve der Absatzsumme aller
Produkte über die 42 Tage der Vorhersagemenge durchführt, um die Frequenzen
der Siebentagesschwankung empirisch zu bestimmen.
Es wurden jeweils einzelne Frequenzbereiche entfernt und bei der
Rücktransformation ein Digramm erwartet, welches einer linearen Preiszuordnung
unterliegt.

Der Algorithmus erstellt im weiteren für jedes Produkt eine
Fourier-Transformation, entfernt die zuvor empirisch ermittelten Frequenzen,
und führt eine inverse Fourier-Transformation durch.
Dann wird die im xref:anchor-regress[] beschriebene Regression auf
den bereinigten Daten durchgeführt.
Nach der Anwendung des Regressions-Polynoms auf die Klassifikationsdaten,
werden die Siebentages-Frequenzen wieder addiert.
Dazu werden die temporären Vorhersagewerte einer Fourier-Transformation mit
anschließender Addition der Siebentages-Frequenzen und Rücktransformation
unterzogen.

Zufallsverfahren
~~~~~~~~~~~~~~~~
Dieses Verfahren wurde entwickelt um Plausibität der anderen Verfahren zu
Testen und um der Vermutung nach zu gehen, das es Produkte gibt, welche
gar nicht vorhersagbar sind.

Bei dieses Verfahren wurde für jedes Produkt der Mittelwert und die
Standardabweichung ermittelt.
Mit dieses Parametern konnten für jedes Produkt 14 Werte zufällig für die
Vorhersage bestimmt werden.
Zur Zufallsbestimmung wurden Octave-interen Zufallsfunktionen mit Normal- und
mit Chi-Verteilung benutzt.
Beide Verteiltungen lieferten ähnliche Ergebnisse.

Der Gesammtfehler bei diesem Verfahren schankte zwischen 640 und 590
Fehlerpunkten.
Im Vergleich mit anderen Verfahren (siehe Optimierungsverfahren) stellte sich
herraus, dass es immer wieder Produkte gab, welche mit diesesm Verfahren bessere
Werte lieferten.
Circa 7% der Podukte liessen sich mit Zufall besser vorhersagen, als duch die
Zuvor beschriebenen Verfahren.
Es stellte sich aber herraus, dass es bei jedem duchlauf andere Produkte waren,
welche mit dem Vergleich zu den Realendaten besser vorhergesagt wurden.
Somit war dieses Verfahren keine Option für eine seriöse Vorhersage für
unbekannten Datensätze.

Optimierungsverfahren
---------------------
Das Optmierungsverfahren ist Post-Clustering und wurde im Script 'opt_pred.m'
implementiert.
Dieses Meta-Verfahren bestimmt für jedes Produkt eines der oben genannten
Verfahren, welches den geringsten Fehlerwert bei der Vorhersage über der
Trainingsmenge ergab.
Dabei werden die Vorhersage-Matrizen der Verfahren mit den Real-Daten über die
Manhatten-Distanz verglichen.
Als Ergebnis erhält man nun einen Vektor, welches die Indizes der jeweils
besten Verfahren enthält.
Die Position des Indizes spiegelt dabei das Produkt wieder, für die dieses
Verfahren am besten geeignet ist.

Mit diesem Vektor können nun die Vorhersagen der einzelnen Produkte für den
unbekannten Zeitraum zusammen gelegt werden.

.Anteil der Verfahren an der Gesammtlösung
image::image/opt_pred_pie.svg[scaledwidth="75%"]

Dieses Verfahren würde sich auch gut zur Bestimmung des Abgabe-Datensatzes für
den Daten-Mining-Cup eignen.
Dabei könnten alle Teams für ihre Verfahren einmal ihre Vorhersage für die
Tage 29 bis 42 in Form der "train.txt" und ihre Vorhersagen für den unbekannten
Zeitraum abgeben.
Anhand der verschiedenen Fehler der Vorhersagen pro Produkt könnte wie oben
beschrieben ebenfalls ein Vektor mit den Indizes der Verschiedenen Einreichungen
erstellt werden und damit auch der Datensatz für die Einreichung im Wettbewerb.

// vim: set syntax=asciidoc: