Demo-PY3: Clusteranalyse "Automotive in 3D"

Die vorliegende Demo zeigt, wie eine Clusteranalyse mit Hilfe der Python-Bibliothek scikit-learn durchgeführt wird, hier am Beispiel eines Automobildatensatzes, der auch in Demo-PY4: Predictive Maintenance mit scikit-learn verwendet wird. In diesem Anwendungsfall werden die Cluster auf Basis von drei Merkmalen des Datensatzes erstellt und die Cluster-Zuordnung der Daten wird im 3 dimensionalen Raum visualisiert. Dazu wird das Toolkit mplot3d verwendet, dieses Toolkit erweitert die Bibliothek Matplotlib um Methoden zur Erstellung von 3D-Grafiken.

  Motivation

Für die Automobildaten wurden in Demo-PY4: Predictive Maintenance mit scikit-learn mittels eines Entscheidungsbaums diejenigen Merkmale / Sensordaten ermittelt, die am stärksten zu einem Ausfall des Motors beitragen.
Diese drei Merkmale werden nun herangezogen, um eine Clusteranalyse durchzuführen. Bei einer Clusteranalyse werden durch die Verwendung eines bestimmten Ähnlichkeits- bzw. Abstandsmaßes Gruppen/Cluster ähnlicher Merkmale gebildet. Anschließend können neue Daten anhand ihrer Merkmale den in der Analyse gebildeten Clustern zugeordnet werden.

Die Zuordnung zu den Clustern anhand der drei Merkmale wird danach im 3 dimensionalen Raum visualisiert und interpretiert.

1 Die Fragestellung

Aus den Ergebnissen der in Demo-PY4: Predictive Maintenance mit scikit-learn durchgeführten Analysen wurden drei Merkmale, die am stärksten zum Ausfall des Motors beitragen, ausgewählt: der Ansaugkrümmerdruck, die Drossel­klappen­stellung und die Katalysatortemperatur.
Die Frage, die mit einer Clusteranalyse beantwortet werden soll, lautet: Welche Clusterzuordnung der Motoren erfolgt bzgl. dieser drei Merkmale, die den stärksten Einfluss auf den Ausfall hatten?

2 Vorbereitung: Installation der Entwicklungsumgebung

Um Python-Programme schreiben zu können, verwendet man Entwicklungsumgebungen wie Visual Studio Code oder Jupyter Notebook. Zunächst sollte eine aktuelle Python-Installation von der Python-Webseite python.org heruntergeladen und installiert werden.
Anschließend muss Visual Studio Code von der Webseite des Anbieters code.visualstudio.com/ heruntergeladen und installiert werden. Alternativ kann Jupyter Notebook als Teil der Paketverwaltungsplattform Anaconda installiert werden.

Details zur Installation und Verwendung von Python und Visual Studio Code sind im Python-Tutorial beschrieben.

Die Details der Installation von Python und Anaconda sind in dem Abschnitt Vorbereitung: Installation von Python und Anaconda beschrieben.

Die Details der Verwendung von Jupyter Notebook ist in dem Tutorial Jupyter Notebook verwenden beschrieben, inkl. YouTube-Anleitung.

3 Clusteranalyse im 3 dimensionalen Raum

Über Programme öffnen wir die Jupyter Notebook-Anwendung und erstellen mit Hilfe des Menüpunkts "New" ein neues Python3-Notebook mit dem Namen elab2go-Demo-PY3_automotive. In dieses Notebook werden vier Codezellen eingefügt, die den üblichen Schritten bei der Erstellung einer Clusteranalyse entsprechen.

3-1 Importieren der Programmbibliotheken

In der ersten Codezelle des Jupyter Notebooks importieren wir die benötigten Programm­bibliotheken: Die in Demo-PY3 bereits vorgestellten Bibliotheken scikit-learn und sciPy, die die verwendeten Clustering-Algorithmen enthalten, sowie die aus Demo-PY2: Datenverwaltung mit Pandas bekannten Bibliotheken Pandas, Matplotlib und NumPy werden in Python mit Hilfe der import-Anweisung entweder komplett importiert oder mit Hilfe der from-import-Anweisung nur einzelne Funktionen der Programmbibliothek abgerufen. Zusätzlich wird in diesem Anwendungsfall das Toolkit mplot3d verwendet, das die Bibliothek Matplotlib um Methoden zur Erstellung von 3D-Grafiken erweitert.

Die erste Codezelle enthält insgesamt sieben Import-Anweisungen.

 import numpy as np
 import pandas as pd 
 import matplotlib.pyplot as plt
 import scipy.cluster.hierarchy as shc  
 import mpl_toolkits.mplot3d.axes3d as p3
 from sklearn.cluster import AgglomerativeClustering

3-2 Daten einlesen und verwalten

