Data Mining mit der Oracle-Datenbank und Application Express

Data Mining beschäftigt sich bekanntlich mit dem Auffinden bislang unbekannter Zusammenhänge in Datenbeständen. Dazu werden statistische Methoden wie Naive Bayes, Support Vector Machines oder andere verwendet. Kaum bekannt ist, dass auch die Oracle-Datenbank mit Data Mining-Funktionalität ausgestattet ist - dieser Tipp stellt sie vor und zeigt auf, wie sie aus einer Application Express-Anwendung heraus genutzt werden kann. Hintergrundinformationen zum Thema finden Sie unter anderem im Wikipedia-Artikel "Data Mining".

Data Mining-Funktionalität in Oracle: Grundlagen

Die Data Mining-Funktionalität ist in den Kern der Oracle-Datenbank integriert - im Gegensatz zu spezieller Data Mining-Software müssen die Daten also nicht aus der Datenbank herausbewegt werden, um eine Analyse zu machen - alles geschieht direkt in der Datenbank. Da Data Mining-Analysen einerseits auf mitunter sehr großen Datenbeständen durchgeführt werden, andererseits teilweise aufwändige Datentransformationen nötig sind, ist das Arbeiten in der Datenbank hier von großem Vorteil.

Data Mining-Funktionalität in der Datenbank

Abbildung 1: Data Mining-Funktionalität in der Datenbank

Einer der wichtigsten Aspekte, den Data Mining in der Datenbank mit sich bringt, ist allerdings die Tatsache, dass das Data Mining-Modell in der Datenbank bekannt ist. Demnach können die Ergebnisse auch direkt im Online-Betrieb genutzt werden. Wenn bspw. mit einer Data Mining-Analyse ein Modell zur Klassifizierung von Kunden gefunden wurde, kann dieses Modell direkt auf neu erstellte Daten angewendet werden - ein neue Kunde wird also in dem Moment, in dem die Daten in die Datenbank gespeichert werden, klassifiziert.

Data Mining in der Oracle-Datenbank ist Teil der Data Mining Option; um die Funktion nutzen zu können, ist also die Lizensierung der Data Mining Option erforderlich.

Oracle stellt zur Nutzung der Data Mining-Funktionen eine Java- und eine PL/SQL-Programmierschnittstelle bereit - in diesem Tipp wird die Nutzung der PL/SQL-API mit Application Express vorgestellt. Daneben steht im Oracle Technet ein grafisches Werkzeug (Oracle Data Miner) zum Download bereit. Dieser Tipp wurde mit einer Oracle11g-Datenbank erstellen; Data Mining steht allerdings auch schon in Oracle9i und Oracle10g bereit.

Grafisches Werkzeug: Oracle Data Miner

Abbildung 2: Grafisches Werkzeug: Oracle Data Miner

Zunächst wird das recht einfache PL/SQL-Paket DBMS_PREDICTIVE_ANALYTICS vorgestellt - es erlaubt die Durchführung standardisierter Data Mining-Analysen ohne große Vorbereitungen. Anschließend wird auf die weitergehenden Möglichkeiten des Pakets DBMS_DATA_MINING eingegangen - damit können Data Mining-Analysen bis ins Detail parametrisiert werden.

Die wichtigste Voraussetzung für eine Data Mining-Analyse ist eine klar formulierte Aufgabenstellung. Als erstes Beispiel soll anhand eines Datenbestandes mit Informationen zu Kunden herausgefunden werden, welche Attribute welchen Einfluß (statistisch!) auf das Einkommen des Kunden haben ...

Data Mining mit Application Express nutzen: Vorbereitungen

Wenn Sie in einer Oracle11g-Datenbank arbeiten, benötigt Ihr APEX Parsing Schema das Privileg CREATE MINING MODEL zur Durchführung von Data Mining-Analysen.

Die Daten befinden sich im Beispielschema SH; wenn dieses Schema in Ihrer Datenbank nicht vorhanden ist, können Sie es mit dem Skript mksample.sql im Verzeichnis $ORACLE_HOME/demo/schema einspielen. Im Schema SH befinden sich unter anderem die Tabellen CUSTOMERS, SALES und PRODUCTS. Stellen Sie sicher, dass Ihr APEX Workspace Zugriffsrechte (SELECT-Privilegien) an der Tabelle CUSTOMERS hat. Spielen Sie anschließend folgendes SQL-Skript ein, um im APEX Parsing Schema die Tabelle CUSTOMERS_MINING zu erzeugen.

drop table customers_mining
/

create table customers_mining as 
  select 
    c.cust_id,
    cust_first_name || ' ' || cust_last_name cust_name,
    cust_gender,
    cust_income_level,
    cust_credit_limit,
    cust_year_of_birth,
    cust_marital_status
from sh.customers c 
/

Erzeugen Sie nun eine Application Express-Anwendung mit einer Berichtsseite - somit können Sie einen Blick auf die Daten werfen (Abbildung 3).

Mining-Daten in der Berichtsansicht

Abbildung 3: Mining-Daten in der Berichtsansicht

Data Mining ganz einfach: DBMS_PREDICTIVE_ANALYTICS

Nun führen wir eine erste Data Mining-Analyse auf den Testdaten durch - wir möchten wissen, welches der Attribute eines Kunden ("MARITAL_STATUS", "YEAR_OF_BIRTH", etc.) den (statistisch) stärksten Einfluß auf das Einkommen ("INCOME_LEVEL") hat. Dazu gibt es die Prozedur EXPLAIN im PL/SQL-Paket DBMS_PREDICTICVE_ANALYTICS.

Fügen Sie Ihrer Application Express also zunächst eine neue Schaltfläche mit Titel Analysieren zu. Bei Klick auf die Schaltfläche soll die Seite Weitergeleitet werden. Danach erzeugen Sie einen neuen Prozeß vom Typ PL/SQL. Er soll beim Weiterleiten der Seite (onSubmit) gestartet werden und folgenden PL/SQL-Code ausführen.

begin
  begin
    execute immediate 'drop table mining_ergebnis';
  exception
    when others then null;
  end;

  dbms_predictive_analytics.explain(
    data_table_name =>     'CUSTOMERS_MINING',
    explain_column_name => 'CUST_INCOME_LEVEL', 
    result_table_name =>   'MINING_ERGEBNIS',
    data_schema_name =>    '#OWNER#'
  );
end;

Achten Sie darauf, den Prozeß an eine Bedingung zu knüpfen; er soll natürlich nur dann ausgeführt werden, wenn die Schaltfläche geklickt wurde.

Die Prozedur DBMS_PREDICTIVE_ANALYTICS schreibt die Ergebnisse der Analyse in eine Tabelle - der Name der Tabelle wird als Parameter result_table_name übergeben und die Tabelle darf noch nicht existieren - aus diesem Grund versucht obiger Prozeßcode, sie vorher zu löschen.

Wenn Sie die Seite nun starten und auf die neue Schaltfläche klicken, sehen Sie zunächst noch nichts (Abbildung 4). Das liegt daran, dass die Ergebnisse des Data Minings nun in der Tabelle MINING_ERGEBNIS vorliegen; an der Oberfläche ist noch nicht passiert ...

Die Data Mining-Analyse wurde durchgeführt

Abbildung 4: Die Data Mining-Analyse wurde durchgeführt

Es bleibt die Visualisierung der Ergebnisse übrig: Erzeugen Sie also (je nach Geschmack) einen Bericht oder ein Diagramm auf die Tabelle MINING_ERGEBNIS - am besten knüpfen Sie die Darstellung an die Bedingung, dass die Tabelle vorhanden ist (Abbildung 5).

Bedingung für Ergebnisbericht: Die Tabelle MINING_ERGEBNIS muss existieren

Abbildung 5: Bedingung für Ergebnisbericht: Die Tabelle MINING_ERGEBNIS muss existieren

Das Ergebnis sieht dann in etwa wie in Abbildung 6 aus ...

Ergebnis der Data Mining-Analyse

Abbildung 6: Ergebnis der Data Mining-Analyse

Den größten Einfluß aus statistischer Sicht hat demnach das Attribut CUST_CREDIT_LIMIT. Bereits hier ist erkennbar, dass man fachliches Know How benötigt, um Data Mining-Ergebnisse interpretieren zu können. Denn das Kreditlimit ist wohl eher eine Folge des Einkommens und nicht dessen Ursache. Das "zweitwichtigste" Attribut YEAR_OF_BIRTH ist einleuchtend; in vielen Berufen ist es normal, dass mit dem Lebensalter die Einkommen steigen.

Die Prozeduren des Pakets DBMS_PREDICTIVE_ANALYTICS dienen der "Schnellanalyse"; die Prozedur EXPLAIN bietet keinen Parameter zum Einschließen oder Ausschließen von Attributen oder zum Festlegen des konkreten Algorithmus an - das ist allerdings mit dem Paket DBMS_DATA_MINING möglich - das Modell zur Vorhersage der Umsatzerwartung aufgrund gegebener Attribute erzeugen wir daher mit DBMS_DATA_MINING.

Data Mining im Detail mit DBMS_DATA_MINING

Wir setzen wieder auf dem Stand von Abbildung 3 auf. Erstellen Sie also ggfs. eine neue Anwendungsseite und kopieren Sie den Bericht mit den Mining-Daten auf diese.

Wenn Sie mit Oracle Data Mining arbeiten, werden Einstellungen vielfach nicht als Parameter zu einer PL/SQL-Prozedur übergeben, sondern aus Tabellen gelesen. So bspw. die Einstellung, welcher Algorithmus verwendet werden soll. Erstellen Sie sich also eine "Einstellungstabelle" a (Settings Table) im SQL Workshop mit folgendem Kommnado:

CREATE TABLE datamining_settings (
  setting_name  VARCHAR2(30),
  setting_value VARCHAR2(30)
);

In diesem Beispiel wollen wir mit dem Naive Bayes-Algorithmus arbeiten; die entsprechende Einstellung tätigen wir der Einfachheit halber nun ebenfalls im SQL Workshop (natürlich könnte man dies auch in die Oberfläche zur Anwendung einarbeiten, dies würde hier aber zu weit führen). Lassen Sie daher (ebenfalls im SQL Workshop) zusätzlich dieses Skript laufen.

BEGIN 
  -- SVM-Klassifizierung wird hier nicht verwendet:
  --
  -- INSERT INTO datamining_settings (setting_name, setting_value) VALUES
  --   (dbms_data_mining.algo_name, dbms_data_mining.ALGO_SUPPORT_VECTOR_MACHINES);

  INSERT INTO datamining_settings (setting_name, setting_value) VALUES
     (dbms_data_mining.algo_name, dbms_data_mining.ALGO_NAIVE_BAYES);

  -- Die folgende Einstellung (automatische Daten-Vorbereitung) funktioniert nur in Oracle11g

  INSERT INTO datamining_settings (setting_name, setting_value) VALUES
     (dbms_data_mining.prep_auto, dbms_data_mining.PREP_AUTO_ON);
END;
/

Navigieren Sie nun zurück zu Ihrer Anwendungsseite. Im Gegensatz zu vorhin möchten wir nun die Attribute, welche in die Analyse einbezogen werden, auswählen können. Um diese Einstellungen tätigen zu können, benötigen wir einige APEX-Formularelemente in einer neuen Region vom Typ HTML.

Beginnen Sie mit einer einfachen Auswahlliste (Element PX_TARGET_COL) zum Festlegen der abhängigen Variable (hier: TARGET_COLUMN). Verwenden Sie als Wertelistenabfrage folgendes SQL:

select column_name d, column_name r
from user_tab_columns
where table_name = 'CUSTOMERS_MINING'

Der Naive Bayes-Algorithmus erwartet (wie alle anderen Klassifizierungsalgorithemn) die Angabe der Case-ID bzw. des Primärschlüssels. Erzeugen Sie also eine entsprechende Auswahlliste (PX_ID_COL) - der Einfachheit halber nehmen Sie obiges SQL als Wertelistenabfrage. Hier haben wir es eigentlich mit abhängigen Auswahllisten (cascading LOV's) zu tun; wenn Sie eine intuitivere Oberfläche erstellen möchten, finden Sie in diesem Tipp Hinwiese zur Implementierung mit AJAX-Technologie.

Alle anderen Spalten können als unabhängige Variablen (input attributes) verwendet werden. Erstellen Sie also ein weiteres Element vom Typ Shuttle (PX_INPUT_COL) mit wiederum derselben SQL-Abfrage. Das vorläufige Ergebnis sollte dann wie in Abbildung 7 aussehen.

Parameter für die Data Mining-Analyse

Abbildung 7: Parameter für die Data Mining-Analyse

Es fehlt noch ein letzter Parameter: Wir möchten die Daten in eine Trainingsmenge und eine Testmenge unterteilen können. Mit der Trainingsmenge erstellen wir das Modell, mit der Testmenge wird später die Güte des gefundenen Modells geprüft: Man lässt das Modell die Fälle schätzen, die man schon kennt - anhand der Differenzen kann das Modell beurteilt werden.

Erzeugen Sie also ein einfaches Texteingabefeld (PX_TRAINING), in welches man einen Prozentwert eingeben kann. Fügen Sie zum Abschluß noch eine Schaltfläche zum Absenden hinzu.

Alle Parameter für die Data Mining-Analyse

Abbildung 8: Alle Parameter für die Data Mining-Analyse

Mit Klick auf die Schaltfläche geht es los: Anhand der ausgewählten Spalten und der Angabe für die Trainingsmenge werden zunächst zwei Views erzeugt - eine repräsentiert die Trainingsmenge - die andere die Testmenge. Der Code generiert mit den in den Auswahllisten und dem Shuttle-Element ausgewählten Tabellenspalten zwei CREATE VIEW -Kommandos und führt sie mit EXECUTE IMMEDIATE aus. Anschließend wird mit der Prozedur DBMS_DATA_MINING.CREATE_MODEL das Data Mining-Modell erzeugt.

Erstellen Sie also einen neuen Prozeß mit Namen Mining Modell erstellen und hinterlegen Sie folgenden PL/SQL-Code.

declare
  v_sql          varchar2(4000);
  v_table        varchar2(30)   := 'CUSTOMERS_MINING';
  v_mining_model varchar2(20)   := 'DM_APEX';
  v_random_seed  number;
begin
  v_random_seed := trunc(dbms_random.value(0, 4294967295));

  /* View zum Abgrenzen der Trainingsmenge erstellen */

  v_sql :=          'create or replace view '||v_mining_model||'_TRAIN as ';
  v_sql := v_sql || 'select '||:P1_ID_COL||', '||:P1_TARGET_COL||', '|| replace(:P1_INPUT_COL, ':', ',') || ' ';
  v_sql := v_sql || 'from '||v_table||' sample('||:P1_PERCENT_TRAINING||') seed ('||v_random_seed||')';
  execute immediate v_sql;

  /* View zum Abgrenzen der Testmenge erstellen */

  v_sql :=          'create or replace view '||v_mining_model||'_TEST as ';
  v_sql := v_sql || 'select '||:P1_ID_COL||', '||:P1_TARGET_COL||', '|| replace(:P1_INPUT_COL, ':', ',') || ' ';
  v_sql := v_sql || 'from '||v_table||' minus (select * from '||v_mining_model||'_TRAIN)';

  execute immediate v_sql;

  /* evtl. vorhandenes Data Mining-Modell löschen */
  begin
    dbms_data_mining.drop_model(
      model_name          => v_mining_model
    );
  exception
    when others then null;
  end;

  /* Data Mining-Modell erstellen */

  dbms_data_mining.create_model(
    model_name          => v_mining_model
   ,mining_function     => DBMS_DATA_MINING.CLASSIFICATION
   ,data_table_name     => v_mining_model||'_TRAIN'
   ,case_id_column_name => :P1_ID_COL
   ,target_column_name  => :P1_TARGET_COL
   ,settings_table_name => 'DATAMINING_SETTINGS'
  );
end;

Achten Sie darauf, dass der Prozeß nur ausgeführt wird, wenn die Schaltfläche geklickt wurde. Fügen Sie der Seite nun noch einen weiteren Bericht für die bereits vorhandenen Data Mining-Modelle hinzu - hinterlegen Sie dazu folgendes SQL:

select 
  model_name, 
  mining_function, 
  algorithm, 
  creation_date
from user_mining_models 

Starten Sie die Seite nun, wählen Sie die Zielspalte (TARGET_COLUMN), die Fall-ID-Spalte (CUST_ID) und die in die Analyse einzubeziehenden Attribute ein und klicken Sie die Schaltfläche. Sie sollten dann folgendes Bild erhalten ...

Ein Data Mining-Modell wurde erstellt

Abbildung 9: Ein Data Mining-Modell wurde erstellt

Doch was tut man nun damit?

Der nächste Schritt wäre das Anwenden auf den Testdatenbestand (welcher durch den PL/SQL-Prozeß als View von der Trainingsmenge abgegrenzt wurde), das Ermitteln von Kennzahlen und die Bewertung des gefundenen Modells. Diese Themen werden mitsamt einem weiteren Algorithmus (Decision Tree) in einem der nächsten Community-Tipps behandelt. Dieser Tipp schließt mit der konkreten Anwendung des Data Mining-Modells.

Nutzung des gefundenen Data Mining-Modells

Das erstellte Data Mining-Modell kann nun genutzt werden, um anhand gegebener Attribute eine Abschätzung zu liefern. Dazu dienen die SQL-Funktionen PREDICTION und PREDICTION_PROBABILITY. Einen ersten Test können Sie bereits im SQL Workshop durchführen.

with customer as (
  SELECT 
    'M'      cust_gender,
    1953     cust_year_of_birth,
    'single' cust_marital_status
  from dual
) 
select 
  prediction(dm_apex using 
    cust_gender,  
    cust_year_of_birth, 
    cust_marital_status
  ) schaetzung,
  prediction_probability(dm_apex using 
    cust_gender, 
    cust_year_of_birth, 
    cust_marital_status
  ) wahrscheinlichkeit
from customer

Sie sehen in etwa folgende Ausgabe ...

Nutzung des Data Mining Modells: Online-Schätzung

Abbildung 10: Nutzung des Data Mining Modells: Online-Schätzung

Spielen Sie ein wenig mit den Eingabeattributen herum; Sie werden feststellen, dass Sie mit anderen Attributen andere Schätzungen bekommen. Die Funktion PREDICTION_PROBABILITY gibt Ihnen eine Einschätzung über die statistische Sicherheit der jeweiligen Abschätzung.

Dieser Funktionalität kann nun beliebig in Application Express-Prozesse oder Formulare eingebaut werden ...

Nutzung des Data Mining Modells: Online-Schätzung in einer APEX-Anwendung

Abbildung 11: Nutzung des Data Mining Modells: Online-Schätzung in einer APEX-Anwendung

Damit ist das Thema Data Mining noch lange nicht abgeschlossen - man kann nun darüber nachdenken ...

  • Zunächst die Güte des gefundenen Modells zu überprüfen; dies wird in einem der nächsten Community-Tipps betrachtet.
  • Einen anderen Algorithmus zu verwenden (bspw. Support Vector Machines oder Decision Trees)
  • Die Daten anders aufzubereiten; so könnte das Einteilen des Attributs Geburtsjahr in wenige Klassen zu anderen (vielleicht besseren?) Ergebnissen bei der Abschätzung führen

Weitere Informationen zum Thema:

Zurück zur Community-Seite