Aika: Ein semantisches neuronales Netzwerk

Wenn es darum geht Informationen aus natürlichsprachigen Texten zu extrahieren, stehen einem verschiedene Möglichkeiten zur Verfügung. Eine der ältesten und wohl auch am häufigsten genutzten Möglichkeiten ist die der regulären Ausdrücke. Hier werden exakte Muster definiert und in einem Textstring gematcht. Probleme bereiten diese allerdings, wenn kompliziertere semantische Muster gefunden werden sollen oder wenn verschiedene Muster aufeinander aufbauen oder miteinander interagieren sollen. Gerade das ist aber der Normalfall bei der Verarbeitung von natürlichem Text. Muster hängen voneinander ab, verstärken oder unterdrücken sich gegenseitig.
Prädestiniert um solche Beziehungen abzubilden wären eigentlich künstliche neuronale Netze. Diese haben nur das große Manko, dass sie keine strukturierten Informationen verarbeiten können. Neuronale Netze bringen von sich aus keine Möglichkeit mit, die relationalen Beziehungen zwischen Worten oder Phrasen zu verarbeiten. Ein weiteres Problem neuronaler Netze ist die Verarbeitung von Feedback-Schleifen, bei denen einzelne Neuronen von sich selbst abhängig sind. Genau diese Probleme versucht der Aika Algorithmus (www.aika-software.org) zu lösen.

Der Aika Algorithmus ist als Open Source Java-Bibliothek implementiert und dient dazu semantische Informationen in Texten zu erkennen und zu verarbeiten. Da semantische Informationen sehr häufig mehrdeutig sind, erzeugt die Bibliothek für jede dieser Bedeutungen eine eigene Interpretation und wählt zum Schluss die am höchsten gewichtete aus. Aika kombiniert dazu aktuelle Ideen und Konzepte aus den Bereichen des maschinellen Lernens und der künstlichen Intelligenz, wie etwa künstliche neuronale Netze, Frequent Pattern Mining und die auf formaler Logik basierenden Expertensysteme. Aika basiert auf der heute gängigen Architektur eines künstlichen neuronalen Netzwerks (KNN) und nutzt diese, um sprachliche Regeln und semantische Beziehungen abzubilden.

Die Knackpunkte: relationale Struktur und zyklische Abhängigkeiten

Das erste Problem: Texte haben eine von Grund auf relationale Struktur. Die einzelnen Worte stehen über ihre Reihenfolge in einer ganz bestimmten Beziehung zueinander. Gängige Methoden, um Texte für die Eingabe in ein KNN auszuflachen, sind beispielsweise Bag-of-Words oder Sliding-Window. Mittlerweile haben sich auch rekurrente neuronale Netze etabliert, die das gesamte Netz in einer Schleife für jedes Wort des Textes mehrfach hintereinander schalten. Aika geht hier allerdings einen anderen Weg. Aika propagiert die relationalen Informationen, also den Textbereich und die Wortposition, gemeinsam mit den Aktivierungen durch das Netzwerk. Die gesamte relationale Struktur des Textes bleibt also erhalten und lässt sich jederzeit zur weiteren Verarbeitung nutzen.

Das zweite Problem ist, dass bei der Verarbeitung von Text häufig nicht klar ist, in welcher Reihenfolge einzelne Informationen verarbeitet werden müssen. Wenn wir beispielsweise den Namen „August Schneider“ betrachten, können sowohl der Vor- als auch der Nachname in einem anderen Zusammenhang eine völlig andere Bedeutung annehmen. August könnte sich auch auf den Monat beziehen. Und genauso könnte Schneider eben auch den Beruf des Schneiders meinen. Einfache Regeln, um hier dennoch den Vor- und den Nachnamen zu erkennen, wären: „Wenn das nachfolgende Wort ein Nachname ist, handelt es sich bei August um einen Vornamen“ und „Wenn das vorherige Wort ein Vorname ist, dann handelt es sich bei Schneider um einen Nachnamen“. Das Problem dabei ist nur, dass unsere Regeln nun eine zyklische Abhängigkeit beinhalten. Aber ist das wirklich so schlimm? Aika erlaubt es, genau solche Feedback-Schleifen abzubilden. Wobei die Schleifen sowohl positive, als auch negative Gewichte haben können. Negative rekurrente Synapsen führen dazu, dass zwei sich gegenseitig ausschließende Interpretationen entstehen. Der Trick ist nun zunächst nur Annahmen zu treffen, also etwa dass es sich bei dem Wort „Schneider“ um den Beruf handelt und zu schauen wie das Netzwerk auf diese Annahme reagiert. Es bedarf also einer Evaluationsfunktion und einer Suche, die die Annahmen immer weiter variiert, bis schließlich eine optimale Interpretation des Textes gefunden ist. Genau wie schon der Textbereich und die Wortposition werden nun auch die Annahmen gemeinsam mit den Aktivierungen durch das Netzwerk propagiert.

Die zwei Ebenen des Aika Algorithmus

Aber wie lassen sich diese Informationen mit den Aktivierungen durch das Netzwerk propagieren, wo doch der Aktivierungswert eines Neurons für gewöhnlich nur eine Fließkommazahl ist? Genau hier liegt der Grund, weshalb Aika unter der neuronalen Ebene mit ihren Neuronen und kontinuierlich gewichteten Synapsen noch eine diskrete Ebene besitzt, in der es eine Darstellung aller Neuronen in boolscher Logik gibt. Aika verwendet als Aktivierungsfunktion die obere Hälfte der Tanh-Funktion. Alle negativen Werte werden auf 0 gesetzt und führen zu keiner Aktivierung des Neurons. Es gibt also einen klaren Schwellenwert, der zwischen aktiven und inaktiven Neuronen unterscheidet. Anhand dieses Schwellenwertes lassen sich die Gewichte der einzelnen Synapsen in boolsche Logik übersetzen und entlang der Gatter dieser Logik kann nun ein Aktivierungsobjekt mit den Informationen durch das Netzwerk propagiert werden. So verbindet Aika seine diskrete bzw. symbolische Ebene mit seiner subsymbolischen Ebene aus kontinuierlichen Synapsen-Gewichten.

Die Logik Ebene in Aika erlaubt außerdem einen enormen Effizienzgewinn im Vergleich zu einem herkömmlichen KNN, da die gewichtete Summe von Neuronen nur noch für solche Neuronen berechnet werden muss, die vorher durch die Logikebene aktiviert wurden. Im Falle eines UND-verknüpfenden Neurons bedeutet das, dass das Aktivierungsobjekt zunächst mehrere Ebenen einer Lattice-Datenstruktur aus UND-Knoten durchlaufen muss, bevor das eigentliche Neuron berechnet und aktiviert werden kann. Diese Lattice-Datenstruktur stammt aus dem Bereich des Frequent Pattern Mining und enthält in einem gerichteten azyklischen Graphen alle Teilmuster eines beliebigen größeren Musters. Ein solches Frequent Pattern Lattice kann in zwei Richtungen betrieben werden. Zum Einen können damit bereits bekannte Muster gematcht werden, und zum Anderen können auch völlig neue Muster damit erzeugt werden.

Da es schwierig ist Netze mit Millionen von Neuronen im Speicher zu halten, nutzt Aika das Provider Architekturpattern um selten verwendete Neuronen oder Logikknoten in einen externen Datenspeicher (z.B. eine Mongo DB) auszulagern, und bei Bedarf nachzuladen.

Ein Beispielneuron

Hier soll nun noch beispielhaft gezeigt werden wie ein Neuron innerhalb des semantischen Netzes angelegt werden kann. Zu beachten ist, dass Neuronen sowohl UND- als auch ODER-Verknüpfungen abbilden können. Das Verhalten hängt dabei alleine vom gewählten Bias ab. Liegt der Bias bei 0.0 oder einem nur schwach negativen Wert reicht schon die Aktivierung eines positiven Inputs aus um auch das aktuelle Neuron zu aktivieren. Es handelt sich dann um eine ODER-Verknüpfung. Liegt der Bias hingegen tiefer im negativen Bereich dann müssen mitunter mehrere positive Inputs gleichzeitig aktiviert werden damit das aktuelle Neuron dann auch aktiv wird. Jetzt handelt es sich dann um eine UND-Verknüpfung. Der Bias Wert kann der initNeuron einfach als Parameter übergeben werden. Um jedoch die Berechnung des Bias zu erleichtern bietet Aika bei den Inputs noch den Parameter BiasDelta an. Der Parameter BiasDelta nimmt einen Wert zwischen 0.0 und 1.0 entgegen. Bei 0.0 wirkt sich der Parameter gar nicht aus. Bei einem höheren Wert hingegen wird er mit dem Betrag des Synapsengewichts multipliziert und von dem Bias abgezogen. Der Gesamtbias lautet in diesem Beispiel also -55.0. Die beiden positiven Eingabesynapsen müssen also aktiviert werden und die negative Eingabesynapse darf nicht aktiviert werden, damit dieses Neuron selber aktiv werden kann. Das Zusammenspiel von Bias und Synpasengewichten ist aber nicht nur für die Aktivierung eines Neurons wichtig, sondern auch für die spätere Auswahl der finalen Interpretation. Je stärker die Aktivierungen innerhalb einer Interpretation aktiv sind, desto höher wird diese Interpretation gewichtet.
Um eine beliebige Graphstruktur abbilden zu können, trennt Aika das Anlegen der Neuronen von der Verknüpfung mit anderen Neuronen. Mit createNeuron(“E-Schneider (Nachname)”) wird also zunächst einmal ein unverknüpftes Neuron erzeugt, das dann über die initNeuron Funktion mit den Eingabeneuronen wortSchneiderNeuron, kategorieVornameNeuron und unterdrueckendesNeuron verknüpft wird. Über den Parameter RelativeRid wird hier angegeben auf welche relative Wortposition sich die Eingabesynapse bezieht. Die Eingabesynpase zu der Kategorie Vorname bezieht sich also mit -1 auf die vorherige Wortposition. Der Parameter Recurrent gibt an ob es sich bei dieser Synpase um eine Feedback-Schleife handelt. Über den Parameter RangeMatch wird angegeben wie sich der Textbereich, also die Start- und die Endposition zwischen der Eingabe- und der Ausgabeaktivierung verhält. Bei EQUALS sollen die Bereiche also genau übereinstimmen, bei CONTAINED_IN reicht es hingegen wenn der Bereich der Eingabeaktivierung innerhalb des Bereichs der Ausgabeaktivierung liegt. Dann kann noch über den Parameter RangeOutput angegeben werden, dass der Bereich der Eingabeaktivierung an die Ausgabeaktivierung weiterpropagiert werden soll.

    Neuron entitaetSchneiderNachnameNeuron = m.initNeuron(
            m.createNeuron("E-Schneider (Nachname)"),
            5.0,
            new Input()
                    .setNeuron(wortSchneiderNeuron)
                    .setWeight(10.0f)
                    .setBiasDelta(1.0)
                    .setRelativeRid(0)
                    .setRecurrent(false)
                    .setRangeMatch(EQUALS)
                    .setRangeOutput(true),
            new Input()
                    .setNeuron(kategorieVornameNeuron)
                    .setWeight(10.0f)
                    .setBiasDelta(1.0)
                    .setRelativeRid(-1)
                    .setRecurrent(true)
                    .setRangeMatch(NONE),
            new Input()
                    .setNeuron(unterdrueckendesNeuron)
                    .setWeight(-40.0f)
                    .setBiasDelta(1.0)
                    .setRecurrent(true)
                    .setRangeMatch(CONTAINED_IN)
    );

Fazit

Mit Aika können sehr flexibel umfangreiche semantische Modelle erzeugt und verarbeitet werden. Aus Begriffslisten verschiedener Kategorien, wie etwa: Vor- und Nachnamen, Orten, Berufen, Strassen, grammatikalischen Worttypen usw. können automatisch Neuronen generiert werden. Diese können dann dazu genutzt werden, Worte und Phrasen zu erkennen, einzelnen Begriffen eine Bedeutung zuzuordnen oder die Kategorie eines Begriffs zu bestimmen. Falls in dem zu verarbeitenden Text mehrdeutige Begriffe oder Phrasen auftauchen, kann Aika für diese jeweils eigene Interpretationen erzeugen und gewichten. Die sinnvollste Interpretation wird dann als Ergebnis zurück geliefert.

Interview – Process Mining ist ein wichtiger Treiber der Prozessautomatisierung

Interview mit Prof. Scheer, Erfinder des etablierten ARIS-Konzepts, über die Bedeutung von Big Data für die Prozessoptimierung

Prof. Dr. Dr. h.c. mult. August-Wilhelm Scheer

Copyright – Scheer GmbH

Prof. Dr. Dr. h.c. mult. August-Wilhelm Scheer war Gründer der IDS Scheer AG und Direktor des von ihm gegründeten Instituts für Wirtschaftsinformatik an der Universität des Saarlandes in Saarbrücken. Es ist der Erfinder des bekannten ARIS-Konzeptes und heute Alleingesellschafter und Beiratsvorsitzender der Scheer GmbH (www.scheer-group.com), einem Consulting- und Software-Haus in Saarbrücken. Daneben gehören zur Scheer Gruppe  Beteiligungen an Start- up Unternehmen.

Data Science Blog: Herr Prof. Scheer, Sie sind der Erfinder des ARIS-Konzepts in den 90er-Jahren, mit dem viele Unternehmen in den darauffolgenden Jahren ihr betriebliches Informationssystem überarbeiten konnten. Auch heute arbeiten viele Unternehmen an der Umsetzung dieses Konzepts. Was hat sich heute verändert?

Prof. Scheer: Auch heute noch bilden Prozessmodelle die Grundlage der digitalen Prozessautomatisierung, indem sie menschliche Arbeitsleistung innerhalb der Modelle durch IT ­Systeme unterstützen oder ersetzen. Die Scheer GmbH setzt diesen modellgetriebenen Ansatz erfolgreich in großen BPM und SAP ­Einführungsprojekten ein. Hierfür wurden in den vergangenen Jahren industriespezifische Referenzmodelle entwickelt, die unter der Bezeichnung „Performance Ready“ eine beachtliche Beschleunigung hervorbringen.

Weitere Treiber der Automatisierung sind die technische Weiterentwicklung der IT, insbesondere durch prozessorientierte Architekturen der Anwendungssoftware, sowie Big Data, Data Mining, Cloud Computing und Hardware ­Infrastruktur. Gleichzeitig werden neuere Forschungsergebnisse zu Modellierungsmethoden, der Künstlichen Intelligenz und Data Mining zunehmend in der Praxis der digitalen Geschäftsprozessorganisation umgesetzt.

Data Science Blog: Zu Zeiten der ARIS-Einführung steckte die Geschäftswelt, insbesondere die Industrie, gerade im Trend zum Lean Management. Heute ist es ähnlich mit dem Trend zu Big Data und Analytics. Welche Synergien gibt es hier im Kontext von Data Analytics?

Prof. Scheer: Mit der Implementierung einer lauffähigen Prozesslösung ist der enge BPM ­Ansatz von der  Problemerkennung bis zum lauffertigen Anwendungssystem abgeschlossen. In der Realität können jedoch auch unvorhergesehenen Abweichungen auftreten oder Störungen entstehen. Derartige Abweichungen begründen das Interesse an der Auswertung realer Prozessinstanzen. Die automatische Suche in Datenbeständen, um unerwartete Muster und Zusammenhänge zu erkennen und diese in gut verständlicher, häufig grafischer Form aufzubereiten, wird generell als Datamining bezeichnet und gehört zum Gebiet der Data Analytics. Wird dieses Vorgehen auf Geschäftsprozesse angewendet, so wird es als Process Mining bezeichnet. Es geht also  darum, die Spuren der Geschäftsprozesse während ihrer Ausführung in einer Logdatei zu erfassen und ihr Verhalten zu beobachten (Monitoring).

Data Science Blog: Welche Anwendungsfälle sind mit Process Mining zu bewältigen? Und welche Mehrwerte werden Ihrer Erfahrung nach daraus generiert?

Prof. Scheer: Beim Process Mining generiert ein komplexer Algorithmus aus den Datenspuren der Logdatei von Anwendungssystemen automatisch ein Ist-­Prozessmodell. Aus den Vergleichen des bestehenden Soll-­Modells mit den Datenspuren der Logdatei und des generierten Ist-Modells werden Abweichungen ermittelt. Diese werden analysiert, um das Soll-Modell an die Realität anzupassen und organisatorische Verbesserungsvorschläge zu entwickeln. Process Mining kann Auskunft geben, ob bei der Prozessausführung Compliance ­Regeln eingehalten oder verletzt werden, an welchen Stellen Kapazitätsengpässe entstehen, ob von vorgesehenen Kapazitätszuordnungen abgewichen wurde, wie sich Durchlaufzeiten und Qualität verhalten usw.. Die Ergänzung des BPM ­Ansatzes um das Process Mining, insbesondere auch durch den Einsatz von KI ­Techniken, führt zu einer neuen Qualität des Prozessmanagements und wird deshalb als intelligentes BPM (iBPM) bezeichnet.

Data Science Blog: Welche analytischen Methoden kommen zum Einsatz und auf welche Software-Technologien setzen Sie dabei?

Prof. Scheer: Das Process Mining wird gegenwärtig wissenschaftlich intensiv mit formalen Methoden bearbeitet. Ziel dieser Forschungen ist es, das Process Mining durch Entwicklung komplexer Algorithmen nahezu vollständig zu automatisieren. Der Verzicht auf den Einsatz menschlichen Fachwissens führt aber z. T. zu einer überhöhten Komplexität der Algorithmen für Aufgaben, die ein erfahrener Prozessmanager intuitiv leicht und besser erledigen kann. Hier ist eine Kombination aus Automatik und Fachwissen sinnvoller. Die Unternehmen der Scheer Gruppe legen den Fokus auf die Modellierung und das mehr strategische BPM und sehen Process Mining als Ergänzung dieses Ansatzes. Die Software „Scheer Process Mining“ folgt diesem Ansatz und sieht sie als Ergänzung ihrer modellbasierten BPMS ­Software „Scheer BPaaS“ und „Scheer E2EBridge“. Weiterhin unterstützen unsere Berater in vielen Projekten das Produkt „ARIS PPM“ der Software AG.

Data Science Blog: Sind die datengetriebenen Prozessanalysen vorerst abgeschlossen, geht es an die Umsetzung der Verbesserungen. Wie unterstützen Sie Unternehmen dabei, diese herbei zu führen? Und in wie weit können datengetriebene Entscheidungssysteme realisiert werden, die die Vision des autonomen Unternehmens im Sinne der Industrie 4.0 einen Schritt näher bringen?

Prof. Scheer: Sowohl langfristige strategische BPM Projekte als auch kurzfristig taktische Umsetzungen aus Process Mining Aktivitäten werden von der Scheer Gruppe unterstützt. Aber wir schauen auch in die Zukunft. Im Rahmen von Machine Learning werden Algorithmen entwickelt, die aus Beobachtungen ein Systemverhalten erkennen (lernen), um es dann für Prognosen auszuwerten. Als bekannteste Verfahren sind künstliche neuronale Netze zu nennen. Diese bilden Funktionen des menschlichen Gehirns ab. Interessante Anwendungsfälle gibt es bereits in der Fertigung. An Produktionsanlagen werden heute zahlreiche Sensoren angebracht, die Temperatur, Schwingungen, Energieverbrauch usw. kontinuierlich messen. Diese Datenströme können als Input ­Größen von neuronalen Netzen ausgewertet und zu Prognosen genutzt werden. Das Unternehmen IS ­Predict, das zur Scheer Gruppe gehört, hat dazu eigene Algorithmen auf Basis von KI entwickelt und führt seit Jahren erfolgreich Projekte zu Predictive Maintenance und zur vorausschauenden Qualitätssteuerung durch. 

Data Science Blog: Process Mining ist somit ein spannendes Zukunftsthema. Unter welchen Rahmenbedingungen sollten derartige Projekte durchgeführt werden? Was sind Ihrer Erfahrung nach die Kriterien zum Erfolg?

Prof. Scheer: Zunächst ist es sehr wichtig, das Thema aus der Business-Perspektive anzugehen und sich nicht zu früh mit technologischen Fragen auseinanderzusetzen: Welche Fragen sollen durch Process Mining beantwortet werden? Welche Informationsquellen werden hierfür benötigt?

Zu Beginn des Projekts sollte zunächst eine konkrete Aufgabenstellung angegangen werden, die auch von ihrer Größenordnung gut zu bewältigen ist. Je konkreter die Aufgabenstellung gewählt wird, desto größer ist die Erfolgswahrscheinlichkeit und umso schneller kann ein ROI erzielt werden. Natürlich bedeutet dies nicht, das „große Ganze“ zu vernachlässigen. Auch bei der Einführung von Process Mining gilt der Grundsatz „think big, start small“.

Data Science Blog: Datengetriebene Prozessanalysen bedingen interdisziplinäres Wissen. Welche Tipps würden Sie einem Prozessmanager geben, der sich in die Thematik einarbeiten möchte?

Prof. Scheer: Die Grundvoraussetzung für die Einführung von Process Mining ist ein gutes Verständnis aller Aspekte des Geschäftsmodells.  Darauf aufbauend sollte ein guter Überblick der Unternehmensprozesse und ihrer Ausprägung in den verschiedenen Unternehmensbereichen vorhanden sein. Immer wichtiger wird in diesem Zusammenhang das Thema der verschiedenen Arten von Daten und wie sie entlang der Prozesse entstehen bzw. angewendet werden. Hierbei sind für Process Mining insbesondere zwei Arten von Daten relevant:  Kennzahlen, die bei der Ausführung der Prozesse entstehen, die sog. Prozesskennzahlen oder Process KPIs. Neben den Process KPIs können mit Process Mining fachliche Daten, die während der Ausführung der Prozesse erfasst oder manipuliert werden, betrachtet werden. Mit den Process Mining Produkten von Scheer können beide Arten von Daten analysiert werden. Der Einstieg in die Datenanalyse erfolgt über das Process Analytics Dashboard. Weitergehende Informationen zu den Details der Prozesse liefert dann das Modul Process Explorer.

Lineare Regression in Python mit Scitkit-Learn

Die lineare Regressionsanalyse ist ein häufiger Einstieg ins maschinelle Lernen um stetige Werte vorherzusagen (Prediction bzw. Prädiktion). Hinter der Regression steht oftmals die Methode der kleinsten Fehlerquadrate und die hat mehr als eine mathematische Methode zur Lösungsfindung (Gradientenverfahren und Normalengleichung). Alternativ kann auch die Maximum Likelihood-Methode zur Regression verwendet werden. Wir wollen uns in diesem Artikel nicht auf die Mathematik konzentrieren, sondern uns direkt an die Anwendung mit Python Scikit-Learn machen:

Haupt-Lernziele:

  • Einführung in Machine Learning mit Scikit-Learn
  • Lineare Regression mit Scikit-Learn

Neben-Lernziele:

  • Datenvorbereitung (Data Preparation) mit Pandas und Scikit-Learn
  • Datenvisualisierung mit der Matplotlib direkt und indirekt (über Pandas)

Was wir inhaltlich tun:

Der Versuch einer Vorhersage eines Fahrzeugpreises auf Basis einer quantitativ-messbaren Eigenschaft eines Fahrzeuges.


Die Daten als Download

Für dieses Beispiel verwende ich die Datei “Automobil_data.txt” von Kaggle.com. Die Daten lassen sich über folgenden Link downloaden, nur leider wird ein (kostenloser) Account benötigt:
https://www.kaggle.com/toramky/automobile-dataset/downloads/automobile-dataset.zip
Sollte der Download-Link unerwartet mal nicht mehr funktionieren, freue ich mich über einen Hinweis als Kommentar 🙂

Die Entwicklungsumgebung

Ich verwende hier die Python-Distribution Anaconda 3 und als Entwicklungs-Umgebung Spyder (in Anaconda enthalten). Genauso gut funktionieren jedoch auch Jupyter Notebook, Eclipse mit PyDev oder direkt die IPython QT-Console.


Zuerst einmal müssen wir die Daten in unsere Python-Session laden und werden einige Transformationen durchführen müssen. Wir starten zunächst mit dem Importieren von drei Bibliotheken NumPy und Pandas, deren Bedeutung ich nicht weiter erläutern werde, somit voraussetze.

import matplotlib.pyplot as plt  # Die Nr.1 der Bibliotheken zur Datenvisualisierung
import numpy as np               # Bibliothek "Nummerisches Python"
import pandas as pd              # Bibliothek "Panel Data"

Wir nutzen die Pandas-Bibliothek, um die “Automobile_data.txt” in ein pd.DataFrame zu laden.

dataSet = pd.read_csv("Automobile_data.txt",  # Hier liegt die Datei im selben Verzeichnis wie das Python-Skript!
                      delimiter = ',',
                      thousands = None,
                      decimal = '.')

Schauen wir uns dann die ersten fünf Zeilen in IPython via dataSet.head().

In : dataSet.head()
Out: 
   symboling normalized-losses         make fuel-type aspiration num-of-doors  \
0          3                 ?  alfa-romero       gas        std          two   
1          3                 ?  alfa-romero       gas        std          two   
2          1                 ?  alfa-romero       gas        std          two   
3          2               164         audi       gas        std         four   
4          2               164         audi       gas        std         four   

    body-style drive-wheels engine-location  wheel-base  ...    engine-size  \
0  convertible          rwd           front        88.6  ...            130   
1  convertible          rwd           front        88.6  ...            130   
2    hatchback          rwd           front        94.5  ...            152   
3        sedan          fwd           front        99.8  ...            109   
4        sedan          4wd           front        99.4  ...            136   

   fuel-system  bore  stroke compression-ratio horsepower  peak-rpm city-mpg  \
0         mpfi  3.47    2.68               9.0        111      5000       21   
1         mpfi  3.47    2.68               9.0        111      5000       21   
2         mpfi  2.68    3.47               9.0        154      5000       19   
3         mpfi  3.19     3.4              10.0        102      5500       24   
4         mpfi  3.19     3.4               8.0        115      5500       18   

  highway-mpg  price  
0          27  13495  
1          27  16500  
2          26  16500  
3          30  13950  
4          22  17450  

[5 rows x 26 columns]

Hinweis: Der Datensatz hat viele Spalten, so dass diese in der Darstellung mit einem Backslash \ umgebrochen werden.

Gleich noch eine weitere Ausgabe dataSet.info(), die uns etwas über die Beschaffenheit der importierten Daten verrät:

In : dataSet.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 205 entries, 0 to 204
Data columns (total 26 columns):
symboling            205 non-null int64
normalized-losses    205 non-null object
make                 205 non-null object
fuel-type            205 non-null object
aspiration           205 non-null object
num-of-doors         205 non-null object
body-style           205 non-null object
drive-wheels         205 non-null object
engine-location      205 non-null object
wheel-base           205 non-null float64
length               205 non-null float64
width                205 non-null float64
height               205 non-null float64
curb-weight          205 non-null int64
engine-type          205 non-null object
num-of-cylinders     205 non-null object
engine-size          205 non-null int64
fuel-system          205 non-null object
bore                 205 non-null object
stroke               205 non-null object
compression-ratio    205 non-null float64
horsepower           205 non-null object
peak-rpm             205 non-null object
city-mpg             205 non-null int64
highway-mpg          205 non-null int64
price                205 non-null object
dtypes: float64(5), int64(5), object(16)
memory usage: 41.7+ KB

Einige Spalten entsprechen hinsichtlich des Datentypes nicht der Erwartung. Für die Spalten ‘horsepower’ und ‘peak-rpm’ würde ich eine Ganzzahl (Integer) erwarten, für ‘price’ hingegen eine Fließkommazahl (Float), allerdings sind die drei Spalten als Object deklariert. Mit Trick 17 im Data Science, der Anzeige der Minimum- und Maximum-Werte einer zu untersuchenden Datenreihe, kommen wir dem Übeltäter schnell auf die Schliche:

dataSet['horsepower'].min()
Out: '100'

dataSet['horsepower'].max()
Out: '?'

Datenbereinigung

Für eine Regressionsanalyse benötigen wir nummerische Werte (intervall- oder ratioskaliert), diese möchten wir auch durch richtige Datentypen-Deklaration herstellen. Nun wird eine Konvertierung in den gewünschten Datentyp jedoch an den (mit ‘?’ aufgefüllten) Datenlücken scheitern.

Schauen wir uns doch einmal die Datenreihen an, in denen in der Spalte ‘peak-rpm’ Fragezeichen stehen:

dataSet[dataSet['peak-rpm'] == '?'][['engine-type', 'num-of-cylinders']]
Out: 
    engine-type num-of-cylinders
130         ohc             four
131         ohc             four

Zwei Datenreihen sind vorhanden, bei denen ‘peak-rpm’ mit einem ‘?’ aufgefüllt wurde. Nun könnten wir diese Datenreihen einfach rauslöschen. Oder mit sinnvollen (im Sinne von wahrscheinlichen) Werten auffüllen. Vermutlichen haben beide Einträge – beide sind OHC-Motoren mit 4 Zylindern – eine ähnliche Drehzahl-Angabe wie vergleichbare Motoren. Mit folgendem Quellcode, gruppieren wir die Spalten ‘engine-type’ und ‘num-of-cylinders’ und bilden für diese Klassen den arithmetischen Mittelwert (.mean()) für die ‘peak-rpm’.

dataSet_rpm = dataSet[dataSet['peak-rpm'] != '?'][['engine-type', 'num-of-cylinders','peak-rpm']]
dataSet_rpm['peak-rpm'] = dataSet_rpm['peak-rpm'].astype(float)
dataSet_rpm_grouped = dataSet_rpm.groupby(['engine-type', 'num-of-cylinders'])
dataSet_rpm_grouped['peak-rpm'].mean()

Und schauen wir uns das Ergebnis an:

dataSet_rpm_grouped['peak-rpm'].mean()
Out: 
engine-type  num-of-cylinders
dohc         four                5700.000000 -- 
             six                 5050.000000
dohcv        eight               5750.000000
l            four                4668.181818
             three               5100.000000
ohc          five                5081.818182
             four                5155.468750
             six                 4821.428571
ohcf         four                4775.000000
             six                 5900.000000
ohcv         eight               4625.000000
             six                 5212.500000
             twelve              5000.000000
rotor        two                 6000.000000
Name: peak-rpm, dtype: float64

Ein Vier-Zylinder-OHC-Motor hat demnach durchschnittlich einen Drehzahl-Peak von 5155 Umdrehungen pro Minute. Ohne nun (fahrlässigerweise) auf die Verteilung in dieser Klasse zu achten, nehmen wir einfach diesen Schätzwert, um die zwei fehlende Datenpunkte zu ersetzen.

Wir möchten jedoch die Original-Daten erhalten und legen ein neues DataSet (dataSet_c) an, in welches wir die Korrekturen vornehmen:

dataSet_c = dataSet.copy()   # das "c"-Anhängsel steht für "corrected"

Nun können wir die fehlenden Peak-RPM-Einträge mit unserem Schätzwert ersetzen:

dataSet_c.loc[dataSet_c['peak-rpm'] == '?', 'peak-rpm'] = 5155

Was bei einer Drehzahl-Angabe noch funktionieren mag, ist für anderen Spalten bereits etwas schwieriger: Die beiden Spalten ‘price’ und ‘horsepower’ sind ebenfalls vom Typ Object, da sie ‘?’ enthalten. Verzichten wir einfach auf die betroffenen Zeilen:

dataSet_c = dataSet_c[dataSet_c['price'] != '?']                    # entsprechende Zeilen herausfiltern
dataSet_c['price'] = dataSet_c['price'].astype(float)               # Typ-Konvertierung zu Float

dataSet_c = dataSet_c[dataSet_c.horsepower != '?']                  # entsprechende Zeilen herausfiltern
dataSet_c['horsepower'] = dataSet_c['horsepower'].astype(float)     # Typ-Konvertierung in Int

Datenvisualisierung mit Pandas

Wir wollen uns nicht lange vom eigentlichen Ziel ablenken, dennoch nutzen wir die Visualisierungsfähigkeiten der Pandas-Library (welche die Matplotlib inkludiert), um uns dann die Anzahlen an Einträgen nach Hersteller der Fahrzeuge (Spalte ‘make’) anzeigen zu lassen:

dataSet_grouped_make = dataSet_c.groupby('make')
dataSet_grouped_make['make'].count().plot(kind = 'bar', figsize = (10, 10))
plt.show()    # Besser jedes Plot abschließen! Auch wenn es in Pandas entstanden ist.

Oder die durchschnittliche PS-Zahl nach Hersteller:

(dataSet_c.groupby('make'))['horsepower'].mean().plot(kind = 'barh',
                                                      title = 'Mean Horsepower',
                                                      figsize = (10, 10))
plt.show()

Vorbereitung der Regressionsanalyse

Nun kommen wir endlich zur Regressionsanalyse, die wir mit Scikit-Learn umsetzen möchten. Die Regressionsanalyse können wir nur mit intervall- oder ratioskalierten Datenspalten betreiben, daher beschränken wir uns auf diese. Die “price”-Spalte nehmen wir jedoch heraus und setzen sie als unsere Zielgröße fest.

""" ----- Vorbereitung für die Regressionsanalyse ----- """
cols_ratio = ['horsepower', 'wheel-base', 'length', 'width', 'height', 'curb-weight', 'engine-size', 'compression-ratio', 'city-mpg', 'highway-mpg']
cols_target = ['price']

dataSet_ratio = dataSet_c.loc[:, cols_ratio]
dataSet_target = dataSet_c[cols_target]

Interessant ist zudem die Betrachtung vorab, wie die einzelnen nummerischen Attribute untereinander korrelieren. Dafür nehmen wir auch die ‘price’-Spalte wieder in die Betrachtung hinein und hinterlegen auch eine Farbskala mit dem Preis (höhere Preise, hellere Farben).

grr = pd.plotting.scatter_matrix(dataSet_c[cols_target + cols_ratio]
                                 ,c = dataSet_target
                                 ,figsize=(15, 15)
                                 ,marker = 'o'
                                 ,hist_kwds={'bins' : 20}
                                 ,s = 60
                                 ,alpha = 0.8)
plt.show()

Die lineare Korrelation ist hier sehr interessant, da wir auch nur eine lineare Regression beabsichtigen.

Wie man in dieser Scatter-Matrix recht gut erkennen kann, scheinen einige Größen-Paare nahezu perfekt zu korrelieren, andere nicht.

Korrelation…

  • …nahezu perfekt linear: highway-mpg vs city-mpg (mpg = Miles per Gallon)
  • … eher nicht gegeben: highway-mpg vs height
  • … nicht linear, dafür aber nicht-linear: highway-mpg vs price

Nun, wir wollen den Preis eines Fahrzeuges vorhersagen, wenn wir eine andere quantitative Größe gegeben haben. Auf den Preis bezogen, erscheint mir die Motorleistung (Horsepower) einigermaßen linear zu korrelieren. Versuchen wir hier die lineare Regression und setzen somit die Spalte ‘horsepower’ als X und ‘price’ als y fest.

X = dataSet_ratio[['horsepower']] # doppelte [], da eine Liste von Spalten zu übergeben ist
y = dataSet_c[cols_target]

Die gängige Konvention ist übrigens, X groß zu schreiben, weil hier auch mehrere x-Dimensionen enthalten sein dürfen (multivariate Regression). y hingegen, ist stets nur eine Zielgröße (eine Dimension).

Die lineare Regression ist ein überwachtes Verfahren des maschinellen Lernens, somit müssen wir unsere Prädiktionsergebnisse mit Test-Daten testen, die nicht für das Training verwendet werden dürfen. Scitkit-Learn (oder kurz: sklearn) bietet hierfür eine Funktion an, die uns das Aufteilen der Daten abnimmt:

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y,
                                                    test_size = 0.3,     # 70% der Daten für das Training
                                                    random_state = None) # bei Bedarf kann hier "dem Zufall auf die Sprünge geholfen" werden

Zu beachten ist dabei, dass die Daten vor dem Aufteilen in Trainings- und Testdaten gut zu durchmischen sind. Auch dies übernimmt die train_test_split-Funktion für uns, nur sollte man im Hinterkopf behalten, dass die Ergebnisse (auf Grund der Zufallsauswahl) nach jedem Durchlauf immer wieder etwas anders aussehen.

Lineare Regression mit Scikit-Learn

Nun kommen wir zur Durchführung der linearen Regression mit Scitkit-Learn, die sich in drei Zeilen trainieren lässt:

""" ----- Lineare Regressionsanalyse ------- """

from sklearn.linear_model import LinearRegression   # importieren der Klasse

lr = LinearRegression()                             # instanziieren der Klasse

lr.fit(X_train, y_train)                            # trainieren

Aber Vorsicht! Bevor wir eine Prädiktion durchführen, wollen wir festlegen, wie wir die Güte der Prädiktion bewerten wollen. Die gängigsten Messungen für eine lineare Regression sind der MSE und R².

MSE = \frac{\sum_{i=1}^n (y_i - \hat{y_i})^2}{n}

Ein großer MSE ist schlecht, ein kleiner gut.

R^2 = 1 - \frac{MSE}{Var(y)}= \frac{\frac{1}{n} \cdot \sum_{i=1}^n (y_i - \hat{y_i})^2}{\frac{1}{n} \cdot \sum_{i=1}^n (y_i - \hat{\mu_y})^2}

Ein kleines R² ist schlecht, ein großes R² gut. Ein R² = 1.0 wäre theoretisch perfekt (da der Fehler = 0.00 wäre), jedoch in der Praxis unmöglich, da dieser nur bei absolut perfekter Korrelation auftreten würde. Die Klasse LinearRegression hat eine R²-Messmethode implementiert (score(x, y)).

print('------ Lineare Regression -----')
print('Funktion via sklearn: y = %.3f * x + %.3f' % (lr.coef_[0], lr.intercept_))
print("Alpha: {}".format(lr.intercept_))
print("Beta: {}".format(lr.coef_[0]))
print("Training Set R² Score: {:.2f}".format(lr.score(X_train, y_train)))
print("Test Set R² Score: {:.2f}".format(lr.score(X_test, y_test)))
print("\n")

Die Ausgabe (ein Beispiel!):

------ Lineare Regression -----
Funktion via sklearn: y = 170.919 * x + -4254.701     # Die Funktion ist als y = 171 * x - 4254.7
Alpha: [-4254.70114803]                               # y-Achsenschnitt bei x = 0
Beta: [ 170.91919086]                                 # Steigung der Gerade
Training Set R² Score: 0.62                           
Test Set R² Score: 0.73

Nach jedem Durchlauf ändert sich mit der Datenaufteilung (train_test_split()) das Modell etwas und auch R² schwankt um eine gewisse Bandbreite. Berauschend sind die Ergebnisse dabei nicht, und wenn wir uns die Regressionsgerade einmal ansehen, wird auch klar, warum:

plt.figure(figsize=(10,10))
plt.scatter(X_train, y_train, color = 'blue')                 # Blaue Punkte sind Trainingsdaten
plt.scatter(X_test, y_test, color = 'green')                  # Grüne Punkte sind Testdaten
plt.plot(X_train, lr.predict(X_train), color = 'red')         # Hier ensteht die Gerade (x, y) = (x, lr.predict(x)
plt.xlabel(X_train.columns[0])
plt.ylabel(cols_target[0])
plt.show()

Bei kleineren Leistungsbereichen, etwa bis 100 PS, ist die Preis-Varianz noch annehmbar gering, doch bei höheren Leistungsbereichen ist die Spannweite deutlich größer. (Nachträgliche Anmerkung vom 06.05.2018: relativ betrachtet, bleibt der Fehler über alle Wertebereiche ungefähr gleich [relativer Fehler]. Die absoluten Fehlerwerte haben jedoch bei größeren x-Werten so eine Varianz der möglichen y-Werte, dass keine befriedigenden Prädiktionen zu erwarten sind.)

Egal wie wir eine Gerade in diese Punktwolke legen, wir werden keine befriedigende Fehlergröße erhalten.

Nehmen wir einmal eine andere Spalte für X, bei der wir vor allem eine nicht-lineare Korrelation erkannt haben: “highway-mpg”

X = dataSet_ratio[['highway-mpg']]
y = dataSet_c[cols_target]

Wenn wir dann das Training wiederholen:

------ Lineare Regression -----
Funktion via sklearn: y = -868.787 * x + 40575.036
Alpha: [ 40575.03556055]
Beta: [-868.7869183]
Training Set R² Score: 0.49
Test Set R² Score: 0.40

Die R²-Werte sind nicht gerade berauschend, und das erklärt sich auch leicht, wenn wir die Trainings- und Testdaten sowie die gelernte Funktionsgerade visualisieren:

Die Gerade lässt sich nicht wirklich gut durch diese Punktwolke legen, da letztere eher eine Kurve als eine Gerade bildet. Im Grunde könnte eine Gerade noch einigermaßen gut in den Bereich von 22 bis 43 mpg passen und vermutlich annehmbare Ergebnisse liefern. Die Wertebereiche darunter und darüber jedoch verzerren zu sehr und sorgen zudem dafür, dass die Gerade auch innerhalb des mittleren Bereiches zu weit nach oben verschoben ist (ggf. könnte hier eine Ridge-/Lasso-Regression helfen).

Richtig gute Vorhersagen über nicht-lineare Verhältnisse können jedoch nur mit einer nicht-linearen Regression erreicht werden.

Nicht-lineare Regression mit Scikit-Learn

Nicht-lineare Regressionsanalysen erlauben es uns, nicht-lineare korrelierende Werte-Paare als Funktion zu erlernen. Im folgenden Scatter-Plot sehen wir zum einen die gewohnte lineare Regressionsgerade (y = a * x + b) in rot, eine polinominale Regressionskurve dritten Grades (y = a * x³ + b * x² + c * x + d) in violet sowie einen Entscheidungsweg einer Entscheidungsbaum-Regression in gelb.

Nicht-lineare Regressionsanalysen passen sich dem Verlauf der Punktwolke sehr viel besser an und können somit in der Regel auch sehr gute Vorhersageergebnisse liefern. Ich ziehe hier nun jedoch einen Gedankenstrich, liefere aber den Quellcode für die lineare Regression als auch für die beiden nicht-linearen Regressionen mit:

Python Script Regression via Scikit-Learn

Weitere Anmerkungen

  • Bibliotheken wie Scitkit-Learn erlauben es, machinelle Lernverfahren schnell und unkompliziert anwenden zu können. Allerdings sollte man auch verstehen, wei diese Verfahren im Hintergrund mathematisch arbeiten. Diese Bibliotheken befreien uns also nicht gänzlich von der grauen Theorie.
  • Statt der “reinen” lineare Regression (LinearRegression()) können auch eine Ridge-Regression (Ridge()), Lasso-Regression (Lasso()) oder eine Kombination aus beiden als sogenannte ElasticNet-Regression (ElasticNet()). Bei diesen kann über Parametern gesteuert werden, wie stark Ausreißer in den Daten berücksichtigt werden sollen.
  • Vor einer Regression sollten die Werte skaliert werden, idealerweise durch Standardisierung der Werte (sklearn.preprocessing.StandardScaler()) oder durch Normierung (sklearn.preprocessing.Normalizer()).
  • Wir haben hier nur zwei-dimensional betrachtet. In der Praxis ist das jedoch selten ausreichend, auch der Fahrzeug-Preis ist weder von der Motor-Leistung, noch von dem Kraftstoffverbrauch alleine abhängig – Es nehmen viele Größen auf den Preis Einfluss, somit benötigen wir multivariate Regressionsanalysen.

Process Mining: Innovative Analyse von Datenspuren für Audit und Forensik

Step-by-Step:

Neue Möglichkeiten zur Aufdeckung von Compliance-Verstößen mit Process Analytics

Im Zuge der fortschreitenden Digitalisierung findet derzeit ein enormer Umbruch der alltäglichen Arbeit hin zur lückenlosen Erfassung aller Arbeitsschritte in IT-Systemen statt. Darüber hinaus sehen sich Unternehmen mit zunehmend verschärften Regulierungsanforderungen an ihre IT-Systeme konfrontiert.

Der unaufhaltsame Trend hin zur vernetzten Welt („Internet of Things“) wird die Möglichkeiten der Prozesstransparenz noch weiter vergrößern – jedoch werden bereits jetzt viele Prozesse im Unternehmensbereich über ein oder mehrere IT-Systeme erfasst. Jeder Mitarbeiter, aber auch jeder automatisiert ablaufende Prozess hinterlässt viele Datenspuren in IT-Backend-Systemen, aus denen Prozesse rückwirkend oder in Echtzeit nachgebildet werden können. Diese umfassen sowohl offensichtliche Prozesse, wie etwa den Eintrag einer erfassten Bestellung oder Rechnung, als auch teilweise verborgene Prozesse, wie beispielsweise die Änderung bestimmter Einträge oder Löschung dieser Geschäftsobjekte. 


english-flagRead this article in English:
“Process Analytics – Data Analysis for Process Audit & Improvement”


1 Das Verständnis von Process Analytics

Process Analytics ist eine datengetriebene Methodik der Ist-Prozessanalyse, die ihren Ursprung in der Forensik hat. Im Kern des dieser am Zweck orientierten Analyse steht das sogenannte Process Mining, eine auf die Rekonstruktion von Prozessen ausgerichtetes Data Mining. Im Zuge der steigenden Bedeutung der Computerkriminalität wurde es notwendig, die Datenspuren, die potenzielle Kriminelle in IT-Systemen hinterließen, zu identifizieren und zu analysieren, um das Geschehen so gut wie möglich zu rekonstruieren.

Mit dem Trend hin zu Big Data Analytics hat Process Analytics nicht nur neue Datengrundlagen erhalten, sondern ist als Analysemethode weiterentwickelt worden. Zudem ermöglicht die Visualisierung dem Analysten oder Berichtsempfänger ein tief gehendes Verständnis auch komplexerer Geschäftsprozesse.

Während in der konventionellen Prozessanalyse vor allem Mitarbeiterinterviews und Beobachtung der Mitarbeiter am Schreibtisch durchgeführt werden, um tatsächlich gelebte Prozesse zu ermitteln, ist Process Analytics eine führende Methode, die rein faktenbasiert und damit objektiv an die Prozesse herangeht. Befragt werden nicht die Mitarbeiter, sondern die IT-Systeme, die nicht nur alle erfassten Geschäftsobjekte tabellenorientiert abspeichern, sondern auch im Hintergrund – unsichtbar für die Anwender – jegliche Änderungsvorgänge z. B. an Bestellungen, Rechnungen oder Kundenaufträgen lückenlos mit einem Zeitstempel (oft Sekunden- oder Millisekunden-genau) protokollieren.

2 Die richtige Auswahl der zu betrachtenden Prozesse

Heute arbeitet nahezu jedes Unternehmen mit mindestens einem ERP-System. Da häufig noch weitere Systeme eingesetzt werden, lässt sich klar herausstellen, welche Prozesse nicht analysiert werden können: Solche Prozesse, die noch ausschließlich auf Papier und im Kopf der Mitarbeiter ablaufen, also typische Entscheiderprozesse auf oberster, strategischer Ebene, die nicht in IT-Systemen erfasst und dementsprechend nicht ausgewertet werden können. Operative Prozesse werden hingegen in der Regel nahezu lückenlos in IT-Systemen erfasst und operative Entscheidungen protokolliert.

Zu den operativen Prozessen, die mit Process Analytics sehr gut rekonstruiert und analysiert werden können und gleichermaßen aus Compliance-Sicht von höchstem Interesse sind, gehören beispielsweise Prozesse der:

  • Beschaffung
  • Logistik / Transport
  • Vertriebs-/Auftragsvorgänge
  • Gewährleistungsabwicklung
  • Schadensregulierung
  • Kreditgewährung

Process Analytics bzw. Process Mining ermöglicht unabhängig von der Branche und dem Fachbereich die größtmögliche Transparenz über alle operativen Geschäftsprozesse. Für die Audit-Analyse ist dabei zu beachten, dass jeder Prozess separat betrachtet werden sollte, denn die Rekonstruktion erfolgt anhand von Vorgangsnummern, die je nach Prozess unterschiedlich sein können. Typische Vorgangsnummern sind beispielsweise Bestell-, Auftrags-, Kunden- oder Materialnummern.

3 Auswahl der relevanten IT-Systeme

Grundsätzlich sollte jedes im Unternehmen eingesetzte IT-System hinsichtlich der Relevanz für den zu analysierenden Prozess untersucht werden. Für die Analyse der Einkaufsprozesse ist in der Regel nur das ERP-System (z. B. SAP ERP) von Bedeutung. Einige Unternehmen verfügen jedoch über ein separates System der Buchhaltung (z.B. DATEV) oder ein CRM/SRM (z. B. von Microsoft), die dann ebenfalls einzubeziehen sind.

Bei anderen Prozessen können außer dem ERP-/CRM-System auch Daten aus anderen IT-Systemen eine entscheidende Rolle spielen. Gelegentlich sollten auch externe Daten integriert werden, wenn diese aus extern gelagerten Datenquellen wichtige Prozessinformationen liefern – beispielsweise Daten aus der Logistik.

4 Datenaufbereitung

Vor der datengetriebenen Prozessanalyse müssen die Daten, die auf Prozessaktivitäten direkt oder indirekt hindeuten, in den Datenquellen identifiziert, extrahiert und aufbereitet werden. Die Daten liegen in Datenbanktabellen und Server-Logs vor und werden über ein Data Warehousing Verfahren zusammengeführt und in ein Prozessprotokoll (unter den Process Minern i.d.R. als Event Log bezeichnet) umformuliert.

Das Prozessprotokoll ist in der Regel eine sehr große und breite Tabelle, die neben den eigentlichen Prozessaktivitäten auch Parameter enthält, über die sich Prozesse filtern lassen, beispielsweise Informationen über Produktgruppen, Preise, Mengen, Volumen, Fachbereiche oder Mitarbeitergruppen.

5 Prüfungsdurchführung

Die eigentliche Prüfung erfolgt visuell und somit intuitiv vor einem Prozessflussdiagramm, das die tatsächlichen Prozesse so darstellt, wie sie aus den IT-Systemen extrahiert werden konnten.

Process Mining – Beispielhafter Process Flow mit Fluxicon Disco (www.fluxicon.com)

Das durch die Datenaufbereitung erstellte Prozessprotokoll wird in eine Datenvisualisierungssoftware geladen, die dieses Protokoll über die Vorgangsnummern und Zeitstempel in einem grafischen Prozessnetzwerk darstellt. Die Prozessflüsse werden also nicht modelliert, wie es bei den Soll-Prozessen der Fall ist, sondern es „sprechen“ die IT-Systeme.

Die Prozessflüsse werden visuell dargestellt und statistisch ausgewertet, so dass konkrete Aussagen über die im Hinblick auf Compliance relevante Prozess-Performance und -Risiken getroffen werden können.

6 Abweichung von Soll-Prozessen

Die Möglichkeit des intuitiven Filterns der Prozessdarstellung ermöglicht auch die gezielte Analyse von Ist-Prozessen, die von den Soll-Prozessverläufen abweichen.

Die Abweichung der Ist-Prozesse von den Soll-Prozessen wird in der Regel selbst von IT-affinen Führungskräften unterschätzt – mit Process Analytics lassen sich nun alle Abweichungen und die generelle Prozesskomplexität auf ihren Daten basierend untersuchen.

6 Erkennung von Prozesskontrollverletzungen

Die Implementierung von Prozesskontrollen sind Bestandteil eines professionellen Internen Kontrollsystems (IKS), die tatsächliche Einhaltung dieser Kontrollen in der Praxis ist jedoch häufig nicht untersucht oder belegt. Process Analytics ermöglicht hier die Umgehung des Vier-Augen-Prinzips bzw. die Aufdeckung von Funktionstrennungskonflikten. Zudem werden auch die bewusste Außerkraftsetzung von internen Kontrollmechanismen durch leitende Mitarbeiter oder die falsche Konfiguration der IT-Systeme deutlich sichtbar.

7 Erkennung von bisher unbekannten Verhaltensmustern

Nach der Prüfung der Einhaltung bestehender Kontrollen, also bekannter Muster, wird Process Analytics weiterhin zur Neuerkennung von bislang unbekannten Mustern in Prozessnetzwerken, die auf Risiken oder gar konkrete Betrugsfälle hindeuten und aufgrund ihrer bisherigen Unbekanntheit von keiner Kontrolle erfasst werden, genutzt. Insbesondere durch die – wie bereits erwähnt – häufig unterschätzte Komplexität der alltäglichen Prozessverflechtung fallen erst durch diese Analyse Fraud-Szenarien auf, die vorher nicht denkbar gewesen wären. An dieser Stelle erweitert sich die Vorgehensweise des Process Mining um die Methoden des maschinellen Lernens (Machine Learning), typischerweise unter Einsatz von Clustering, Klassifikation und Regression.

8 Berichterstattung – auch in Echtzeit möglich

Als hocheffektive Audit-Analyse ist Process Analytics bereits als iterative Prüfung in Abständen von drei bis zwölf Monaten ausreichend. Nach der erstmaligen Durchführung werden bereits Compliance-Verstöße, schwache oder gar unwirksame Kontrollen und gegebenenfalls sogar Betrugsfälle zuverlässig erkannt. Die Erkenntnisse können im Nachgang dazu genutzt werden, um die Schwachstellen abzustellen. Eine weitere Durchführung der Analyse nach einer Karenzzeit ermöglicht dann die Beurteilung der Wirksamkeit getroffener Maßnahmen.

In einigen Anwendungsszenarien ist auch die nahtlose Anbindung der Prozessanalyse mit visuellem Dashboard an die IT-Systemlandschaft zu empfehlen, so dass Prozesse in nahezu Echtzeit abgebildet werden können. Diese Anbindung kann zudem um Benachrichtigungssysteme ergänzt werden, so dass Entscheider und Revisoren via SMS oder E-Mail automatisiert über aktuellste Prozessverstöße informiert werden. Process Analytics wird somit zum Realtime Analytics.

Fazit

Process Analytics ist im Zuge der Digitalisieurng die hocheffektive Methodik aus dem Bereich der Big Data Analyse zur Aufdeckung Compliance-relevanter Tatbestände im gesamten Unternehmensbereich und auch eine visuelle Unterstützung bei der forensischen Datenanalyse.