In der zweiten Codezelle werden Daten, die in der csv-Datei automotive_test_140.csv gespeichert sind, mit Hilfe der Funktion read_csv() der Pandas-Bibliothek eingelesen, siehe auch Demo-PY2: Datenverwaltung mit Pandas.

 # Lese CSV-Datei ein  
 file = 'automotive_test_140.csv'  
 df = pd.read_csv(file, header=0, sep = ";")
 
 # Auswahl der drei Merkmale in der Clusterananlyse
 merkmale = df.iloc[:,[6,7,23]].copy() ;  
 X = merkmale.to_numpy()  
 
 # Zeige die ersten 5 Daten zur Kontrolle an  
 merkmale.head(5)

Erläuterung des Codes:

Die Ausgabe nach Ausführung dieses Codeblocks sieht ähnlich aus wie abgebildet.


3-3 Clusteranalyse durchführen

Die Clusteranalyse erfolgt in zwei Schritten. Zunächst wird mit Hilfe eines Dendogramms die korrekte Anzahl an Clustern ermitteln, danach werden mit einem hierarchischen Clustering die Daten den Clustern zugeordnet.

Schritt 1: Clusterzahl mit Dendogramm ermitteln

Die Clusteranalyse beginnt mit der Erstellung eines Dendrogramms, dies ist ein Hilfsmittel, um die korrekte Anzahl der Cluster/Zentren herauszufinden. In Python wird ein Dendogramm mit der dendrogram-Funktion des cluster.hierarchy-Pakets der SciPy-Bibliothek durchgeführt.

 fig = plt.figure(figsize=(10, 7))
 ax = fig.add_axes([0.1,0.1,0.75,0.75])
 ax.set_title("Hierarchisches Cluster-Dendogramm mit 4 bis 5 Clustern")
 ax.set_xlabel("Distanz")
 ax.set_ylabel("Cluster")
 Z = shc.linkage(X, method='ward')
 dend = shc.dendrogram(Z)
 plt.savefig("dendogramm.svg, dpi=320, format="svg", bbox_inches='tight')

Erläuterung des Codes:

Die Ausgabe nach Ausführung dieses Codeblocks sieht ähnlich aus wie abgebildet. Das Dendrogramm zeigt das Vorhandensein von 4 oder 5 Clustern an. Die Information über die Anzahl der Cluster verwenden wir bei der Durchführung der Clusteranalyse, die im nächsten Schritt erfolgt.

Schritt 2: Clusteranalyse mit AgglomerativeClustering

Die detaillierte Clusteranalyse wird mittels der AgglomerativeClustering aus dem sklearn.cluster-Paket der scikit-learn-Bibliothek durchgeführt.

Die Anzahl der Cluster bzw. Zentren wird als n = 4 festgelegt. Das Vorhersagemodell model wird als Instanz der Klasse AgglomerativeClustering erstellt, mit den Argumenten n_clusters=n und linkage='ward', und danach die Methode fit() mit den Datenpunkten X als Parameter aufgerufen. Die Zuordnungen zu den Clustern werden für die Beobachtungen gespeichert und ausgegeben.

 print("Erstelle Modell für Hierarchisches Clustering ...")
 # Lege Clusteranzahl fest 
 n = 4 
 # Erstelle Vorhersagemodell model
 model = AgglomerativeClustering(n_clusters=n, linkage='ward').fit(X)
 # Gebe Zuordnungen zu Clustern aus
 zuordnung = model.labels_
 print("Anzahl Beobachtungen: %d" % zuordnung.size)
 print("Zuordnung der Beobachtungen zu Cluster-Zentren 0, 1, 2, 3:")
 print(zuordnung)

Die Ausgabe nach Ausführung dieses Codeblocks sieht ähnlich aus wie abgebildet. Das Array zuordnung ist folgendermaßen zu interpretieren: die erste Beobachtung ist im Cluster 0, die zweite im Cluster 3, und die letzte im Cluster 3.

3-4 Zuordnung der Daten zu den Clustern visualisieren

Die Ergebnis, d.h. die Zuordnung der Beobachtungen zu den vier möglichen Zentren/Clustern, wird als 3D-Plot dargestellt. Dazu wird das Toolkit mplot3d verwendet, dieses Toolkit erweitert die Bibliothek Matplotlib um Methoden zur Erstellung von 3D-Grafiken, z.B. um die Funktion Axes3D, die ein 3D-Grafikfenster erstellt.

 # Daten visualisieren  
 fig = plt.figure(figsize=(10, 7))  
 ax = fig.add_subplot(projection='3d')  
  
 for z in np.unique(zuordnung):  
    ax.scatter(X[zuordnung == z, 0], X[zuordnung == z, 1], X[zuordnung == z, 2],  
               color=plt.cm.jet(float(z) / np.max(zuordnung + 1)),  
               s=20, edgecolor='k')  
      
 plt.title('Clusterzuordnung der Motoren')  
 ax.set_xlabel('Ansaugkruemmerdruck')  
 ax.set_ylabel('Drossel­klappen­stellung')  
 ax.set_zlabel('Katalysatortemperatur')    
 plt.show()   

Erläuterung des Codes:

Die Ausgabe nach Ausführung dieses Codeblocks sieht ähnlich aus wie abgebildet.

4 Die Interpretation

Bei der Bildung und Visualisierung der vier Cluster fällt auf, dass

Die Visualisierung in 2-dimensionalen Grafiken Ansaugkrümmerdruck vs. Drossel­klappen­stellung, Ansaugkrümmerdruck vs. Katalysatortemperatur und Drossel­klappen­stellung vs. Katalysatortemperatur zeigen auch, dass es keinen direkten Zusammenhang zwischen der Katalysatortemperatur und den anderen beiden Variablen gibt. In der Grafik Ansaugkrümmerdruck vs. Drossel­klappen­stellung ist die Bildung der Cluster, wie sie die obige Analyse ergeben hat, ebenfalls zu erkennen: es besteht ein grafischer Zusammenhang/Abhängigkeit zwischen Ansaugkrümmerdruck niedrig und Drossel­klappen­stellung niedrig und Ansaugkrümmerdruck hoch und Drossel­klappen­stellung niedrig.

2D-Plot 1 2D-Plot 2 2D-Plot 3

Die Bildung der Cluster (orange und grün) spiegeln den funktionalen Zusammenhang zwischen den Bauteilen Ansaugkrümmer und Drosselklappe wieder. Eine Drosselklappe wird dazu verwendet, um den Ansaugkrümmerdruck und damit die Ansaugluftdichte zu regeln. Im Verbrennungsmotor, der wie eine Luftpumpe wirkt, wird die Luft oder Luft-Kraftstoff-Gemisch durch den Einlass ein und durch den Auslass heraus gedrückt. Der Durchfluss dieser Luftmasse oder des Gemisches hängt neben der Motorendrehzahl und dem Hubraum und eben auch von der Luftdichte des Ansaugkrümmers ab und damit indirekt von der Stellung der Drosselklappe.

Bei der Interpretation der Cluster spielen die beiden Zustände Leerlauf und Volllast eine Rolle. Bei Leerlauf sind die Drosselklappe und ein sogenannter Leerlaufschalter geschlossen. Erreicht der Öffnungswinkel einen vom Motorsteuergerät festgelegten Wert, startet der Volllastbereich und ein Volllastschalter wird geschlossen. Bei geschlossenem Volllastschalter wird die Kraftstoffeinspritzmenge erhöht, um bessere Leistungswerte zu erzielen. Die Widerstandswerte des Drosselklappensensors liegen bei geschlossener Drosselklappe (Leerlauf) z.B. bei 1190 Ohm bzw. 1.19 kohm, und bei geöffneter Drosselklappe (Volllast) z.B. bei 9200 Ohm bzw. 9.2 kohm.

Die beiden Cluster (orange und grün) beinhalten damit Motoren, deren Drosselklappen sich in geschlossenen (Leerlauf) oder leicht geöffneten Zustand (Anlassen eines Motors) befinden. Das Verhalten des Ansaugkrümmerdrucks während des Leerlaufs kann wie folgt beschrieben werden:
Die dicht geschlossene Drosselklappe drosselt den Luftdurchfluss aus der Umgebung, wenn der Motor Luftmasse von Ansaugkrümmer weg pumpt. Der kumulative Effekt ist eine Verringerung der Ansaugkrümmerluftdichte, was zu einem reduzierten Gesamtdruck im Vergleich zum Luftdruck führt (orangenes Cluster).

5 Weiterführende Fragen

Die Clusterbildung unabhängig von der Katalysatortemperatur zeigt, dass dieses Bauteil keinen direkten Einfluss auf die beiden anderen ausgewählten Bauteile/Merkmale Drossel­klappen­stellung und Ansaugkrümmerdruck hat. Da zum Katalysatorschutz aber je nach Abstimmung des Motormanagements die Einspritzmenge (und damit der Kraftstoffverbrauch) erhöht wird, um den Katalysator zu kühlen, wäre das Aufnehmen weiterer Merkmale, die damit in Zusammenhang stehen, für eine weiterführende Clusteranalyse sinnvoll.

Mögliche Merkmale aus dem Automobildatensatz für eine erweiterte Clusteranalyse sind die eingesetze Einspritzmenge in Kurzzeit, die eingesetze Einspritzmenge in Langzeit sowie der Kraftsstoffeinsatz. Aufgrund eines möglichen erhöhten Kraftstoffeinsatzes zum Katalysatorschutz ist auch das Merkmal der Kraftstoffdampfsäuberung, das zeigt wie gut der Katalysator arbeitet, eine sinnvolles Merkmal für eine Clusteranalyse im höher dimensionalen Raum.

Auch hinsichtlich weiterer Analysen in Bezug auf den Gesamtzustand des Motors, seiner Leistungsfähigkeit, einer möglichen Wartung oder eines Ausfalls spielt die Wirkung der Bauteile untereinander und ihr Zustand und ihre Wirkungsweise eine entscheidende Rolle.

Autoren, Tools und Quellen

Autoren:
 M.Sc. Anke Welz
 Prof. Dr. Eva Maria Kiss

Tools:

Quellen und weiterführende Links: