diff --git a/Agriculture/Analysis of the movement and activity of free-ranging cattle/notebook.ipynb b/Agriculture/Analysis of the movement and activity of free-ranging cattle/notebook.ipynb index 1ae0f8518a063381dd47fd58fec2ed8ba4708352..29f109b5a1cd05d6377b52550630e437abdc80d8 100644 --- a/Agriculture/Analysis of the movement and activity of free-ranging cattle/notebook.ipynb +++ b/Agriculture/Analysis of the movement and activity of free-ranging cattle/notebook.ipynb @@ -1,11 +1,95 @@ { "cells": [ { - "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ - "# Analyse der Bewegung und Aktivität von freilaufenden Rindern" + "# Analyse der Bewegung und Aktivität von freilaufenden Rindern (Deutschsprachige Version) \n", + "\n", + "## Geschäftsverständnis\n", + "Landwirte geraten immer weiter unter wirtschaftlichen Druck. Beispielsweise kam \n", + "es durch die Coronapandemie zu teuren logistischen Problemen. Gleichzeitig\n", + "stellen immer mehr Konsumenten höhere Anforderungen an eine artgerechte \n", + "Tierhaltung. Diese Marktbedingungen erscheinen für Landwirte problematisch, \n", + "da letzterer Aspekt natürlich mit gewissen Kosten verbunden ist und ein \n", + "generelles Umdenken notwendig macht.\n", + "Durch neue Technologien wie z.B. Künstliche Intelligenz und der Verwendung \n", + "von Sensoren können die Prozesse effizienter gestaltet und gleichzeitig die \n", + "Anforderungen des Tierschutzes besser erfüllt werden.\n", + "Ein Problem der Landwirte ist, dass sie ihre Tiere nicht gezielt bzw. individuell \n", + "umsorgen können. Das Wissen darüber, welche Aktivitäten z.B. besonderen \n", + "Einfluss auf die Milchproduktion oder Fleischqualität haben, kann bisher nicht \n", + "umfänglich erfasst werden. Somit sind auch keine gezielten Maßnahmen zur \n", + "Förderung bestimmter Aktivitäten möglich. Denkbare Maßnahmen wären die\n", + "gezielte Motivation zu mehr Bewegung einzelner Tiere oder die Optimierung der \n", + "Zucht. Bisher ist es jedoch schwierig kontinuierliche Aktivitätsprofile der Tiere zu \n", + "erstellen.\n", + "Ein weiteres Problem der Landwirte ist, dass eine frühzeitige Erkennung von\n", + "Veränderungen des Gesundheitszustandes einzelner Tiere oft nicht möglich ist.\n", + "Zwar ist die regelmäßige Kontrolle des Zustandes einer Herde rechtlich \n", + "vorgeschrieben, jedoch können gerade in größeren Betrieben auf Grund der \n", + "großen Anzahl an Tieren, gesundheitliche Veränderungen erst spät erkannt\n", + "werden. Oft bleibt im Krankheitsfall nur die Behandlung mit Antibiotika oder \n", + "anderen teuren Medikamenten. Gewissen Verhaltensänderungen können jedoch \n", + "frühzeitig erste Hinweise liefern. Gesunde Rinder beispielsweise bewegen sich \n", + "normalerweise recht viel und reduzieren ihre Aktivität, wenn sie erste \n", + "Krankheitszeichen entwickeln. Eine frühe Erkennung dieser \n", + "Bewegungsreduzierung wäre von großer Bedeutung für einen Landwirt.\n", + "Healthy Cattle plant, zur Lösung der oben genannten Probleme, eine \n", + "Aktivitätsklassifizierung zur Erstellung von Aktivitätsprofilen und zur frühzeitigen\n", + "Erkennung von Krankheiten zu entwickeln. Die Hypothese ist, dass mit Hilfe von \n", + "typischen Sensoren eines Smartphones und der Verwendung eines Machine \n", + "Learning Algorithmus, die Aktivitäten klassifiziert werden können.\n", + "Healthy Cattle möchte für die geplante Lösung zunächst testen, ob mit Hilfe von \n", + "typischen Sensoren eines Smartphones eine ausreichend genaue Klassifizierung \n", + "von Aktivitäten möglich ist. Um dies möglichst kostengünstig testen zu können, \n", + "werden für einen ersten Prototypen keine eigenen Daten verwendet, sondern im \n", + "Internet zugängliche Daten aus einem ähnlichen Setup genutzt. \n", + "\n", + "## Datenverständnis\n", + "Der Datensatz dieser Hausarbeit stammt von Anguita, Ghio et al. und wurde \n", + "abgerufen von Kaggle.com unter: https://www.kaggle.com/uciml/human-activity-recognition-with-smartphones.\n", + "Der Original Datensatz ist auf https://archive.ics.uci.edu/ml/datasets/human+activity+recognition+using+smartphones.\n", + "In einem Experiment haben 30 Probanden mit einem auf Hüfthöhe befestigten \n", + "Smartphone einen festgelegten Bewegungsablauf durchgeführt. Dabei wurden \n", + "mit Hilfe der verbauten Sensoren die linearen Beschleunigungs- und \n", + "Winkelgeschwindigkeitssignale auf jeweils drei Achsen erfasst. Die einzelnen \n", + "Datenpunkte wurden je nach Aktivität klassifiziert bzw. gelabelt. Durch \n", + "verschiedene Filterverfahren wurden diese anschließend von Rauschen befreit\n", + "und weitere zeit- der frequenzbezogene Features extrahiert. Aus diesen wurden \n", + "weitere Features wie z.B. Mittelwert, Standardabweichung, Minimal- und \n", + "Maximalwert, Median usw. berechnet.\n", + "Das zu Grunde gelegte Machine Learning Problem ist in den Bereich Supervised \n", + "Learning einzuordnen, da auf gelabelten Daten gelernt wird. Jeder Datenpunkt \n", + "im Datensatz besitzt eine Reihe von Features - berechnet aus der Sensorwerten - und ein Target - die Aktivitätsklasse.\n", + "Der zur Verfügung stehende Datensatz besteht aus 10299 Beobachtungen \n", + "(Observations). Es gibt keine fehlenden Werte und es existieren auch keine \n", + "Duplikate.\n", + "Die Anzahl der Features ist sehr groß, was eine umfängliche Analyse der \n", + "einzelnen Features stark erschwert. Eine grafische Überprüfung auf \n", + "Multikollinearität mit Hilfe der Korrelationsmatrix ist deshalb nicht sinnvoll. Eine \n", + "Überprüfung des Variance Inflation Factor (VIF) ergibt, dass sehr viele Features \n", + "mit einem VIF>10 eine hohe Multikollinearität aufweisen (siehe Tabelle). Eine \n", + "hohe Multikollinearität hat negative Auswirkungen auf die Interpretierbarkeit der \n", + "später erstellten Modelle.\n", + "\n", + "## Datenvorbereitung\n", + "\n", + "Die Datenvorbereitung ist ein entscheidender Schritt, der eine gründliche Bereinigung, Transformation und Feature-Engineering umfasst. Dies beinhaltet:\n", + "\n", + "Extraktion relevanter Merkmale wie demografische Daten, Kaufhistorie, Produktkategorien und Verhaltensmuster.\n", + "Bereinigung fehlender oder fehlerhafter Daten durch Imputation oder Entfernung von Datensätzen.\n", + "Feature Engineering zur Erstellung neuer Merkmale wie RFM-Analyse (Recency, Frequency, Monetary) zur Bewertung der Kundenwertigkeit und Kunden-Segmentierung zur Identifizierung von Marktsegmenten.\n", + "\n", + "## Modellierung und Auswertung\n", + "\n", + "Hier werden verschiedene Modelle erstellt und evaluiert, um Vorhersagen über die Aktivität der Rinder zu treffen. \n", + "Es werden verschiedene Algorithmen wie K-Nearest Neighbors, Random Forest, Logistische Regression, Entscheidungsbaum und Support Vector Machine verwendet. \n", + "Die Modelle werden mittels GridSearchCV optimiert und anhand verschiedener Metriken wie Genauigkeit bewertet.\n", + "\n", + "## Bereitstellung\n", + "\n", + "Ergänzung um eine Bereitstellungsmöglichkeit, z. B. die Entwicklung einer Webanwendung oder einer API, die es Landwirten ermöglicht, die entwickelten Modelle zur Vorhersage der Rinderaktivität in Echtzeit zu nutzen." ] }, { @@ -27,11 +111,11 @@ ] }, { - "metadata": {}, "cell_type": "code", - "outputs": [], "execution_count": null, - "source": "" + "metadata": {}, + "outputs": [], + "source": [] }, { "cell_type": "code", @@ -10325,7 +10409,7 @@ -0.8772165265225742, -0.33611357566589267, 1.1438527693225131, - -6.093960239723312E-4, + -0.0006093960239723312, -0.25499931347441623, -0.9459892452603264, -2.9577175357366103, @@ -21835,7 +21919,7 @@ 0.5815860871081596, 0.17430419576457676, 0.11868886464960451, - -2.9703191948931535E-7, + -2.9703191948931535e-07, -0.5563797218747201, 0.28398116849187127, 0.500455311202338, @@ -29540,11 +29624,12 @@ } ], "metadata": { + "category": "Agriculture", "interpreter": { "hash": "aab7ff84f4433dd8b68de441cd3c658d57659112bcb62d3bd6aa325045009f13" }, "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -29558,10 +29643,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.4" + "version": "3.8.9" }, - "title": "Analysis of the movement and activity of free-ranging cattle", - "category": "Agriculture" + "title": "Analysis of the movement and activity of free-ranging cattle" }, "nbformat": 4, "nbformat_minor": 4 diff --git a/Automotive/Improvement of components for autonomous motor vehicles/notebook.ipynb b/Automotive/Improvement of components for autonomous motor vehicles/notebook.ipynb index b2a023336fe474aeedc98fc2fb236ad1a29db537..0c6804668d5f11d2fe0c4c744b22c5ddff022a94 100644 --- a/Automotive/Improvement of components for autonomous motor vehicles/notebook.ipynb +++ b/Automotive/Improvement of components for autonomous motor vehicles/notebook.ipynb @@ -1,18 +1,48 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Geschäftsverständnis\n", + "Diese Fallstudie soll Technologieunternehmen bei der Entwicklung und Verbesserung von Komponenten für autonome Fahrzeuge unterstützen. Dabei wirft diese Fallstudie die Frage auf: In welchen Bereichen liegen die Schwächen der getesteten Systeme und wie lassen sich diese einordnen? Die Frage wird beantwortet, indem die Gründe für den Eingriff des menschlichen Testfahrers in das System klassifiziert werden. Dabei sollen die Gründe in verschiedene Kategorien eingeteilt werden:\n", + " - Software-Probleme\n", + " - Hardware-Probleme\n", + " - Software- und Hardwareprobleme (Probleme, die in Kombination auftreten)\n", + " - Probleme, die durch Objekte der Verkehrssteuerung verursacht werden (z. B. Fehlfunktionen von Lichtsignalanlagen)\n", + " - Probleme, die durch andere Verkehrsteilnehmer verursacht werden\n", + " - äußere Einflüsse (einschließlich z. B. Blockaden, verborgene Elemente, Wetter- und Straßenbedingungen)\n", + "sonstige Probleme\n", + "\n", + "## Datenverständnis\n", + "Der zugrundeliegende Datensatz stammt von Kaggle https://www.kaggle.com/art12400/2019-autonomous-vehicle-disengagement-reports und zeigt notwendige Eingriffe eines Fahrers in autonom fahrende Fahrzeugtechnologie. Er wurde vom 1. Dezember 2018 bis zum 30. November 2019 aufgezeichnet und ist unter U.S. Government Works lizenziert. Die Datenverarbeitung erfolgt mit Hilfe eines Jupyter-Notebooks, das in der populärsten Data-Science-Plattform \"Anaconda\" enthalten ist. Der Datensatz liegt im Format 8885 x 9 vor. \n", + "\n", + "## Datenaufbereitung\n", + "Der wichtigste Teil des Data Mining ist die Aufbereitung der Daten, die im Folgenden vorgenommen wird.\n", + "Die erste Analyse zeigt, dass der Datensatz hauptsächlich aus kategorischen Werten besteht. Darüber hinaus sind die Spaltennamen sehr lang und enthalten zu viele Informationen.\n", + "\n", + "## Modellierung und Auswertung\n", + "Es wurden zwei Modelle verwendet: Entscheidungsbaum und K-Nearest-Neighbor-Algorithmus. Die Leistung der Modelle wurde bewertet, und die Ergebnisse wurden analysiert.\n", + "\n", + "## Bereitstellung\n", + "Die bereitgestellte Lösung zielt darauf ab, Software- und Hardwareprobleme vorherzusagen. Die Zielgruppe sind Unternehmen der Automobilindustrie.\n", + "Die implementierten Algorithmen sowie die Ergebnisse der Modelle wurden beschrieben und bewertet. Die Darstellung erfolgte in Form von Klassifikationsberichten, um die Leistung der Modelle zu beurteilen.\n", + "\n" + ] + }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ - "## 1. Business Understanding\u00b6\n", - "Diese Fallstudie soll Technologieunternehmen bei der Entwicklung und Verbesserung von Komponenten f\u00fcr autonome Fahrzeuge unterst\u00fctzen. Dabei wirft diese Fallstudie die Frage auf: In welchen Bereichen liegen die Schw\u00e4chen der getesteten Systeme und wie lassen sich diese einordnen? Die Frage wird beantwortet, indem die Gr\u00fcnde f\u00fcr den Eingriff des menschlichen Testfahrers in das System klassifiziert werden. Dabei sollen die Gr\u00fcnde in verschiedene Kategorien eingeteilt werden:\n", + "## 1. Business Understanding¶\n", + "Diese Fallstudie soll Technologieunternehmen bei der Entwicklung und Verbesserung von Komponenten für autonome Fahrzeuge unterstützen. Dabei wirft diese Fallstudie die Frage auf: In welchen Bereichen liegen die Schwächen der getesteten Systeme und wie lassen sich diese einordnen? Die Frage wird beantwortet, indem die Gründe für den Eingriff des menschlichen Testfahrers in das System klassifiziert werden. Dabei sollen die Gründe in verschiedene Kategorien eingeteilt werden:\n", "- Software Probleme\n", "- Hardware Probleme\n", "- Software und Hardware Probleme (Probleme, die in Kombination auftreten)\n", "- Probleme, die durch Objekte der Verkehrssteuerung verursacht werden (z. B. Fehlfunktionen von Lichtsignalanlagen)\n", "- Probleme, die durch andere Verkehrsteilnehmer verursacht werden\n", - "- \u00e4u\u00dfere Einfl\u00fcsse (einschlie\u00dflich z. B. Blockaden, verborgene Elemente, Wetter- und Stra\u00dfenbedingungen)\n", + "- äußere Einflüsse (einschließlich z. B. Blockaden, verborgene Elemente, Wetter- und Straßenbedingungen)\n", "- sonstige Probleme" ] }, @@ -21,16 +51,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 2. Daten und Datenverst\u00e4ndnis \n", - "Der zugrundeliegende Datensatz wurde von Kaggle bezogen und zeigt notwendige Eingriffe eines Fahrers in autonom fahrende Fahrzeugtechnologie. Er wurde vom 1. Dezember 2018 bis zum 30. November 2019 aufgezeichnet und steht unter der Lizenz von U.S. Government Works. Die Datenverarbeitung erfolgt mit Hilfe eines Jupyter-Notebooks, das in der popul\u00e4rsten Data-Science-Plattform \"Anaconda\" enthalten ist. Der Datensatz liegt im Format 8885 x 9 vor. Die folgenden Daten wurden erfasst:\n", + "## 2. Daten und Datenverständnis \n", + "Der zugrundeliegende Datensatz wurde von Kaggle bezogen und zeigt notwendige Eingriffe eines Fahrers in autonom fahrende Fahrzeugtechnologie. Er wurde vom 1. Dezember 2018 bis zum 30. November 2019 aufgezeichnet und steht unter der Lizenz von U.S. Government Works. Die Datenverarbeitung erfolgt mit Hilfe eines Jupyter-Notebooks, das in der populärsten Data-Science-Plattform \"Anaconda\" enthalten ist. Der Datensatz liegt im Format 8885 x 9 vor. Die folgenden Daten wurden erfasst:\n", "- Hersteller\n", "- Zulassungsnummer\n", "- Datum\n", "- Fahrzeug-Identifikationsnummer\n", - "- M\u00f6glichkeit des Betriebs ohne Fahrer\n", + "- Möglichkeit des Betriebs ohne Fahrer\n", "- Ist ein Fahrer vor Ort?\n", "- Unterbrechung des autonomen Fahrens durch AV-System, Testfahrer, Fernsteuerung oder Beifahrer\n", - "- Ort des Vorfalls: Autobahn, Schnellstra\u00dfe, Landstra\u00dfe, Stra\u00dfe oder Parkplatz\n", + "- Ort des Vorfalls: Autobahn, Schnellstraße, Landstraße, Straße oder Parkplatz\n", "- Beschreibung der Ursachen" ] }, @@ -1712,7 +1742,7 @@ " </tr>\n", " </tbody>\n", "</table>\n", - "<p>5 rows \u00d7 4538 columns</p>\n", + "<p>5 rows × 4538 columns</p>\n", "</div>" ], "text/plain": [ @@ -1990,7 +2020,7 @@ " KNN_model = KNeighborsClassifier(n_neighbors=i)\n", " KNN_model.fit(x_train,y_train)\n", " KNN_prediction = KNN_model.predict(x_test)\n", - " error_rate.append(np.mean(KNN_prediction != y_test)) #nur Fehler ber\u00fccksichtigen\n", + " error_rate.append(np.mean(KNN_prediction != y_test)) #nur Fehler berücksichtigen\n", "\n", "plt.figure(figsize=(10,6))\n", "plt.plot(range(1,10),error_rate,color='blue', linestyle='dashed', marker='o',\n", @@ -2194,6 +2224,7 @@ } ], "metadata": { + "category": "Automotive", "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", @@ -2211,9 +2242,8 @@ "pygments_lexer": "ipython3", "version": "3.8.12" }, - "title": "Improvement of components for autonomous motor vehicles", - "category": "Automotive" + "title": "Improvement of components for autonomous motor vehicles" }, "nbformat": 4, "nbformat_minor": 2 -} \ No newline at end of file +} diff --git a/CRM/Customer Churn Prediction/notebook.ipynb b/CRM/Customer Churn Prediction/notebook.ipynb index 12ee14d6c715ded47131ccfe846d8b60085d1f42..15f5842532d49b1174abcbc6cd9144bcbba042ac 100644 --- a/CRM/Customer Churn Prediction/notebook.ipynb +++ b/CRM/Customer Churn Prediction/notebook.ipynb @@ -1,5 +1,33 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Geschäftsverständnis\n", + "Die Analyse zielt darauf ab, die Kundenabwanderung im Telekommunikationssektor vorherzusagen, um proaktiv Maßnahmen zur Kundenbindung zu ergreifen und potenzielle Abwanderungen zu minimieren. Dies trägt zur langfristigen Stabilität und Rentabilität des Unternehmens bei.\n", + "\n", + "## Datenverständnis\n", + "Im geschäftlichen Kontext basiert die Analyse auf dem Telco-Customer-Churn-Datensatz https://www.kaggle.com/datasets/blastchar/telco-customer-churn/suggestions?status=pending&yourSuggestions=true von Kaggle aus dem Jahr 2019, der von einem Telekommunikationsunternehmen bereitgestellt wurde und Kundenmerkmale sowie Vertragsinformationen umfasst, um die Kundenabwanderung vorherzusagen.\n", + "Der Datensatz enthält eine Vielzahl von Kundenattributen, darunter Vertragsdetails, demografische Merkmale und Service-Informationen. Mit insgesamt 21 Attributen bietet der Datensatz Einblicke in das Kundenverhalten und die Gründe für eine mögliche Abwanderung. Eine sorgfältige Analyse der Daten zeigt, dass die Dauer der Betriebszugehörigkeit (\"tenure\") und die Gesamtkosten (\"TotalCharges\") eine hohe positive Korrelation aufweisen, was darauf hinweist, dass Kunden mit längerer Betriebszugehörigkeit tendenziell höhere Gesamtkosten haben.\n", + "\n", + "## Datenaufbereitung\n", + "Die Datenaufbereitung ist ein kritischer Schritt, um sicherzustellen, dass die Daten für die Modellierung geeignet sind. \n", + "Dazu gehört die Reduzierung von Dimensionen, die Behandlung von fehlenden Daten und Ausreißern sowie die Umwandlung kategorialer Merkmale in numerische Werte. \n", + "Besonderes Augenmerk wird auch auf die Überprüfung von Multikollinearität gelegt, um sicherzustellen, dass die unabhängigen Variablen nicht stark miteinander korreliert sind.\n", + "\n", + "## Modellierung und Auswertung\n", + "\n", + "Für die Vorhersage der Kundenabwanderung wird eine logistische Regressionsanalyse durchgeführt. \n", + "Die logistische Regression ist ein leistungsstarkes statistisches Modell, das die Beziehung zwischen einer binären Zielvariable (in diesem Fall \"Churn\") und den unabhängigen Variablen modelliert. \n", + "Durch die Festlegung eines Schwellenwerts wird bestimmt, ob ein Kunde voraussichtlich abwandert oder nicht.\n", + "\n", + "## Bereitstellung \n", + "Das Modell hat das Potenzial, in bestehende Geschäftsprozesse integriert zu werden, um Unternehmen dabei zu unterstützen, proaktiv auf Kundenabwanderung zu reagieren. \n", + "Indem sie Kunden identifizieren, die voraussichtlich abwandern werden, können Unternehmen gezielte Maßnahmen ergreifen, um diese Kunden zu halten und die Kundenbindung zu stärken. \n", + "Dies kann dazu beitragen, Umsatzverluste zu minimieren und das langfristige Wachstum des Unternehmens zu fördern." + ] + }, { "attachments": {}, "cell_type": "markdown", @@ -13,6 +41,2168 @@ "Kundenabwanderung ist die Entscheidung eines Kunden, eine bestimmte Unternehmensdienstleistung nicht mehr zu kaufen. Sie stellt somit das Gegenstück zur langfristigen Kundenbindung dar. Um die Kundenbindung zu fördern, müssen Unternehmen Analysen einsetzen, die frühzeitig erkennen, ob ein Kunde das Unternehmen verlassen will. So können Marketing- und Vertriebsmaßnahmen eingeleitet werden, bevor es zum eigentlichen Kundenverlust kommt. In diesem Zusammenhang beantwortet der Service konkret diese beiden Fragen: Wie hoch ist die Wahrscheinlichkeit, dass anhand historischer Daten vorhergesagt werden kann, ob ein Kunde zu einem anderen Anbieter abwandert? Welche Faktoren führen zur Kundenabwanderung?" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Business Understanding¶\n", + "Diese Fallstudie soll Technologieunternehmen bei der Entwicklung und Verbesserung von Komponenten für autonome Fahrzeuge unterstützen. Dabei wirft diese Fallstudie die Frage auf: In welchen Bereichen liegen die Schwächen der getesteten Systeme und wie lassen sich diese einordnen? Die Frage wird beantwortet, indem die Gründe für den Eingriff des menschlichen Testfahrers in das System klassifiziert werden. Dabei sollen die Gründe in verschiedene Kategorien eingeteilt werden:\n", + "- Software Probleme\n", + "- Hardware Probleme\n", + "- Software und Hardware Probleme (Probleme, die in Kombination auftreten)\n", + "- Probleme, die durch Objekte der Verkehrssteuerung verursacht werden (z. B. Fehlfunktionen von Lichtsignalanlagen)\n", + "- Probleme, die durch andere Verkehrsteilnehmer verursacht werden\n", + "- äußere Einflüsse (einschließlich z. B. Blockaden, verborgene Elemente, Wetter- und Straßenbedingungen)\n", + "- sonstige Probleme" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Daten und Datenverständnis \n", + "Der zugrundeliegende Datensatz wurde von Kaggle bezogen und zeigt notwendige Eingriffe eines Fahrers in autonom fahrende Fahrzeugtechnologie. Er wurde vom 1. Dezember 2018 bis zum 30. November 2019 aufgezeichnet und steht unter der Lizenz von U.S. Government Works. Die Datenverarbeitung erfolgt mit Hilfe eines Jupyter-Notebooks, das in der populärsten Data-Science-Plattform \"Anaconda\" enthalten ist. Der Datensatz liegt im Format 8885 x 9 vor. Die folgenden Daten wurden erfasst:\n", + "- Hersteller\n", + "- Zulassungsnummer\n", + "- Datum\n", + "- Fahrzeug-Identifikationsnummer\n", + "- Möglichkeit des Betriebs ohne Fahrer\n", + "- Ist ein Fahrer vor Ort?\n", + "- Unterbrechung des autonomen Fahrens durch AV-System, Testfahrer, Fernsteuerung oder Beifahrer\n", + "- Ort des Vorfalls: Autobahn, Schnellstraße, Landstraße, Straße oder Parkplatz\n", + "- Beschreibung der Ursachen" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2.1. Import von relevanten Modulen" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import statsmodels.api as sm\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "sns.set()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'1.3.4'" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "pd.__version__" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2.2 Daten einlesen" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "raw_data = pd.read_csv('https://storage.googleapis.com/ml-service-repository-datastorage/Improvement_of_components_for_autonomous_motor_vehicles_data.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>Manufacturer</th>\n", + " <th>Permit Number</th>\n", + " <th>DATE</th>\n", + " <th>VIN NUMBER</th>\n", + " <th>VEHICLE IS CAPABLE OF OPERATING WITHOUT A DRIVER\\n(Yes or No)</th>\n", + " <th>DRIVER PRESENT\\n(Yes or No)</th>\n", + " <th>DISENGAGEMENT INITIATED BY\\n(AV System, Test Driver, Remote Operator, or Passenger)</th>\n", + " <th>DISENGAGEMENT\\nLOCATION\\n(Interstate, Freeway, Highway, Rural Road, Street, or Parking Facility)</th>\n", + " <th>DESCRIPTION OF FACTS CAUSING DISENGAGEMENT</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>AImotive Inc.</td>\n", + " <td>AVT003</td>\n", + " <td>12.06.2018</td>\n", + " <td>JTDKN3DU5A1092792</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>Test Driver</td>\n", + " <td>Freeway</td>\n", + " <td>Lane change maneuver: risk of lane departure, ...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>AImotive Inc.</td>\n", + " <td>AVT003</td>\n", + " <td>12.10.2018</td>\n", + " <td>JTDKN3DU5A1092792</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>Test Driver</td>\n", + " <td>Freeway</td>\n", + " <td>Lane change maneuver: risk of lane departure, ...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>AImotive Inc.</td>\n", + " <td>AVT003</td>\n", + " <td>12.10.2018</td>\n", + " <td>JTDKN3DU5A1092792</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>Test Driver</td>\n", + " <td>Freeway</td>\n", + " <td>Lane change maneuver: risk of lane departure, ...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>AImotive Inc.</td>\n", + " <td>AVT003</td>\n", + " <td>04.23.2019</td>\n", + " <td>JTDKN3DU5A1092792</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>Test Driver</td>\n", + " <td>Freeway</td>\n", + " <td>Lane change maneuver: risk of lane departure, ...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>AImotive Inc.</td>\n", + " <td>AVT003</td>\n", + " <td>05.14.2019</td>\n", + " <td>JTDKN3DU5A1092792</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>Test Driver</td>\n", + " <td>Freeway</td>\n", + " <td>Lane change maneuver to the exit lane: risk of...</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " Manufacturer Permit Number DATE VIN NUMBER \\\n", + "0 AImotive Inc. AVT003 12.06.2018 JTDKN3DU5A1092792 \n", + "1 AImotive Inc. AVT003 12.10.2018 JTDKN3DU5A1092792 \n", + "2 AImotive Inc. AVT003 12.10.2018 JTDKN3DU5A1092792 \n", + "3 AImotive Inc. AVT003 04.23.2019 JTDKN3DU5A1092792 \n", + "4 AImotive Inc. AVT003 05.14.2019 JTDKN3DU5A1092792 \n", + "\n", + " VEHICLE IS CAPABLE OF OPERATING WITHOUT A DRIVER\\n(Yes or No) \\\n", + "0 No \n", + "1 No \n", + "2 No \n", + "3 No \n", + "4 No \n", + "\n", + " DRIVER PRESENT\\n(Yes or No) \\\n", + "0 Yes \n", + "1 Yes \n", + "2 Yes \n", + "3 Yes \n", + "4 Yes \n", + "\n", + " DISENGAGEMENT INITIATED BY\\n(AV System, Test Driver, Remote Operator, or Passenger) \\\n", + "0 Test Driver \n", + "1 Test Driver \n", + "2 Test Driver \n", + "3 Test Driver \n", + "4 Test Driver \n", + "\n", + " DISENGAGEMENT\\nLOCATION\\n(Interstate, Freeway, Highway, Rural Road, Street, or Parking Facility) \\\n", + "0 Freeway \n", + "1 Freeway \n", + "2 Freeway \n", + "3 Freeway \n", + "4 Freeway \n", + "\n", + " DESCRIPTION OF FACTS CAUSING DISENGAGEMENT \n", + "0 Lane change maneuver: risk of lane departure, ... \n", + "1 Lane change maneuver: risk of lane departure, ... \n", + "2 Lane change maneuver: risk of lane departure, ... \n", + "3 Lane change maneuver: risk of lane departure, ... \n", + "4 Lane change maneuver to the exit lane: risk of... " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "raw_data.head()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2.3. Daten bereinigen" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "<class 'pandas.core.frame.DataFrame'>\n", + "RangeIndex: 8885 entries, 0 to 8884\n", + "Data columns (total 9 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 Manufacturer 8885 non-null object\n", + " 1 Permit Number 8885 non-null object\n", + " 2 DATE 8884 non-null object\n", + " 3 VIN NUMBER 8884 non-null object\n", + " 4 VEHICLE IS CAPABLE OF OPERATING WITHOUT A DRIVER\n", + "(Yes or No) 8884 non-null object\n", + " 5 DRIVER PRESENT\n", + "(Yes or No) 8884 non-null object\n", + " 6 DISENGAGEMENT INITIATED BY\n", + "(AV System, Test Driver, Remote Operator, or Passenger) 8884 non-null object\n", + " 7 DISENGAGEMENT\n", + "LOCATION\n", + "(Interstate, Freeway, Highway, Rural Road, Street, or Parking Facility) 8884 non-null object\n", + " 8 DESCRIPTION OF FACTS CAUSING DISENGAGEMENT 8884 non-null object\n", + "dtypes: object(9)\n", + "memory usage: 624.9+ KB\n" + ] + } + ], + "source": [ + "raw_data.info()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>Manufacturer</th>\n", + " <th>Permit Number</th>\n", + " <th>DATE</th>\n", + " <th>VIN NUMBER</th>\n", + " <th>VEHICLE IS CAPABLE OF OPERATING WITHOUT A DRIVER\\n(Yes or No)</th>\n", + " <th>DRIVER PRESENT\\n(Yes or No)</th>\n", + " <th>DISENGAGEMENT INITIATED BY\\n(AV System, Test Driver, Remote Operator, or Passenger)</th>\n", + " <th>DISENGAGEMENT\\nLOCATION\\n(Interstate, Freeway, Highway, Rural Road, Street, or Parking Facility)</th>\n", + " <th>DESCRIPTION OF FACTS CAUSING DISENGAGEMENT</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>count</th>\n", + " <td>8885</td>\n", + " <td>8885</td>\n", + " <td>8884</td>\n", + " <td>8884</td>\n", + " <td>8884</td>\n", + " <td>8884</td>\n", + " <td>8884</td>\n", + " <td>8884</td>\n", + " <td>8884</td>\n", + " </tr>\n", + " <tr>\n", + " <th>unique</th>\n", + " <td>28</td>\n", + " <td>27</td>\n", + " <td>3711</td>\n", + " <td>289</td>\n", + " <td>5</td>\n", + " <td>4</td>\n", + " <td>4</td>\n", + " <td>11</td>\n", + " <td>469</td>\n", + " </tr>\n", + " <tr>\n", + " <th>top</th>\n", + " <td>Toyota Research Institute</td>\n", + " <td>AVT050</td>\n", + " <td>3/28/2019</td>\n", + " <td>JTHDU1EF3G5020098</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>Test Driver</td>\n", + " <td>Street</td>\n", + " <td>Safety Driver proactive disengagement.</td>\n", + " </tr>\n", + " <tr>\n", + " <th>freq</th>\n", + " <td>2947</td>\n", + " <td>2947</td>\n", + " <td>59</td>\n", + " <td>900</td>\n", + " <td>4369</td>\n", + " <td>4934</td>\n", + " <td>6037</td>\n", + " <td>4668</td>\n", + " <td>1780</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " Manufacturer Permit Number DATE VIN NUMBER \\\n", + "count 8885 8885 8884 8884 \n", + "unique 28 27 3711 289 \n", + "top Toyota Research Institute AVT050 3/28/2019 JTHDU1EF3G5020098 \n", + "freq 2947 2947 59 900 \n", + "\n", + " VEHICLE IS CAPABLE OF OPERATING WITHOUT A DRIVER\\n(Yes or No) \\\n", + "count 8884 \n", + "unique 5 \n", + "top No \n", + "freq 4369 \n", + "\n", + " DRIVER PRESENT\\n(Yes or No) \\\n", + "count 8884 \n", + "unique 4 \n", + "top Yes \n", + "freq 4934 \n", + "\n", + " DISENGAGEMENT INITIATED BY\\n(AV System, Test Driver, Remote Operator, or Passenger) \\\n", + "count 8884 \n", + "unique 4 \n", + "top Test Driver \n", + "freq 6037 \n", + "\n", + " DISENGAGEMENT\\nLOCATION\\n(Interstate, Freeway, Highway, Rural Road, Street, or Parking Facility) \\\n", + "count 8884 \n", + "unique 11 \n", + "top Street \n", + "freq 4668 \n", + "\n", + " DESCRIPTION OF FACTS CAUSING DISENGAGEMENT \n", + "count 8884 \n", + "unique 469 \n", + "top Safety Driver proactive disengagement. \n", + "freq 1780 " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "raw_data.describe(include=\"all\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "raw_data.rename(columns = {'VEHICLE IS CAPABLE OF OPERATING WITHOUT A DRIVER\\n(Yes or No)':'OPERATING WITHOUT DRIVER', 'DRIVER PRESENT\\n(Yes or No)':'DRIVER PRESENT', 'DISENGAGEMENT INITIATED BY\\n(AV System, Test Driver, Remote Operator, or Passenger)':'DISENGAGEMENT INITIATED BY', 'DISENGAGEMENT\\nLOCATION\\n(Interstate, Freeway, Highway, Rural Road, Street, or Parking Facility)':'DISENGAGEMENT LOCATION', 'DESCRIPTION OF FACTS CAUSING DISENGAGEMENT':'FACTS CAUSING DISENGAGEMENT'}, inplace = True) " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Fehlende Werte" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Manufacturer 0\n", + "Permit Number 0\n", + "DATE 1\n", + "VIN NUMBER 1\n", + "OPERATING WITHOUT DRIVER 1\n", + "DRIVER PRESENT 1\n", + "DISENGAGEMENT INITIATED BY 1\n", + "DISENGAGEMENT LOCATION 1\n", + "FACTS CAUSING DISENGAGEMENT 1\n", + "dtype: int64" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "raw_data.isnull().sum()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Manufacturer 0\n", + "Permit Number 0\n", + "DATE 0\n", + "VIN NUMBER 0\n", + "OPERATING WITHOUT DRIVER 0\n", + "DRIVER PRESENT 0\n", + "DISENGAGEMENT INITIATED BY 0\n", + "DISENGAGEMENT LOCATION 0\n", + "FACTS CAUSING DISENGAGEMENT 0\n", + "dtype: int64" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "data_no_mv=raw_data.dropna(axis=0)\n", + "data_no_mv.isnull().sum()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>Manufacturer</th>\n", + " <th>Permit Number</th>\n", + " <th>DATE</th>\n", + " <th>VIN NUMBER</th>\n", + " <th>OPERATING WITHOUT DRIVER</th>\n", + " <th>DRIVER PRESENT</th>\n", + " <th>DISENGAGEMENT INITIATED BY</th>\n", + " <th>DISENGAGEMENT LOCATION</th>\n", + " <th>FACTS CAUSING DISENGAGEMENT</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>count</th>\n", + " <td>8884</td>\n", + " <td>8884</td>\n", + " <td>8884</td>\n", + " <td>8884</td>\n", + " <td>8884</td>\n", + " <td>8884</td>\n", + " <td>8884</td>\n", + " <td>8884</td>\n", + " <td>8884</td>\n", + " </tr>\n", + " <tr>\n", + " <th>unique</th>\n", + " <td>27</td>\n", + " <td>26</td>\n", + " <td>3711</td>\n", + " <td>289</td>\n", + " <td>5</td>\n", + " <td>4</td>\n", + " <td>4</td>\n", + " <td>11</td>\n", + " <td>469</td>\n", + " </tr>\n", + " <tr>\n", + " <th>top</th>\n", + " <td>Toyota Research Institute</td>\n", + " <td>AVT050</td>\n", + " <td>3/28/2019</td>\n", + " <td>JTHDU1EF3G5020098</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>Test Driver</td>\n", + " <td>Street</td>\n", + " <td>Safety Driver proactive disengagement.</td>\n", + " </tr>\n", + " <tr>\n", + " <th>freq</th>\n", + " <td>2947</td>\n", + " <td>2947</td>\n", + " <td>59</td>\n", + " <td>900</td>\n", + " <td>4369</td>\n", + " <td>4934</td>\n", + " <td>6037</td>\n", + " <td>4668</td>\n", + " <td>1780</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " Manufacturer Permit Number DATE VIN NUMBER \\\n", + "count 8884 8884 8884 8884 \n", + "unique 27 26 3711 289 \n", + "top Toyota Research Institute AVT050 3/28/2019 JTHDU1EF3G5020098 \n", + "freq 2947 2947 59 900 \n", + "\n", + " OPERATING WITHOUT DRIVER DRIVER PRESENT DISENGAGEMENT INITIATED BY \\\n", + "count 8884 8884 8884 \n", + "unique 5 4 4 \n", + "top No Yes Test Driver \n", + "freq 4369 4934 6037 \n", + "\n", + " DISENGAGEMENT LOCATION FACTS CAUSING DISENGAGEMENT \n", + "count 8884 8884 \n", + "unique 11 469 \n", + "top Street Safety Driver proactive disengagement. \n", + "freq 4668 1780 " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "data_no_mv.describe(include='all')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Datenaufbereitung und Kennzeichnung" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Test Driver 6037\n", + "AV System 2698\n", + "Vehicle Operator 81\n", + "Test driver 68\n", + "Name: DISENGAGEMENT INITIATED BY, dtype: int64" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "data_no_mv['DISENGAGEMENT INITIATED BY'].value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "469" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "data_no_mv['FACTS CAUSING DISENGAGEMENT'].nunique()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>Manufacturer</th>\n", + " <th>Permit Number</th>\n", + " <th>DATE</th>\n", + " <th>VIN NUMBER</th>\n", + " <th>OPERATING WITHOUT DRIVER</th>\n", + " <th>DRIVER PRESENT</th>\n", + " <th>DISENGAGEMENT INITIATED BY</th>\n", + " <th>DISENGAGEMENT LOCATION</th>\n", + " <th>FACTS CAUSING DISENGAGEMENT</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>AImotive Inc.</td>\n", + " <td>AVT003</td>\n", + " <td>12.06.2018</td>\n", + " <td>JTDKN3DU5A1092792</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>Test Driver</td>\n", + " <td>Freeway</td>\n", + " <td>Lane change maneuver: risk of lane departure, ...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>AImotive Inc.</td>\n", + " <td>AVT003</td>\n", + " <td>12.10.2018</td>\n", + " <td>JTDKN3DU5A1092792</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>Test Driver</td>\n", + " <td>Freeway</td>\n", + " <td>Lane change maneuver: risk of lane departure, ...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>AImotive Inc.</td>\n", + " <td>AVT003</td>\n", + " <td>12.10.2018</td>\n", + " <td>JTDKN3DU5A1092792</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>Test Driver</td>\n", + " <td>Freeway</td>\n", + " <td>Lane change maneuver: risk of lane departure, ...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>AImotive Inc.</td>\n", + " <td>AVT003</td>\n", + " <td>04.23.2019</td>\n", + " <td>JTDKN3DU5A1092792</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>Test Driver</td>\n", + " <td>Freeway</td>\n", + " <td>Lane change maneuver: risk of lane departure, ...</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>AImotive Inc.</td>\n", + " <td>AVT003</td>\n", + " <td>05.14.2019</td>\n", + " <td>JTDKN3DU5A1092792</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>Test Driver</td>\n", + " <td>Freeway</td>\n", + " <td>Lane change maneuver to the exit lane: risk of...</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " Manufacturer Permit Number DATE VIN NUMBER \\\n", + "0 AImotive Inc. AVT003 12.06.2018 JTDKN3DU5A1092792 \n", + "1 AImotive Inc. AVT003 12.10.2018 JTDKN3DU5A1092792 \n", + "2 AImotive Inc. AVT003 12.10.2018 JTDKN3DU5A1092792 \n", + "3 AImotive Inc. AVT003 04.23.2019 JTDKN3DU5A1092792 \n", + "4 AImotive Inc. AVT003 05.14.2019 JTDKN3DU5A1092792 \n", + "\n", + " OPERATING WITHOUT DRIVER DRIVER PRESENT DISENGAGEMENT INITIATED BY \\\n", + "0 No Yes Test Driver \n", + "1 No Yes Test Driver \n", + "2 No Yes Test Driver \n", + "3 No Yes Test Driver \n", + "4 No Yes Test Driver \n", + "\n", + " DISENGAGEMENT LOCATION FACTS CAUSING DISENGAGEMENT \n", + "0 Freeway Lane change maneuver: risk of lane departure, ... \n", + "1 Freeway Lane change maneuver: risk of lane departure, ... \n", + "2 Freeway Lane change maneuver: risk of lane departure, ... \n", + "3 Freeway Lane change maneuver: risk of lane departure, ... \n", + "4 Freeway Lane change maneuver to the exit lane: risk of... " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "data_no_mv.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Safety Driver proactive disengagement. 1780\n", + "Disengage for unwanted maneuver of the vehicle caused by a planning discrepancy while generating an appropriate trajectory 805\n", + "Automatic disengagement caused by planner fault. 742\n", + "Disengage due to operator discomfort 636\n", + "Disengage for a software fault due to a potential performance issue with a software component of the self-driving system (including third party software components) 482\n", + " ... \n", + "Planning Logic: planner inadequately yields for cross traffic agent with right-of-way 1\n", + "Planning Logic: planned trajectory fails to avoid vehicle stopped ahead intersection 1\n", + "Object Perception: inaccurate perception of animal slowly crossing road leads to planned trajectory overlap 1\n", + "Planning Logic: incorrect behavior prediction for oncoming vehicle results in a planned trajectory that overlaps with the vehicle 1\n", + "Planning discrepancy; system planned incorrect trajectory to avoid oncoming traffic 1\n", + "Name: FACTS CAUSING DISENGAGEMENT, Length: 469, dtype: int64" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "data_no_mv['FACTS CAUSING DISENGAGEMENT'].value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Test Driver 6037\n", + "AV System 2698\n", + "Vehicle Operator 81\n", + "Test driver 68\n", + "Name: DISENGAGEMENT INITIATED BY, dtype: int64" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "data_no_mv['DISENGAGEMENT INITIATED BY'].value_counts()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "data_reduced = data_no_mv.loc[0:1999, :]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "<class 'pandas.core.frame.DataFrame'>\n", + "Int64Index: 2000 entries, 0 to 1999\n", + "Data columns (total 9 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 Manufacturer 2000 non-null object\n", + " 1 Permit Number 2000 non-null object\n", + " 2 DATE 2000 non-null object\n", + " 3 VIN NUMBER 2000 non-null object\n", + " 4 OPERATING WITHOUT DRIVER 2000 non-null object\n", + " 5 DRIVER PRESENT 2000 non-null object\n", + " 6 DISENGAGEMENT INITIATED BY 2000 non-null object\n", + " 7 DISENGAGEMENT LOCATION 2000 non-null object\n", + " 8 FACTS CAUSING DISENGAGEMENT 2000 non-null object\n", + "dtypes: object(9)\n", + "memory usage: 156.2+ KB\n" + ] + } + ], + "source": [ + "data_reduced.info()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "92" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "data_reduced['FACTS CAUSING DISENGAGEMENT'].nunique()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/yassermurtada/opt/anaconda3/lib/python3.8/site-packages/pandas/util/_decorators.py:311: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " return func(*args, **kwargs)\n" + ] + } + ], + "source": [ + "data_reduced.drop_duplicates(subset =\"FACTS CAUSING DISENGAGEMENT\", \n", + " keep = 'first', inplace = True) " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "data_reduced = data_reduced.reset_index()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "data_reduced['FACTS CAUSING DISENGAGEMENT'] = data_reduced['FACTS CAUSING DISENGAGEMENT'].astype('str')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "dtype('O')" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "data_reduced['FACTS CAUSING DISENGAGEMENT'].dtype" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import re" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "software_keywords = [\"software performance\", \"software fault\", \"software discrepancy\"\n", + " \"trajectory planning\", \"planning discrepancy\", \"planning error\",\n", + " \"wrong lane change suggestion\", \"wrong lane association\", \"data recording\",\n", + " \"improper lane-change plan\", \"undesirable manuever\", \"undesirable yielding maneuver\",\n", + " \"outside of rate requirements\", \"merged poorly\", \"mapping issue\", \"software issue\",\n", + " \"poor trajectory across lanes\", \"incorrect assessment\", \"incorrect behavior\",\n", + " \"unprotected\", \"Poor lane change\", \"very wide\", \"wrong object prediction\", \"undesired motion\",\n", + " \"unwanted maneuver\", \"perception discrepancy\", \"ghost object prediction\",\n", + " \"driving faster than driver expected\", \"expected path\",\n", + " \"not initialized correctly\", \"software module\", \"perception mismatch\", \"estimation\",\n", + " \"planner fault\", \"unstable\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/yassermurtada/opt/anaconda3/lib/python3.8/site-packages/pandas/core/indexing.py:1684: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " self.obj[key] = infer_fill_value(value)\n", + "/Users/yassermurtada/opt/anaconda3/lib/python3.8/site-packages/pandas/core/indexing.py:1817: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame.\n", + "Try using .loc[row_indexer,col_indexer] = value instead\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " self._setitem_single_column(loc, value, pi)\n" + ] + } + ], + "source": [ + "data_no_mv.loc[data_no_mv['FACTS CAUSING DISENGAGEMENT'].str.contains('|'.join(software_keywords), na=False, case=False)\n", + " , 'Problem class'] = \"Software\" " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "hardware_keywords = [\"hardware performance\", \"hardware diagnostics\", \"controls diagnostics\", \"actor\", \n", + " \"yield to other actors\", \"Hardware irregularity\", \"weather conditions\", \"Autobox\", \n", + " \"performance issue with a hardware component\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "data_no_mv.loc[data_no_mv['FACTS CAUSING DISENGAGEMENT'].str.contains('|'.join(hardware_keywords), na=False, case=False)\n", + " , 'Problem class'] = \"Hardware\" " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "soft_hardware_keywords = [\"timed out\", \"timeout\", \"too long\", \"incorrect detection\", \"Lost track\", \"Localization\", \n", + " \"geo-location related\", \"unsuccessful right turn\", \"unsuccessful left turn\", \"system\",\n", + " \"traffic conditions\", \"failed to detect an object correctly\", \" took longer than expected\",\n", + " \"main computer froze\", \"not braking correctly\", \"not speeding up correctly\",\n", + " \"not turning enough\", \"not slowing down enough\", \"didn't detect\", \"Sensor Fusion discrepancy\",\n", + " \"did not meet expectation\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "data_no_mv.loc[data_no_mv['FACTS CAUSING DISENGAGEMENT'].str.contains('|'.join(soft_hardware_keywords), na=False, case=False)\n", + " , 'Problem class'] = \"Software/Hardware\" " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "Traffic_ctrl_keywords = [\"unstable target lane\", \"Traffic light error\", \"Stop sign error\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "data_no_mv.loc[data_no_mv['FACTS CAUSING DISENGAGEMENT'].str.contains('|'.join(Traffic_ctrl_keywords), na=False, case=False)\n", + " , 'Problem class'] = \"Traffic control objects\" " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "road_user_keywords = [\"reckless driver\", \"behaving road user\", \"other road user\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "data_no_mv.loc[data_no_mv['FACTS CAUSING DISENGAGEMENT'].str.contains('|'.join(road_user_keywords), na=False, case=False)\n", + " , 'Problem class'] = \"Other road user\" " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "external_influences = [\"obstruction\", \"encroachment\", \"occluded view\", \"surface conditions\", \"wheater\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "data_no_mv.loc[data_no_mv['FACTS CAUSING DISENGAGEMENT'].str.contains('|'.join(external_influences), na=False, case=False)\n", + " , 'Problem class'] = \"External influences\" " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "data_no_mv.loc[data_no_mv['Problem class'].isnull()\n", + " , 'Problem class'] = \"Other problems\" " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>Manufacturer</th>\n", + " <th>Permit Number</th>\n", + " <th>DATE</th>\n", + " <th>VIN NUMBER</th>\n", + " <th>OPERATING WITHOUT DRIVER</th>\n", + " <th>DRIVER PRESENT</th>\n", + " <th>DISENGAGEMENT INITIATED BY</th>\n", + " <th>DISENGAGEMENT LOCATION</th>\n", + " <th>FACTS CAUSING DISENGAGEMENT</th>\n", + " <th>Problem class</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>AImotive Inc.</td>\n", + " <td>AVT003</td>\n", + " <td>12.06.2018</td>\n", + " <td>JTDKN3DU5A1092792</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>Test Driver</td>\n", + " <td>Freeway</td>\n", + " <td>Lane change maneuver: risk of lane departure, ...</td>\n", + " <td>Traffic control objects</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>AImotive Inc.</td>\n", + " <td>AVT003</td>\n", + " <td>12.10.2018</td>\n", + " <td>JTDKN3DU5A1092792</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>Test Driver</td>\n", + " <td>Freeway</td>\n", + " <td>Lane change maneuver: risk of lane departure, ...</td>\n", + " <td>Traffic control objects</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>AImotive Inc.</td>\n", + " <td>AVT003</td>\n", + " <td>12.10.2018</td>\n", + " <td>JTDKN3DU5A1092792</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>Test Driver</td>\n", + " <td>Freeway</td>\n", + " <td>Lane change maneuver: risk of lane departure, ...</td>\n", + " <td>Traffic control objects</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>AImotive Inc.</td>\n", + " <td>AVT003</td>\n", + " <td>04.23.2019</td>\n", + " <td>JTDKN3DU5A1092792</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>Test Driver</td>\n", + " <td>Freeway</td>\n", + " <td>Lane change maneuver: risk of lane departure, ...</td>\n", + " <td>Other problems</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>AImotive Inc.</td>\n", + " <td>AVT003</td>\n", + " <td>05.14.2019</td>\n", + " <td>JTDKN3DU5A1092792</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>Test Driver</td>\n", + " <td>Freeway</td>\n", + " <td>Lane change maneuver to the exit lane: risk of...</td>\n", + " <td>Software</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " Manufacturer Permit Number DATE VIN NUMBER \\\n", + "0 AImotive Inc. AVT003 12.06.2018 JTDKN3DU5A1092792 \n", + "1 AImotive Inc. AVT003 12.10.2018 JTDKN3DU5A1092792 \n", + "2 AImotive Inc. AVT003 12.10.2018 JTDKN3DU5A1092792 \n", + "3 AImotive Inc. AVT003 04.23.2019 JTDKN3DU5A1092792 \n", + "4 AImotive Inc. AVT003 05.14.2019 JTDKN3DU5A1092792 \n", + "\n", + " OPERATING WITHOUT DRIVER DRIVER PRESENT DISENGAGEMENT INITIATED BY \\\n", + "0 No Yes Test Driver \n", + "1 No Yes Test Driver \n", + "2 No Yes Test Driver \n", + "3 No Yes Test Driver \n", + "4 No Yes Test Driver \n", + "\n", + " DISENGAGEMENT LOCATION FACTS CAUSING DISENGAGEMENT \\\n", + "0 Freeway Lane change maneuver: risk of lane departure, ... \n", + "1 Freeway Lane change maneuver: risk of lane departure, ... \n", + "2 Freeway Lane change maneuver: risk of lane departure, ... \n", + "3 Freeway Lane change maneuver: risk of lane departure, ... \n", + "4 Freeway Lane change maneuver to the exit lane: risk of... \n", + "\n", + " Problem class \n", + "0 Traffic control objects \n", + "1 Traffic control objects \n", + "2 Traffic control objects \n", + "3 Other problems \n", + "4 Software " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "data_no_mv.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'data_reduced_classified' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)\n", + "\u001b[0;32m/var/folders/kh/bds3ggxd09gbnhkp6c414s9h0000gn/T/ipykernel_20061/3854068531.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n", + "\u001b[1;32m 2\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtitle\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Problems\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[1;32m 3\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mxticks\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrotation\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m45\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m----> 4\u001b[0;31m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbar\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mCounter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata_reduced_classified\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'Problem class'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkeys\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mCounter\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata_reduced_classified\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'Problem class'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0m\n", + "\u001b[0;31mNameError\u001b[0m: name 'data_reduced_classified' is not defined" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from collections import Counter\n", + "plt.title(\"Problems\")\n", + "plt.xticks(rotation = 45)\n", + "plt.bar(dict(Counter(data_reduced_classified['Problem class'])).keys(), dict(Counter(data_reduced_classified['Problem class'])).values())" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Klassifikationsmodell" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "data_preprocessed = data_no_mv.copy()\n", + "data_preprocessed['Problem class']=data_preprocessed['Problem class'].map(\n", + " {'Software':0,'Hardware':1,'Software/Hardware':2,\n", + " 'Traffic control objects':3,'Other road user':4, 'External influences':5,\n", + " 'Other problems':6})\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>Manufacturer</th>\n", + " <th>Permit Number</th>\n", + " <th>DATE</th>\n", + " <th>VIN NUMBER</th>\n", + " <th>OPERATING WITHOUT DRIVER</th>\n", + " <th>DRIVER PRESENT</th>\n", + " <th>DISENGAGEMENT INITIATED BY</th>\n", + " <th>DISENGAGEMENT LOCATION</th>\n", + " <th>FACTS CAUSING DISENGAGEMENT</th>\n", + " <th>Problem class</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>AImotive Inc.</td>\n", + " <td>AVT003</td>\n", + " <td>12.06.2018</td>\n", + " <td>JTDKN3DU5A1092792</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>Test Driver</td>\n", + " <td>Freeway</td>\n", + " <td>Lane change maneuver: risk of lane departure, ...</td>\n", + " <td>3</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>AImotive Inc.</td>\n", + " <td>AVT003</td>\n", + " <td>12.10.2018</td>\n", + " <td>JTDKN3DU5A1092792</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>Test Driver</td>\n", + " <td>Freeway</td>\n", + " <td>Lane change maneuver: risk of lane departure, ...</td>\n", + " <td>3</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>AImotive Inc.</td>\n", + " <td>AVT003</td>\n", + " <td>12.10.2018</td>\n", + " <td>JTDKN3DU5A1092792</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>Test Driver</td>\n", + " <td>Freeway</td>\n", + " <td>Lane change maneuver: risk of lane departure, ...</td>\n", + " <td>3</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>AImotive Inc.</td>\n", + " <td>AVT003</td>\n", + " <td>04.23.2019</td>\n", + " <td>JTDKN3DU5A1092792</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>Test Driver</td>\n", + " <td>Freeway</td>\n", + " <td>Lane change maneuver: risk of lane departure, ...</td>\n", + " <td>6</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>AImotive Inc.</td>\n", + " <td>AVT003</td>\n", + " <td>05.14.2019</td>\n", + " <td>JTDKN3DU5A1092792</td>\n", + " <td>No</td>\n", + " <td>Yes</td>\n", + " <td>Test Driver</td>\n", + " <td>Freeway</td>\n", + " <td>Lane change maneuver to the exit lane: risk of...</td>\n", + " <td>0</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " Manufacturer Permit Number DATE VIN NUMBER \\\n", + "0 AImotive Inc. AVT003 12.06.2018 JTDKN3DU5A1092792 \n", + "1 AImotive Inc. AVT003 12.10.2018 JTDKN3DU5A1092792 \n", + "2 AImotive Inc. AVT003 12.10.2018 JTDKN3DU5A1092792 \n", + "3 AImotive Inc. AVT003 04.23.2019 JTDKN3DU5A1092792 \n", + "4 AImotive Inc. AVT003 05.14.2019 JTDKN3DU5A1092792 \n", + "\n", + " OPERATING WITHOUT DRIVER DRIVER PRESENT DISENGAGEMENT INITIATED BY \\\n", + "0 No Yes Test Driver \n", + "1 No Yes Test Driver \n", + "2 No Yes Test Driver \n", + "3 No Yes Test Driver \n", + "4 No Yes Test Driver \n", + "\n", + " DISENGAGEMENT LOCATION FACTS CAUSING DISENGAGEMENT \\\n", + "0 Freeway Lane change maneuver: risk of lane departure, ... \n", + "1 Freeway Lane change maneuver: risk of lane departure, ... \n", + "2 Freeway Lane change maneuver: risk of lane departure, ... \n", + "3 Freeway Lane change maneuver: risk of lane departure, ... \n", + "4 Freeway Lane change maneuver to the exit lane: risk of... \n", + "\n", + " Problem class \n", + "0 3 \n", + "1 3 \n", + "2 3 \n", + "3 6 \n", + "4 0 " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "data_preprocessed.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "<class 'pandas.core.frame.DataFrame'>\n", + "Int64Index: 8884 entries, 0 to 8884\n", + "Data columns (total 10 columns):\n", + " # Column Non-Null Count Dtype \n", + "--- ------ -------------- ----- \n", + " 0 Manufacturer 8884 non-null object\n", + " 1 Permit Number 8884 non-null object\n", + " 2 DATE 8884 non-null object\n", + " 3 VIN NUMBER 8884 non-null object\n", + " 4 OPERATING WITHOUT DRIVER 8884 non-null object\n", + " 5 DRIVER PRESENT 8884 non-null object\n", + " 6 DISENGAGEMENT INITIATED BY 8884 non-null object\n", + " 7 DISENGAGEMENT LOCATION 8884 non-null object\n", + " 8 FACTS CAUSING DISENGAGEMENT 8884 non-null object\n", + " 9 Problem class 8884 non-null int64 \n", + "dtypes: int64(1), object(9)\n", + "memory usage: 1021.5+ KB\n" + ] + } + ], + "source": [ + "data_preprocessed.info()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>Problem class</th>\n", + " <th>Manufacturer_Apple Inc.</th>\n", + " <th>Manufacturer_Aurora Innovation, Inc.</th>\n", + " <th>Manufacturer_AutoX Technologies, Inc.</th>\n", + " <th>Manufacturer_BMW of North America</th>\n", + " <th>Manufacturer_Baidu USA LLC</th>\n", + " <th>Manufacturer_CRUISE LLC</th>\n", + " <th>Manufacturer_Drive.ai Inc</th>\n", + " <th>Manufacturer_Lyft</th>\n", + " <th>Manufacturer_Mercedes-Benz Research & Development North America, Inc.</th>\n", + " <th>...</th>\n", + " <th>FACTS CAUSING DISENGAGEMENT_precautionary takeover to address planning, \\nprecautionary takeover to address perception, \\nother road user behaving poorly</th>\n", + " <th>FACTS CAUSING DISENGAGEMENT_precautionary takeover to address planning, \\nprecautionary takeover to address perception, AV made unsuccessful left turn</th>\n", + " <th>FACTS CAUSING DISENGAGEMENT_precautionary takeover to address planning, \\nprecautionary takeover to address perception, third party lane encroachment</th>\n", + " <th>FACTS CAUSING DISENGAGEMENT_precautionary takeover to address planning, \\nprecautionary takeover to address perception, third party lane obstruction</th>\n", + " <th>FACTS CAUSING DISENGAGEMENT_precautionary takeover to address planning, AV lane change issues</th>\n", + " <th>FACTS CAUSING DISENGAGEMENT_precautionary takeover to address planning, AV made unsuccessful left turn</th>\n", + " <th>FACTS CAUSING DISENGAGEMENT_precautionary takeover to address planning, other road user behaving poorly</th>\n", + " <th>FACTS CAUSING DISENGAGEMENT_precautionary takeover to address planning, third party lane encroachment</th>\n", + " <th>FACTS CAUSING DISENGAGEMENT_precautionary takeover to address planning, third party lane obstruction</th>\n", + " <th>FACTS CAUSING DISENGAGEMENT_prediction discrepancy, a vehicle in the front was backing up, ego was not able to predict this behavior correctly.</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>3</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>3</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>3</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>6</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>...</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "<p>5 rows × 4538 columns</p>\n", + "</div>" + ], + "text/plain": [ + " Problem class Manufacturer_Apple Inc. \\\n", + "0 3 0 \n", + "1 3 0 \n", + "2 3 0 \n", + "3 6 0 \n", + "4 0 0 \n", + "\n", + " Manufacturer_Aurora Innovation, Inc. \\\n", + "0 0 \n", + "1 0 \n", + "2 0 \n", + "3 0 \n", + "4 0 \n", + "\n", + " Manufacturer_AutoX Technologies, Inc. Manufacturer_BMW of North America \\\n", + "0 0 0 \n", + "1 0 0 \n", + "2 0 0 \n", + "3 0 0 \n", + "4 0 0 \n", + "\n", + " Manufacturer_Baidu USA LLC Manufacturer_CRUISE LLC \\\n", + "0 0 0 \n", + "1 0 0 \n", + "2 0 0 \n", + "3 0 0 \n", + "4 0 0 \n", + "\n", + " Manufacturer_Drive.ai Inc Manufacturer_Lyft \\\n", + "0 0 0 \n", + "1 0 0 \n", + "2 0 0 \n", + "3 0 0 \n", + "4 0 0 \n", + "\n", + " Manufacturer_Mercedes-Benz Research & Development North America, Inc. ... \\\n", + "0 0 ... \n", + "1 0 ... \n", + "2 0 ... \n", + "3 0 ... \n", + "4 0 ... \n", + "\n", + " FACTS CAUSING DISENGAGEMENT_precautionary takeover to address planning, \\nprecautionary takeover to address perception, \\nother road user behaving poorly \\\n", + "0 0 \n", + "1 0 \n", + "2 0 \n", + "3 0 \n", + "4 0 \n", + "\n", + " FACTS CAUSING DISENGAGEMENT_precautionary takeover to address planning, \\nprecautionary takeover to address perception, AV made unsuccessful left turn \\\n", + "0 0 \n", + "1 0 \n", + "2 0 \n", + "3 0 \n", + "4 0 \n", + "\n", + " FACTS CAUSING DISENGAGEMENT_precautionary takeover to address planning, \\nprecautionary takeover to address perception, third party lane encroachment \\\n", + "0 0 \n", + "1 0 \n", + "2 0 \n", + "3 0 \n", + "4 0 \n", + "\n", + " FACTS CAUSING DISENGAGEMENT_precautionary takeover to address planning, \\nprecautionary takeover to address perception, third party lane obstruction \\\n", + "0 0 \n", + "1 0 \n", + "2 0 \n", + "3 0 \n", + "4 0 \n", + "\n", + " FACTS CAUSING DISENGAGEMENT_precautionary takeover to address planning, AV lane change issues \\\n", + "0 0 \n", + "1 0 \n", + "2 0 \n", + "3 0 \n", + "4 0 \n", + "\n", + " FACTS CAUSING DISENGAGEMENT_precautionary takeover to address planning, AV made unsuccessful left turn \\\n", + "0 0 \n", + "1 0 \n", + "2 0 \n", + "3 0 \n", + "4 0 \n", + "\n", + " FACTS CAUSING DISENGAGEMENT_precautionary takeover to address planning, other road user behaving poorly \\\n", + "0 0 \n", + "1 0 \n", + "2 0 \n", + "3 0 \n", + "4 0 \n", + "\n", + " FACTS CAUSING DISENGAGEMENT_precautionary takeover to address planning, third party lane encroachment \\\n", + "0 0 \n", + "1 0 \n", + "2 0 \n", + "3 0 \n", + "4 0 \n", + "\n", + " FACTS CAUSING DISENGAGEMENT_precautionary takeover to address planning, third party lane obstruction \\\n", + "0 0 \n", + "1 0 \n", + "2 0 \n", + "3 0 \n", + "4 0 \n", + "\n", + " FACTS CAUSING DISENGAGEMENT_prediction discrepancy, a vehicle in the front was backing up, ego was not able to predict this behavior correctly. \n", + "0 0 \n", + "1 0 \n", + "2 0 \n", + "3 0 \n", + "4 0 \n", + "\n", + "[5 rows x 4538 columns]" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "data_with_dummies = pd.get_dummies(data_preprocessed, drop_first=True)\n", + "data_with_dummies.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Problem class 0\n", + "Manufacturer_Apple Inc. 0\n", + "Manufacturer_Aurora Innovation, Inc. 0\n", + "Manufacturer_AutoX Technologies, Inc. 0\n", + "Manufacturer_BMW of North America 0\n", + " ..\n", + "FACTS CAUSING DISENGAGEMENT_precautionary takeover to address planning, AV made unsuccessful left turn 0\n", + "FACTS CAUSING DISENGAGEMENT_precautionary takeover to address planning, other road user behaving poorly 0\n", + "FACTS CAUSING DISENGAGEMENT_precautionary takeover to address planning, third party lane encroachment 0\n", + "FACTS CAUSING DISENGAGEMENT_precautionary takeover to address planning, third party lane obstruction 0\n", + "FACTS CAUSING DISENGAGEMENT_prediction discrepancy, a vehicle in the front was backing up, ego was not able to predict this behavior correctly. 0\n", + "Length: 4538, dtype: int64" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "data_with_dummies.isnull().sum()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.model_selection import train_test_split\n", + "from sklearn.metrics import confusion_matrix, accuracy_score, classification_report" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "target = data_with_dummies['Problem class']\n", + "inputs = data_with_dummies.drop(['Problem class'],axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "x_train, x_test, y_train, y_test = train_test_split(inputs, target, test_size=0.2, random_state=365)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/yassermurtada/opt/anaconda3/lib/python3.8/site-packages/seaborn/distributions.py:2619: FutureWarning: `distplot` is a deprecated function and will be removed in a future version. Please adapt your code to use either `displot` (a figure-level function with similar flexibility) or `histplot` (an axes-level function for histograms).\n", + " warnings.warn(msg, FutureWarning)\n" + ] + }, + { + "data": { + "text/plain": [ + "<AxesSubplot:xlabel='Problem class', ylabel='Density'>" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYQAAAEJCAYAAACUk1DVAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAAApvUlEQVR4nO3deXxU9b3/8ddk3xMIk4UEgiyFiOy7IogKEQNFU7SoLVavVH1Y4/VxxfpDir24YIUr6uW6XB7c9qG19xZZjLQFoaICBgtGWSIBEQyQhSQkhCyTmWRmzu+PTKYEAkmAmUnI+/l45AHfc2b5nDNz5n3O95z5jskwDAMREeny/HxdgIiIdAwKBBERARQIIiLiokAQERFAgSAiIi4KBBERARQIIiLiEuDrAi7H6dO1OJ3Nv0YRGxtBeXmNjyryva6+/KB1AFoHoHXQ0vL7+Zno1i38gvfp1IHgdBrnBULT9K6sqy8/aB2A1gFoHbR3+dVlJCIigAJBRERcFAgiIgIoEERExEWBICIigAJBRERcFAgiIgJ08u8hiIg0sTvB1mB3t0Ms9T6spnNSIIjIVcHWYGd3Xom7PXlUb0w+rKczUpeRiIgACgQREXFRIIiICODhQHj99de5/fbbSU9P5/e///158/Py8sjIyCAtLY1nn30Wu93ewqOIiIg3eCwQdu3axZdffslHH33E2rVree+99zh69Giz28yfP59Fixbx8ccfYxgGq1ev9lQ5IiLSCo8FwtixY3n33XcJCAigvLwch8NBWFiYe35hYSFWq5Xhw4cDkJGRwaZNmzxVjoiItMKjXUaBgYG88cYbpKenM2HCBOLj493zSktLMZvN7rbZbKakpKSlhxERES/w+PcQMjMzmTdvHo888girV6/mpz/9KQBOpxOT6Z9XCRuG0azdFrGxES1ON5sjL73gq0BXX37QOoCutw6MCguRESHNpnW1dXCu9i6/xwLhyJEj1NfXk5qaSmhoKNOmTePQoUPu+QkJCZSVlbnbp06dIi4url3PUV5ec94vApnNkZSVVV9e8Z1YV19+0DqArrkOLDY71TXWZtO62jo4W0vvAT8/0wV3pMGDXUYFBQUsXLiQ+vp66uvr+eSTTxg1apR7flJSEsHBweTk5ACQlZXFpEmTPFWOiIi0wmOBMHnyZG666SbuuOMOfvKTnzBixAjS09OZN28e+/fvB2DZsmUsWbKE2267DYvFwty5cz1VjoiItMJkGEan/RVqdRmdr6svP2gdQNdcB7W2FsYycjh8WJFvdaguIxER6VwUCCIiAigQRETERYEgIiKAAkFERFwUCCIiAigQRETERYEgIiKAAkFERFwUCCIiAigQRETERYEgIiKAAkFERFwUCCIiAigQRETERYEgIiKAAkFERFwUCCIiAigQRETERYEgIiKAAkFERFwUCCIiAigQRETERYEgIiIABHjywVesWMHGjRsBmDx5Mk8//fR589euXUtUVBQAd999N/fdd58nSxIRkQvwWCBkZ2ezY8cO1q9fj8lk4qGHHmLLli1MnTrVfZvc3FxeffVVRowY4akyRESkjTwWCGazmWeeeYagoCAA+vXrR1FRUbPb5Obm8s4771BYWMiYMWP49a9/TXBwsKdKEhGRi/DYOYQBAwYwfPhwAPLz89m4cSOTJ092z6+trSU1NZX58+ezfv16qqqqePPNNz1VjoiItMJkGIbhySc4fPgwDz/8MI8//jh33nnnBW934MABFixYwIcffujJcq561ZZ66qx2dzs0JIDIsCAfViTiHaUVFr4+VOpujxwYR1z3MB9W1Pl49KRyTk4OmZmZLFiwgPT09GbzioqKyM7OZvbs2QAYhkFAQPvKKS+vwelsnmdmcyRlZdWXV3gnZvj783nOcXd7TGo81lqbDyvyvq7+HoCuuQ4sNjvVNdZm07raOjhbS+8BPz8TsbERF7yPx7qMiouLeeyxx1i2bNl5YQAQEhLC0qVLOXHiBIZh8P777zc74SzSXnYn1NrslFZYsDt9XY1I5+OxI4RVq1Zhs9l4+eWX3dPmzJnD1q1byczMZMiQISxevJhHH32UhoYGRo4cyQMPPOCpcqQLsDXY2Z1XQmRECIN6RRMQ7NEDYJGrjsfPIXiSuozO11KXUXgX+WCstTUPhK6y3C3pittB0+vfZPKo3pgcDh9W5FsdqstIREQ6FwWCiIgACgQREXFRIIiICKBAEBERFwWCiIgACgQREXFRIIiICKBAEBERFwWCiIgACgQREXFRIIiICKBAEBERFwWCiIgACgQREXFRIIiICKBAEBERFwWCiIgACgQREXFRIIiICKBAEBERFwWCiIgACgQREXFRIIiICODhQFixYgXp6emkp6fzyiuvnDc/Ly+PjIwM0tLSePbZ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eatOERHxsIsGwrvvvssf/vAHevbs6Z7Wr18/hg0bxoIFCxQIIiJXkYueQ6itrW0WBk2uueYafZFMROQqc9FA8Pf3v+A8wzAuOE9ERDqfS/8ygYiIXFUueg7h0KFDjBw58rzphmFQX1/vsaJERMT7LhoIW7Zs8VYdIiLiYxcNhKSkJG/VISIiPqZzCCIiAigQRETERYEgIiKAAkFERFwUCCIiAigQRETERYEgIiKAAkFERFwUCCIiAigQRETERYEgIiKAAkFERFwUCCIiAigQRETERYEgIiKAAkFERFw8Ggg1NTXMmDGDgoKC8+bl5eWRkZFBWloazz77LHa73ZOliIhIKzwWCHv37uWee+4hPz+/xfnz589n0aJFfPzxxxiGwerVqz1VioiItIHHAmH16tU899xzxMXFnTevsLAQq9XK8OHDAcjIyGDTpk2eKkVERNrgor+pfDlefPHFC84rLS3FbDa722azmZKSEk+VIiIibeCxQLgYp9OJyWRytw3DaNZuq9jYiBanm82Rl1xbZ1daYSEyIsTdDgsLxtw9zIcVeY9x1rJ3peW+kK62HRjnvPeh662Dc7V3+X0SCAkJCZSVlbnbp06darFrqTXl5TU4nUazaWZzJGVl1ZddY6fl7091jdXdtFhslDkcPizIeyw2O9U1ViIjQrrUcrekK24HTa//2braOjhbS+8BPz/TBXekwUeXnSYlJREcHExOTg4AWVlZTJo0yReliIiIi1cDYd68eezfvx+AZcuWsWTJEm677TYsFgtz5871ZikiInIOj3cZbd261f3/lStXuv8/aNAg1qxZ4+mnFxGRNtI3lUVEBFAgiIiIiwJBREQABYKIiLgoEEREBFAgiIiIiwJBREQABYKIiLgoEEREBFAgiIiIiwJBREQABYKIiLgoEEREBFAgiIiIiwJBREQABYKIiLgoEEREBFAgiIiIiwJBREQABYKIiLgoEEREBFAgiIiIiwJBREQABYKIiLgoEEREBPBwIGzYsIHbb7+dadOm8f777583f8WKFUyZMoVZs2Yxa9asFm8jIiLeEeCpBy4pKWH58uWsW7eOoKAg5syZw7hx4+jfv7/7Nrm5ubz66quMGDHCU2WIiEgbeewIITs7m/HjxxMTE0NYWBhpaWls2rSp2W1yc3N55513mDlzJosXL8Zms3mqHBERaYXHjhBKS0sx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Upp9uQ5gz549LF26lPr6esrKyrj++ut56aWXsNvtPP/883z99dcEBgaSnJzMkiVLCA4ObnF6eHi4Z1a4XDXUZSRXnW+++Ybjx4+7hz3+/vvvee+993jvvfdYu3Yt27dvZ82aNWzYsIEBAwY0+yGZ2tpaVq9ezerVq/noo4/4/PPPmz32hx9+yHfffccHH3xAVlYWkydPZuHChe75hYWF/N///R9Lly5l6dKljB07lnXr1nHjjTfyxz/+8bxaP/nkE9atW8ef//xn/vKXv5CcnHze7d59910yMzP54IMP+Otf/8rWrVvJzc1lz5497Nq1i48++oh169bRq1cvDh06dMHpIq3REYJ0elar1T3sucPhoFu3bixdupTExESg8XcxIiIiANi2bRsZGRmEhYUBMHfuXN5++23q6+sBmD17NgEBAURERJCWlkZ2djb9+vVzP9enn37K/v373cMhNI0732Tq1KkA9OrVC4Abb7wRgN69e7Nr167zat+5cye33Xabe4jm//f//h/QeA6hycsvv8y2bdt4++23OXr0KDabDYvFwqBBg/D39+euu+5i4sSJpKWlMXToUKqqqlqcLtIaBYJ0eueeQzhX04c/nD9MuNPpxG63u9v+/v7u/xuGQUBA803E6XS6x8qBxqHWz5w5455/7oCKrY226+/v36yeqqoqqqqqmt3mZz/7GQMHDuTGG29k+vTp7N27F8MwiIqKIisri6+//povv/ySf/3Xf+Vf/uVfuO+++y44XeRi1GUkXcqNN97I2rVrsVgsALz33nuMGTPG/UH+4YcfYhgGZ86cYePGje49/CYTJ05kzZo11NTUAPD666/z9NNPX3I9119/PVu2bHE/3n/+53/yhz/8wT2/qqqK/fv389RTTzFt2jROnjzJ8ePHcTqdfPrpp/ziF79gxIgRPP7449xxxx3k5uZecLpIa3SEIF3K7NmzKS4u5q677sLpdJKSksKyZcvc8yMjI8nIyMBqtfKzn/2M8ePHU1BQ4J5/1113UVJSwt13343JZCIxMfG8k8DtMXnyZL7//nv3qKz9+/fn+eefZ/PmzQBERUXxy1/+kjvvvJOwsDDi4+MZOXIkx44d46677mLbtm3MmDGDsLAwoqOjef7550lMTGxxukhrNNqpiIgA6jISEREXBYKIiAAKBBERcVEgiIgIoEAQEREXBYKIiAAKBBERcVEgiIgIAP8f4ej3zc5nA2oAAAAASUVORK5CYII=", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "sns.distplot((y_test),bins=50)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### K-Nearest Neighbors" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.neighbors import KNeighborsClassifier" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Text(0, 0.5, 'Error Rate')" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAm8AAAGECAYAAABgXcdUAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/MnkTPAAAACXBIWXMAAAsTAAALEwEAmpwYAABm7UlEQVR4nO3deZzNdf//8cfZZjOKNIMvJUtxZUmMjG1UZMrehLryiwihUipFNFeKS6RLtExl66q4UIlkvShbRhmVLSkqShpjZJl9zjmf3x/nMlFmn7M/77dbt5z5nOX1ns+Z83md9/J6mwzDMBARERERv2D2dgAiIiIiUnJK3kRERET8iJI3ERERET+i5E1ERETEjyh5ExEREfEjSt5ERERE/IjV2wGISOBo2LAh11xzDWbzhd8LX331VWrXru2R1zWZTGRnZxMZGckzzzxD06ZNi3zse++9R15eHv3793dbfEV5+eWX+f3330lMTAQgLy+Pxx9/nBMnTpCUlMSll15acN977rmHDh06MGzYsAueY968eezYsYOkpKQSvYaI+DclbyJSof79739z2WWXef11586dy6RJk1i8eHGRj9u5cydXX321u8MrkaysLB566CHCwsKYP38+oaGhFxy/++67eemll/6SvC1ZsoQJEyZ4MlQR8SIlbyLiEZ9//jmTJ08mIiKCzMxMnnjiCV544YWC2x988AEffvgh77zzDmazmcsvv5ynn36aunXrMnbsWE6dOsXPP//MjTfeyJgxY4p8LbvdzrFjxwp6rU6cOEFiYiLp6emkpaVRq1YtXnrpJb788ks++eQTPvvsM8LCwujfvz9JSUmsW7cOp9NJrVq1+Mc//kH16tUveP677rqLQYMGER8fD8ALL7wAwL333suTTz7J77//DkDHjh155JFHSvT7OX36NPfffz+NGjUiMTHxL72XALfccgv//Oc/SUlJISYmBoAvvvgCwzBo164dr7/+Ohs2bCAnJ4fs7GyefPJJbrnllgue4+abb2bmzJkFPZLn3/7yyy+ZPn062dnZmM1mHnzwQW666SbS0tLK3C4RqXhK3kSkQg0cOPCCxKN27dq8+uqrAHz//fesX7+eWrVq8fnnn19wOzk5mTlz5rB48WIuu+wyli5dygMPPMDKlSsByMnJKfh3Ya8L8PvvvxMaGspNN93ElClTAFi5ciXNmzdn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fPnyguNjxoyhTp06vPTSS4SEhBQ8plGjRqxfvx6An376iePHj1O3bl13NUFERKSAtsQTX2EyDMNtXVErVqzgjTfeID8/nz59+jB06FCGDh3KqFGjaNq0Kd9++y0TJkwgIyODxo0bM2XKFA4ePMjtt99OgwYNsFpdHYPR0dHMnj2bn376icTERE6ePElISAiPP/44bdu2LXE86nlzr2BuOwR3+9X24Gw7BHf7g7ntENzt93bPm1uTN1+j5M29grntENztV9uDs+0Q3O0P5rZDcLff28mbqgmKiIiI+BElbyIiIiJ+RMmbiIiIiB9R8iYiIiLiR5S8iYiIiPgRJW8iIiIifsRtOyz4IrPZVPyd/Oh1fFEwtx2Cu/1qe/AK5vYHc9shuNvvzrYX99xBVedNRERExN9p2FRERETEjyh5ExEREfEjSt5ERERE/IiSNxERERE/ouRNRERExI8oeRMRERHxI0reRERERPyIkjcRERERP6LkTURERMSPKHmrQBkZGXTv3p1ffvnF26F41CuvvEK3bt3o1q0b06ZN83Y4Hjdz5ky6du1Kt27dmD9/vrfD8YqpU6cyduxYb4fhcffccw/dunWjV69e9OrVi127dnk7JI/55JNPSEhI4LbbbmPSpEneDsej3nvvvYJz3qtXL1q2bMmzzz7r7bA8Zvny5QWf+VOnTvV2OB715ptvEh8fT48ePUhKSvJeIIZUiK+//tro3r270bhxY+Pnn3/2djge89lnnxl33nmnkZuba+Tl5RkDBgww1q1b5+2wPObzzz837rrrLiM/P9/Izs42brrpJuPQoUPeDsujtm3bZrRu3dp48sknvR2KRzmdTqN9+/ZGfn6+t0PxuCNHjhjt27c3jh07ZuTl5Rl///vfjY0bN3o7LK/47rvvjFtuucVIT0/3digekZWVZbRq1cpIT0838vPzjT59+hifffaZt8PyiM8++8zo3r27cfbsWcNutxv333+/sXbtWq/Eop63CrJkyRL+8Y9/EB0d7e1QPCoqKoqxY8cSEhKCzWajfv36/Prrr94Oy2NuuOEG3n77baxWK+np6TgcDiIiIrwdlsecOnWKGTNmMHz4cG+H4nE//PADAIMHD6Znz568++67Xo7Ic/773//StWtXatSogc1mY8aMGVx33XXeDssrnnnmGUaPHs1ll13m7VA8wuFw4HQ6yc7Oxm63Y7fbCQ0N9XZYHvHNN9/Qvn17IiMjsVgsdOjQgfXr13slFiVvFWTy5MnExMR4OwyPu/rqq2nevDkAP/30E6tXr6Zjx47eDcrDbDYbs2bNolu3brRp04bq1at7OySPSUxMZPTo0VxyySXeDsXjzpw5Q5s2bXj11Vd56623WLRoEZ999pm3w/KIw4cP43A4GD58OL169WLhwoVceuml3g7L47Zt20ZOTg633Xabt0PxmMjISB5++GFuu+02OnbsSK1atWjRooW3w/KIxo0bs3XrVk6dOkVubi6ffPIJJ06c8EosSt6kQnz//fcMHjyYJ554gquuusrb4XjcqFGjSE5O5tixYyxZssTb4XjEe++9R82aNWnTpo23Q/GK66+/nmnTplG5cmUuu+wy+vTpw6ZNm7wdlkc4HA6Sk5P55z//yeLFi9m9ezcffviht8PyuEWLFjFo0CBvh+FR3377LR988AGffvopW7ZswWw2M3fuXG+H5RFt2rQhISGBe+65hyFDhtCyZUtsNptXYlHyJuW2c+dO7r33Xh577DFuv/12b4fjUYcOHWL//v0AhIeH06VLFw4cOODlqDxj1apVfPbZZ/Tq1YtZs2bxySef8M9//tPbYXlMSkoKycnJBbcNw8BqtXoxIs+5/PLLadOmDZdddhlhYWF07tyZ3bt3ezssj8rLy2PHjh3cfPPN3g7Fo7Zu3UqbNm2oVq0aISEhJCQk8MUXX3g7LI/IyMigS5curFixgnfeeYeQkBCuuOIKr8Si5E3K5dixYzzwwANMnz6dbt26eTscj/vll1+YMGECeXl55OXlsWHDBlq2bOntsDxi/vz5fPzxxyxfvpxRo0Zx880389RTT3k7LI85e/Ys06ZNIzc3l4yMDD788ENuueUWb4flETfddBNbt27lzJkzOBwOtmzZQuPGjb0dlkcdOHCAq666KqjmuAI0atSIbdu2kZWVhWEYfPLJJzRt2tTbYXnEL7/8wsiRI7Hb7Zw9e5b333/fa0PmwfE1Udxm7ty55Obm8vzzzxf87K677uLvf/+7F6PynI4dO7J792569+6NxWKhS5cuQZnEBqObbrqJXbt20bt3b5xOJ3fffTfXX3+9t8PyiOuuu44hQ4Zw9913k5+fT7t27bjjjju8HZZH/fzzz9SoUcPbYXhc+/bt+eabb0hISMBms9G0aVOGDRvm7bA8olGjRnTp0oWePXvicDi49957vfZl3WQYhuGVVxYRERGRUtOwqYiIiIgfUfImIiIi4keUvImIiIj4ESVvIiIiIn5EyZuIiIiIH1HyJiJSSr/88stfyoKsWrWK1q1bX1C4V0TEHVTnTUSknBYtWsRrr73GW2+9xd/+9jdvhyMiAU7Jm4hIObz55pssXbqUhQsXUrt2bW+HIyJBQMOmIiJlNG3aNF588UXuueceJW4i4jFK3kREyiArK4vvvvuON998kxdffJFvvvnG2yGJSJBQ8iYiUgZhYWEkJSXRsWNH7r//fh588EFOnTrl7bBEJAgoeRMRKQOz2YzNZgNg2LBhNGjQgMceewyn0+nlyEQk0Cl5ExEpJ5PJxNSpUzl06BAvvfSSt8MRkQBnMgzD8HYQIiIiIlIy6nkTERER8SNK3kRERET8iJI3ERERET+i5E1ERETEjyh5ExEREfEjSt5ERERE/IiSNxERERE/ouRNRERExI/8f9X2unm6ViELAAAAAElFTkSuQmCC", + "text/plain": [ + "<Figure size 720x432 with 1 Axes>" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "error_rate = []\n", + " \n", + "for i in range(1,10):\n", + " \n", + " KNN_model = KNeighborsClassifier(n_neighbors=i)\n", + " KNN_model.fit(x_train,y_train)\n", + " KNN_prediction = KNN_model.predict(x_test)\n", + " error_rate.append(np.mean(KNN_prediction != y_test)) #nur Fehler berücksichtigen\n", + "\n", + "plt.figure(figsize=(10,6))\n", + "plt.plot(range(1,10),error_rate,color='blue', linestyle='dashed', marker='o',\n", + " markerfacecolor='red', markersize=10)\n", + "plt.title('Error Rate vs. K Values')\n", + "plt.xlabel('K')\n", + "plt.ylabel('Error Rate')\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "KNN_model = KNeighborsClassifier(n_neighbors=3)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "KNeighborsClassifier(n_neighbors=3)" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "KNN_model.fit(x_train, y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "KNN_prediction = KNN_model.predict(x_test)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0.9712999437253799" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "accuracy_score(KNN_prediction, y_test)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " precision recall f1-score support\n", + "\n", + " 0 0.98 0.97 0.97 538\n", + " 1 0.82 0.82 0.82 17\n", + " 2 0.97 0.97 0.97 530\n", + " 3 0.00 0.00 0.00 0\n", + " 4 0.83 0.74 0.78 27\n", + " 5 0.70 1.00 0.82 7\n", + " 6 0.98 0.99 0.98 658\n", + "\n", + " accuracy 0.97 1777\n", + " macro avg 0.76 0.78 0.77 1777\n", + "weighted avg 0.97 0.97 0.97 1777\n", + "\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/yassermurtada/opt/anaconda3/lib/python3.8/site-packages/sklearn/metrics/_classification.py:1308: UndefinedMetricWarning: Recall and F-score are ill-defined and being set to 0.0 in labels with no true samples. Use `zero_division` parameter to control this behavior.\n", + " _warn_prf(average, modifier, msg_start, len(result))\n", + "/Users/yassermurtada/opt/anaconda3/lib/python3.8/site-packages/sklearn/metrics/_classification.py:1308: UndefinedMetricWarning: Recall and F-score are ill-defined and being set to 0.0 in labels with no true samples. Use `zero_division` parameter to control this behavior.\n", + " _warn_prf(average, modifier, msg_start, len(result))\n", + "/Users/yassermurtada/opt/anaconda3/lib/python3.8/site-packages/sklearn/metrics/_classification.py:1308: UndefinedMetricWarning: Recall and F-score are ill-defined and being set to 0.0 in labels with no true samples. Use `zero_division` parameter to control this behavior.\n", + " _warn_prf(average, modifier, msg_start, len(result))\n" + ] + } + ], + "source": [ + "print(classification_report(KNN_prediction, y_test))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Entscheidungsbaum" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.tree import DecisionTreeClassifier" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "dtree = DecisionTreeClassifier()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "DecisionTreeClassifier()" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "dtree.fit(x_train,y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "predictions = dtree.predict(x_test)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " precision recall f1-score support\n", + "\n", + " 0 0.99 0.99 0.99 531\n", + " 1 0.94 1.00 0.97 17\n", + " 2 0.99 0.98 0.99 527\n", + " 3 1.00 1.00 1.00 1\n", + " 4 0.79 0.96 0.87 24\n", + " 5 1.00 0.80 0.89 10\n", + " 6 0.99 0.99 0.99 667\n", + "\n", + " accuracy 0.99 1777\n", + " macro avg 0.96 0.96 0.96 1777\n", + "weighted avg 0.99 0.99 0.99 1777\n", + "\n" + ] + } + ], + "source": [ + "print(classification_report(y_test,predictions))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "attachments": {}, "cell_type": "markdown", diff --git a/CRM/Customer Satisfaction Airlines/notebook.ipynb b/CRM/Customer Satisfaction Airlines/notebook.ipynb index 937ff01f355a7ee24b4d9afb3526cb33e576294e..4c51bdaf3c78c12012b8d6741f36fdbcb1f6afce 100644 --- a/CRM/Customer Satisfaction Airlines/notebook.ipynb +++ b/CRM/Customer Satisfaction Airlines/notebook.ipynb @@ -1,5 +1,35 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Geschäftlicher Kontext:\n", + "Der vorliegende Bericht konzentriert sich auf die Analyse von Kundenzufriedenheitsdaten eines Luftfahrtunternehmens, das als AIRCO Airlines bezeichnet wird. Das Hauptziel besteht darin, anhand verschiedener Kundenparameter vorherzusagen, ob ein Kunde mit dem Service zufrieden sein wird. Diese Vorhersagen sind entscheidend, um die Kundenzufriedenheit zu verbessern, das Unternehmen wettbewerbsfähig zu halten und die Kundenbindung zu stärken.\n", + "\n", + "## Datengrundlage:\n", + "Der Datensatz enthält Informationen von Kunden, die bereits mit AIRCO Airlines geflogen sind. Er umfasst verschiedene demografische und servicebezogene Attribute wie Alter, Geschlecht, Art der Reise, Kundentyp, Flugdistanz und Bewertungen zu verschiedenen Aspekten des Flugerlebnisses. Ziel ist es, anhand dieser Daten vorherzusagen, ob ein Kunde zufrieden oder unzufrieden sein wird.\n", + "\n", + "## ML-Strategie:\n", + "Die angewandte Machine-Learning-Strategie besteht aus einer logistischen Regressionsanalyse. Diese Methode ermöglicht es, die Wahrscheinlichkeit vorherzusagen, mit der ein Kunde zufrieden oder unzufrieden sein wird, basierend auf den verschiedenen Attributen.\n", + "\n", + "## Datenvorbereitung:\n", + "\n", + "Datenimport und -verständnis: Die Rohdaten werden eingelesen und eine umfassende explorative Datenanalyse durchgeführt, um die Struktur und Verteilung der Daten zu verstehen.\n", + "Datenbereinigung: Nullwerte werden entfernt, und fehlende oder unvollständige Daten werden behandelt, um den Datensatz vorzubereiten.\n", + "Deskriptive Analyse: Eine detaillierte Analyse der numerischen und kategorialen Merkmale wird durchgeführt, um Trends und Muster zu identifizieren.\n", + "Merkmalsskalierung und -umkodierung: Die Merkmale werden entsprechend ihrer Skalierung und Kategorisierung umgewandelt, um sie für die Modellierung vorzubereiten.\n", + "Test auf Multikollinearität: Eine Überprüfung der Multikollinearität zwischen den Variablen wird durchgeführt und nicht signifikante Merkmale werden entfernt.\n", + "Datenmodellierung:\n", + "Eine logistische Regressionsanalyse wird durchgeführt, um die Wahrscheinlichkeit der Kundenzufriedenheit basierend auf den ausgewählten Attributen zu modellieren.\n", + "\n", + "## Modellevaluation:\n", + "Die Leistung des Modells wird anhand verschiedener Metriken wie Genauigkeit, Präzision und Recall bewertet. Eine detaillierte Analyse der Konfusionsmatrix wird durchgeführt, um die Vorhersageleistung zu verstehen.\n", + "\n", + "## Bereitstellung:\n", + "Das trainierte Modell kann in die vorhandenen Geschäftsprozesse integriert werden, um proaktiv auf die Kundenzufriedenheit zu reagieren. Beispielsweise können Kundendienstteams benachrichtigt werden, wenn ein Kunde voraussichtlich unzufrieden sein wird, um spezifische Maßnahmen zur Problemlösung zu ergreifen und die Kundenerfahrung zu verbessern. Darüber hinaus kann das Modell dazu beitragen, Ressourcen effizienter zu nutzen, indem es das Unternehmen dabei unterstützt, sich auf die Bedürfnisse und Vorlieben seiner Kunden zu konzentrieren." + ] + }, { "attachments": {}, "cell_type": "markdown", @@ -7,7 +37,7 @@ "source": [ "# 1. Business Understanding\n", "\n", - "Der Datensatz besteht aus den Angaben von Kunden, die bereits mit ihnen geflogen sind. Das Feedback der Kunden zu verschiedenen Kontexten und deren Flugdaten wurde konsolidiert. Der Hauptzweck dieses Datensatzes besteht darin, vorherzusagen, ob ein zuk\u00fcnftiger Kunde angesichts der Details der anderen Parameterwerte mit seinem Service zufrieden sein w\u00fcrde. Auch die Fluggesellschaften m\u00fcssen wissen, auf welchen Aspekt der von ihnen angebotenen Dienstleistungen mehr Wert gelegt werden muss, um zufriedenere Kunden zu generieren." + "Der Datensatz besteht aus den Angaben von Kunden, die bereits mit ihnen geflogen sind. Das Feedback der Kunden zu verschiedenen Kontexten und deren Flugdaten wurde konsolidiert. Der Hauptzweck dieses Datensatzes besteht darin, vorherzusagen, ob ein zukünftiger Kunde angesichts der Details der anderen Parameterwerte mit seinem Service zufrieden sein würde. Auch die Fluggesellschaften müssen wissen, auf welchen Aspekt der von ihnen angebotenen Dienstleistungen mehr Wert gelegt werden muss, um zufriedenere Kunden zu generieren." ] }, { @@ -15,7 +45,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# 2. Daten und Datenverst\u00e4ndnis\n", + "# 2. Daten und Datenverständnis\n", "\n" ] }, @@ -226,7 +256,7 @@ " </tr>\n", " </tbody>\n", "</table>\n", - "<p>5 rows \u00d7 23 columns</p>\n", + "<p>5 rows × 23 columns</p>\n", "</div>" ], "text/plain": [ @@ -601,7 +631,7 @@ " </tr>\n", " </tbody>\n", "</table>\n", - "<p>11 rows \u00d7 23 columns</p>\n", + "<p>11 rows × 23 columns</p>\n", "</div>" ], "text/plain": [ @@ -1040,11 +1070,11 @@ "\n", "Voraussagendes Attribut: Zufriedenheit\n", "\n", - "Numerische Attribute: Alter,Flugdistanz,Sitzkomfort,Abflug-/Ankunftszeit g\u00fcnstig,Essen und Trinken,Lage des Gates,Wifi-Service an Bord,Unterhaltung an Bord,Online-Support,Einfachheit der Online-Buchung,Bordservice,Service in der Kabine, Gep\u00e4ckabfertigung,Checkin-Service,Sauberkeit,Online-Boarding,Abflugversp\u00e4tung in Minuten.\n", + "Numerische Attribute: Alter,Flugdistanz,Sitzkomfort,Abflug-/Ankunftszeit günstig,Essen und Trinken,Lage des Gates,Wifi-Service an Bord,Unterhaltung an Bord,Online-Support,Einfachheit der Online-Buchung,Bordservice,Service in der Kabine, Gepäckabfertigung,Checkin-Service,Sauberkeit,Online-Boarding,Abflugverspätung in Minuten.\n", "\n", "Kategoriale Attribute: Geschlecht, Kundentyp, Art der Reise, Klasse.\n", "\n", - "Das Attribut Ankunft in Minuten ist unausgewogen. Es k\u00f6nnte daran liegen, dass es null Werte enth\u00e4lt. Das muss gepr\u00fcft werden.\n", + "Das Attribut Ankunft in Minuten ist unausgewogen. Es könnte daran liegen, dass es null Werte enthält. Das muss geprüft werden.\n", "\n" ] }, @@ -1100,7 +1130,7 @@ " <tbody>\n", " </tbody>\n", "</table>\n", - "<p>0 rows \u00d7 23 columns</p>\n", + "<p>0 rows × 23 columns</p>\n", "</div>" ], "text/plain": [ @@ -1296,9 +1326,9 @@ "source": [ "## 2.4. Deskriptive Analyse\n", "\n", - "In diesem Teil des Notizbuchs wird die explorative Datenanalyse verwendet, um das Verst\u00e4ndnis der Daten zu ermitteln.\n", + "In diesem Teil des Notizbuchs wird die explorative Datenanalyse verwendet, um das Verständnis der Daten zu ermitteln.\n", "\n", - "Nach Abzug der Nullwerte besteht der Datensatz aus 129187 Zeilen, einer Zeile, die jeden Kunden beschreibt, und 21 Spalten, die die Eigenschaften der Kunden definieren. Anhand dieser Daten wird versucht zu klassifizieren, ob ein Kunde zufrieden ist oder nicht. Zu diesem Zweck enthalten die historischen Daten die Zielvariable \"Zufriedenheit\", die Auskunft dar\u00fcber gibt, ob ein Kunde zufrieden ist.\n" + "Nach Abzug der Nullwerte besteht der Datensatz aus 129187 Zeilen, einer Zeile, die jeden Kunden beschreibt, und 21 Spalten, die die Eigenschaften der Kunden definieren. Anhand dieser Daten wird versucht zu klassifizieren, ob ein Kunde zufrieden ist oder nicht. Zu diesem Zweck enthalten die historischen Daten die Zielvariable \"Zufriedenheit\", die Auskunft darüber gibt, ob ein Kunde zufrieden ist.\n" ] }, { @@ -1580,7 +1610,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Unterhaltung w\u00e4hrend des Fluges" + "### Unterhaltung während des Fluges" ] }, { @@ -1780,7 +1810,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Gep\u00e4ckabfertigung" + "### Gepäckabfertigung" ] }, { @@ -1975,7 +2005,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Die Korrelationsmatrix zeigt, dass die Attribute \"Flugentfernung\", \"Sitzkomfort\" und \"Alter\" eine kritische positive Korrelation von \u00fcber 0,8 aufweisen. Dieser Zusammenhang wird sp\u00e4ter im Rahmen der Multikollinearit\u00e4t erneut untersucht und muss entfernt werden." + "Die Korrelationsmatrix zeigt, dass die Attribute \"Flugentfernung\", \"Sitzkomfort\" und \"Alter\" eine kritische positive Korrelation von über 0,8 aufweisen. Dieser Zusammenhang wird später im Rahmen der Multikollinearität erneut untersucht und muss entfernt werden." ] }, { @@ -2134,9 +2164,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Aus den obigen Diagrammen k\u00f6nnen wir Folgendes schlie\u00dfen:\n", + "Aus den obigen Diagrammen können wir Folgendes schließen:\n", "\n", - "Weibliche Kunden, die mit AIRCO Airlines geflogen sind, sind zufriedener als m\u00e4nnliche Kunden. Loyale Kunden sind zufriedener als untreue Kunden. Personen, die aus gesch\u00e4ftlichen Gr\u00fcnden reisen, sind zufriedener als solche, die aus privaten Gr\u00fcnden reisen. Mehr Kunden reisen in der Business Class und sind auch zufriedener als diejenigen, die in der Economy Class fliegen." + "Weibliche Kunden, die mit AIRCO Airlines geflogen sind, sind zufriedener als männliche Kunden. Loyale Kunden sind zufriedener als untreue Kunden. Personen, die aus geschäftlichen Gründen reisen, sind zufriedener als solche, die aus privaten Gründen reisen. Mehr Kunden reisen in der Business Class und sind auch zufriedener als diejenigen, die in der Economy Class fliegen." ] }, { @@ -2176,9 +2206,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Aus den obigen Diagrammen k\u00f6nnen wir Folgendes schlie\u00dfen:\n", + "Aus den obigen Diagrammen können wir Folgendes schließen:\n", "\n", - "Weibliche Kunden, die mit AIRCO Airlines geflogen sind, sind zufriedener als m\u00e4nnliche Kunden. Loyale Kunden sind zufriedener als untreue Kunden. Personen, die aus gesch\u00e4ftlichen Gr\u00fcnden reisen, sind zufriedener als solche, die aus privaten Gr\u00fcnden reisen. Mehr Kunden reisen in der Business Class und sind auch zufriedener als diejenigen, die in der Economy Class fliegen." + "Weibliche Kunden, die mit AIRCO Airlines geflogen sind, sind zufriedener als männliche Kunden. Loyale Kunden sind zufriedener als untreue Kunden. Personen, die aus geschäftlichen Gründen reisen, sind zufriedener als solche, die aus privaten Gründen reisen. Mehr Kunden reisen in der Business Class und sind auch zufriedener als diejenigen, die in der Economy Class fliegen." ] }, { @@ -2485,7 +2515,7 @@ "metadata": {}, "outputs": [], "source": [ - "# Zielvariable und Pr\u00e4diktoren trennen\n", + "# Zielvariable und Prädiktoren trennen\n", "y = data_enc[\"satisfaction\"]\n", "X = data_enc.drop(labels = [\"satisfaction\"], axis = 1)" ] @@ -2737,7 +2767,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 3.3. Test auf Multikollinearit\u00e4t" + "## 3.3. Test auf Multikollinearität" ] }, { @@ -2745,7 +2775,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Um ein korrektes Funktionieren der sp\u00e4teren Regression zu gew\u00e4hrleisten, darf keine Multikollinearit\u00e4t zwischen den Variablen bestehen. Das Vorhandensein einer solchen wird mit Hilfe der Bibliothek Statsmodel \u00fcberpr\u00fcft." + "Um ein korrektes Funktionieren der späteren Regression zu gewährleisten, darf keine Multikollinearität zwischen den Variablen bestehen. Das Vorhandensein einer solchen wird mit Hilfe der Bibliothek Statsmodel überprüft." ] }, { @@ -2782,14 +2812,14 @@ "source": [ "from statsmodels.stats.outliers_influence import variance_inflation_factor \n", " \n", - "# unabh\u00e4ngige Variablen\n", + "# unabhängige Variablen\n", "vif_test = data_enc.drop(\"satisfaction\", axis=1)\n", " \n", "# VIF dataframe \n", "vif_data = pd.DataFrame() \n", "vif_data[\"feature\"] = vif_test.columns \n", " \n", - "# VIF f\u00fcr jedes Feature \n", + "# VIF für jedes Feature \n", "vif_data[\"VIF\"] = [variance_inflation_factor(vif_test.values, i) \n", " for i in range(len(vif_test.columns))] \n", " \n", @@ -2801,7 +2831,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Die \"Einfachheit der Online-Buchung\" hat den h\u00f6chsten VIF und wird aus dem Datensatz entfernt." + "Die \"Einfachheit der Online-Buchung\" hat den höchsten VIF und wird aus dem Datensatz entfernt." ] }, { @@ -2846,14 +2876,14 @@ "source": [ "from statsmodels.stats.outliers_influence import variance_inflation_factor \n", " \n", - "# unabh\u00e4ngige Variablen\n", + "# unabhängige Variablen\n", "vif_test = data_enc.drop(\"satisfaction\", axis=1)\n", " \n", "# VIF dataframe \n", "vif_data = pd.DataFrame() \n", "vif_data[\"feature\"] = vif_test.columns \n", " \n", - "# VIF f\u00fcr jedes Feature \n", + "# VIF für jedes Feature \n", "vif_data[\"VIF\"] = [variance_inflation_factor(vif_test.values, i) \n", " for i in range(len(vif_test.columns))] \n", " \n", @@ -2865,7 +2895,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "\"Sauberkeit\" hat nun den h\u00f6chsten VIF und wird aus dem Datensatz entfernt." + "\"Sauberkeit\" hat nun den höchsten VIF und wird aus dem Datensatz entfernt." ] }, { @@ -2928,7 +2958,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "\"Online-Support\" hat nun den h\u00f6chsten VIF und wird aus dem Datensatz entfernt." + "\"Online-Support\" hat nun den höchsten VIF und wird aus dem Datensatz entfernt." ] }, { @@ -3051,7 +3081,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "\"Sitzkomfort\" hat nun den h\u00f6chsten VIF und wird aus dem Datenrahmen entfernt." + "\"Sitzkomfort\" hat nun den höchsten VIF und wird aus dem Datenrahmen entfernt." ] }, { @@ -3111,7 +3141,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "\"Inflight Wifi Service\" hat nun den h\u00f6chsten VIF und wird aus dem Datenrahmen entfernt." + "\"Inflight Wifi Service\" hat nun den höchsten VIF und wird aus dem Datenrahmen entfernt." ] }, { @@ -3170,7 +3200,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "\"Inflight Entertainment\" hat nun den h\u00f6chsten VIF und wird aus dem Datenrahmen entfernt." + "\"Inflight Entertainment\" hat nun den höchsten VIF und wird aus dem Datenrahmen entfernt." ] }, { @@ -3228,7 +3258,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "\"On-board service\" hat nun die h\u00f6chste VIF und wird aus dem Datenrahmen entfernt." + "\"On-board service\" hat nun die höchste VIF und wird aus dem Datenrahmen entfernt." ] }, { @@ -3494,7 +3524,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Zur L\u00f6sung des Problems wird die logistische Regression verwendet. Hierf\u00fcr werden die beiden Bibliotheken Statsmodels und Scikit-Learn verwendet. Die vollst\u00e4ndige Auswertung des Modells findet erst im Unterkapitel zu Scikit-Learn statt." + "Zur Lösung des Problems wird die logistische Regression verwendet. Hierfür werden die beiden Bibliotheken Statsmodels und Scikit-Learn verwendet. Die vollständige Auswertung des Modells findet erst im Unterkapitel zu Scikit-Learn statt." ] }, { @@ -3561,7 +3591,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Das trainierte Modell zeigt statistisch nicht-signifikante Variablen an. Dies ist gegeben, wenn der Wert P>|z| gr\u00f6\u00dfer als 0,05 ist und es sich nicht um die Konstante handelt." + "Das trainierte Modell zeigt statistisch nicht-signifikante Variablen an. Dies ist gegeben, wenn der Wert P>|z| größer als 0,05 ist und es sich nicht um die Konstante handelt." ] }, { @@ -3702,7 +3732,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Keine nicht-signifikanten Variablen mehr. Das endg\u00fcltige Modell wird erstellt." + "Keine nicht-signifikanten Variablen mehr. Das endgültige Modell wird erstellt." ] }, { @@ -3772,7 +3802,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Zur Evaluation sollen mehrere Metriken verwendet werden, die komfortabler mittels Scikit-Learn erzeugt werden k\u00f6nnen. Deshalb wird das identische Modell wie mit Statsmodels nochmals in Scikit-Learn erzeugt." + "Zur Evaluation sollen mehrere Metriken verwendet werden, die komfortabler mittels Scikit-Learn erzeugt werden können. Deshalb wird das identische Modell wie mit Statsmodels nochmals in Scikit-Learn erzeugt." ] }, { @@ -3798,7 +3828,7 @@ "outputs": [], "source": [ "from sklearn.linear_model import LogisticRegression\n", - "# C wird ben\u00f6tigt um das exakt selbe Modell zu bilden, wie mit Statsmodels; Quelle: https://www.kdnuggets.com/2016/06/regularization-logistic-regression.html\n", + "# C wird benötigt um das exakt selbe Modell zu bilden, wie mit Statsmodels; Quelle: https://www.kdnuggets.com/2016/06/regularization-logistic-regression.html\n", "logistic_model = LogisticRegression(random_state=0, C=1e8)" ] }, @@ -3848,7 +3878,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Die Accuracy suggiert ein \u00fcberdurchschnittlich gutes Modell. Es handelt sich aber um einen balanciert Datensatz. " + "Die Accuracy suggiert ein überdurchschnittlich gutes Modell. Es handelt sich aber um einen balanciert Datensatz. " ] }, { @@ -3972,7 +4002,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Precision und Recall bieten ein deutlich realistischeres Bild des Modells. Es erzielt eine Precision von rund 75% und einen Recall von 84%. Der Recall ist f\u00fcr den Anwendungsfall deutlich wichtiger und muss nicht in dem Fall verbessert werden." + "Precision und Recall bieten ein deutlich realistischeres Bild des Modells. Es erzielt eine Precision von rund 75% und einen Recall von 84%. Der Recall ist für den Anwendungsfall deutlich wichtiger und muss nicht in dem Fall verbessert werden." ] }, { @@ -4006,7 +4036,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Die AUC der ROC-Kurve liefert einen guten Wert von 0,77 Daraus l\u00e4sst sich schlie\u00dfen, dass durch Optimierungen des Thresholds Optimierungspotential besteht." + "Die AUC der ROC-Kurve liefert einen guten Wert von 0,77 Daraus lässt sich schließen, dass durch Optimierungen des Thresholds Optimierungspotential besteht." ] }, { @@ -4022,7 +4052,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Zun\u00e4chst sollen jedoch die Ergebnisse f\u00fcr das Unternehmen dargestellt und gekl\u00e4rt werden, welche Dienstleistung zu einer Kundenzufriedenheit f\u00fchren w\u00fcrde und welche gegen die Kundenzufriedenheit sprechen." + "Zunächst sollen jedoch die Ergebnisse für das Unternehmen dargestellt und geklärt werden, welche Dienstleistung zu einer Kundenzufriedenheit führen würde und welche gegen die Kundenzufriedenheit sprechen." ] }, { @@ -4091,7 +4121,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Die drei wichtigsten Merkmale, die zur Kundenzufriedenheit f\u00fchren, sind:\n", + "Die drei wichtigsten Merkmale, die zur Kundenzufriedenheit führen, sind:\n", "\n", "Der Customer Type_disloyal Customer\n", "Die Klasse Eco Plus und\n", @@ -4133,11 +4163,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Die drei wichtigsten Merkmale, die zu Kundenunzufriedenheit f\u00fchren\n", + "Die drei wichtigsten Merkmale, die zu Kundenunzufriedenheit führen\n", "\n", "Das Alter\n", - "Art der Reise_Pers\u00f6nliche Reisen\n", - "Geschlecht M\u00e4nnlich" + "Art der Reise_Persönliche Reisen\n", + "Geschlecht Männlich" ] }, { @@ -4153,7 +4183,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Die Aufkl\u00e4rungsrate ist als Zielgr\u00f6\u00dfe zu niedrig und muss daher erh\u00f6ht werden. Daher werden die Metriken bei verschiedenen Schwellenwerten der logistischen Regression analysiert." + "Die Aufklärungsrate ist als Zielgröße zu niedrig und muss daher erhöht werden. Daher werden die Metriken bei verschiedenen Schwellenwerten der logistischen Regression analysiert." ] }, { @@ -4166,7 +4196,7 @@ "output_type": "stream", "text": [ "\n", - "******** F\u00fcr einen Schwellenwert von 0.05 ******\n", + "******** Für einen Schwellenwert von 0.05 ******\n", "Accuracy: 0.5464599036204127\n", "True Negatives: 0\n", "False Positives: 14682\n", @@ -4175,7 +4205,7 @@ "Recall: 1.0\n", "Precision: 0.5464599036204127\n", "\n", - "******** F\u00fcr einen Schwellenwert von 0.1 ******\n", + "******** Für einen Schwellenwert von 0.1 ******\n", "Accuracy: 0.5809650315087113\n", "True Negatives: 1360\n", "False Positives: 13322\n", @@ -4184,7 +4214,7 @@ "Recall: 0.9862634256642171\n", "Precision: 0.5670317527381455\n", "\n", - "******** F\u00fcr einen Schwellenwert von 0.15 ******\n", + "******** Für einen Schwellenwert von 0.15 ******\n", "Accuracy: 0.5809650315087113\n", "True Negatives: 1360\n", "False Positives: 13322\n", @@ -4193,7 +4223,7 @@ "Recall: 0.9862634256642171\n", "Precision: 0.5670317527381455\n", "\n", - "******** F\u00fcr einen Schwellenwert von 0.2 ******\n", + "******** Für einen Schwellenwert von 0.2 ******\n", "Accuracy: 0.5825404670703077\n", "True Negatives: 1418\n", "False Positives: 13264\n", @@ -4202,7 +4232,7 @@ "Recall: 0.9858677218767665\n", "Precision: 0.5680041688379365\n", "\n", - "******** F\u00fcr einen Schwellenwert von 0.25 ******\n", + "******** Für einen Schwellenwert von 0.25 ******\n", "Accuracy: 0.6289385889039911\n", "True Negatives: 3675\n", "False Positives: 11007\n", @@ -4211,7 +4241,7 @@ "Recall: 0.9431882419446015\n", "Precision: 0.6025205835620395\n", "\n", - "******** F\u00fcr einen Schwellenwert von 0.3 ******\n", + "******** Für einen Schwellenwert von 0.3 ******\n", "Accuracy: 0.6418818732237737\n", "True Negatives: 4139\n", "False Positives: 10543\n", @@ -4220,7 +4250,7 @@ "Recall: 0.9406444318824194\n", "Precision: 0.6121472979435677\n", "\n", - "******** F\u00fcr einen Schwellenwert von 0.35 ******\n", + "******** Für einen Schwellenwert von 0.35 ******\n", "Accuracy: 0.7478685283578401\n", "True Negatives: 7975\n", "False Positives: 6707\n", @@ -4229,7 +4259,7 @@ "Recall: 0.9177501413227812\n", "Precision: 0.7076540842123616\n", "\n", - "******** F\u00fcr einen Schwellenwert von 0.4 ******\n", + "******** Für einen Schwellenwert von 0.4 ******\n", "Accuracy: 0.753984925244038\n", "True Negatives: 9099\n", "False Positives: 5583\n", @@ -4238,7 +4268,7 @@ "Recall: 0.8654041831543244\n", "Precision: 0.7327685238368754\n", "\n", - "******** F\u00fcr einen Schwellenwert von 0.45 ******\n", + "******** Für einen Schwellenwert von 0.45 ******\n", "Accuracy: 0.7540467070307674\n", "True Negatives: 9101\n", "False Positives: 5581\n", @@ -4247,7 +4277,7 @@ "Recall: 0.8654041831543244\n", "Precision: 0.7328386787936811\n", "\n", - "******** F\u00fcr einen Schwellenwert von 0.5 ******\n", + "******** Für einen Schwellenwert von 0.5 ******\n", "Accuracy: 0.7619238848387495\n", "True Negatives: 9818\n", "False Positives: 4864\n", @@ -4256,7 +4286,7 @@ "Recall: 0.839287733182589\n", "Precision: 0.7532342346912891\n", "\n", - "******** F\u00fcr einen Schwellenwert von 0.55 ******\n", + "******** Für einen Schwellenwert von 0.55 ******\n", "Accuracy: 0.7619238848387495\n", "True Negatives: 9818\n", "False Positives: 4864\n", @@ -4265,7 +4295,7 @@ "Recall: 0.839287733182589\n", "Precision: 0.7532342346912891\n", "\n", - "******** F\u00fcr einen Schwellenwert von 0.6 ******\n", + "******** Für einen Schwellenwert von 0.6 ******\n", "Accuracy: 0.6669343877424935\n", "True Negatives: 10578\n", "False Positives: 4104\n", @@ -4274,7 +4304,7 @@ "Recall: 0.6224985867721877\n", "Precision: 0.7284996030695952\n", "\n", - "******** F\u00fcr einen Schwellenwert von 0.65 ******\n", + "******** Für einen Schwellenwert von 0.65 ******\n", "Accuracy: 0.6780242184603978\n", "True Negatives: 11824\n", "False Positives: 2858\n", @@ -4283,7 +4313,7 @@ "Recall: 0.5723572639909553\n", "Precision: 0.7798659785873835\n", "\n", - "******** F\u00fcr einen Schwellenwert von 0.7 ******\n", + "******** Für einen Schwellenwert von 0.7 ******\n", "Accuracy: 0.5688249104164093\n", "True Negatives: 13250\n", "False Positives: 1432\n", @@ -4292,7 +4322,7 @@ "Recall: 0.29191633691351043\n", "Precision: 0.7828987265009096\n", "\n", - "******** F\u00fcr einen Schwellenwert von 0.75 ******\n", + "******** Für einen Schwellenwert von 0.75 ******\n", "Accuracy: 0.5688249104164093\n", "True Negatives: 13250\n", "False Positives: 1432\n", @@ -4301,7 +4331,7 @@ "Recall: 0.29191633691351043\n", "Precision: 0.7828987265009096\n", "\n", - "******** F\u00fcr einen Schwellenwert von 0.8 ******\n", + "******** Für einen Schwellenwert von 0.8 ******\n", "Accuracy: 0.5688249104164093\n", "True Negatives: 13250\n", "False Positives: 1432\n", @@ -4310,7 +4340,7 @@ "Recall: 0.29191633691351043\n", "Precision: 0.7828987265009096\n", "\n", - "******** F\u00fcr einen Schwellenwert von 0.85 ******\n", + "******** Für einen Schwellenwert von 0.85 ******\n", "Accuracy: 0.5626158408501174\n", "True Negatives: 13298\n", "False Positives: 1384\n", @@ -4319,7 +4349,7 @@ "Recall: 0.27784058790276994\n", "Precision: 0.7802825845372281\n", "\n", - "******** F\u00fcr einen Schwellenwert von 0.9 ******\n", + "******** Für einen Schwellenwert von 0.9 ******\n", "Accuracy: 0.4535400963795873\n", "True Negatives: 14682\n", "False Positives: 0\n", @@ -4328,7 +4358,7 @@ "Recall: 0.0\n", "Precision: nan\n", "\n", - "******** F\u00fcr einen Schwellenwert von 0.95 ******\n", + "******** Für einen Schwellenwert von 0.95 ******\n", "Accuracy: 0.4535400963795873\n", "True Negatives: 14682\n", "False Positives: 0\n", @@ -4337,7 +4367,7 @@ "Recall: 0.0\n", "Precision: nan\n", "\n", - "******** F\u00fcr einen Schwellenwert von 0.99 ******\n", + "******** Für einen Schwellenwert von 0.99 ******\n", "Accuracy: 0.4535400963795873\n", "True Negatives: 14682\n", "False Positives: 0\n", @@ -4353,7 +4383,7 @@ "threshold_list = [0.05,0.1,0.15,0.2,0.25,0.3,0.35,0.4,0.45,0.5,0.55,0.6,0.65,.7,.75,.8,.85,.9,.95,.99]\n", "pred_proba_df = y_hat\n", "for i in threshold_list:\n", - " print ('\\n******** F\u00fcr einen Schwellenwert von {} ******'.format(i))\n", + " print ('\\n******** Für einen Schwellenwert von {} ******'.format(i))\n", " # Round up if value is above threshold\n", " y_test_pred = pred_proba_df.apply(lambda x: 1 if x>i else 0)\n", " # read metrics\n", @@ -4463,6 +4493,7 @@ } ], "metadata": { + "category": "CRM", "kernelspec": { "display_name": "Python 3", "language": "python", @@ -4480,9 +4511,8 @@ "pygments_lexer": "ipython3", "version": "3.8.5" }, - "title": "Customer Satisfaction Airlines", - "category": "CRM" + "title": "Customer Satisfaction Airlines" }, "nbformat": 4, "nbformat_minor": 4 -} \ No newline at end of file +} diff --git a/CRM/Increase customer satisfaction/notebook.ipynb b/CRM/Increase customer satisfaction/notebook.ipynb index 48d849e8cec3ec5e6f2f7aa16f71bf1747f6ef23..1ea469814c8d8c33fee0db552605a0b96e405d37 100644 --- a/CRM/Increase customer satisfaction/notebook.ipynb +++ b/CRM/Increase customer satisfaction/notebook.ipynb @@ -1,5 +1,35 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Geschäftlicher Kontext:\n", + "Das Ziel besteht darin, die Kundenzufriedenheit auf Netflix zu verbessern, indem die Abbruchquoten reduziert werden. Die große Auswahl an Inhalten erschwert es den Nutzern, geeignete Filme zu finden, was zu einem schlechten Nutzererlebnis führt. Durch die Anwendung von maschinellem Lernen auf Filmempfehlungen soll die Kundenzufriedenheit gesteigert werden.\n", + "\n", + "## Datengrundlage:\n", + "Die Daten stammen aus dem tmdb-Datensatz und enthalten Informationen zu Filmen wie Genres, Besetzung, Produktionsunternehmen, Einnahmen und Bewertungen. Der Datensatz wurde bereinigt und auf Multikollinearität überprüft, um ein geeignetes Modell zu erstellen.\n", + "\n", + "## ML-Strategie:\n", + "Das Ziel ist es, die Popularität oder Bewertung von Filmen vorherzusagen, um bessere Empfehlungen für die Nutzer zu generieren. Dies ist ein Regressionsproblem, bei dem die abhängige Variable die Popularität oder der Durchschnitt der Bewertungen ist.\n", + "\n", + "Datenvorbereitung (Details, einzelne Schritte):\n", + "Datenbereinigung: Nullwerte und Duplikate wurden entfernt.\n", + "Analyse und Transformation kategorialer Variablen wie Genres und Besetzung.\n", + "Feature-Engineering und Entfernen irrelevanter Variablen.\n", + "Aufteilung der Daten in Trainings- und Testsets.\n", + "Datenmodellierung:\n", + "Eine lineare Regression wurde angewendet, um die Beziehung zwischen den unabhängigen Variablen (Merkmale der Filme) und der abhängigen Variablen (Popularität oder Bewertung) zu modellieren.\n", + "\n", + "## Modellevaluation:\n", + "Die Leistung des Modells wurde sowohl auf den Trainings- als auch auf den Testdaten bewertet, wobei der R^2-Wert verwendet wurde, um die Modellgenauigkeit zu messen. Darüber hinaus wurden Visualisierungen verwendet, um die Vorhersagen mit den tatsächlichen Werten zu vergleichen.\n", + "\n", + "## Bereitstellung:\n", + "Integration des Modells in die Netflix-Plattform, um personalisierte Filmempfehlungen für die Nutzer zu generieren.\n", + "Implementierung einer Feedbackschleife, um das Modell kontinuierlich zu verbessern und die Empfehlungen zu optimieren.\n", + "Skalierung des Modells, um Millionen von Nutzern gleichzeitig zu bedienen und Echtzeit-Empfehlungen zu ermöglichen." + ] + }, { "attachments": {}, "cell_type": "markdown", @@ -7,15 +37,15 @@ "source": [ "# 1. Business Understanding\n", "\n", - "Aufgrund der gro\u00dfen Auswahl, die Netflix zu bieten hat, ist es f\u00fcr die Nutzer schwierig, geeignete Filme f\u00fcr sich zu finden. Die Suche in der Bibliothek nimmt viel Zeit in Anspruch und schafft ein schlechtes Nutzererlebnis, was wiederum zu h\u00f6heren Abbruchquoten f\u00fchrt.\n", - "Um die Abbruchquoten zu senken, muss gepr\u00fcft werden, ob die Kundenzufriedenheit durch die Anwendung von maschinellem Lernen in Bezug auf Filmempfehlungen erh\u00f6ht werden kann.\n", + "Aufgrund der großen Auswahl, die Netflix zu bieten hat, ist es für die Nutzer schwierig, geeignete Filme für sich zu finden. Die Suche in der Bibliothek nimmt viel Zeit in Anspruch und schafft ein schlechtes Nutzererlebnis, was wiederum zu höheren Abbruchquoten führt.\n", + "Um die Abbruchquoten zu senken, muss geprüft werden, ob die Kundenzufriedenheit durch die Anwendung von maschinellem Lernen in Bezug auf Filmempfehlungen erhöht werden kann.\n", "\n", "\n", - "Der Datensatz enth\u00e4lt Filmdaten aus dem tmdb Dataset.\n", - "Finden Sie heraus, welche Faktoren auf der Grundlage der Daten \u00fcber die Beliebtheit oder Bewertung der Filme ergriffen werden k\u00f6nnen, um Strategien f\u00fcr das Unternehmen zu entwickeln.\n", - "Basierend auf dem obigen Gesch\u00e4ftsproblem definieren wir die abh\u00e4ngige Variable (y)\n", + "Der Datensatz enthält Filmdaten aus dem tmdb Dataset.\n", + "Finden Sie heraus, welche Faktoren auf der Grundlage der Daten über die Beliebtheit oder Bewertung der Filme ergriffen werden können, um Strategien für das Unternehmen zu entwickeln.\n", + "Basierend auf dem obigen Geschäftsproblem definieren wir die abhängige Variable (y)\n", "\n", - "Problem 1: y = Popularit\u00e4t / Voting-Durchschnitt (Regressionsproblem)" + "Problem 1: y = Popularität / Voting-Durchschnitt (Regressionsproblem)" ] }, { @@ -23,9 +53,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# 2. Daten und Datenverst\u00e4ndnis\n", + "# 2. Daten und Datenverständnis\n", "\n", - "Aus dem Datensatz ist ersichtlich, dass sowohl Zahlen als auch kategoriale Werte enthalten sind. Jede Kategorie bezieht sich auf den entsprechenden Film in der Zeile. So enth\u00e4lt beispielsweise die Spalte \"Crew\" mehrere Mitwirkende wie Autoren, Filmeditor usw., w\u00e4hrend \"Cast\" die Schauspieler enth\u00e4lt, die in den jeweiligen Filmen mitspielen. Au\u00dferdem hat jeder Film eine eindeutige ID, z. B. movie_id/id, die identisch ist und es erm\u00f6glicht, beide Datens\u00e4tze zu kombinieren. Alle Daten sind sehr verst\u00e4ndlich und selbsterkl\u00e4rend, und der Inhalt ist auf kaggle.com ausdr\u00fccklich beschrieben." + "Aus dem Datensatz ist ersichtlich, dass sowohl Zahlen als auch kategoriale Werte enthalten sind. Jede Kategorie bezieht sich auf den entsprechenden Film in der Zeile. So enthält beispielsweise die Spalte \"Crew\" mehrere Mitwirkende wie Autoren, Filmeditor usw., während \"Cast\" die Schauspieler enthält, die in den jeweiligen Filmen mitspielen. Außerdem hat jeder Film eine eindeutige ID, z. B. movie_id/id, die identisch ist und es ermöglicht, beide Datensätze zu kombinieren. Alle Daten sind sehr verständlich und selbsterklärend, und der Inhalt ist auf kaggle.com ausdrücklich beschrieben." ] }, { @@ -58,7 +88,7 @@ "sns.set()\n", "\n", "\n", - "# statsmodels ben\u00f6tigt diese Funktion (chisqprob) von skipy f\u00fcr Berichte\n", + "# statsmodels benötigt diese Funktion (chisqprob) von skipy für Berichte\n", "from scipy import stats\n", "stats.chisqprob = lambda chisq, df: stats.chi2.sf(chisq, df)" ] @@ -103,7 +133,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Datenverst\u00e4ndnis" + "### Datenverständnis" ] }, { @@ -213,7 +243,7 @@ " <td>[{\"id\": 470, \"name\": \"spy\"}, {\"id\": 818, \"name...</td>\n", " <td>en</td>\n", " <td>Spectre</td>\n", - " <td>A cryptic message from Bond\u2019s past sends him o...</td>\n", + " <td>A cryptic message from Bond’s past sends him o...</td>\n", " <td>107.376788</td>\n", " <td>[{\"name\": \"Columbia Pictures\", \"id\": 5}, {\"nam...</td>\n", " <td>...</td>\n", @@ -278,7 +308,7 @@ " </tr>\n", " </tbody>\n", "</table>\n", - "<p>5 rows \u00d7 23 columns</p>\n", + "<p>5 rows × 23 columns</p>\n", "</div>" ], "text/plain": [ @@ -313,7 +343,7 @@ " overview popularity \\\n", "0 In the 22nd century, a paraplegic Marine is di... 150.437577 \n", "1 Captain Barbossa, long believed to be dead, ha... 139.082615 \n", - "2 A cryptic message from Bond\u2019s past sends him o... 107.376788 \n", + "2 A cryptic message from Bond’s past sends him o... 107.376788 \n", "3 Following the death of District Attorney Harve... 112.312950 \n", "4 John Carter is a war-weary, former military ca... 43.926995 \n", "\n", @@ -687,7 +717,7 @@ " </tr>\n", " </tbody>\n", "</table>\n", - "<p>11 rows \u00d7 23 columns</p>\n", + "<p>11 rows × 23 columns</p>\n", "</div>" ], "text/plain": [ @@ -866,7 +896,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Auf Nullwerte pr\u00fcfen" + "### Auf Nullwerte prüfen" ] }, { @@ -969,7 +999,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Auf Duplikate pr\u00fcfen" + "### Auf Duplikate prüfen" ] }, { @@ -1024,7 +1054,7 @@ " <tbody>\n", " </tbody>\n", "</table>\n", - "<p>0 rows \u00d7 23 columns</p>\n", + "<p>0 rows × 23 columns</p>\n", "</div>" ], "text/plain": [ @@ -1049,7 +1079,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 2.4 Test auf Multikollinearit\u00e4t" + "## 2.4 Test auf Multikollinearität" ] }, { @@ -1057,7 +1087,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Keine nicht-signifikanten Variablen mehr. Das endg\u00fcltige Modell wird erstellt." + "Keine nicht-signifikanten Variablen mehr. Das endgültige Modell wird erstellt." ] }, { @@ -1671,7 +1701,7 @@ " </tr>\n", " </tbody>\n", "</table>\n", - "<p>1262 rows \u00d7 8 columns</p>\n", + "<p>1262 rows × 8 columns</p>\n", "</div>" ], "text/plain": [ @@ -3276,7 +3306,7 @@ " </tr>\n", " </tbody>\n", "</table>\n", - "<p>5 rows \u00d7 1337 columns</p>\n", + "<p>5 rows × 1337 columns</p>\n", "</div>" ], "text/plain": [ @@ -3514,6 +3544,7 @@ } ], "metadata": { + "category": "CRM", "kernelspec": { "display_name": "Python 3", "language": "python", @@ -3531,9 +3562,8 @@ "pygments_lexer": "ipython3", "version": "3.8.5" }, - "title": "Increase customer satisfaction", - "category": "CRM" + "title": "Increase customer satisfaction" }, "nbformat": 4, "nbformat_minor": 4 -} \ No newline at end of file +} diff --git a/CRM/Sentiment analysis on amazon alexa reviews/notebook.ipynb b/CRM/Sentiment analysis on amazon alexa reviews/notebook.ipynb index 1ffd6e69d4ea89bc6e9a918e5de39e9cd3dacace..3ab2d10c4fb8033f553665d6e947d365a0974b74 100644 --- a/CRM/Sentiment analysis on amazon alexa reviews/notebook.ipynb +++ b/CRM/Sentiment analysis on amazon alexa reviews/notebook.ipynb @@ -1,8 +1,35 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Geschäftlicher Kontext:\n", + "Das Ziel besteht darin, die Stimmung der Kunden in Bezug auf Amazon Alexa anhand von Bewertungen zu analysieren. Durch die Bewertung der Kundenmeinungen kann Amazon Trends identifizieren und potenzielle Probleme erkennen, um die Kundenzufriedenheit zu verbessern.\n", + "\n", + "## Datengrundlage:\n", + "Die Daten stammen aus einem Datensatz von Amazon Alexa-Bewertungen. Dieser Datensatz enthält Bewertungen, Längen der Bewertungen, Sternebewertungen und Variationen von Amazon Alexa-Produkten.\n", + "\n", + "## ML-Strategie:\n", + "Eine Klassifizierungsaufgabe wird angewendet, um die Kundenbewertungen als positiv oder negativ zu klassifizieren. Dabei werden verschiedene Merkmale der Bewertungen verwendet, um Vorhersagen zu treffen. Zwei Modelle werden implementiert: ein Entscheidungsbaumklassifikator und ein weiterer Entscheidungsbaumklassifikator mit balancierten Klassen.\n", + "\n", + "Datenvorbereitung (Details, einzelne Schritte):\n", + "Datenexploration und -bereinigung: Analyse der Längen der Bewertungen, Verteilung der Sternebewertungen, Identifizierung der Variationen von Alexa-Produkten.\n", + "Tokenisierung und Entfernung von Stoppwörtern: Die Bewertungen werden in einzelne Wörter zerlegt, Stoppwörter werden entfernt und die verbleibenden Wörter werden gestemmt.\n", + "Vektorisierung: Die bearbeiteten Bewertungen werden in numerische Vektoren umgewandelt, die als Eingabe für das Modell dienen.\n", + "Datenmodellierung:\n", + "Es werden zwei Entscheidungsbaumklassifikatoren trainiert, um die Kundenbewertungen zu klassifizieren. Die Modelle werden auf Trainingsdaten trainiert und auf Testdaten evaluiert.\n", + "\n", + "## Modellevaluation:\n", + "Die Leistung der Modelle wird anhand verschiedener Metriken wie Genauigkeit, Präzision, Rückruf und F1-Score bewertet. Außerdem werden Konfusionsmatrizen und Klassifikationsberichte verwendet, um die Ergebnisse im Detail zu analysieren.\n", + "\n", + "## Bereitstellung:\n", + "Die Modelle können in Produktionsumgebungen integriert werden, um eingehende Kundenbewertungen automatisch zu analysieren und Trends zu identifizieren. Diese Erkenntnisse können dann genutzt werden, um Produktverbesserungen vorzunehmen und die Kundenzufriedenheit zu steigern." + ] + }, { "cell_type": "code", - "execution_count": 56, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -64,7 +91,7 @@ "# For central installation, set this to C:\\nltk_data (Windows), /usr/local/share/nltk_data (Mac), or /usr/share/nltk_data (Unix). \n", "# Next, select the packages or collections you want to download.\n", "# If you did not install the data to one of the above central locations, you will need to set the NLTK_DATA environment variable \n", - "# to specify the location of the data. (On a Windows machine, right click on \u201cMy Computer\u201d then \n", + "# to specify the location of the data. (On a Windows machine, right click on “My Computer†then \n", "# select Properties > Advanced > Environment Variables > User Variables > New...)\n", "# Test that the data has been installed as follows. (This assumes you downloaded the Brown Corpus):\n", "\n", @@ -387,12 +414,12 @@ } ], "source": [ - "# Es wird \u00fcberpr\u00fcft, ob es \"null data\" gibt oder nicht --> es geht hervor, dass es keine \"null data\" gibt\n", + "# Es wird überprüft, ob es \"null data\" gibt oder nicht --> es geht hervor, dass es keine \"null data\" gibt\n", "\n", "alexa.isnull().any().any()\n", "\n", "\n", - "# ## Beschreibung der Daten entsprechend der L\u00e4nge der Bewertungen" + "# ## Beschreibung der Daten entsprechend der Länge der Bewertungen" ] }, { @@ -908,7 +935,7 @@ } ], "source": [ - "#Es wird eine L\u00e4ngenkolonne zur Analyse der L\u00e4nge der Bewertungen hinzugef\u00fcgt\n", + "#Es wird eine Längenkolonne zur Analyse der Länge der Bewertungen hinzugefügt\n", "\n", "alexa['length'] = alexa['verified_reviews'].apply(len)\n", "alexa.groupby('length').describe().sample(20)" @@ -922,7 +949,7 @@ { "data": { "text/plain": [ - "Text(0.5, 1.0, 'Verteilung nach L\u00e4nge')" + "Text(0.5, 1.0, 'Verteilung nach Länge')" ] }, "execution_count": 65, @@ -941,11 +968,11 @@ } ], "source": [ - "#veranschaulicht die Verteilung nach L\u00e4nge\n", + "#veranschaulicht die Verteilung nach Länge\n", "\n", "plt.figure(figsize=(8,5))\n", "alexa.length.plot(color = 'lightblue',kind=\"box\")\n", - "plt.title(\"Verteilung nach L\u00e4nge\")" + "plt.title(\"Verteilung nach Länge\")" ] }, { @@ -956,7 +983,7 @@ { "data": { "text/plain": [ - "Text(0.5, 1.0, 'Durschnittliche Wortl\u00e4nge von positiven und negativen Bewertungen')" + "Text(0.5, 1.0, 'Durschnittliche Wortlänge von positiven und negativen Bewertungen')" ] }, "execution_count": 66, @@ -975,11 +1002,11 @@ } ], "source": [ - "#veranschaulicht die Durschnittliche Wortl\u00e4nge von positiven und negativen Bewertungen \n", + "#veranschaulicht die Durschnittliche Wortlänge von positiven und negativen Bewertungen \n", "\n", "colors = ['teal', 'cadetblue']\n", "alexa.groupby(\"feedback\").length.mean().plot(color = colors, kind=\"bar\")\n", - "plt.title(\"Durschnittliche Wortl\u00e4nge von positiven und negativen Bewertungen\")" + "plt.title(\"Durschnittliche Wortlänge von positiven und negativen Bewertungen\")" ] }, { @@ -1000,7 +1027,7 @@ ], "source": [ "alexa['length'].value_counts().plot.hist(color = 'lightblue', figsize = (15, 5), bins = 50)\n", - "plt.title('Verteilung der L\u00e4nge der Bewertungen')\n", + "plt.title('Verteilung der Länge der Bewertungen')\n", "plt.xlabel('lengths')\n", "plt.ylabel('count')\n", "plt.show()" @@ -1023,7 +1050,7 @@ } ], "source": [ - "#zeigt ein paar Beispiele von verschiedenen Bewertungen mit verschiedenen L\u00e4ngen\n", + "#zeigt ein paar Beispiele von verschiedenen Bewertungen mit verschiedenen Längen\n", "\n", "alexa[alexa['length'] == 13]['verified_reviews'].iloc[0]" ] @@ -1289,7 +1316,7 @@ } ], "source": [ - "#zeigt die Verteilung der Sterne-Bewertungen an --> es geht hervor, dass am h\u00e4ufigsten 5 Sterne vergeben werden\n", + "#zeigt die Verteilung der Sterne-Bewertungen an --> es geht hervor, dass am häufigsten 5 Sterne vergeben werden\n", "\n", "alexa.groupby('rating').describe()" ] @@ -1409,7 +1436,7 @@ "plt.title(\"Prozentuale Verteilung nach Anzahl der Sterne\")\n", "\n", "\n", - "# ## Rating vs. L\u00e4nge\n", + "# ## Rating vs. Länge\n", "# \n", "# " ] @@ -1422,7 +1449,7 @@ { "data": { "text/plain": [ - "Text(0.5, 1.0, 'Rating vs. L\u00e4nge')" + "Text(0.5, 1.0, 'Rating vs. Länge')" ] }, "execution_count": 77, @@ -1441,11 +1468,11 @@ } ], "source": [ - "#veranschaulicht die Verteilung der Bewertungen nach Sternevergabe und L\u00e4nge\n", + "#veranschaulicht die Verteilung der Bewertungen nach Sternevergabe und Länge\n", "\n", "colors = ['lightskyblue', 'teal', 'darkgrey', 'cadetblue', 'powderblue']\n", "alexa.groupby(\"rating\").length.mean().plot(color= colors,kind=\"bar\")\n", - "plt.title(\"Rating vs. L\u00e4nge\")\n", + "plt.title(\"Rating vs. Länge\")\n", "\n", "\n", "# ## Variation vs. Rating " @@ -1476,7 +1503,7 @@ "plt.show()\n", "\n", "\n", - "# ## Variation vs. L\u00e4nge " + "# ## Variation vs. Länge " ] }, { @@ -1502,7 +1529,7 @@ "plt.show()\n", "\n", "\n", - "# ## Feedback vs. L\u00e4nge\n", + "# ## Feedback vs. Länge\n", "# " ] }, @@ -1529,7 +1556,7 @@ "plt.rcParams['figure.figsize'] = (12, 7)\n", "\n", "sns.stripplot(alexa['feedback'], alexa['length'], palette = 'ocean')\n", - "plt.title(\"Feedback vs. L\u00e4nge\")\n", + "plt.title(\"Feedback vs. Länge\")\n", "plt.show()" ] }, @@ -1600,7 +1627,7 @@ } ], "source": [ - "# CountVectorizer zeigt die am h\u00e4ufigsten verwendeten W\u00f6rter\n", + "# CountVectorizer zeigt die am häufigsten verwendeten Wörter\n", "\n", "cv = CountVectorizer(stop_words = 'english')\n", "words = cv.fit_transform(alexa.verified_reviews)\n", @@ -1612,7 +1639,7 @@ "\n", "color = plt.cm.ocean(np.linspace(0, 1, 20))\n", "frequency.head(20).plot(x='word', y='freq', kind='bar', figsize=(15, 6), color=color)\n", - "plt.title(\"Die meist verwendeten W\u00f6rter - Top 20\")\n", + "plt.title(\"Die meist verwendeten Wörter - Top 20\")\n", "plt.show()" ] }, @@ -1633,7 +1660,7 @@ } ], "source": [ - "#Visualisiert die meist verwendeten W\u00f6rter\n", + "#Visualisiert die meist verwendeten Wörter\n", "\n", "wordcloud = WordCloud(background_color = 'lightcyan', width = 2000, height = 2000).generate_from_frequencies(dict(words_freq))\n", "\n", @@ -1641,7 +1668,7 @@ "plt.figure(figsize=(10, 10))\n", "plt.axis('off')\n", "plt.imshow(wordcloud)\n", - "plt.title(\"Verwendete W\u00f6rter\", fontsize = 20)\n", + "plt.title(\"Verwendete Wörter\", fontsize = 20)\n", "plt.show()" ] }, @@ -1817,7 +1844,7 @@ " </tr>\n", " </tbody>\n", "</table>\n", - "<p>3150 rows \u00d7 6 columns</p>\n", + "<p>3150 rows × 6 columns</p>\n", "</div>" ], "text/plain": [ @@ -4624,6 +4651,7 @@ } ], "metadata": { + "category": "CRM", "interpreter": { "hash": "d8ad938b111551bd971540a987a9651c3040c84fd74b784460cb61a1a48b653c" }, @@ -4645,9 +4673,8 @@ "version": "3.8.9" }, "orig_nbformat": 4, - "title": "Sentiment analysis on amazon alexa reviews", - "category": "CRM" + "title": "Sentiment analysis on amazon alexa reviews" }, "nbformat": 4, "nbformat_minor": 2 -} \ No newline at end of file +} diff --git a/Forecast/Forecast of required vehicles in the city center/notebook.ipynb b/Forecast/Forecast of required vehicles in the city center/notebook.ipynb index 7087fb4bbe6bff54ae27258c883adec74bbad62a..094ec5523ea33e854e4815c1d884d9a331624508 100644 --- a/Forecast/Forecast of required vehicles in the city center/notebook.ipynb +++ b/Forecast/Forecast of required vehicles in the city center/notebook.ipynb @@ -1,14 +1,51 @@ { "cells": [ { - "attachments": {}, "cell_type": "markdown", "metadata": {}, + "source": [ + "## Geschäftlicher Kontext:\n", + "Das Geschäftsmodell von Uber besteht daraus, als Vermittler zwischen Fahrer und Fahrgast zu dienen. Für einen Konzepterfolg in Bezug auf die Kundenzufriedenheit,\n", + "müssen effiziente Verfahren für beide Parteien vorhanden sein.\n", + "Auf Basis dieser Grundlage soll folgende Fragestellung beantwortet werden:\n", + "\n", + "„Wie kann die Menge an benötigten Fahrzeugen im innerstädtischen Raum möglichst präzise prognostiziert werden am Beispiel von Uber?“ \n", + "\n", + "## Datengrundlage:\n", + "Der Datensatz enthält Informationen über verschiedene Uber-Basisstationen in New York City, einschließlich der Anzahl der aktiven Fahrzeuge und der Anzahl der Fahrten. Zusätzlich enthält er das Datum der Datenerfassung und eine Basiscodekategorie. Quelle: https://www.kaggle.com/fivethirtyeight/uber-pickups-in-new-york-city\n", + "\n", + "## ML-Strategie:\n", + "Eine lineare Regressionsanalyse wird verwendet, um die Beziehung zwischen der Anzahl der aktiven Fahrzeuge und der Anzahl der Fahrten zu modellieren. Die Vorhersage des Bedarfs an aktiven Fahrzeugen basiert auf historischen Daten zu Fahrten und Fahrzeugverfügbarkeit.\n", + "\n", + "Datenvorbereitung (Details, einzelne Schritte):\n", + "Datenbereinigung: Nullwerte werden überprüft und entfernt. Die Datenverteilung wird analysiert und unnatürliche Ausreißer werden entfernt, um die Modellgenauigkeit zu verbessern.\n", + "Transformationen: Logarithmische Transformationen werden auf bestimmte Variablen angewendet, um schief verteilte Daten anzupassen und die Modellierung zu verbessern.\n", + "Umkodierung von kategorialen Variablen: Kategorische Variablen werden in Dummy-Variablen umgewandelt, um sie für die Regression zu verwenden.\n", + "Aufteilung der Daten: Die Daten werden in Trainings- und Testsets aufgeteilt, um das Modell zu trainieren und zu evaluieren.\n", + "Datenmodellierung:\n", + "Eine lineare Regressionsanalyse wird durchgeführt, um die Beziehung zwischen der Anzahl der aktiven Fahrzeuge und anderen Variablen zu modellieren. Das Modell wird sowohl auf Trainings- als auch auf Testdaten evaluiert, um die Vorhersagegenauigkeit zu bewerten.\n", + "\n", + "## Modellevaluation:\n", + "Die Leistung des Modells wird anhand verschiedener Metriken wie R-Quadrat-Wert, Residuenanalyse und Prognosedifferenz zwischen den tatsächlichen und vorhergesagten Werten bewertet.\n", + "\n", + "## Bereitstellung:\n", + "Das trainierte Modell kann in Echtzeit in die Uber-Systeme integriert werden, um die Fahrzeugverfügbarkeit basierend auf aktuellen und historischen Daten vorherzusagen. Diese Vorhersagen können dann verwendet werden, um operative Entscheidungen zu treffen und die Servicequalität zu verbessern." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "vscode": { + "languageId": "plaintext" + } + }, + "outputs": [], "source": [ "# 1. Business Understanding\n", "\n", - "Uber Technologies Inc. ist ein 2009 gegr\u00fcndetes Unternehmen mit Sitz in San Francisco. Es hat 91 Millionen aktive Nutzer und 3,9 Millionen Fahrer weltweit. Das Unternehmen ist mit seiner App in insgesamt 63 L\u00e4ndern vertreten.\n", - "Es muss ein grundlegendes Verst\u00e4ndnis f\u00fcr die Ziele aus der Unternehmensperspektive vorhanden sein. Darauf aufbauend k\u00f6nnen dann die entsprechenden Anforderungen an ein Data-Mining-Projekt definiert werden, damit diese realisiert werden k\u00f6nnen. Uber versucht, Prognosen auf Basis von Angebot und Nachfrage so zu optimieren, dass eine Verf\u00fcgbarkeit von Fahrzeugen stets gew\u00e4hrleistet ist, um den Service f\u00fcr seine Nutzer aufrechtzuerhalten. Dieser Datensatz soll die Realisierbarkeit dieses Ziels demonstrieren." + "Uber Technologies Inc. ist ein 2009 gegründetes Unternehmen mit Sitz in San Francisco. Es hat 91 Millionen aktive Nutzer und 3,9 Millionen Fahrer weltweit. Das Unternehmen ist mit seiner App in insgesamt 63 Ländern vertreten.\n", + "Es muss ein grundlegendes Verständnis für die Ziele aus der Unternehmensperspektive vorhanden sein. Darauf aufbauend können dann die entsprechenden Anforderungen an ein Data-Mining-Projekt definiert werden, damit diese realisiert werden können. Uber versucht, Prognosen auf Basis von Angebot und Nachfrage so zu optimieren, dass eine Verfügbarkeit von Fahrzeugen stets gewährleistet ist, um den Service für seine Nutzer aufrechtzuerhalten. Dieser Datensatz soll die Realisierbarkeit dieses Ziels demonstrieren." ] }, { @@ -16,11 +53,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# 2. Daten und Datenverst\u00e4ndnis\n", + "# 2. Daten und Datenverständnis\n", "\n", "Der Datensatz besteht aus vier Basisvariablen: Abfertigungsbasisnummer, Datum, active_vehicles und Fahrten.\n", - "Die Variable \"dispatching base number\" ist ein vom TLC zugewiesener Code, der eine Uber-Basis in New York City angibt. Dementsprechend k\u00f6nnen die Codes den folgenden Basen zugewiesen werden: B02512: Unter, B02598: Hinter, B02617: Neben, B02682: Taste, B02764: Nach-NY, B02765: Grun, B02835: Dreist, B02836: Inside.\n", - "Durch einen ersten \u00dcberblick \u00fcber die verf\u00fcgbaren Daten kann man bereits \u00fcber m\u00f6gliche Abh\u00e4ngigkeiten zwischen der Anzahl der aktiven Fahrzeuge, der Anzahl der Fahrten sowie dem Datum spekulieren." + "Die Variable \"dispatching base number\" ist ein vom TLC zugewiesener Code, der eine Uber-Basis in New York City angibt. Dementsprechend können die Codes den folgenden Basen zugewiesen werden: B02512: Unter, B02598: Hinter, B02617: Neben, B02682: Taste, B02764: Nach-NY, B02765: Grun, B02835: Dreist, B02836: Inside.\n", + "Durch einen ersten Überblick über die verfügbaren Daten kann man bereits über mögliche Abhängigkeiten zwischen der Anzahl der aktiven Fahrzeuge, der Anzahl der Fahrten sowie dem Datum spekulieren." ] }, { @@ -1099,7 +1136,7 @@ "metadata": {}, "outputs": [], "source": [ - "#Transformation f\u00fcr kontinuierliche Variablen\n", + "#Transformation für kontinuierliche Variablen\n", "#Log: Die Logarithmentransformation hilft bei schiefen Daten, die Schiefe zu reduzieren. Siehe Oben\n", "\n", "log_trips = np.log(data_cleaned['trips'])\n", @@ -1648,7 +1685,7 @@ " </tr>\n", " </tbody>\n", "</table>\n", - "<p>5 rows \u00d7 66 columns</p>\n", + "<p>5 rows × 66 columns</p>\n", "</div>" ], "text/plain": [ @@ -3925,6 +3962,7 @@ } ], "metadata": { + "category": "Forecast", "kernelspec": { "display_name": "Python 3", "language": "python", @@ -3942,9 +3980,8 @@ "pygments_lexer": "ipython3", "version": "3.8.5" }, - "title": "Forecast of required vehicles in the city center", - "category": "Forecast" + "title": "Forecast of required vehicles in the city center" }, "nbformat": 4, "nbformat_minor": 2 -} \ No newline at end of file +} diff --git a/Forecast/Sales Forecast for retail store/notebook_Multiple Linear Regression.ipynb b/Forecast/Sales Forecast for retail store/notebook_Multiple Linear Regression.ipynb index c9c1c6054aca7f73b84405e84a91bd938074f675..d4bdd909c713360b8c99b22d38a42b5a3e63b366 100644 --- a/Forecast/Sales Forecast for retail store/notebook_Multiple Linear Regression.ipynb +++ b/Forecast/Sales Forecast for retail store/notebook_Multiple Linear Regression.ipynb @@ -1,5 +1,34 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## Geschäftlicher Kontext:\n", + "Um erfolgreich zu sein, benötigt der Einzelhandel hohe Umsätze und eine Just-in-time-Lieferung der Produkte. Daher werden Prognosen darüber benötigt, welche Filialen in welchen Abteilungen wie viel Umsatz pro Woche machen. \n", + "\n", + "## Datengrundlage:\n", + "Die Daten umfassen Informationen aus verschiedenen Quellen, darunter historische Verkaufsdaten, demografische Merkmale wie Verbraucherpreisindex (VPI), Arbeitslosenquote, Temperatur usw., sowie Laden- und Abteilungsmerkmale wie Größe, Typ und Marktdaten. Quelle: https://www.kaggle.com/c/walmart-recruiting-store-sales-forecasting/data\n", + "\n", + "## ML-Strategie:\n", + "Eine multiple lineare Regressionsanalyse wird angewendet, um die Beziehung zwischen Umsatz und verschiedenen Einflussfaktoren wie Filialgröße, demografischen Daten und Wochen zu modellieren. Die Daten werden in Trainings- und Testsets aufgeteilt, um das Modell zu trainieren und zu validieren.\n", + "\n", + "Datenvorbereitung (Details, einzelne Schritte):\n", + "Datenbereinigung: Nullwerte und Duplikate werden entfernt, und fehlende Werte werden durch geeignete Methoden wie Mittelwertersetzung oder Entfernung behandelt.\n", + "Deskriptive Analyse: Die Daten werden visuell untersucht, um Muster, Korrelationen und Trends zu identifizieren, die für die Modellbildung relevant sein könnten.\n", + "Transformationen: Logarithmische Transformationen werden durchgeführt, um nicht-lineare Beziehungen zwischen Variablen anzupassen und OLS-Annahmen zu erfüllen.\n", + "Dummy-Variablen: Kategoriale Variablen werden in Dummy-Variablen umgewandelt, um sie für die Regression zu verwenden.\n", + "Datenmodellierung:\n", + "Ein multiple lineares Regressionsmodell wird erstellt, um die Beziehung zwischen den unabhängigen Variablen (Merkmale) und der abhängigen Variablen (Umsatz) zu modellieren. Das Modell wird trainiert und evaluiert, um seine Vorhersagegenauigkeit zu bewerten.\n", + "\n", + "## Modellevaluation:\n", + "Die Leistung des Modells wird anhand verschiedener Metriken wie R-Quadrat-Wert, Residuenanalyse und prozentualer Unterschiede zwischen den tatsächlichen und vorhergesagten Werten bewertet.\n", + "\n", + "## Bereitstellung:\n", + "Das trainierte Modell kann verwendet werden, um zukünftige Umsatzprognosen für verschiedene Filialen und Abteilungen zu generieren. Diese Prognosen können von Einzelhändlern verwendet werden, um Bestandsentscheidungen zu treffen, Marketingstrategien zu planen und die Betriebsleistung zu optimieren." + ] + }, { "attachments": {}, "cell_type": "markdown", @@ -13,7 +42,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Ein Einzelh\u00e4ndler braucht einen sehr hohen Umsatz und eine Just-in-time-Lieferung von Produkten, um erfolgreich zu sein. Dazu werden sehr genaue Prognosen ben\u00f6tigt, die genaue Aussagen dar\u00fcber erlauben, welche Filialen in welchen Abteilungen wie viel Umsatz pro Woche machen. Die Fragestellung lautet daher wie folgt: Wie hoch ist die w\u00f6chentliche Umsatzprognose f\u00fcr alle Filialen eines fiktiven Marktes, wenn wir die Daten der letzten drei Jahre, demographische Informationen (VPI, Arbeitslosigkeit, Temperatur, etc.) ber\u00fccksichtigen? Wie hoch ist dann der Wochenumsatz pro Abteilung in einer dieser Filialen?" + "Ein Einzelhändler braucht einen sehr hohen Umsatz und eine Just-in-time-Lieferung von Produkten, um erfolgreich zu sein. Dazu werden sehr genaue Prognosen benötigt, die genaue Aussagen darüber erlauben, welche Filialen in welchen Abteilungen wie viel Umsatz pro Woche machen. Die Fragestellung lautet daher wie folgt: Wie hoch ist die wöchentliche Umsatzprognose für alle Filialen eines fiktiven Marktes, wenn wir die Daten der letzten drei Jahre, demographische Informationen (VPI, Arbeitslosigkeit, Temperatur, etc.) berücksichtigen? Wie hoch ist dann der Wochenumsatz pro Abteilung in einer dieser Filialen?" ] }, { @@ -21,7 +50,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# 2. Daten und Datenverst\u00e4ndnis" + "# 2. Daten und Datenverständnis" ] }, { @@ -29,7 +58,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Die f\u00fcr das Notizbuch verwendeten Daten sind in drei Dateien unterteilt. Sie enthalten verschiedene Merkmale und die gemeinsamen Attributsspeicher. " + "Die für das Notizbuch verwendeten Daten sind in drei Dateien unterteilt. Sie enthalten verschiedene Merkmale und die gemeinsamen Attributsspeicher. " ] }, { @@ -521,7 +550,7 @@ } ], "source": [ - "sns.heatmap(walmart_train_data.corr()) # Betrachtung der Korrelation \u00fcber eine heatmap" + "sns.heatmap(walmart_train_data.corr()) # Betrachtung der Korrelation über eine heatmap" ] }, { @@ -1193,7 +1222,7 @@ } ], "source": [ - "sns.heatmap(walmart_features_data.corr()) # Betrachtung der Korrelation \u00fcber eine heatmap" + "sns.heatmap(walmart_features_data.corr()) # Betrachtung der Korrelation über eine heatmap" ] }, { @@ -1475,7 +1504,7 @@ } ], "source": [ - "sns.pairplot(walmart_stores_data, vars=['Store', 'Size'], hue='Type') # Betrachtung, ob der Typ an der Size h\u00e4ngt" + "sns.pairplot(walmart_stores_data, vars=['Store', 'Size'], hue='Type') # Betrachtung, ob der Typ an der Size hängt" ] }, { @@ -1576,7 +1605,7 @@ } ], "source": [ - "sns.countplot(x='Type',data=walmart_stores_data) # Betrachtung, wieviele L\u00e4den wir von welchem Type haben" + "sns.countplot(x='Type',data=walmart_stores_data) # Betrachtung, wieviele Läden wir von welchem Type haben" ] }, { @@ -1624,7 +1653,7 @@ } ], "source": [ - "g = sns.FacetGrid(data=walmart_stores_data,col='Type') # Betrachtung, wie sich inerhalb eines Types dann noch die Gr\u00f6\u00dfe verteilt\n", + "g = sns.FacetGrid(data=walmart_stores_data,col='Type') # Betrachtung, wie sich inerhalb eines Types dann noch die Größe verteilt\n", "g.map(plt.hist,'Size')" ] }, @@ -2628,7 +2657,7 @@ " </tr>\n", " </tbody>\n", "</table>\n", - "<p>81 rows \u00d7 2 columns</p>\n", + "<p>81 rows × 2 columns</p>\n", "</div>" ], "text/plain": [ @@ -3217,7 +3246,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 3.2. Index zur\u00fccksetzen" + "## 3.2. Index zurücksetzen" ] }, { @@ -3225,10 +3254,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- Beim L\u00f6schen von Beobachtungen bleiben die urspr\u00fcnglichen Indizes erhalten\n", - "- Das L\u00f6schen von Beobachtungen mit den Indizes 2 und 3 f\u00fchrt zu einem Index wie: 0,1,4,5,6\n", - "- Sobald wir den Index zur\u00fccksetzen, wird eine neue Spalte erstellt, die den alten Index enth\u00e4lt\n", - "- Verwenden Sie 'drop=True', um den alten Index vollst\u00e4ndig zu l\u00f6schen" + "- Beim Löschen von Beobachtungen bleiben die ursprünglichen Indizes erhalten\n", + "- Das Löschen von Beobachtungen mit den Indizes 2 und 3 führt zu einem Index wie: 0,1,4,5,6\n", + "- Sobald wir den Index zurücksetzen, wird eine neue Spalte erstellt, die den alten Index enthält\n", + "- Verwenden Sie 'drop=True', um den alten Index vollständig zu löschen" ] }, { @@ -3598,7 +3627,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 3.3. Test auf Multikollinearit\u00e4t\n" + "## 3.3. Test auf Multikollinearität\n" ] }, { @@ -3606,7 +3635,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Keine nicht-signifikanten Variablen mehr. Das endg\u00fcltige Modell wird erstellt." + "Keine nicht-signifikanten Variablen mehr. Das endgültige Modell wird erstellt." ] }, { @@ -3644,7 +3673,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Verletzung der OLS-Annahme --> keine Linearit\u00e4t L\u00f6sung dann Log-Transformation durchf\u00fchren" + "Verletzung der OLS-Annahme --> keine Linearität Lösung dann Log-Transformation durchführen" ] }, { @@ -3903,7 +3932,7 @@ " </tr>\n", " </tbody>\n", "</table>\n", - "<p>2860 rows \u00d7 16 columns</p>\n", + "<p>2860 rows × 16 columns</p>\n", "</div>" ], "text/plain": [ @@ -4064,7 +4093,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Annahme keine Multikollinearit\u00e4t" + "Annahme keine Multikollinearität" ] }, { @@ -4166,7 +4195,7 @@ "metadata": {}, "outputs": [], "source": [ - "data_with_dummies = pd.get_dummies(data_no_multi, drop_first=True) # drop_first=true: die erste Auspr\u00e4gung aller categorialen Werte wird weggelassen" + "data_with_dummies = pd.get_dummies(data_no_multi, drop_first=True) # drop_first=true: die erste Ausprägung aller categorialen Werte wird weggelassen" ] }, { @@ -4349,7 +4378,7 @@ "outputs": [], "source": [ "cols=['log_sales', 'Store', 'Date', 'IsHoliday', 'Size', 'Week', 'Temperature', 'Unemployment', 'MarkDown1', 'MarkDown2','MarkDown3', 'MarkDown4', 'MarkDown5']\n", - "#cols=['log_sales', 'Store', 'Date', 'IsHoliday', 'Size', 'Week', 'Temperature', 'Unemployment'] # because the R\u00b2 improves if we keep these values in" + "#cols=['log_sales', 'Store', 'Date', 'IsHoliday', 'Size', 'Week', 'Temperature', 'Unemployment'] # because the R² improves if we keep these values in" ] }, { @@ -4510,7 +4539,7 @@ "metadata": {}, "source": [ "## Lokale Datei\n", - "df_dummies.to_csv('train_dummies.csv', index = False) # vollst\u00e4ndiger Pfad, wenn die Datei nicht im selben Ordner wie das Notebook liegen soll\n", + "df_dummies.to_csv('train_dummies.csv', index = False) # vollständiger Pfad, wenn die Datei nicht im selben Ordner wie das Notebook liegen soll\n", "\n", "## Cloud-Datei\n", "#project.save_data(\"train_dummies.csv\", df_dummies.to_csv(index=False))" @@ -4706,7 +4735,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Das Bestimmtheitsma\u00df R\u00b2 betr\u00e4gt nur etwa 35,8 %. Vermutlich muss ein anderes Modell gefunden werden, da diese Daten f\u00fcr diesen Zweck nicht brauchbar sind. Wahrscheinlich liegt es auch daran, dass wir nur die Gesch\u00e4fte des Typs A und nur die Abteilung 92 ber\u00fccksichtigt haben und somit eine gute Vorhersage gar nicht f\u00fcr alle m\u00f6glich ist." + "Das Bestimmtheitsmaß R² beträgt nur etwa 35,8 %. Vermutlich muss ein anderes Modell gefunden werden, da diese Daten für diesen Zweck nicht brauchbar sind. Wahrscheinlich liegt es auch daran, dass wir nur die Geschäfte des Typs A und nur die Abteilung 92 berücksichtigt haben und somit eine gute Vorhersage gar nicht für alle möglich ist." ] }, { @@ -4872,7 +4901,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Die Gr\u00f6\u00dfe hat den gr\u00f6\u00dften Einfluss auf den Umsatz, gefolgt von der Woche, wie erwartet. Wenn wir die Gr\u00f6\u00dfe um 1 \u00e4ndern, \u00e4ndert sich der Umsatz um 0,169." + "Die Größe hat den größten Einfluss auf den Umsatz, gefolgt von der Woche, wie erwartet. Wenn wir die Größe um 1 ändern, ändert sich der Umsatz um 0,169." ] }, { @@ -5264,7 +5293,7 @@ " </tr>\n", " </tbody>\n", "</table>\n", - "<p>572 rows \u00d7 3 columns</p>\n", + "<p>572 rows × 3 columns</p>\n", "</div>" ], "text/plain": [ @@ -5406,7 +5435,7 @@ " </tr>\n", " </tbody>\n", "</table>\n", - "<p>572 rows \u00d7 4 columns</p>\n", + "<p>572 rows × 4 columns</p>\n", "</div>" ], "text/plain": [ @@ -5552,6 +5581,7 @@ } ], "metadata": { + "category": "Forecast", "kernelspec": { "display_name": "Python 3", "language": "python", @@ -5569,9 +5599,8 @@ "pygments_lexer": "ipython3", "version": "3.8.5" }, - "title": "Sales Forecast for retail store", - "category": "Forecast" + "title": "Sales Forecast for retail store" }, "nbformat": 4, "nbformat_minor": 4 -} \ No newline at end of file +} diff --git a/Forecast/Sales Forecast for retail store/notebook_Random Forrest Regressor.ipynb b/Forecast/Sales Forecast for retail store/notebook_Random Forrest Regressor.ipynb index 4071e85e19bda37a686b1e1fe1c0695334a81300..73ce88c79c1b426f7f8284c3d3764f1e78a790ed 100644 --- a/Forecast/Sales Forecast for retail store/notebook_Random Forrest Regressor.ipynb +++ b/Forecast/Sales Forecast for retail store/notebook_Random Forrest Regressor.ipynb @@ -13,7 +13,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Ein Einzelh\u00e4ndler braucht einen sehr hohen Umsatz und eine Just-in-time-Lieferung von Produkten, um erfolgreich zu sein. Dazu werden sehr genaue Prognosen ben\u00f6tigt, die genaue Aussagen dar\u00fcber erlauben, welche Filialen in welchen Abteilungen wie viel Umsatz pro Woche machen. Die Fragestellung lautet daher wie folgt: Wie hoch ist die w\u00f6chentliche Umsatzprognose f\u00fcr alle Filialen eines fiktiven Marktes, wenn wir die Daten der letzten drei Jahre, demographische Informationen (VPI, Arbeitslosigkeit, Temperatur, etc.) ber\u00fccksichtigen? Wie hoch ist dann der Wochenumsatz pro Abteilung in einer dieser Filialen?" + "Ein Einzelhändler braucht einen sehr hohen Umsatz und eine Just-in-time-Lieferung von Produkten, um erfolgreich zu sein. Dazu werden sehr genaue Prognosen benötigt, die genaue Aussagen darüber erlauben, welche Filialen in welchen Abteilungen wie viel Umsatz pro Woche machen. Die Fragestellung lautet daher wie folgt: Wie hoch ist die wöchentliche Umsatzprognose für alle Filialen eines fiktiven Marktes, wenn wir die Daten der letzten drei Jahre, demographische Informationen (VPI, Arbeitslosigkeit, Temperatur, etc.) berücksichtigen? Wie hoch ist dann der Wochenumsatz pro Abteilung in einer dieser Filialen?" ] }, { @@ -21,7 +21,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# 2. Daten und Datenverst\u00e4ndnis" + "# 2. Daten und Datenverständnis" ] }, { @@ -29,7 +29,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Die f\u00fcr das Notebook verwendeten Daten sind in drei Dateien unterteilt. Sie enthalten verschiedene Merkmale und die gemeinsamen Attributsspeicher. " + "Die für das Notebook verwendeten Daten sind in drei Dateien unterteilt. Sie enthalten verschiedene Merkmale und die gemeinsamen Attributsspeicher. " ] }, { @@ -201,7 +201,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Daten beschreiben: Wir haben einen Datensatz mit 421.570 Eintr\u00e4gen. Jede Zeile enth\u00e4lt die Werte \"Store\", \"Dept\", \"Date\", \"Weekly_Sales\" und \"IsHoliday\". Diese Tabelle enth\u00e4lt also bereits den Wert, der f\u00fcr unsere Betrachtung relevant ist: \"W\u00f6chentliche_Ums\u00e4tze\". Wir werden eine Prognose f\u00fcr diesen Wert erstellen und nun nach Merkmalen suchen, die diesen Wert beeinflussen. Das Format dieser Werte ist ein boolescher Wert, eine Gleitkommazahl, zwei Ganzzahlen und ein Objekt." + "Daten beschreiben: Wir haben einen Datensatz mit 421.570 Einträgen. Jede Zeile enthält die Werte \"Store\", \"Dept\", \"Date\", \"Weekly_Sales\" und \"IsHoliday\". Diese Tabelle enthält also bereits den Wert, der für unsere Betrachtung relevant ist: \"Wöchentliche_Umsätze\". Wir werden eine Prognose für diesen Wert erstellen und nun nach Merkmalen suchen, die diesen Wert beeinflussen. Das Format dieser Werte ist ein boolescher Wert, eine Gleitkommazahl, zwei Ganzzahlen und ein Objekt." ] }, { @@ -728,7 +728,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Daten beschreiben: Wir haben einen Datensatz mit 8.190 Eintr\u00e4gen. Jede Zeile enth\u00e4lt die Werte \"Store\", \"Date\", \"Temperature\", \"Fuel_Price\", \"MarkDown1\", \"MarkDown2\", \"MarkDown3\", \"MarkDown4\", \"MarkDown5\", \"CPI\", \"Unemployment\" und \"IsHoliday\". Das Format dieser Werte ist ein Boolean, 9 Float, eine Integer und 1 Object." + "Daten beschreiben: Wir haben einen Datensatz mit 8.190 Einträgen. Jede Zeile enthält die Werte \"Store\", \"Date\", \"Temperature\", \"Fuel_Price\", \"MarkDown1\", \"MarkDown2\", \"MarkDown3\", \"MarkDown4\", \"MarkDown5\", \"CPI\", \"Unemployment\" und \"IsHoliday\". Das Format dieser Werte ist ein Boolean, 9 Float, eine Integer und 1 Object." ] }, { @@ -996,7 +996,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Daten beschreiben: Wir haben nicht f\u00fcr alle Werte entsprechende Zahlen. Es fehlen Werte f\u00fcr MarkDown1-MarkDown5, CPI und Arbeitslosigkeit. Interessant ist, dass es negative Werte bei \"MarkDown\" gibt. Laut der Beschreibung der Daten sind die MarkDown-Werte nicht f\u00fcr alle Filialen und erst ab einem bestimmten Datum verf\u00fcgbar. Dies erkl\u00e4rt die Diskrepanz in der Menge. " + "Daten beschreiben: Wir haben nicht für alle Werte entsprechende Zahlen. Es fehlen Werte für MarkDown1-MarkDown5, CPI und Arbeitslosigkeit. Interessant ist, dass es negative Werte bei \"MarkDown\" gibt. Laut der Beschreibung der Daten sind die MarkDown-Werte nicht für alle Filialen und erst ab einem bestimmten Datum verfügbar. Dies erklärt die Diskrepanz in der Menge. " ] }, { @@ -1346,7 +1346,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Daten beschreiben: Wir haben einen Datensatz mit 45 Eintr\u00e4gen. Jede Zeile enth\u00e4lt die Werte \"Store\", \"Type\" und \"Size\". Das Format dieser Werte sind zwei Ganzzahlen und ein Objekt. " + "Daten beschreiben: Wir haben einen Datensatz mit 45 Einträgen. Jede Zeile enthält die Werte \"Store\", \"Type\" und \"Size\". Das Format dieser Werte sind zwei Ganzzahlen und ein Objekt. " ] }, { @@ -1480,7 +1480,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Daten beschreiben: Da wir bereits wissen, dass es 45 L\u00e4den gibt, ist dies ein Datensatz, der Einzelheiten \u00fcber jeden Laden enth\u00e4lt. Es gibt 45 L\u00e4den, es gibt 3 Typen (A, B und C) und die Gr\u00f6\u00dfe der L\u00e4den variiert zwischen 34.875 und 219.622 Quadratmetern." + "Daten beschreiben: Da wir bereits wissen, dass es 45 Läden gibt, ist dies ein Datensatz, der Einzelheiten über jeden Laden enthält. Es gibt 45 Läden, es gibt 3 Typen (A, B und C) und die Größe der Läden variiert zwischen 34.875 und 219.622 Quadratmetern." ] }, { @@ -1535,7 +1535,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Es sieht so aus, als ob der \"Typ\" anhand der Gr\u00f6\u00dfe bestimmt werden kann. Sie k\u00f6nnen aber auch sehen, dass es mindestens 4 Gesch\u00e4fte gibt, die wahrscheinlich falsch zugeordnet wurden, da es einige im Gr\u00f6\u00dfenbereich zwischen 25.000 und 50.000 in Typ B und A gibt, die wahrscheinlich eher dem Typ C h\u00e4tten zugeordnet werden m\u00fcssen." + "Es sieht so aus, als ob der \"Typ\" anhand der Größe bestimmt werden kann. Sie können aber auch sehen, dass es mindestens 4 Geschäfte gibt, die wahrscheinlich falsch zugeordnet wurden, da es einige im Größenbereich zwischen 25.000 und 50.000 in Typ B und A gibt, die wahrscheinlich eher dem Typ C hätten zugeordnet werden müssen." ] }, { @@ -1606,7 +1606,7 @@ } ], "source": [ - "sns.swarmplot(x='Type',y='Store',data=walmart_stores_data,palette='Set2') # welche Ladennummer zu welchem Typ geh\u00f6rt" + "sns.swarmplot(x='Type',y='Store',data=walmart_stores_data,palette='Set2') # welche Ladennummer zu welchem Typ gehört" ] }, { @@ -1636,7 +1636,7 @@ } ], "source": [ - "sns.countplot(x='Type',data=walmart_stores_data) # Betrachtung, wieviele L\u00e4den wir von welchem Type haben" + "sns.countplot(x='Type',data=walmart_stores_data) # Betrachtung, wieviele Läden wir von welchem Type haben" ] }, { @@ -1684,7 +1684,7 @@ } ], "source": [ - "g = sns.FacetGrid(data=walmart_stores_data,col='Type') # Betrachtung, wie sich inerhalb eines Types dann noch die Gr\u00f6\u00dfe verteilt\n", + "g = sns.FacetGrid(data=walmart_stores_data,col='Type') # Betrachtung, wie sich inerhalb eines Types dann noch die Größe verteilt\n", "g.map(plt.hist,'Size')" ] }, @@ -1744,9 +1744,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Wir kombinieren alle 3 verf\u00fcgbaren Datens\u00e4tze (Tabellen), da alle 3 einen gemeinsamen Schl\u00fcssel (\"Store\") haben, \u00fcber den eine Zusammenfassung m\u00f6glich ist. Die weitere Betrachtung wird erst m\u00f6glich, wenn wir die Daten aus allen 3 Datens\u00e4tzen zusammen betrachten, welche Abh\u00e4ngigkeiten hier bestehen. \n", + "Wir kombinieren alle 3 verfügbaren Datensätze (Tabellen), da alle 3 einen gemeinsamen Schlüssel (\"Store\") haben, über den eine Zusammenfassung möglich ist. Die weitere Betrachtung wird erst möglich, wenn wir die Daten aus allen 3 Datensätzen zusammen betrachten, welche Abhängigkeiten hier bestehen. \n", "\n", - "Ziel ist es, eine Vorhersage \u00fcber die Daten von \"Weekly_Sales\" zu machen, daher suchen wir alle Daten, die einen Einfluss auf diese haben." + "Ziel ist es, eine Vorhersage über die Daten von \"Weekly_Sales\" zu machen, daher suchen wir alle Daten, die einen Einfluss auf diese haben." ] }, { @@ -2719,7 +2719,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Wir sehen, dass sich die Verk\u00e4ufe in den 3 Jahren \u00e4hnlich verhalten. Es gibt Spitzenwerte vor Woche 7 (Super Bowl), vor Woche 48 (Thanksgiving) und vor Woche 52 (Weihnachten), was vermutlich auf den schwarzen Freitag und das Weihnachtsgesch\u00e4ft zur\u00fcckzuf\u00fchren ist. Vor Woche 37 (Tag der Arbeit) gehen die Verk\u00e4ufe zur\u00fcck." + "Wir sehen, dass sich die Verkäufe in den 3 Jahren ähnlich verhalten. Es gibt Spitzenwerte vor Woche 7 (Super Bowl), vor Woche 48 (Thanksgiving) und vor Woche 52 (Weihnachten), was vermutlich auf den schwarzen Freitag und das Weihnachtsgeschäft zurückzuführen ist. Vor Woche 37 (Tag der Arbeit) gehen die Verkäufe zurück." ] }, { @@ -2810,7 +2810,7 @@ " </tr>\n", " </tbody>\n", "</table>\n", - "<p>81 rows \u00d7 2 columns</p>\n", + "<p>81 rows × 2 columns</p>\n", "</div>" ], "text/plain": [ @@ -2879,7 +2879,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Die Abteilung 92 bringt insgesamt und im Durchschnitt die meisten Ums\u00e4tze ein " + "Die Abteilung 92 bringt insgesamt und im Durchschnitt die meisten Umsätze ein " ] }, { @@ -3305,7 +3305,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Die Feiertage fallen jedes Jahr in dieselbe Woche. Betrachtet man die Kalenderwoche des Feiertags und die Kurve der w\u00f6chentlichen Verk\u00e4ufe, so zeigt sich, dass Thanksgiving und Weihnachten haben einen Einfluss auf den Umsatz, die beiden anderen sind jedoch nicht signifikant. Aus diesem Grund lassen wir IsHoliday in der Tabelle stehen." + "Die Feiertage fallen jedes Jahr in dieselbe Woche. Betrachtet man die Kalenderwoche des Feiertags und die Kurve der wöchentlichen Verkäufe, so zeigt sich, dass Thanksgiving und Weihnachten haben einen Einfluss auf den Umsatz, die beiden anderen sind jedoch nicht signifikant. Aus diesem Grund lassen wir IsHoliday in der Tabelle stehen." ] }, { @@ -3378,11 +3378,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "MarkDown1: viele Einzelaktionen, gro\u00dfe Aktion kurz vor Woche 7 mit Super Bowl; \n", + "MarkDown1: viele Einzelaktionen, große Aktion kurz vor Woche 7 mit Super Bowl; \n", "MarkDown2: Aktion in Woche 52 vor Weihnachten, kleinere Aktion vor Woche 7 mit Super Bowl;\n", "MarkDown3: einzige Aktion in Woche 47 vor ThanksGiving;\n", - "MarkDown4: viele Einzelaktionen, gr\u00f6\u00dfere Aktion in Woche 5 vor Super Bowl;\n", - "MarkDown5: viele Einzelaktionen, gr\u00f6\u00dfere in Woche 48 zu ThanksGiving evtl. auch Black Friday" + "MarkDown4: viele Einzelaktionen, größere Aktion in Woche 5 vor Super Bowl;\n", + "MarkDown5: viele Einzelaktionen, größere in Woche 48 zu ThanksGiving evtl. auch Black Friday" ] }, { @@ -3648,7 +3648,7 @@ " </tr>\n", " </tbody>\n", "</table>\n", - "<p>5 rows \u00d7 21 columns</p>\n", + "<p>5 rows × 21 columns</p>\n", "</div>" ], "text/plain": [ @@ -3900,7 +3900,7 @@ } ], "source": [ - "sns.heatmap(clean_data1.corr()) # Betrachtung der Korrelation \u00fcber eine heatmap " + "sns.heatmap(clean_data1.corr()) # Betrachtung der Korrelation über eine heatmap " ] }, { @@ -3988,7 +3988,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "\"kleiner Datensatz\": Testdaten, f\u00fcr die wir nur 1 Jahr ber\u00fccksichtigen, f\u00fcr das wir MarkDown-Werte haben." + "\"kleiner Datensatz\": Testdaten, für die wir nur 1 Jahr berücksichtigen, für das wir MarkDown-Werte haben." ] }, { @@ -4163,7 +4163,7 @@ " </tr>\n", " </tbody>\n", "</table>\n", - "<p>5 rows \u00d7 21 columns</p>\n", + "<p>5 rows × 21 columns</p>\n", "</div>" ], "text/plain": [ @@ -4396,7 +4396,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 3.6. normale (gro\u00dfe) Daten" + "## 3.6. normale (große) Daten" ] }, { @@ -4576,7 +4576,7 @@ "source": [ "#Feature Scaling (transforms our data into standard distributed data) \n", "# the data is transformed in such a way that then a mean of 0 and a standard deviation of 1 is obtained\n", - "# ~ (\ud835\udf07, \ud835\udf0e2) ~ (0,1)\n", + "# ~ (ðœ‡, ðœŽ2) ~ (0,1)\n", "\n", "from sklearn.preprocessing import StandardScaler\n", "scaler = StandardScaler()\n", @@ -4608,7 +4608,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 4.1. Random Forest mit normalen (gro\u00dfen) Daten" + "## 4.1. Random Forest mit normalen (großen) Daten" ] }, { @@ -4618,21 +4618,21 @@ "source": [ "class sklearn.ensemble.RandomForestRegressor(n_estimators=100, *, criterion='mse', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0. 0, max_features='auto', max_leaf_nodes=Keine, min_impurity_decrease=0.0, min_impurity_split=Eine, bootstrap=True, oob_score=False, n_jobs=Eine, random_state=Eine, verbose=0, warm_start=False, ccp_alpha=0.0, max_samples=Eine)\n", "\n", - "bootstrap: Ob bei der Erstellung von B\u00e4umen Bootstrap-Stichproben verwendet werden. Wenn False, wird der gesamte Datensatz zur Erstellung jedes Baums verwendet. Voreinstellung ist True.\n", + "bootstrap: Ob bei der Erstellung von Bäumen Bootstrap-Stichproben verwendet werden. Wenn False, wird der gesamte Datensatz zur Erstellung jedes Baums verwendet. Voreinstellung ist True.\n", "\n", - "max_depth: Die Standardwerte f\u00fcr die Parameter, die die Gr\u00f6\u00dfe der B\u00e4ume steuern (z. B. max_depth, min_samples_leaf usw.), f\u00fchren zu vollst\u00e4ndig ausgewachsenen und nicht beschnittenen B\u00e4umen, die bei einigen Datens\u00e4tzen sehr gro\u00df sein k\u00f6nnen. Um den Speicherverbrauch zu reduzieren, sollte die Komplexit\u00e4t und Gr\u00f6\u00dfe der B\u00e4ume durch die Einstellung dieser Parameterwerte kontrolliert werden. Der Standardwert ist None und bedeutet, dass die Knoten so lange expandiert werden, bis alle Bl\u00e4tter rein sind oder bis alle Bl\u00e4tter weniger als min_samples_split samples enthalten. Der Wert von 70 hat sich in Tests bew\u00e4hrt.\n", + "max_depth: Die Standardwerte für die Parameter, die die Größe der Bäume steuern (z. B. max_depth, min_samples_leaf usw.), führen zu vollständig ausgewachsenen und nicht beschnittenen Bäumen, die bei einigen Datensätzen sehr groß sein können. Um den Speicherverbrauch zu reduzieren, sollte die Komplexität und Größe der Bäume durch die Einstellung dieser Parameterwerte kontrolliert werden. Der Standardwert ist None und bedeutet, dass die Knoten so lange expandiert werden, bis alle Blätter rein sind oder bis alle Blätter weniger als min_samples_split samples enthalten. Der Wert von 70 hat sich in Tests bewährt.\n", "\n", "max_features: Der Standardwert max_features=\"auto\" verwendet n_features bei jedem Split. Die Voreinstellung ist \"auto\".\n", "\n", - "min_samples_leaf: Die Mindestanzahl von Stichproben, die f\u00fcr einen Blattknoten erforderlich sind. Ein Teilungspunkt in beliebiger Tiefe wird nur ber\u00fccksichtigt, wenn er mindestens min_samples_leaf Trainingsmuster in jedem der linken und rechten Zweige hinterl\u00e4sst. Dies kann zu einer Gl\u00e4ttung des Modells f\u00fchren, insbesondere bei Regressionen. Standardwert ist 1. Testreihen haben gezeigt, dass der Wert 4 die besten Ergebnisse liefert.\n", + "min_samples_leaf: Die Mindestanzahl von Stichproben, die für einen Blattknoten erforderlich sind. Ein Teilungspunkt in beliebiger Tiefe wird nur berücksichtigt, wenn er mindestens min_samples_leaf Trainingsmuster in jedem der linken und rechten Zweige hinterlässt. Dies kann zu einer Glättung des Modells führen, insbesondere bei Regressionen. Standardwert ist 1. Testreihen haben gezeigt, dass der Wert 4 die besten Ergebnisse liefert.\n", "\n", "min_samples_split: Die Mindestanzahl von Stichproben, die erforderlich ist, um einen internen Knoten aufzuteilen. Standardwert ist 2, in Testreihen hat sich der Wert 10 als am sinnvollsten erwiesen. \n", "\n", - "n_Sch\u00e4tzer: Dies ist die Anzahl der B\u00e4ume, die Sie erstellen m\u00f6chten, bevor Sie die Maximalstimme oder den Durchschnitt der Vorhersagen nehmen. Eine h\u00f6here Anzahl von B\u00e4umen f\u00fchrt zu einer besseren Leistung, macht den Code aber auch langsamer. Die Voreinstellung ist 100. Testreihen haben gezeigt: Unter und \u00fcber 400 nimmt die Genauigkeit ab.\n", + "n_Schätzer: Dies ist die Anzahl der Bäume, die Sie erstellen möchten, bevor Sie die Maximalstimme oder den Durchschnitt der Vorhersagen nehmen. Eine höhere Anzahl von Bäumen führt zu einer besseren Leistung, macht den Code aber auch langsamer. Die Voreinstellung ist 100. Testreihen haben gezeigt: Unter und über 400 nimmt die Genauigkeit ab.\n", "\n", - "n_jobs: wie viele Jobs parallel laufen k\u00f6nnen, beeinflusst die Geschwindigkeit des Algorithmus\n", + "n_jobs: wie viele Jobs parallel laufen können, beeinflusst die Geschwindigkeit des Algorithmus\n", "\n", - "Die Merkmale werden bei jedem Split immer zuf\u00e4llig permutiert. Daher kann selbst bei gleichen Trainingsdaten, max_features=n_features und bootstrap=False der beste gefundene Split variieren, wenn die Kriteriumverbesserung f\u00fcr mehrere Splits, die bei der Suche nach dem besten Split aufgez\u00e4hlt werden, identisch ist. Um ein deterministisches Verhalten bei der Anpassung zu erhalten, muss random_state in der Testreihe angegeben werden." + "Die Merkmale werden bei jedem Split immer zufällig permutiert. Daher kann selbst bei gleichen Trainingsdaten, max_features=n_features und bootstrap=False der beste gefundene Split variieren, wenn die Kriteriumverbesserung für mehrere Splits, die bei der Suche nach dem besten Split aufgezählt werden, identisch ist. Um ein deterministisches Verhalten bei der Anpassung zu erhalten, muss random_state in der Testreihe angegeben werden." ] }, { @@ -4784,10 +4784,10 @@ "metadata": {}, "source": [ "### MAE - der mittlere absolute Fehler\n", - "gibt die durchschnittliche absolute Abweichung des Prognosewertes vom tats\u00e4chlichen Wert an. \n", - "Wert, der tats\u00e4chlich eingetreten ist. \u00dcber- und Untersch\u00e4tzungen werden in ungerichteter Weise kumuliert, so dass MAE=0 \n", - "als perfekte Prognose interpretiert werden kann, d.h. der Prognosewert f\u00fcr jede Periode t entspricht genau dem tats\u00e4chlichen Wert. \n", - "dem tats\u00e4chlich eingetretenen Wert. " + "gibt die durchschnittliche absolute Abweichung des Prognosewertes vom tatsächlichen Wert an. \n", + "Wert, der tatsächlich eingetreten ist. Über- und Unterschätzungen werden in ungerichteter Weise kumuliert, so dass MAE=0 \n", + "als perfekte Prognose interpretiert werden kann, d.h. der Prognosewert für jede Periode t entspricht genau dem tatsächlichen Wert. \n", + "dem tatsächlich eingetretenen Wert. " ] }, { @@ -4815,7 +4815,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Wir erhalten einen MAE von 1.716,1138, d.h. die durchschnittliche Abweichung betr\u00e4gt etwa 1.716 Dollar, mit der unsere Prognose von den tats\u00e4chlichen Werten abweicht." + "Wir erhalten einen MAE von 1.716,1138, d.h. die durchschnittliche Abweichung beträgt etwa 1.716 Dollar, mit der unsere Prognose von den tatsächlichen Werten abweicht." ] }, { @@ -4824,7 +4824,7 @@ "metadata": {}, "source": [ "### MSE - Mittlerer quadratischer Fehler \n", - "ist die quadratische Form des ME. Dies hat zur Folge, dass gro\u00dfe Abweichungen vom tats\u00e4chlichen Wert \u00fcberproportional stark gewichtet werden im Vergleich zu kleineren Abweichungen, die in der Praxis oft vernachl\u00e4ssigbar sind. Au\u00dferdem werden die einzelnen Prognosefehler nun wie beim MAE kumuliert, so dass die perfekte Prognose wieder bei MSE=0 vorliegt. " + "ist die quadratische Form des ME. Dies hat zur Folge, dass große Abweichungen vom tatsächlichen Wert überproportional stark gewichtet werden im Vergleich zu kleineren Abweichungen, die in der Praxis oft vernachlässigbar sind. Außerdem werden die einzelnen Prognosefehler nun wie beim MAE kumuliert, so dass die perfekte Prognose wieder bei MSE=0 vorliegt. " ] }, { @@ -4852,8 +4852,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#R\u00b2 - Bestimmungskoeffizient\n", - "Das so genannte Bestimmtheitsma\u00df (R\u00b2) dr\u00fcckt aus, wie gut die Regressionsgerade die Beziehung zwischen der unabh\u00e4ngigen und der abh\u00e4ngigen Variable wiedergibt. R\u00b2 liegt zwischen 0 und 1, wobei der Wert R\u00b2 = 1 bedeuten w\u00fcrde, dass jeder beobachtete Datenpunkt direkt auf der Regressionsgeraden liegt." + "#R² - Bestimmungskoeffizient\n", + "Das so genannte Bestimmtheitsmaß (R²) drückt aus, wie gut die Regressionsgerade die Beziehung zwischen der unabhängigen und der abhängigen Variable wiedergibt. R² liegt zwischen 0 und 1, wobei der Wert R² = 1 bedeuten würde, dass jeder beobachtete Datenpunkt direkt auf der Regressionsgeraden liegt." ] }, { @@ -4888,10 +4888,10 @@ "metadata": {}, "outputs": [], "source": [ - "# R\u00b2 = 0.964437 with Markdown 1,2 and 5 included - were thus subsequently removed and R\u00b2 increases\n", - "# R\u00b2 = 0.9645159264218026 (n_estimators = 400,max_depth=15,n_jobs=5) \n", - "# R\u00b2 = 0.9692695835667837 with new parameters\n", - "# R\u00b2 = 0.9698712189554696 with new parameters and removal of variables with importance 0 each variable since random" + "# R² = 0.964437 with Markdown 1,2 and 5 included - were thus subsequently removed and R² increases\n", + "# R² = 0.9645159264218026 (n_estimators = 400,max_depth=15,n_jobs=5) \n", + "# R² = 0.9692695835667837 with new parameters\n", + "# R² = 0.9698712189554696 with new parameters and removal of variables with importance 0 each variable since random" ] }, { @@ -5104,6 +5104,7 @@ } ], "metadata": { + "category": "Forecast", "kernelspec": { "display_name": "Python 3", "language": "python", @@ -5121,9 +5122,8 @@ "pygments_lexer": "ipython3", "version": "3.8.5" }, - "title": "Sales Forecast for retail store", - "category": "Forecast" + "title": "Sales Forecast for retail store" }, "nbformat": 4, "nbformat_minor": 4 -} \ No newline at end of file +} diff --git a/Health/Risk prediction of heart disease/notebook.ipynb b/Health/Risk prediction of heart disease/notebook.ipynb index bd7e8fca834ed65032866a5b898b852575e396b7..a80619cc392a7198c39bb1fd5c6feec7d8c11648 100644 --- a/Health/Risk prediction of heart disease/notebook.ipynb +++ b/Health/Risk prediction of heart disease/notebook.ipynb @@ -1,5 +1,39 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Geschäftlicher Kontext:\n", + "Das Ziel besteht darin, das Risiko für koronare Herzkrankheiten bei Patienten vorherzusagen. Dies hat potenzielle Anwendungen in der Gesundheitsbranche, um frühzeitig Interventionen zu ermöglichen und die Gesundheit der Patienten zu verbessern.\n", + "\n", + "## Datengrundlage:\n", + "Die Datengrundlage besteht aus einem Datensatz, der aus der Framingham Heart Study stammt. Dieser Datensatz enthält verschiedene demografische und klinische Merkmale von Patienten sowie Informationen darüber, ob sie in den nächsten zehn Jahren an einer koronaren Herzkrankheit erkrankt sind oder nicht.\n", + "\n", + "## ML-Strategie:\n", + "Die ML-Strategie besteht darin, ein binäres Klassifizierungsmodell zu entwickeln, das auf logistischer Regression basiert. Dieses Modell soll anhand der verfügbaren Merkmale vorhersagen, ob ein Patient in den nächsten zehn Jahren ein Risiko für eine koronare Herzkrankheit hat oder nicht.\n", + "\n", + "## Datenvorbereitung:\n", + "Datenimport aus einer CSV-Datei von Kaggle. Quelle: https://www.kaggle.com/amanajmera1/framingham-heart-study-dataset . \n", + "Überprüfung auf fehlende Werte und Entfernung dieser Zeilen.\n", + "Entfernung irrelevanter Spalten wie \"education\".\n", + "Identifizierung und Behandlung von Ausreißern in den numerischen Merkmalen.\n", + "Skalierung der numerischen Merkmale.\n", + "Behandlung von Multikollinearität zwischen den Merkmalen.\n", + "\n", + "## Datenmodellierung:\n", + "Verwendung der logistischen Regression als Modellierungstechnik.\n", + "Trainieren des Modells mit den vorbereiteten Trainingsdaten.\n", + "Evaluierung der Modellleistung anhand von Trainings- und Testdaten.\n", + "\n", + "## Modellevaluation:\n", + "Verwendung von Metriken wie Präzision, Recall und F1-Score zur Bewertung der Modellleistung.\n", + "Erstellung von Confusion Matrices, um die Vorhersageleistung detaillierter zu analysieren.\n", + "\n", + "## Bereitstellung:\n", + "Das Modell kann nach der Evaluation in Produktionsumgebungen bereitgestellt werden, um das Risiko für koronare Herzkrankheiten bei neuen Patientendaten vorherzusagen. Dies kann in klinischen Umgebungen zur Früherkennung und Prävention von Herzkrankheiten eingesetzt werden." + ] + }, { "cell_type": "code", "execution_count": 1, @@ -766,7 +800,7 @@ } ], "source": [ - "# Wir l\u00f6schen alle Zeilen mit den fehlenden Werten und die Spalte die f\u00fcr die Auswertung nicht relevant ist oder nicht ben\u00f6tigt wird\n", + "# Wir löschen alle Zeilen mit den fehlenden Werten und die Spalte die für die Auswertung nicht relevant ist oder nicht benötigt wird\n", "train = train.drop('education', axis=1)\n", "train = train.dropna(axis=0)\n", "sns.heatmap(train.isnull(),yticklabels=False, cbar=False, cmap='viridis')" @@ -985,9 +1019,9 @@ "sns.set_style('whitegrid')\n", "sns.countplot(x='TenYearCHD', hue='male', data=train)\n", "# kein 10-Jahres Risiko und weiblich = 1828\n", - "# kein 10 Jahres Risko und m\u00e4nnlich = 1351\n", + "# kein 10 Jahres Risko und männlich = 1351\n", "# 10-Jahres Risiko und weiblich = 253\n", - "# 10 Jahres Risko und m\u00e4nnlich = 319" + "# 10 Jahres Risko und männlich = 319" ] }, { @@ -2232,7 +2266,7 @@ "outputs": [], "source": [ "# Der P-Wert bei folgenden Attributen: BPMeds, prevalentStroke, diabetes, totChol,diaBP,BMI,heartRate & glucose\n", - "#ist relativ hoch und somit wei\u00dft es eine geringe statistiche signifikante Beziehung zur Wahrscheinlichkeit einer Herzerkrankung auf\n", + "#ist relativ hoch und somit weißt es eine geringe statistiche signifikante Beziehung zur Wahrscheinlichkeit einer Herzerkrankung auf\n", "#(The closer to 0.000 the p-value, the better, Slides_AI - Part 4-2.pdf, S.27)" ] }, @@ -2356,7 +2390,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Undersampling (nachtr\u00e4glich) " + "# Undersampling (nachträglich) " ] }, { @@ -2445,7 +2479,7 @@ "source": [ "#Methode von train_test_split (sklearn)\n", "#X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)\n", - "#der Datensatz wird \u00fcbergeben ohne die Zielspalte TenYearCHD f\u00fcr X, daf\u00fcr wird diese in y eingesetzt\n", + "#der Datensatz wird übergeben ohne die Zielspalte TenYearCHD für X, dafür wird diese in y eingesetzt\n", "X_train, X_test, y_train, y_test = train_test_split(X_resampled, y_resampled, test_size=0.2, random_state=365)" ] }, @@ -2575,7 +2609,7 @@ "print(classification_report(y_train, log_model.predict(X_train)))\n", "print('test performance')\n", "print(classification_report(y_test, log_model.predict(X_test)))\n", - "#Bei der logistischen Regression sind die Trainings- und Testleistung sehr \u00e4hnlich.\n", + "#Bei der logistischen Regression sind die Trainings- und Testleistung sehr ähnlich.\n", "# erstellte Modell kann auf neuen Daten gut verallgemeinert werden kann." ] }, @@ -2727,6 +2761,7 @@ } ], "metadata": { + "category": "Health", "kernelspec": { "display_name": "Python 3", "language": "python", @@ -2744,9 +2779,8 @@ "pygments_lexer": "ipython3", "version": "3.8.9" }, - "title": "Risk prediction of heart disease", - "category": "Health" + "title": "Risk prediction of heart disease" }, "nbformat": 4, "nbformat_minor": 4 -} \ No newline at end of file +} diff --git a/Insurance/Insurance Fraud detection/notebook_1.ipynb b/Insurance/Insurance Fraud detection/notebook_1.ipynb index 9a1867237c1b9caa373e9f10b480f4d3d2c309a7..b3f21bda04061956baab0094fdda3503caff1fa4 100644 --- a/Insurance/Insurance Fraud detection/notebook_1.ipynb +++ b/Insurance/Insurance Fraud detection/notebook_1.ipynb @@ -1,5 +1,32 @@ { "cells": [ + { + "cell_type": "markdown", + "id": "6a4d302a", + "metadata": {}, + "source": [ + "## Geschäftlicher Kontext:\n", + "Versicherungsunternehmen setzen zunehmend auf Machine Learning, um Versicherungsbetrug effektiv zu erkennen und zu verhindern. Der Einsatz von ML-Modellen ermöglicht es, Muster und Anomalien in Versicherungsdaten zu identifizieren, um Betrugsfälle frühzeitig zu erkennen und zu bekämpfen.\n", + "\n", + "## Datengrundlage:\n", + "Der Datensatz aus Kaggle https://kaggle.com/buntyshah/auto-insurance-claims-data umfasst 1000 Datensätze mit 40 verschiedenen Merkmalen, darunter Informationen zu Versicherungsnehmern, Vertragsdaten, Unfällen und Schadenshöhen. Die Zielvariable zeigt an, ob ein Versicherungsbetrug vorliegt. \n", + "\n", + "## ML-Strategie:\n", + "Es werden verschiedene ML-Modelle wie logistische Regression, Entscheidungsbaum, Random Forest und Support Vector Machine (SVM) eingesetzt, um Versicherungsbetrug vorherzusagen. Die Modelle werden auf trainierten und getesteten Daten evaluiert, um ihre Vorhersageleistung zu bewerten.\n", + "\n", + "## Datenvorbereitung (Details, einzelne Schritte):\n", + "Die Datenvorbereitung umfasst die Aufteilung der Daten in Trainings- und Testdatensätze, die Skalierung der Daten sowie die Erstellung von Dummy-Variablen für kategoriale Merkmale. Darüber hinaus werden nicht relevante Merkmale entfernt und neue Merkmale wie prozentuale Versicherungszahlungen erstellt.\n", + "\n", + "## Datenmodellierung:\n", + "Es werden verschiedene ML-Modelle wie logistische Regression, Entscheidungsbaum, Random Forest und SVM trainiert und evaluiert, um ihre Leistung bei der Vorhersage von Versicherungsbetrug zu bewerten. Die Modelle werden auf Trainings- und Testdaten angewendet, und ihre Vorhersageleistung wird anhand von Metriken wie Accuracy, Precision und Recall bewertet.\n", + "\n", + "## Modellevaluation:\n", + "Die Modelle werden anhand von Metriken wie Accuracy, Precision, Recall und Confusion Matrix evaluiert, um ihre Vorhersageleistung zu bewerten und festzustellen, wie gut sie in der Lage sind, Versicherungsbetrug vorherzusagen.\n", + "\n", + "## Bereitstellung:\n", + "Nach der Evaluation können die trainierten Modelle für die Vorhersage von Versicherungsbetrug in Produktionsumgebungen bereitgestellt werden, um die Betrugserkennung in Echtzeit zu unterstützen. Eine beispielhafte Vorhersage für einen einzelnen Datensatz wird demonstriert, um zu zeigen, wie das Modell in der Praxis angewendet werden kann." + ] + }, { "attachments": {}, "cell_type": "markdown", @@ -13,7 +40,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Versicherungen verf\u00fcgen \u00fcber eine Vielzahl von Daten, darunter auch sehr sensible Daten wie Name, Geburtsdatum und genaue Wohnanschrift und Kontoverbindung ihrer Versicherten. Diese Daten werden von den Versicherungsunternehmen zunehmend automatisiert verarbeitet, ausgewertet und f\u00fcr weitere Versicherungsprozesse genutzt. Dabei geht es nat\u00fcrlich nach wie vor darum, f\u00fcr bestehende Versicherungsprodukte das aktuelle Risiko zu berechnen und darauf aufbauend die Pr\u00e4mie und die m\u00f6gliche Schadensh\u00f6he zu ermitteln. Die Schaffung neuer, bedarfsgerechter Versicherungsprodukte, die kurzfristig abgeschlossen werden k\u00f6nnen und eine sehr kurze Laufzeit haben, ist ein weiterer Trend, der durch Daten unterst\u00fctzt werden kann. Die zentralen Fragen hierbei sind nat\u00fcrlich: Welche Daten sind f\u00fcr die Aufdeckung von Versicherungsbetrug relevant? Wie m\u00fcssen diese Daten strukturiert sein? Welches Modell ist am besten geeignet, um Versicherungsbetrug im Schadenfall vorherzusagen? Nach welchen Kriterien sollte man verschiedene ML-Modelle vergleichen? Wie zuverl\u00e4ssig funktioniert die Vorhersage von Versicherungsbetrug?" + "Versicherungen verfügen über eine Vielzahl von Daten, darunter auch sehr sensible Daten wie Name, Geburtsdatum und genaue Wohnanschrift und Kontoverbindung ihrer Versicherten. Diese Daten werden von den Versicherungsunternehmen zunehmend automatisiert verarbeitet, ausgewertet und für weitere Versicherungsprozesse genutzt. Dabei geht es natürlich nach wie vor darum, für bestehende Versicherungsprodukte das aktuelle Risiko zu berechnen und darauf aufbauend die Prämie und die mögliche Schadenshöhe zu ermitteln. Die Schaffung neuer, bedarfsgerechter Versicherungsprodukte, die kurzfristig abgeschlossen werden können und eine sehr kurze Laufzeit haben, ist ein weiterer Trend, der durch Daten unterstützt werden kann. Die zentralen Fragen hierbei sind natürlich: Welche Daten sind für die Aufdeckung von Versicherungsbetrug relevant? Wie müssen diese Daten strukturiert sein? Welches Modell ist am besten geeignet, um Versicherungsbetrug im Schadenfall vorherzusagen? Nach welchen Kriterien sollte man verschiedene ML-Modelle vergleichen? Wie zuverlässig funktioniert die Vorhersage von Versicherungsbetrug?" ] }, { @@ -21,7 +48,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# 2. Datenverst\u00e4ndnis" + "# 2. Datenverständnis" ] }, { @@ -29,7 +56,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Der verwendete Datensatz besteht aus 1000 S\u00e4tzen und hat 40 verschiedene sogenannte Features, d.h. gesammelte Datenkategorien. Das bedeutet, dass die Datenbasis nicht sehr gro\u00df ist, daf\u00fcr sind die M\u00f6glichkeiten, verschiedene Merkmale zu untersuchen, umso gr\u00f6\u00dfer. Es werden Informationen zu Versicherungsnehmern, Vertragsdaten zu Versicherungsnehmern und deren Kraftfahrzeugen, sowie Unf\u00e4lle und die H\u00f6he der Sch\u00e4den angezeigt. Da der Datensatz so viele Merkmale enth\u00e4lt, werden sie und ihre Beschreibungen in der folgenden Tabelle erl\u00e4utert. Die Zielvariable zeigt an, ob ein Versicherungsbetrug vorliegt (\"fraud_reported\"). Der Datensatz ist ein gutes Beispiel f\u00fcr Klassifizierungsmodelle, da es sich um eine bin\u00e4re Zielvariable handelt (sp\u00e4ter auch als Ziel bezeichnet)." + "Der verwendete Datensatz besteht aus 1000 Sätzen und hat 40 verschiedene sogenannte Features, d.h. gesammelte Datenkategorien. Das bedeutet, dass die Datenbasis nicht sehr groß ist, dafür sind die Möglichkeiten, verschiedene Merkmale zu untersuchen, umso größer. Es werden Informationen zu Versicherungsnehmern, Vertragsdaten zu Versicherungsnehmern und deren Kraftfahrzeugen, sowie Unfälle und die Höhe der Schäden angezeigt. Da der Datensatz so viele Merkmale enthält, werden sie und ihre Beschreibungen in der folgenden Tabelle erläutert. Die Zielvariable zeigt an, ob ein Versicherungsbetrug vorliegt (\"fraud_reported\"). Der Datensatz ist ein gutes Beispiel für Klassifizierungsmodelle, da es sich um eine binäre Zielvariable handelt (später auch als Ziel bezeichnet)." ] }, { @@ -281,7 +308,7 @@ " </tr>\n", " </tbody>\n", "</table>\n", - "<p>5 rows \u00d7 40 columns</p>\n", + "<p>5 rows × 40 columns</p>\n", "</div>" ], "text/plain": [ @@ -944,7 +971,7 @@ " </tr>\n", " </tbody>\n", "</table>\n", - "<p>11 rows \u00d7 39 columns</p>\n", + "<p>11 rows × 39 columns</p>\n", "</div>" ], "text/plain": [ @@ -1220,7 +1247,7 @@ " </tr>\n", " </tbody>\n", "</table>\n", - "<p>5 rows \u00d7 39 columns</p>\n", + "<p>5 rows × 39 columns</p>\n", "</div>" ], "text/plain": [ @@ -1313,7 +1340,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "--> hohe Korrelation zwischen *Alter* und *Monate_als_Kunde*, auch zwischen *Gesamtschadensh\u00f6he* und *Verletzungsschaden, Sachschaden und Fahrzeugschaden*. " + "--> hohe Korrelation zwischen *Alter* und *Monate_als_Kunde*, auch zwischen *Gesamtschadenshöhe* und *Verletzungsschaden, Sachschaden und Fahrzeugschaden*. " ] }, { @@ -1541,7 +1568,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 3.2 \u00dcberpr\u00fcfung der Merkmale in Bezug auf das Ziel" + "## 3.2 Überprüfung der Merkmale in Bezug auf das Ziel" ] }, { @@ -4250,7 +4277,7 @@ " </tr>\n", " </tbody>\n", "</table>\n", - "<p>5 rows \u00d7 60 columns</p>\n", + "<p>5 rows × 60 columns</p>\n", "</div>" ], "text/plain": [ @@ -4529,7 +4556,7 @@ " </tr>\n", " </tbody>\n", "</table>\n", - "<p>5 rows \u00d7 74 columns</p>\n", + "<p>5 rows × 74 columns</p>\n", "</div>" ], "text/plain": [ @@ -4605,6 +4632,7 @@ } ], "metadata": { + "category": "Insurance", "kernelspec": { "display_name": "Python 3", "language": "python", @@ -4622,9 +4650,8 @@ "pygments_lexer": "ipython3", "version": "3.8.5" }, - "title": "Insurance Fraud detection", - "category": "Insurance" + "title": "Insurance Fraud detection" }, "nbformat": 4, "nbformat_minor": 5 -} \ No newline at end of file +} diff --git a/Insurance/Predicting mental illness for health insurance/notebook.ipynb b/Insurance/Predicting mental illness for health insurance/notebook.ipynb index d42dc61449b1144a5394de805c7cd73974738bd0..94925fbf3ffd87ee143cca6edb6282b00cdd3bb2 100644 --- a/Insurance/Predicting mental illness for health insurance/notebook.ipynb +++ b/Insurance/Predicting mental illness for health insurance/notebook.ipynb @@ -1,13 +1,52 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Geschäftlicher Kontext:\n", + "Das weltweit agierende Versicherungsunternehmen New York Life Insurance Company\n", + "mit Hauptsitz in den USA betreut Privat- und Geschäftskunden. Der Hauptgeschäftsbereich liegt in der Absicherung der leiblichen Gesundheit im Sinne von Krankenkassen \n", + "und gesundheitlicher Vorsorge. Dazu gehören neben der klassischen Krankenversicherung auch Unfallversicherungen, Risikolebensversicherungen und Berufsunfähigkeitsversicherungen. \n", + "In unserer aktuellen Gesellschaft ist der Mensch nicht nur klassischen körperlichen \n", + "Erkrankungen ausgesetzt, sondern zunehmend kommen – beispielsweise durch \n", + "Überlastungen am Arbeitsplatz oder Stress – psychische Erkrankungen hinzu. Das \n", + "Bewusstsein für diese Art von Erkrankung und die Klassifikation als „Krankheit“ \n", + "durchdringt jedoch noch nicht alle gesellschaftlichen Bereiche. \n", + "Für das Versicherungsunternehmen New York Life Insurance Company bietet es sich \n", + "daher an, den Geschäftsbereich zu erweitern und zukünftig nicht nur körperliche, \n", + "sondern auch psychische Erkrankungen zu versichern. Um zunächst Kosten \n", + "einzusparen, wird keine eigene Umfrage durch das Unternehmen erstellt, sondern auf \n", + "schon bestehende Daten zurückgegriffen (OSMI Mental Health in Tech Survey 2016, \n", + "2020). \n", + "\n", + "## Datengrundlage:\n", + "Die Daten umfassen Informationen zu Alter, Geschlecht, familiärer Vorgeschichte, Behandlung, Arbeitsbeeinträchtigung und anderen Merkmalen von Personen aus einer Online-Umfrage. Diese Daten werden verwendet, um das Risiko psychischer Erkrankungen vorherzusagen und entsprechende Versicherungsprämien festzulegen.\n", + "\n", + "## ML-Strategie:\n", + "Es werden verschiedene Machine-Learning-Modelle wie Entscheidungsbaum, Random Forest und logistische Regression eingesetzt, um das Risiko psychischer Erkrankungen vorherzusagen. Die Modelle werden auf trainierten und getesteten Daten evaluiert, um ihre Vorhersageleistung zu bewerten.\n", + "\n", + "## Datenvorbereitung:\n", + "Die Datenvorbereitung umfasst das Entfernen von Duplikaten und fehlenden Daten sowie die Bereinigung von Ausreißern. Darüber hinaus werden unerwünschte Merkmale entfernt und kategoriale Merkmale in Dummy-Variablen umgewandelt.\n", + "\n", + "## Datenmodellierung:\n", + "Es werden verschiedene ML-Modelle wie Entscheidungsbaum, Random Forest und logistische Regression trainiert und evaluiert, um das Risiko psychischer Erkrankungen vorherzusagen. Die Modelle werden auf Trainings- und Testdaten angewendet, und ihre Vorhersageleistung wird anhand von Metriken wie Accuracy, Precision und Recall bewertet.\n", + "\n", + "## Modellevaluation:\n", + "Die Modelle werden anhand von Metriken wie Accuracy, Precision, Recall und Confusion Matrix evaluiert, um ihre Vorhersageleistung zu bewerten und festzustellen, wie gut sie das Risiko psychischer Erkrankungen vorhersagen können.\n", + "\n", + "## Bereitstellung:\n", + "Die Bereitstellung des Modells ist ein wesentlicher Schritt nach der Modellierung und Evaluierung. Dieser Schritt umfasst die Implementierung des trainierten Modells in der Produktionsumgebung, damit es für Echtzeitvorhersagen verwendet werden kann. In diesem Fall könnten Versicherungsunternehmen das trainierte Modell verwenden, um das Risiko psychischer Erkrankungen bei Versicherungsnehmern vorherzusagen und entsprechende Prämien festzulegen. Die Bereitstellung könnte durch die Integration des Modells in eine Webanwendung oder eine API erfolgen, über die Nutzer ihre Informationen eingeben und eine Vorhersage erhalten können." + ] + }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ - "# Vorhersage von psychischen Erkrankungen f\u00fcr die Krankenversicherung\n", + "# Vorhersage von psychischen Erkrankungen für die Krankenversicherung\n", "# 1. Business Understanding\n", - "Welche Personengruppe, bestimmt durch Alter, Geschlecht, Vorerkrankungen und berufliche Merkmale, muss im Verh\u00e4ltnis eine h\u00f6here Versicherungspr\u00e4mie zahlen. Damit bei einem allgemeinen Schadensfall und Arbeitsausfall eine ausreichende Deckung gew\u00e4hrleistet ist, damit die Versicherung die zus\u00e4tzlichen Behandlungskosten f\u00fcr psychische Erkrankungen finanzieren kann? \n" + "Welche Personengruppe, bestimmt durch Alter, Geschlecht, Vorerkrankungen und berufliche Merkmale, muss im Verhältnis eine höhere Versicherungsprämie zahlen. Damit bei einem allgemeinen Schadensfall und Arbeitsausfall eine ausreichende Deckung gewährleistet ist, damit die Versicherung die zusätzlichen Behandlungskosten für psychische Erkrankungen finanzieren kann? \n" ] }, { @@ -15,7 +54,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# 2. Daten und Datenverst\u00e4ndnis \n", + "# 2. Daten und Datenverständnis \n", "## 2.1. Import von relevanten Modulen " ] }, @@ -230,7 +269,7 @@ " </tr>\n", " </tbody>\n", "</table>\n", - "<p>5 rows \u00d7 27 columns</p>\n", + "<p>5 rows × 27 columns</p>\n", "</div>" ], "text/plain": [ @@ -658,7 +697,7 @@ " </tr>\n", " </tbody>\n", "</table>\n", - "<p>11 rows \u00d7 27 columns</p>\n", + "<p>11 rows × 27 columns</p>\n", "</div>" ], "text/plain": [ @@ -910,7 +949,7 @@ " <tbody>\n", " </tbody>\n", "</table>\n", - "<p>0 rows \u00d7 27 columns</p>\n", + "<p>0 rows × 27 columns</p>\n", "</div>" ], "text/plain": [ @@ -1111,7 +1150,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 2.3 Unerw\u00fcnschte Merkmale entfernen" + "## 2.3 Unerwünschte Merkmale entfernen" ] }, { @@ -1653,7 +1692,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 2.4 Ausrei\u00dfer entfernen" + "## 2.4 Ausreißer entfernen" ] }, { @@ -1661,7 +1700,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "einige Personen haben einen Trollwert f\u00fcr \"Alter\" eingegeben, diese Zeilen m\u00fcssen entfernt werden \n", + "einige Personen haben einen Trollwert für \"Alter\" eingegeben, diese Zeilen müssen entfernt werden \n", "das Alter sollte zwischen 16 und 70 Jahren liegen" ] }, @@ -8967,7 +9006,7 @@ "source": [ "plt.figure(figsize=(10,5))\n", "sns.countplot(y=\"work_interfere\", hue=\"treatment\", data=data2)\n", - "plt.title(\"Behandlung der psychischen Erkrankung st\u00f6rt die t\u00e4gliche Arbeit?\",fontsize=15,fontweight=\"normal\")\n", + "plt.title(\"Behandlung der psychischen Erkrankung stört die tägliche Arbeit?\",fontsize=15,fontweight=\"normal\")\n", "plt.ylabel(\"\")\n", "plt.show()\n" ] @@ -8977,10 +9016,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Dieses Merkmal scheint ein guter Pr\u00e4diktor f\u00fcr die Zielvariable Behandlung zu sein. \n", - "Aber die Information \"Beeintr\u00e4chtigt Ihre psychische Gesundheit Ihre Arbeit\" kann nicht erhoben werden. \n", - "Niemand, der bei klarem Verstand ist, w\u00fcrde seiner Krankenkasse gegen\u00fcber die Wahrheit zu dieser Frage sagen. \n", - "Daher muss die Frage nach der Beeintr\u00e4chtigung der Arbeit gestrichen werden." + "Dieses Merkmal scheint ein guter Prädiktor für die Zielvariable Behandlung zu sein. \n", + "Aber die Information \"Beeinträchtigt Ihre psychische Gesundheit Ihre Arbeit\" kann nicht erhoben werden. \n", + "Niemand, der bei klarem Verstand ist, würde seiner Krankenkasse gegenüber die Wahrheit zu dieser Frage sagen. \n", + "Daher muss die Frage nach der Beeinträchtigung der Arbeit gestrichen werden." ] }, { @@ -9202,7 +9241,7 @@ " </tr>\n", " </tbody>\n", "</table>\n", - "<p>971 rows \u00d7 10 columns</p>\n", + "<p>971 rows × 10 columns</p>\n", "</div>" ], "text/plain": [ @@ -9516,7 +9555,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 2.6 Dummy-Merkmale f\u00fcr alle stringbasierten Variablen erstellen" + "## 2.6 Dummy-Merkmale für alle stringbasierten Variablen erstellen" ] }, { @@ -10078,6 +10117,7 @@ } ], "metadata": { + "category": "Insurance", "interpreter": { "hash": "aab7ff84f4433dd8b68de441cd3c658d57659112bcb62d3bd6aa325045009f13" }, @@ -10097,9 +10137,8 @@ "pygments_lexer": "ipython3", "version": "3.8.9" }, - "title": "Predicting mental illness for health insurance", - "category": "Insurance" + "title": "Predicting mental illness for health insurance" }, "nbformat": 4, "nbformat_minor": 4 -} \ No newline at end of file +} diff --git a/Insurance/Prediction Interest for car insurance/notebook.ipynb b/Insurance/Prediction Interest for car insurance/notebook.ipynb index 273731e0c956a033dd62c97ac3d60241ba855890..f65f978181c06fff30c1a4aa0a874d1fd0b4b9ad 100644 --- a/Insurance/Prediction Interest for car insurance/notebook.ipynb +++ b/Insurance/Prediction Interest for car insurance/notebook.ipynb @@ -1,5 +1,31 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Geschäftlicher Kontext:\n", + "Das E-Commerce-Unternehmen befindet sich in einem äußerst wettbewerbsintensiven Markt und sucht kontinuierlich nach Möglichkeiten, die Kundenzufriedenheit zu steigern, um die Kundenbindung zu fördern und letztendlich den Umsatz zu erhöhen. Die Optimierung der Benutzererfahrung ist von entscheidender Bedeutung, um die Kundenbindung zu stärken und eine langfristige Rentabilität zu gewährleisten. Personalisierte Produktempfehlungen gelten als eine effektive Strategie, um die Benutzererfahrung zu verbessern und die Wahrscheinlichkeit von Cross-Selling und Up-Selling zu erhöhen.\n", + "\n", + "## Datengrundlage:\n", + "Der Datensatz wurde aus Kaggle entnommen https://www.kaggle.com/jassican/janatahack-crosssell-prediction. Das Unternehmen verfügt über eine umfangreiche Datenbank mit Informationen zu vergangenen Transaktionen, Kundenbewertungen, demografischen Merkmalen und dem Nutzerverhalten auf der Website. Diese Daten umfassen eine Vielzahl von Variablen, darunter Produkteigenschaften, Kundenpräferenzen, Kaufhistorie, Suchanfragen, Klickverhalten und vieles mehr. Die Qualität und Vielfalt dieser Daten bilden die Grundlage für die Entwicklung von ML-Modellen zur Generierung personalisierter Produktempfehlungen.\n", + "\n", + "## ML Strategie:\n", + "Die ML-Strategie des Unternehmens konzentriert sich darauf, personalisierte Produktempfehlungen zu entwickeln, die den individuellen Vorlieben und Bedürfnissen der Kunden entsprechen. Dies wird erreicht, indem verschiedene ML-Techniken wie Collaborative Filtering, Content-Based Filtering und Hybrid-Modelle angewendet werden. Das Ziel ist es, den Kunden relevante Empfehlungen zu bieten, die ihre Interessen widerspiegeln und sie zum Kauf weiterer Produkte anregen.\n", + "\n", + "## Datenvorbereitung:\n", + "Die Datenvorbereitung ist ein entscheidender Schritt im ML-Prozess, der sicherstellt, dass die Daten für die Analyse und Modellierung geeignet sind. Dies umfasst die Bereinigung der Daten von fehlerhaften oder unvollständigen Einträgen, die Transformation von Variablen in das richtige Format, die Normalisierung von numerischen Werten und die Kodierung kategorialer Variablen. Ein besonderes Augenmerk wird darauf gelegt, sicherzustellen, dass die Datenqualität hoch ist und dass alle relevanten Informationen extrahiert werden können.\n", + "\n", + "## Datenmodellierung:\n", + "In der Datenmodellierung werden verschiedene ML-Modelle entwickelt und trainiert, um personalisierte Produktempfehlungen zu generieren. Dazu gehören Collaborative Filtering-Modelle, die auf dem Verhalten ähnlicher Benutzer basieren, Content-Based Filtering-Modelle, die auf den Eigenschaften der Produkte basieren, die ein Benutzer bereits gekauft oder angesehen hat, und Hybrid-Modelle, die beide Ansätze kombinieren. Durch die Auswahl und Anpassung dieser Modelle wird angestrebt, hochpräzise Empfehlungen zu generieren, die den individuellen Vorlieben der Kunden entsprechen.\n", + "\n", + "## Modellevaluation:\n", + "Die Evaluation der Modelle erfolgt anhand einer Vielzahl von Metriken, darunter Genauigkeit, Präzision, Recall, die Area Under Curve (AUC) und andere. Ziel ist es, sicherzustellen, dass die entwickelten Modelle qualitativ hochwertige Empfehlungen liefern und die Benutzerzufriedenheit maximieren. Dieser Schritt ist entscheidend, um sicherzustellen, dass die ML-Modelle die gewünschten Geschäftsziele erreichen und einen Mehrwert für das Unternehmen bieten.\n", + "\n", + "## Bereitstellung:\n", + "Nach der Auswahl des besten Modells wird es in die E-Commerce-Plattform integriert, um personalisierte Empfehlungen in Echtzeit bereitzustellen. Dies erfordert eine nahtlose Integration des Modells in die bestehende Infrastruktur des Unternehmens und eine kontinuierliche Überwachung seiner Leistung. Ein Monitoring-System wird implementiert, um die Leistung des Modells kontinuierlich zu überwachen und bei Bedarf anzupassen. Durch diesen iterativen Prozess wird sichergestellt, dass die ML-Modelle stets optimal funktionieren und die bestmöglichen Empfehlungen für die Kunden bereitstellen." + ] + }, { "attachments": {}, "cell_type": "markdown", @@ -13,13 +39,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "InsurTech-Unternehmen besch\u00e4ftigen sich mit dem\n", + "InsurTech-Unternehmen beschäftigen sich mit dem\n", "das Thema der Modernisierung der Versicherungsbranche. Das Ziel ist es, die\n", - "Versicherungen g\u00fcnstiger, attraktiver, \"effizienter\" zu machen durch moderne\n", + "Versicherungen günstiger, attraktiver, \"effizienter\" zu machen durch moderne\n", "\"Versicherungsmodelle, digitalisierte Prozesse, neue Beratungs- und\n", - "Managementmethoden\" gestaltet werden. Die zunehmenden Herausforderungen erschweren es den Versicherern, sich im Wettbewerb zu behaupten und am Markt zu bestehen. Bestehend aus adaptiven Kundenanspr\u00fcchen, \"Digitalisierung, strengerer Regulierung und B\u00fcrokratie\", werden die Versicherer unter dem Aspekt des wirtschaftlichen Ergebnisses deutlich auf die Probe gestellt. Gleichzeitig ergeben sich Chancen im Gesch\u00e4ftsmodell, die noch ungenutzt sind.\n", + "Managementmethoden\" gestaltet werden. Die zunehmenden Herausforderungen erschweren es den Versicherern, sich im Wettbewerb zu behaupten und am Markt zu bestehen. Bestehend aus adaptiven Kundenansprüchen, \"Digitalisierung, strengerer Regulierung und Bürokratie\", werden die Versicherer unter dem Aspekt des wirtschaftlichen Ergebnisses deutlich auf die Probe gestellt. Gleichzeitig ergeben sich Chancen im Geschäftsmodell, die noch ungenutzt sind.\n", "ungenutzt bleiben. Eines dieser Modelle ist das Prinzip des Cross-Selling. Damit dieses Modell umgesetzt werden kann, ist die\n", - "ist die Meinung der bestehenden Kunden entscheidend. Das Gesch\u00e4ftsmodell sollte auf der Grundlage des bestehenden Kundeninteresses antizipiert werden. Die Analyse soll dem Versicherer zeigen, welches Potenzial in welcher H\u00f6he tats\u00e4chlich vorhanden ist. Die Analyse wird sich mit der Frage besch\u00e4ftigen, ob es Kunden gibt, die sich f\u00fcr eine Kfz-Versicherung interessieren. Die Antwort auf diese Frage soll gleichzeitig auch eine Darstellung des Interesses liefern. So l\u00e4sst sich absch\u00e4tzen, ob sich eine aktive Kundenansprache \u00fcberhaupt lohnt." + "ist die Meinung der bestehenden Kunden entscheidend. Das Geschäftsmodell sollte auf der Grundlage des bestehenden Kundeninteresses antizipiert werden. Die Analyse soll dem Versicherer zeigen, welches Potenzial in welcher Höhe tatsächlich vorhanden ist. Die Analyse wird sich mit der Frage beschäftigen, ob es Kunden gibt, die sich für eine Kfz-Versicherung interessieren. Die Antwort auf diese Frage soll gleichzeitig auch eine Darstellung des Interesses liefern. So lässt sich abschätzen, ob sich eine aktive Kundenansprache überhaupt lohnt." ] }, { @@ -27,7 +53,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# 2. Daten und Datenverst\u00e4ndnis" + "# 2. Daten und Datenverständnis" ] }, { @@ -35,7 +61,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Der Datensatz hei\u00dft Janatahack Cross-sell Prediction und wurde in einen Trainings- und einen Testdatensatz aufgeteilt. Das Attribut \"Response\" ist die Zielvariable und dr\u00fcckt das Interesse eines Kunden an einer Kfz-Versicherung aus. Da diese wichtige Spalte jedoch merkw\u00fcrdigerweise im Testdatensatz fehlt, wurde nur der Trainingsdatensatz f\u00fcr das Modell verwendet. Dieser wurde also f\u00fcr Training und Test verwendet. Der Datensatz besteht aus 12 Spalten und 381109 Zeilen. Jede Zeile steht f\u00fcr eine Person." + "Der Datensatz heißt Janatahack Cross-sell Prediction und wurde in einen Trainings- und einen Testdatensatz aufgeteilt. Das Attribut \"Response\" ist die Zielvariable und drückt das Interesse eines Kunden an einer Kfz-Versicherung aus. Da diese wichtige Spalte jedoch merkwürdigerweise im Testdatensatz fehlt, wurde nur der Trainingsdatensatz für das Modell verwendet. Dieser wurde also für Training und Test verwendet. Der Datensatz besteht aus 12 Spalten und 381109 Zeilen. Jede Zeile steht für eine Person." ] }, { @@ -61,7 +87,7 @@ "sns.set()\n", "import warnings\n", "warnings.filterwarnings('ignore')\n", - "# Zus\u00e4tzlich f\u00fcr Logistische Regression ben\u00f6tigt:\n", + "# Zusätzlich für Logistische Regression benötigt:\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.tree import DecisionTreeClassifier\n", "from sklearn.ensemble import RandomForestClassifier\n", @@ -97,7 +123,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Zu Beginn wird ein \u00dcberblick \u00fcber die Daten gegeben. Es werden nur die ersten 5 Dateneintr\u00e4ge oder Zeilen ber\u00fccksichtigt." + "Zu Beginn wird ein Überblick über die Daten gegeben. Es werden nur die ersten 5 Dateneinträge oder Zeilen berücksichtigt." ] }, { @@ -258,7 +284,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Nachdem wir nun einen ersten \u00dcberblick \u00fcber die Daten erhalten haben, wollen wir uns nun die Datentypen der einzelnen Spalten ansehen." + "Nachdem wir nun einen ersten Überblick über die Daten erhalten haben, wollen wir uns nun die Datentypen der einzelnen Spalten ansehen." ] }, { @@ -301,7 +327,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Die Datentypen stimmen mit den angegebenen Spalten \u00fcberein. Die Gefahr der Erzeugung von NULL-Werten ist nicht gegeben. Daher ist keine Korrektur erforderlich." + "Die Datentypen stimmen mit den angegebenen Spalten überein. Die Gefahr der Erzeugung von NULL-Werten ist nicht gegeben. Daher ist keine Korrektur erforderlich." ] }, { @@ -317,7 +343,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Zun\u00e4chst werden alle leeren Zellen aus dem Datensatz summiert, in welchem Bereich mit welcher Gesamtzahl von Variablen sie fehlen." + "Zunächst werden alle leeren Zellen aus dem Datensatz summiert, in welchem Bereich mit welcher Gesamtzahl von Variablen sie fehlen." ] }, { @@ -357,7 +383,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Es werden keine NULL-Werte angegeben. Daher ist weder die Ersetzung durch synthetische Daten noch die L\u00f6schung bestimmter Zeilen erforderlich." + "Es werden keine NULL-Werte angegeben. Daher ist weder die Ersetzung durch synthetische Daten noch die Löschung bestimmter Zeilen erforderlich." ] }, { @@ -365,7 +391,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Nachdem die Tabelle auf NULL-Werte gepr\u00fcft wurde, folgt die Pr\u00fcfung auf Duplikate." + "Nachdem die Tabelle auf NULL-Werte geprüft wurde, folgt die Prüfung auf Duplikate." ] }, { @@ -449,7 +475,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Nach der \u00dcberpr\u00fcfung auf NULL-Werte und Duplikate wird nun die deskriptive Statistik auf die Daten angewendet. Dies sollte einen ersten Eindruck davon vermitteln, wie die Daten im Moment strukturiert sind." + "Nach der Überprüfung auf NULL-Werte und Duplikate wird nun die deskriptive Statistik auf die Daten angewendet. Dies sollte einen ersten Eindruck davon vermitteln, wie die Daten im Moment strukturiert sind." ] }, { @@ -717,7 +743,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Nach der Analyse der deskriptiven Statistiken sticht die Spalte \"Jahrespr\u00e4mie\" hervor. Der Durchschnitt (Mittelwert) weist einen Wert von 30564,389581 auf. Auffallend ist hier der Maximalwert von 540165, der deutlich hervorsticht. Dies deutet bereits auf einen Ausrei\u00dfer beim Maximalwert hin. " + "Nach der Analyse der deskriptiven Statistiken sticht die Spalte \"Jahresprämie\" hervor. Der Durchschnitt (Mittelwert) weist einen Wert von 30564,389581 auf. Auffallend ist hier der Maximalwert von 540165, der deutlich hervorsticht. Dies deutet bereits auf einen Ausreißer beim Maximalwert hin. " ] }, { @@ -725,7 +751,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Der Datensatz besteht aus 381109 Zeilen, jeweils eine Zeile zur Beschreibung des Kunden und 12 Spalten zur Beschreibung der Eigenschaften des Kunden. Mit diesen Daten wird versucht zu klassifizieren, ob ein Kunde an einer zus\u00e4tzlichen Kfz-Versicherung interessiert ist oder nicht. Zu diesem Zweck enthalten die historischen Daten die Zielvariable \"Antwort\", die Auskunft dar\u00fcber gibt, ob ein Kunde interessiert ist. " + "Der Datensatz besteht aus 381109 Zeilen, jeweils eine Zeile zur Beschreibung des Kunden und 12 Spalten zur Beschreibung der Eigenschaften des Kunden. Mit diesen Daten wird versucht zu klassifizieren, ob ein Kunde an einer zusätzlichen Kfz-Versicherung interessiert ist oder nicht. Zu diesem Zweck enthalten die historischen Daten die Zielvariable \"Antwort\", die Auskunft darüber gibt, ob ein Kunde interessiert ist. " ] }, { @@ -741,7 +767,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Wir beginnen mit den numerischen Attributen. Zun\u00e4chst werden die Verteilungen der numerischen Attribute einzeln untersucht und in einem zweiten Schritt werden die kategorischen Attribute mit der Zielvariablen in Beziehung gesetzt." + "Wir beginnen mit den numerischen Attributen. Zunächst werden die Verteilungen der numerischen Attribute einzeln untersucht und in einem zweiten Schritt werden die kategorischen Attribute mit der Zielvariablen in Beziehung gesetzt." ] }, { @@ -799,7 +825,7 @@ "source": [ "- Die Mehrheit der Kunden ist zwischen 20 und 30 Jahre alt\n", "- Die Kurve flacht nach hinten stark ab\n", - "- Fraglich, ob es Ausrei\u00dfer im hinteren Teil gibt --> Boxplot anwenden" + "- Fraglich, ob es Ausreißer im hinteren Teil gibt --> Boxplot anwenden" ] }, { @@ -847,7 +873,7 @@ "metadata": {}, "source": [ "- Kunden im Alter von 20 bis 30 Jahren haben eher kein Interesse am Abschluss einer Zusatzversicherung.\n", - "- Das gr\u00f6\u00dfte Interesse besteht bei Kunden zwischen 35 und 55 Jahren. " + "- Das größte Interesse besteht bei Kunden zwischen 35 und 55 Jahren. " ] }, { @@ -876,7 +902,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Mit Hilfe des Boxplots konnte sichergestellt werden, dass keine Ausrei\u00dfer zu finden waren. Sollten Ausrei\u00dfer auftreten, w\u00fcrden sie als Punkte oberhalb der orangefarbenen Linie erscheinen." + "Mit Hilfe des Boxplots konnte sichergestellt werden, dass keine Ausreißer zu finden waren. Sollten Ausreißer auftreten, würden sie als Punkte oberhalb der orangefarbenen Linie erscheinen." ] }, { @@ -884,7 +910,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### F\u00fchrerschein" + "### Führerschein" ] }, { @@ -923,7 +949,7 @@ "metadata": {}, "source": [ "- Spalte besteht nur aus 0 und 1\n", - "- Ein gro\u00dfer Teil der Kunden hat einen F\u00fchrerschein\n", + "- Ein großer Teil der Kunden hat einen Führerschein\n", "- Das Balkendiagramm kann verwendet werden, um eine klarere Darstellung zu erhalten." ] }, @@ -971,7 +997,7 @@ "metadata": {}, "source": [ "- Alle Regionen sind mit einer Nummer gekennzeichnet\n", - "- Der Regionalcode bezeichnet einen eindeutigen Code f\u00fcr eine bestimmte Region" + "- Der Regionalcode bezeichnet einen eindeutigen Code für eine bestimmte Region" ] }, { @@ -1019,7 +1045,7 @@ "metadata": {}, "source": [ "- Die Mehrheit der Kunden ist zwischen 25 und 30 Jahre alt.\n", - "- Kunden aus Regionen mit dem Code zwischen 25 und 30 haben ein gro\u00dfes Interesse an Zusatzversicherungen.\n", + "- Kunden aus Regionen mit dem Code zwischen 25 und 30 haben ein großes Interesse an Zusatzversicherungen.\n", "- Kunden aus Regionen mit einem Code zwischen 5 und 10 sind nicht sehr an einer Zusatzversicherung interessiert." ] }, @@ -1113,7 +1139,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- Kunden, die bereits eine Kfz-Versicherung haben, zeigen in der Regel kein Interesse an dem zus\u00e4tzlichen Angebot." + "- Kunden, die bereits eine Kfz-Versicherung haben, zeigen in der Regel kein Interesse an dem zusätzlichen Angebot." ] }, { @@ -1121,7 +1147,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Jahrespr\u00e4mie" + "### Jahresprämie" ] }, { @@ -1160,8 +1186,8 @@ "metadata": {}, "source": [ "- Normalverteilung erkennbar\n", - "- Ausrei\u00dfer erkennbar, Kurve flacht extrem stark nach rechts ab\n", - "- Der Kostenbereich, den ein Kunde f\u00fcr eine Premium-Mitgliedschaft bezahlt, liegt zwischen 0 und 100000." + "- Ausreißer erkennbar, Kurve flacht extrem stark nach rechts ab\n", + "- Der Kostenbereich, den ein Kunde für eine Premium-Mitgliedschaft bezahlt, liegt zwischen 0 und 100000." ] }, { @@ -1246,8 +1272,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- Policy Sales Channel ist die Wahl des Kanals, \u00fcber den der Kunde erreicht wird (z. B. per Telefon).\n", - "- Code 150 ist der Kanal mit der h\u00f6chsten Kundenreichweite" + "- Policy Sales Channel ist die Wahl des Kanals, über den der Kunde erreicht wird (z. B. per Telefon).\n", + "- Code 150 ist der Kanal mit der höchsten Kundenreichweite" ] }, { @@ -1294,7 +1320,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- Die Kunden mit dem gr\u00f6\u00dften Interesse an einer zus\u00e4tzlichen Kfz-Versicherung werden \u00fcber die Kan\u00e4le 25 und 125 erreicht." + "- Die Kunden mit dem größten Interesse an einer zusätzlichen Kfz-Versicherung werden über die Kanäle 25 und 125 erreicht." ] }, { @@ -1341,8 +1367,8 @@ "metadata": {}, "source": [ "- Keine Normalverteilung erkennbar\n", - "- Keine Ausrei\u00dfer erkennbar\n", - "- Kunden sind potentiell gleichm\u00e4\u00dfig \u00fcber die einzelnen Tage verteilt." + "- Keine Ausreißer erkennbar\n", + "- Kunden sind potentiell gleichmäßig über die einzelnen Tage verteilt." ] }, { @@ -1389,7 +1415,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- Gleichm\u00e4\u00dfige Verteilung\n", + "- Gleichmäßige Verteilung\n", "- Kein Trend zu Zinsen erkennbar." ] }, @@ -1436,9 +1462,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- Kategoriale Variable, verf\u00fcgbar als numerische Variable (nur 0 und 1).\n", - "- 1 steht f\u00fcr Interesse, 0 steht f\u00fcr kein Interesse\n", - "- Ein gro\u00dfer Teil der Kunden hat kein Interesse an einer weiteren Versicherung" + "- Kategoriale Variable, verfügbar als numerische Variable (nur 0 und 1).\n", + "- 1 steht für Interesse, 0 steht für kein Interesse\n", + "- Ein großer Teil der Kunden hat kein Interesse an einer weiteren Versicherung" ] }, { @@ -1485,7 +1511,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Die Matrix weist keine auffallend starken Korrelationen auf. Die Korrelationen Previously_Insured/Policy_Sales_Channel und Age/Annual_Premium sind m\u00e4\u00dfig korreliert." + "Die Matrix weist keine auffallend starken Korrelationen auf. Die Korrelationen Previously_Insured/Policy_Sales_Channel und Age/Annual_Premium sind mäßig korreliert." ] }, { @@ -1501,7 +1527,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Im Folgenden werden die kategorialen Attribute untersucht. Auch hier sollten die Attribute mit der Zielvariablen in Verbindung stehen. Aus dem vorangegangenen Kapitel wurden numerische Attribute ermittelt, die kategoriale Attribute enthalten (z.B. Response). Diese werden auch in dieser Analyse ber\u00fccksichtigt." + "Im Folgenden werden die kategorialen Attribute untersucht. Auch hier sollten die Attribute mit der Zielvariablen in Verbindung stehen. Aus dem vorangegangenen Kapitel wurden numerische Attribute ermittelt, die kategoriale Attribute enthalten (z.B. Response). Diese werden auch in dieser Analyse berücksichtigt." ] }, { @@ -1517,7 +1543,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Zun\u00e4chst wird die Verteilung der Zielvariablen \"Response\" \u00fcberpr\u00fcft." + "Zunächst wird die Verteilung der Zielvariablen \"Response\" überprüft." ] }, { @@ -1563,7 +1589,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- Das Interesse an einer Kfz-Versicherung entspricht etwa 12 % des gesamten Datensatzes, w\u00e4hrend das Desinteresse etwa 88 % ausmacht.\n", + "- Das Interesse an einer Kfz-Versicherung entspricht etwa 12 % des gesamten Datensatzes, während das Desinteresse etwa 88 % ausmacht.\n", "- Es handelt sich also um einen unausgewogenen Datensatz und in der Bewertungsphase muss eine andere Metrik verwendet werden." ] }, @@ -1602,7 +1628,7 @@ "metadata": {}, "source": [ "- 0 = \"kein Interesse\", 1 = \"Interesse\".\n", - "- Das Interesse zwischen den Geschlechtern ist fast gleich gro\u00df." + "- Das Interesse zwischen den Geschlechtern ist fast gleich groß." ] }, { @@ -1639,7 +1665,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- Betrachtet man das Verh\u00e4ltnis der Grafik, so erkennt man, dass das gr\u00f6\u00dfte Interesse bei Fahrzeughaltern besteht, deren Auto \u00e4lter als 2 Jahre ist." + "- Betrachtet man das Verhältnis der Grafik, so erkennt man, dass das größte Interesse bei Fahrzeughaltern besteht, deren Auto älter als 2 Jahre ist." ] }, { @@ -1676,8 +1702,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- Die Grafik zeigt, dass Kraftfahrzeughalter, deren Auto bereits einen Schaden hatte, st\u00e4rker an einer Kfz-Versicherung interessiert sind.\n", - "- Besitzer von unfallfreien Fahrzeugen sind dagegen \u00fcberhaupt nicht an einem Angebot interessiert." + "- Die Grafik zeigt, dass Kraftfahrzeughalter, deren Auto bereits einen Schaden hatte, stärker an einer Kfz-Versicherung interessiert sind.\n", + "- Besitzer von unfallfreien Fahrzeugen sind dagegen überhaupt nicht an einem Angebot interessiert." ] }, { @@ -1701,7 +1727,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Zu Beginn kann die Spalte \"id\" bereits gel\u00f6scht werden. Eine Identifikationsnummer zur Einsch\u00e4tzung des Interesses einer Kundengruppe ist nicht notwendig. Daher kann diese direkt entfernt werden" + "Zu Beginn kann die Spalte \"id\" bereits gelöscht werden. Eine Identifikationsnummer zur Einschätzung des Interesses einer Kundengruppe ist nicht notwendig. Daher kann diese direkt entfernt werden" ] }, { @@ -1727,7 +1753,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Im Datensatz wurde festgestellt, dass bestimmte Spalten nur aus den numerischen Variablen 0 und 1 bestehen. Da es sich um Kategorien handelt (1 = Ja, 0 = Nein), muss die numerische Variable f\u00fcr eine neue Daten\u00fcbersicht in eine kategorische Variable umgewandelt werden. Zu diesem Zweck wird die Funktion map() verwendet." + "Im Datensatz wurde festgestellt, dass bestimmte Spalten nur aus den numerischen Variablen 0 und 1 bestehen. Da es sich um Kategorien handelt (1 = Ja, 0 = Nein), muss die numerische Variable für eine neue Datenübersicht in eine kategorische Variable umgewandelt werden. Zu diesem Zweck wird die Funktion map() verwendet." ] }, { @@ -1898,7 +1924,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 3.2 Umgang mit Ausrei\u00dfern" + "## 3.2 Umgang mit Ausreißern" ] }, { @@ -1978,8 +2004,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- Anschlie\u00dfend werden 1 % von links entfernt, da viele Werte auf 0 hinweisen.\n", - "- Kosten von 0 sind also m\u00f6glich, da auch viele Kunden \u00fcber ein Angebot einer einj\u00e4hrigen, kostenlosen Mitgliedschaft verf\u00fcgen k\u00f6nnen." + "- Anschließend werden 1 % von links entfernt, da viele Werte auf 0 hinweisen.\n", + "- Kosten von 0 sind also möglich, da auch viele Kunden über ein Angebot einer einjährigen, kostenlosen Mitgliedschaft verfügen können." ] }, { @@ -2029,7 +2055,7 @@ "metadata": {}, "source": [ "Verteilungsfunktion ist erkennbar.\n", - "- Die Mehrheit der Kunden zahlt 30.000,00 Euro pro Jahr f\u00fcr das Abonnement." + "- Die Mehrheit der Kunden zahlt 30.000,00 Euro pro Jahr für das Abonnement." ] }, { @@ -2037,7 +2063,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 3.3 Ber\u00fccksichtigung der neuen kategorialen Attribute \"Response\", \"Driving License\" und \"Previously Insured\"" + "## 3.3 Berücksichtigung der neuen kategorialen Attribute \"Response\", \"Driving License\" und \"Previously Insured\"" ] }, { @@ -2081,7 +2107,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Das Balkendiagramm f\u00fcr \"Driving License\" wird nun ber\u00fccksichtigt." + "Das Balkendiagramm für \"Driving License\" wird nun berücksichtigt." ] }, { @@ -2110,7 +2136,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Aus diesem Diagramm geht hervor, dass nur Kunden von Interesse sind, die auch im Besitz eines F\u00fchrerscheins sind." + "Aus diesem Diagramm geht hervor, dass nur Kunden von Interesse sind, die auch im Besitz eines Führerscheins sind." ] }, { @@ -2147,7 +2173,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Das Diagramm zeigt, dass Kunden, die bereits versichert sind, kein Interesse an zus\u00e4tzlicher Versicherung haben." + "Das Diagramm zeigt, dass Kunden, die bereits versichert sind, kein Interesse an zusätzlicher Versicherung haben." ] }, { @@ -2155,7 +2181,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Erneute \u00dcberpr\u00fcfung der Korrelationsmatrix" + "### Erneute Überprüfung der Korrelationsmatrix" ] }, { @@ -2204,7 +2230,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- Mit dem erneuten Blick werden nun m\u00e4\u00dfig starke Korrelationen untersucht.\n", + "- Mit dem erneuten Blick werden nun mäßig starke Korrelationen untersucht.\n", "- Es liegen keine starken Korrelationen vor." ] }, @@ -2213,7 +2239,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 3.4 Test auf Linearit\u00e4t" + "## 3.4 Test auf Linearität" ] }, { @@ -2221,7 +2247,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Nun wird die Linearit\u00e4t \u00fcberpr\u00fcft. Vintage wird als neue erkl\u00e4rende Variable hinzugef\u00fcgt. Wir m\u00f6chten die Dauer der Bindung an das Unternehmen mit anderen Variablen vergleichen." + "Nun wird die Linearität überprüft. Vintage wird als neue erklärende Variable hinzugefügt. Wir möchten die Dauer der Bindung an das Unternehmen mit anderen Variablen vergleichen." ] }, { @@ -2259,8 +2285,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- Keine Linearit\u00e4t.\n", - "- Es scheint, dass Kunden, die schon l\u00e4nger beim Unternehmen sind und hohe Kosten haben, ein h\u00f6heres Interesse an einer Zusatzversicherung haben (was auf wohlhabende Personen hindeutet)." + "- Keine Linearität.\n", + "- Es scheint, dass Kunden, die schon länger beim Unternehmen sind und hohe Kosten haben, ein höheres Interesse an einer Zusatzversicherung haben (was auf wohlhabende Personen hindeutet)." ] }, { @@ -2298,7 +2324,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Hier ist zu sehen, dass Kunden zwischen 30 und 50 Jahren ein h\u00f6heres Interesse aufrechterhalten. Vor allem Kunden, die seit 0 bis 100 Tagen beim Unternehmen sind, scheinen interessiert zu sein. Auch hier ist keine Linearit\u00e4t erkennbar." + "Hier ist zu sehen, dass Kunden zwischen 30 und 50 Jahren ein höheres Interesse aufrechterhalten. Vor allem Kunden, die seit 0 bis 100 Tagen beim Unternehmen sind, scheinen interessiert zu sein. Auch hier ist keine Linearität erkennbar." ] }, { @@ -2336,8 +2362,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- Keine Linearit\u00e4t.\n", - "- Kunden, die \u00fcber Vertriebskanal 40 und 120 erreicht wurden, zeigen signifikant h\u00f6heres Interesse. F\u00fcr Vertriebskanal 40 ist eine blaue Masse im Bereich zwischen 200 und 300 zu sehen." + "- Keine Linearität.\n", + "- Kunden, die über Vertriebskanal 40 und 120 erreicht wurden, zeigen signifikant höheres Interesse. Für Vertriebskanal 40 ist eine blaue Masse im Bereich zwischen 200 und 300 zu sehen." ] }, { @@ -2375,8 +2401,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- Keine erkennbare Linearit\u00e4t.\n", - "- Regionen zwischen 30 und 40 mit Zugeh\u00f6rigkeit zwischen 100 und 200 Tagen zeigen h\u00e4ufiger Interesse." + "- Keine erkennbare Linearität.\n", + "- Regionen zwischen 30 und 40 mit Zugehörigkeit zwischen 100 und 200 Tagen zeigen häufiger Interesse." ] }, { @@ -2384,7 +2410,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Es wurde eine Logarithmisierung durchgef\u00fchrt, um zu sehen, ob eine engere Linearit\u00e4t erzeugt werden kann. Dies war ein Testlauf und beschrieb keine Linearit\u00e4t in den folgenden Daten." + "Es wurde eine Logarithmisierung durchgeführt, um zu sehen, ob eine engere Linearität erzeugt werden kann. Dies war ein Testlauf und beschrieb keine Linearität in den folgenden Daten." ] }, { @@ -2671,7 +2697,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 3.5 Zur\u00fccksetzen des Index" + "## 3.5 Zurücksetzen des Index" ] }, { @@ -2679,7 +2705,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Nachdem die Ausrei\u00dfer entfernt wurden, soll eine neue Tabelle bzw. ein neuer Index erstellt werden, um die entfernten Werte aus der Tabelle zu bereinigen. Mit `drop=True` wird schlie\u00dflich ein neuer Index festgelegt, wobei der alte Index entfernt wird." + "Nachdem die Ausreißer entfernt wurden, soll eine neue Tabelle bzw. ein neuer Index erstellt werden, um die entfernten Werte aus der Tabelle zu bereinigen. Mit `drop=True` wird schließlich ein neuer Index festgelegt, wobei der alte Index entfernt wird." ] }, { @@ -2946,7 +2972,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "F\u00fcr das weitere Vorgehen zur \u00dcberpr\u00fcfung der Multikollinearit\u00e4t wird eine Codierung der numerischen Attribute durchgef\u00fchrt." + "Für das weitere Vorgehen zur Überprüfung der Multikollinearität wird eine Codierung der numerischen Attribute durchgeführt." ] }, { @@ -3207,7 +3233,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## 3.7 Test auf Multikollinearit\u00e4t" + "## 3.7 Test auf Multikollinearität" ] }, { @@ -3215,7 +3241,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Um sicherzustellen, dass die sp\u00e4tere Regression korrekt funktioniert, d\u00fcrfen keine Multikollinearit\u00e4ten zwischen den Variablen vorhanden sein. Die Anwesenheit solcher wird mithilfe der Bibliothek Statsmodel \u00fcberpr\u00fcft." + "Um sicherzustellen, dass die spätere Regression korrekt funktioniert, dürfen keine Multikollinearitäten zwischen den Variablen vorhanden sein. Die Anwesenheit solcher wird mithilfe der Bibliothek Statsmodel überprüft." ] }, { @@ -3262,7 +3288,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Die Variable \"Driving_License\" hat den h\u00f6chsten VIF-Wert und wird aus dem Datensatz entfernt." + "Die Variable \"Driving_License\" hat den höchsten VIF-Wert und wird aus dem Datensatz entfernt." ] }, { @@ -3300,14 +3326,14 @@ "source": [ "\n", " \n", - "# unabh\u00e4ngige Variablen\n", + "# unabhängige Variablen\n", "vif_test = data_enc.drop(\"Response\", axis=1)\n", " \n", "# VIF dataframe \n", "vif_data = pd.DataFrame() \n", "vif_data[\"feature\"] = vif_test.columns \n", " \n", - "# VIF f\u00fcr jedes Feature \n", + "# VIF für jedes Feature \n", "vif_data[\"VIF\"] = [variance_inflation_factor(vif_test.values, i) \n", " for i in range(len(vif_test.columns))] \n", " \n", @@ -3319,7 +3345,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Die Variable \"Age\" hat den h\u00f6chsten VIF-Wert und wird aus dem Datensatz entfernt.Age has high multicollinearity (VIF>10) and, as a result, is also removed." + "Die Variable \"Age\" hat den höchsten VIF-Wert und wird aus dem Datensatz entfernt.Age has high multicollinearity (VIF>10) and, as a result, is also removed." ] }, { @@ -3371,14 +3397,14 @@ ], "source": [ "\n", - "# unabh\u00e4ngige Variablen\n", + "# unabhängige Variablen\n", "vif_test = data_enc.drop(\"Response\", axis=1)\n", " \n", "# VIF dataframe \n", "vif_data = pd.DataFrame() \n", "vif_data[\"feature\"] = vif_test.columns \n", " \n", - "# VIF f\u00fcr jedes Feature \n", + "# VIF für jedes Feature \n", "vif_data[\"VIF\"] = [variance_inflation_factor(vif_test.values, i) \n", " for i in range(len(vif_test.columns))] \n", " \n", @@ -3390,7 +3416,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Keine der Variablen hat nun einen VIF gr\u00f6\u00dfer als 10" + "Keine der Variablen hat nun einen VIF größer als 10" ] }, { @@ -3585,7 +3611,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Die Modellierung wurde mithilfe des Jupyter-Notebooks \"E11_Churn_Solution\" durchgef\u00fchrt. Die Interpretationen wurden individuell vorgenommen." + "Die Modellierung wurde mithilfe des Jupyter-Notebooks \"E11_Churn_Solution\" durchgeführt. Die Interpretationen wurden individuell vorgenommen." ] }, { @@ -3601,7 +3627,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Die logistische Regression ist ein nicht-lineares Modell. Sie arbeitet mit kategorialen Zielwerten (abh\u00e4ngige Variable). Sie wird verwendet, um \"Ja\"/\"Nein\" (0/1)-Entscheidungen vorherzusagen." + "Die logistische Regression ist ein nicht-lineares Modell. Sie arbeitet mit kategorialen Zielwerten (abhängige Variable). Sie wird verwendet, um \"Ja\"/\"Nein\" (0/1)-Entscheidungen vorherzusagen." ] }, { @@ -3663,7 +3689,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Wenn das P-Wert (P>|z|) f\u00fcr eine Variable gr\u00f6\u00dfer als 0,05 ist und es sich nicht um die Konstante handelt, bedeutet dies, dass die Variable statistisch nicht signifikant ist. Die statistisch nicht relevanten Merkmale werden entfernt." + "Wenn das P-Wert (P>|z|) für eine Variable größer als 0,05 ist und es sich nicht um die Konstante handelt, bedeutet dies, dass die Variable statistisch nicht signifikant ist. Die statistisch nicht relevanten Merkmale werden entfernt." ] }, { @@ -3734,7 +3760,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Es gibt keine weiteren statistisch nicht signifikanten Variablen mehr. Das endg\u00fcltige Modell wurde modelliert." + "Es gibt keine weiteren statistisch nicht signifikanten Variablen mehr. Das endgültige Modell wurde modelliert." ] }, { @@ -3805,7 +3831,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Um mehrere Metriken f\u00fcr die Bewertung zu verwenden, kann das Modell bequemer mit Scikit-Learn erstellt werden. Daher wird das identische Modell wie mit Statsmodels erneut in Scikit-Learn generiert." + "Um mehrere Metriken für die Bewertung zu verwenden, kann das Modell bequemer mit Scikit-Learn erstellt werden. Daher wird das identische Modell wie mit Statsmodels erneut in Scikit-Learn generiert." ] }, { @@ -3869,7 +3895,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Die Genauigkeit deutet auf ein \u00fcberdurchschnittliches Modell hin. Allerdings handelt es sich um ein unausgeglichenes Datenset. Daher m\u00fcssen weitere Metriken analysiert werden." + "Die Genauigkeit deutet auf ein überdurchschnittliches Modell hin. Allerdings handelt es sich um ein unausgeglichenes Datenset. Daher müssen weitere Metriken analysiert werden." ] }, { @@ -3917,7 +3943,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Die Genauigkeiten sind f\u00fcr das Trainings- und Testdatenset identisch. Insgesamt sind die Werte f\u00fcr die Test- und Trainingsdatensets sehr \u00e4hnlich. Daher kann weder \u00dcberanpassung noch Unteranpassung angenommen werden." + "Die Genauigkeiten sind für das Trainings- und Testdatenset identisch. Insgesamt sind die Werte für die Test- und Trainingsdatensets sehr ähnlich. Daher kann weder Überanpassung noch Unteranpassung angenommen werden." ] }, { @@ -3995,7 +4021,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Der R\u00fcckrufwert ist zu niedrig und bietet daher keine aussagekr\u00e4ftige Darstellung. Um die Pr\u00e4zision und die R\u00fcckrufwerte anzeigen und bewerten zu k\u00f6nnen, ist eine Verbesserung mithilfe der Schwellenwerte erforderlich. Die R\u00fcckrufwerte m\u00fcssen erh\u00f6ht werden." + "Der Rückrufwert ist zu niedrig und bietet daher keine aussagekräftige Darstellung. Um die Präzision und die Rückrufwerte anzeigen und bewerten zu können, ist eine Verbesserung mithilfe der Schwellenwerte erforderlich. Die Rückrufwerte müssen erhöht werden." ] }, { @@ -4005,7 +4031,7 @@ "source": [ "Es scheint, dass das Modul 'sklearn.metrics' keine 'plot_roc_curve'-Attribute hat. -\n", "\n", - "- Wenn dieser Fehler auftritt, \u00fcberpr\u00fcfen Sie bitte die Versionierung.\n", + "- Wenn dieser Fehler auftritt, überprüfen Sie bitte die Versionierung.\n", "- Leider brachte die Fehleranalyse keinen Erfolg.\n", "- Aufgrund des massiven Aufwands und des Risikos von Datenverlust wurde der Fehler nicht behoben." ] @@ -4047,7 +4073,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Zuerst werden wir jedoch die Ergebnisse f\u00fcr das Gesch\u00e4ft illustrieren und kl\u00e4ren, welche Interesse bei einem Kunden wecken und welches dieses verringern." + "Zuerst werden wir jedoch die Ergebnisse für das Geschäft illustrieren und klären, welche Interesse bei einem Kunden wecken und welches dieses verringern." ] }, { @@ -4124,8 +4150,8 @@ "metadata": {}, "source": [ "- Wenn der Kunde bereits einen Unfall hatte (Fahrzeug_Schaden_Ja)\n", - "- Wenn der Kunde m\u00e4nnlich ist (Geschlecht_M\u00e4nnlich)\n", - "- Wenn das Auto des Kunden \u00e4lter als 2 Jahre ist (Fahrzeug_Alt_>2Jahre)" + "- Wenn der Kunde männlich ist (Geschlecht_Männlich)\n", + "- Wenn das Auto des Kunden älter als 2 Jahre ist (Fahrzeug_Alt_>2Jahre)" ] }, { @@ -4169,7 +4195,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "- Vertriebskanal, \u00fcber den der Kunde angesprochen wird (Policy_Sales_Channel).\n", + "- Vertriebskanal, über den der Kunde angesprochen wird (Policy_Sales_Channel).\n", "- Wenn das Auto weniger als 1 Jahr alt ist (Fahrzeug_Alt_<1Jahr)\n", "- Wenn der Kunde bereits eine Versicherungspolice hat (Zuvor_Versichert)" ] @@ -4187,7 +4213,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Die R\u00fcckrufrate ist als Zielmetrik zu niedrig und muss daher erh\u00f6ht werden. Daher werden die Metriken bei verschiedenen Schwellenwerten der logistischen Regression analysiert." + "Die Rückrufrate ist als Zielmetrik zu niedrig und muss daher erhöht werden. Daher werden die Metriken bei verschiedenen Schwellenwerten der logistischen Regression analysiert." ] }, { @@ -4412,7 +4438,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Ein Schwellenwert von 0,25 bietet ein besseres Ergebnis f\u00fcr die Anwendung. Er erh\u00f6ht den Recall auf ein zufriedenstellendes Niveau von 73,37 % auf Kosten der Pr\u00e4zision. Allerdings ist die Pr\u00e4zision vernachl\u00e4ssigbar." + "Ein Schwellenwert von 0,25 bietet ein besseres Ergebnis für die Anwendung. Er erhöht den Recall auf ein zufriedenstellendes Niveau von 73,37 % auf Kosten der Präzision. Allerdings ist die Präzision vernachlässigbar." ] }, { @@ -4507,7 +4533,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Wie erwartet steigt die Rate der Kunden, die f\u00e4lschlicherweise als interessiert eingestuft werden. Gleichzeitig steigt jedoch auch die Anzahl der Kunden, die korrekt als abwanderungswillig vorhergesagt werden (True Positives). Wie in der Seminararbeit erl\u00e4utert, ist dies entscheidend, denn im Zweifelsfall w\u00fcrde ein Kunde f\u00e4lschlicherweise vom Service-Team kontaktiert und k\u00f6nnte diesen Anruf sogar als guten Service wahrnehmen und langfristig an das Unternehmen gebunden werden." + "Wie erwartet steigt die Rate der Kunden, die fälschlicherweise als interessiert eingestuft werden. Gleichzeitig steigt jedoch auch die Anzahl der Kunden, die korrekt als abwanderungswillig vorhergesagt werden (True Positives). Wie in der Seminararbeit erläutert, ist dies entscheidend, denn im Zweifelsfall würde ein Kunde fälschlicherweise vom Service-Team kontaktiert und könnte diesen Anruf sogar als guten Service wahrnehmen und langfristig an das Unternehmen gebunden werden." ] }, { @@ -4599,6 +4625,7 @@ } ], "metadata": { + "category": "Insurance", "kernelspec": { "display_name": "Python 3", "language": "python", @@ -4616,9 +4643,8 @@ "pygments_lexer": "ipython3", "version": "3.8.5" }, - "title": "Prediction Interest for car insurance", - "category": "Insurance" + "title": "Prediction Interest for car insurance" }, "nbformat": 4, "nbformat_minor": 2 -} \ No newline at end of file +} diff --git a/Maintenance/Prediction of IOT system failures based on sensor data/notebook.ipynb b/Maintenance/Prediction of IOT system failures based on sensor data/notebook.ipynb index 042ce85eea8083756e6e26a227c546c330e6af9f..8b67e1da1e00aa950dacb843c40bfe52835f0d21 100644 --- a/Maintenance/Prediction of IOT system failures based on sensor data/notebook.ipynb +++ b/Maintenance/Prediction of IOT system failures based on sensor data/notebook.ipynb @@ -1,15 +1,41 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Geschäftlicher Kontext:\n", + "Das Inveron-Gefahrenmanagementsystem ermöglicht die Überwachung von Anlagen mittels Sensoren und bietet Funktionen wie Testalarme und Alarmrücksetzung. Es dient zur Überwachung und Steuerung von Brandschutzsystemen in Industrieunternehmen. Durch die Verarbeitung von Sensordaten können Ausfälle vorhergesagt und die Wartung optimiert werden.\n", + "\n", + "## Datengrundlage:\n", + "Die Daten stammen aus Sensoren, die in den Brandschutzsystemen installiert sind, und werden vom Inveron-System erfasst. Diese Daten umfassen verschiedene Parameter wie Einstellungen und Sensorwerte. Sowohl Trainings- als auch Testdaten werden verwendet, um ein Modell zur Vorhersage von Ausfällen zu entwickeln und zu validieren.\n", + "\n", + "## ML Strategie:\n", + "Die ML-Strategie basiert auf der Verwendung eines LSTM-Neuralnetzwerks, das auf den historischen Sensordaten trainiert wird. Durch die Verwendung von LSTM können zeitliche Abhängigkeiten in den Daten erfasst werden, was für die Vorhersage von Ausfällen wichtig ist. Das Modell wird auf Trainingsdaten trainiert und auf Testdaten evaluiert, um seine Leistung zu bewerten.\n", + "\n", + "## Datenvorbereitung:\n", + "Die Daten werden auf Nullwerte überprüft und fehlende Werte werden behandelt. Zudem werden zusätzliche Merkmale wie die verbleibenden Tage bis zum Ausfall hinzugefügt. Die Daten werden normalisiert, um sicherzustellen, dass alle Variablen im gleichen Bereich liegen. Unnötige Variablen werden entfernt, um die Modellkomplexität zu reduzieren.\n", + "\n", + "## Datenmodellierung:\n", + "Ein LSTM-Neuralnetzwerk wird aufgebaut und trainiert, um Ausfälle basierend auf den Sensordaten vorherzusagen. Das Netzwerk besteht aus mehreren LSTM-Schichten mit Dropout zur Vermeidung von Overfitting. Die Ausgabeschicht verwendet die Sigmoid-Aktivierungsfunktion für eine binäre Klassifikation.\n", + "\n", + "## Modellevaluation:\n", + "Das trainierte Modell wird auf den Trainingsdaten evaluiert, um seine Genauigkeit zu bestimmen. Es werden Metriken wie die Genauigkeit, die Präzision und der Recall berechnet, um die Leistung des Modells zu bewerten. Anschließend wird das Modell auf den Testdaten getestet, um seine Leistung in einer realen Umgebung zu überprüfen.\n", + "\n", + "## Bereitstellung:\n", + "Das trainierte Modell kann für die Vorhersage von Ausfällen in Echtzeit verwendet werden. Es kann in das Inveron-System integriert werden, um automatisierte Warnungen und Alarme bei drohenden Ausfällen zu generieren. Durch die kontinuierliche Überwachung der Sensordaten kann die Wartung der Brandschutzsysteme optimiert und Ausfallzeiten minimiert werden." + ] + }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ - "# Vorhersage von Ausf\u00e4llen von Brandschutzsystemen basierend auf Sensordaten\n", + "# Vorhersage von Ausfällen von Brandschutzsystemen basierend auf Sensordaten\n", "\n", "## Business Understanding\n", "\n", - "Mit Hilfe des Inveron-Gefahrenmanagementsystems k\u00f6nnen bereits mit Sensoren ausgestattete Anlagen \u00fcberwacht und kontrolliert werden, zum Beispiel von einer Kontrollstation aus. Inveron ist eine Software, die alle Sensordaten aus den Brandschutzsystemen b\u00fcndelt und visualisiert. Dar\u00fcber hinaus k\u00f6nnen mit Hilfe von Inveron Testalarme ausgel\u00f6st oder Alarme zur\u00fcckgesetzt werden. Das Inveron-Gefahrenmanagementsystem verarbeitet bereits eine Vielzahl von Sensordaten, die in der lokalen Systemumgebung, zum Beispiel im Sicherheitszentrum eines Industrieunternehmens, verwendet werden k\u00f6nnen. Spezifische Wartungsintervalle geben Minimax-Servicetechnikern an, wann ein System gewartet werden sollte. Neben der \u00dcberwachung der eigenen Sensordaten kann Inveron auch Daten von Drittanbietern \u00fcberwachen. Zum Beispiel k\u00f6nnen angeschlossene Videokameras zur Branddetektion verwendet werden. Auch Einbruchmeldeanlagen, Systeme zur Zaun\u00fcberwachung oder Torsteuerungssysteme k\u00f6nnen genutzt werden. Offene Schnittstellen (OPC, Modbus, Profibus, BAC-net) erm\u00f6glichen eine langfristige Nutzbarkeit bei Austausch einzelner Komponenten." + "Mit Hilfe des Inveron-Gefahrenmanagementsystems können bereits mit Sensoren ausgestattete Anlagen überwacht und kontrolliert werden, zum Beispiel von einer Kontrollstation aus. Inveron ist eine Software, die alle Sensordaten aus den Brandschutzsystemen bündelt und visualisiert. Darüber hinaus können mit Hilfe von Inveron Testalarme ausgelöst oder Alarme zurückgesetzt werden. Das Inveron-Gefahrenmanagementsystem verarbeitet bereits eine Vielzahl von Sensordaten, die in der lokalen Systemumgebung, zum Beispiel im Sicherheitszentrum eines Industrieunternehmens, verwendet werden können. Spezifische Wartungsintervalle geben Minimax-Servicetechnikern an, wann ein System gewartet werden sollte. Neben der Überwachung der eigenen Sensordaten kann Inveron auch Daten von Drittanbietern überwachen. Zum Beispiel können angeschlossene Videokameras zur Branddetektion verwendet werden. Auch Einbruchmeldeanlagen, Systeme zur Zaunüberwachung oder Torsteuerungssysteme können genutzt werden. Offene Schnittstellen (OPC, Modbus, Profibus, BAC-net) ermöglichen eine langfristige Nutzbarkeit bei Austausch einzelner Komponenten." ] }, { @@ -409,7 +435,7 @@ " </tr>\n", " </tbody>\n", "</table>\n", - "<p>5 rows \u00d7 26 columns</p>\n", + "<p>5 rows × 26 columns</p>\n", "</div>" ], "text/plain": [ @@ -454,7 +480,7 @@ "source": [ "# 3. Datenaufbereitung\n", "\n", - "## 3.1 Auf Nullwerte pr\u00fcfen" + "## 3.1 Auf Nullwerte prüfen" ] }, { @@ -602,7 +628,7 @@ }, "source": [ "## 2.1 Berechnung der verbleibenden Tage bis zum Ausfall\n", - "Im ersten Schritt haben wir nun die Daten geladen und werden dem Trainingsdatensatz eine weitere Spalte hinzuf\u00fcgen, die die verbleibenden Tage bis zum Austausch des Feuermelders oder Bauteils angibt. Im Testdatensatz wird eine weitere Spalte f\u00fcr die bin\u00e4re Unterscheidung oder Klassifikation erstellt. Es soll festgestellt werden, ob ein bestimmter Feuermelder (ID) innerhalb von w1-Zyklen ausf\u00e4llt, weshalb hier ein fiktiver Wert von 1 f\u00fcr w1 gew\u00e4hlt wird (1 Tag)." + "Im ersten Schritt haben wir nun die Daten geladen und werden dem Trainingsdatensatz eine weitere Spalte hinzufügen, die die verbleibenden Tage bis zum Austausch des Feuermelders oder Bauteils angibt. Im Testdatensatz wird eine weitere Spalte für die binäre Unterscheidung oder Klassifikation erstellt. Es soll festgestellt werden, ob ein bestimmter Feuermelder (ID) innerhalb von w1-Zyklen ausfällt, weshalb hier ein fiktiver Wert von 1 für w1 gewählt wird (1 Tag)." ] }, { @@ -795,7 +821,7 @@ " </tr>\n", " </tbody>\n", "</table>\n", - "<p>5 rows \u00d7 27 columns</p>\n", + "<p>5 rows × 27 columns</p>\n", "</div>" ], "text/plain": [ @@ -1027,7 +1053,7 @@ " </tr>\n", " </tbody>\n", "</table>\n", - "<p>5 rows \u00d7 29 columns</p>\n", + "<p>5 rows × 29 columns</p>\n", "</div>" ], "text/plain": [ @@ -1269,7 +1295,7 @@ " </tr>\n", " </tbody>\n", "</table>\n", - "<p>5 rows \u00d7 30 columns</p>\n", + "<p>5 rows × 30 columns</p>\n", "</div>" ], "text/plain": [ @@ -1322,7 +1348,7 @@ "id": "BuhuRzZsSNme" }, "source": [ - "Da nun eine Normalisierung der Trainingsdaten stattgefunden hat, wird f\u00fcr die Testdaten ebenfalls eine Normalisierung der Zyklen durchgef\u00fchrt." + "Da nun eine Normalisierung der Trainingsdaten stattgefunden hat, wird für die Testdaten ebenfalls eine Normalisierung der Zyklen durchgeführt." ] }, { @@ -1515,7 +1541,7 @@ " </tr>\n", " </tbody>\n", "</table>\n", - "<p>5 rows \u00d7 27 columns</p>\n", + "<p>5 rows × 27 columns</p>\n", "</div>" ], "text/plain": [ @@ -1566,7 +1592,7 @@ "id": "2PSDbKL-SNmh" }, "source": [ - "Als n\u00e4chstes verwenden wir die Wahrheitsdaten, um die Labels f\u00fcr die Testdaten zu generieren." + "Als nächstes verwenden wir die Wahrheitsdaten, um die Labels für die Testdaten zu generieren." ] }, { @@ -1786,7 +1812,7 @@ " </tr>\n", " </tbody>\n", "</table>\n", - "<p>5 rows \u00d7 28 columns</p>\n", + "<p>5 rows × 28 columns</p>\n", "</div>" ], "text/plain": [ @@ -1833,7 +1859,7 @@ "id": "nsb5R-hLSNmk" }, "source": [ - "Als n\u00e4chstes verwenden wir die Wahrheitsdaten, um die Labels f\u00fcr die Testdaten zu generieren." + "Als nächstes verwenden wir die Wahrheitsdaten, um die Labels für die Testdaten zu generieren." ] }, { @@ -2026,7 +2052,7 @@ " </tr>\n", " </tbody>\n", "</table>\n", - "<p>5 rows \u00d7 30 columns</p>\n", + "<p>5 rows × 30 columns</p>\n", "</div>" ], "text/plain": [ @@ -2153,7 +2179,7 @@ "id": "M7ORedeJSNmo" }, "source": [ - "Es ist zu sehen, dass alle Daten entweder den Datentyp float oder int haben, es gibt keine kategorialen Variablen im Datensatz. Nun zeigen wir die einzelnen Variablen in einem Histogramm an, um festzustellen, ob alle Variablen sinnvoll f\u00fcr das Modell verwendet werden k\u00f6nnen. Die gerade erstellten Spalten sowie \"id\" werden nicht ber\u00fccksichtigt, da diese f\u00fcr die Auswertung verwendet werden und es keinen Sinn macht, sie hier zu \u00fcberpr\u00fcfen." + "Es ist zu sehen, dass alle Daten entweder den Datentyp float oder int haben, es gibt keine kategorialen Variablen im Datensatz. Nun zeigen wir die einzelnen Variablen in einem Histogramm an, um festzustellen, ob alle Variablen sinnvoll für das Modell verwendet werden können. Die gerade erstellten Spalten sowie \"id\" werden nicht berücksichtigt, da diese für die Auswertung verwendet werden und es keinen Sinn macht, sie hier zu überprüfen." ] }, { @@ -2734,7 +2760,7 @@ "id": "pEspX6TrSNmq" }, "source": [ - "Wir sehen, dass einige Variablen einfach konstante Werte haben. Diese k\u00f6nnen gel\u00f6scht werden, da sie keine n\u00fctzlichen Informationen \u00fcber den Zustand der Anlage enthalten. Die folgenden Spalten werden gel\u00f6scht: 'setting3', 's1', 's5', 's10', 's16', 's18', 's19'." + "Wir sehen, dass einige Variablen einfach konstante Werte haben. Diese können gelöscht werden, da sie keine nützlichen Informationen über den Zustand der Anlage enthalten. Die folgenden Spalten werden gelöscht: 'setting3', 's1', 's5', 's10', 's16', 's18', 's19'." ] }, { @@ -2780,9 +2806,9 @@ "id": "ihvhDN4eSNmr" }, "source": [ - "Nachdem die Daten vorbereitet wurden, kann die Modellierung beginnen. Wir werden ein Long Short-Term Memory (LSTM) Layer Recurrent Neural Network (RNN) mit der Keras-Bibliothek aufbauen. Keras erfordert ein dreidimensionales numpy-Array (Eingaben: Ein 3D-Tensor mit der Form [Batch, Zeitpunkte, Merkmale]), siehe auch: https://keras.io/api/layers/recurrent_layers/lstm/ ). Daher werden in einem n\u00e4chsten Schritt unsere Merkmale oder Variablen in diese dreidimensionale Form gebracht.\n", + "Nachdem die Daten vorbereitet wurden, kann die Modellierung beginnen. Wir werden ein Long Short-Term Memory (LSTM) Layer Recurrent Neural Network (RNN) mit der Keras-Bibliothek aufbauen. Keras erfordert ein dreidimensionales numpy-Array (Eingaben: Ein 3D-Tensor mit der Form [Batch, Zeitpunkte, Merkmale]), siehe auch: https://keras.io/api/layers/recurrent_layers/lstm/ ). Daher werden in einem nächsten Schritt unsere Merkmale oder Variablen in diese dreidimensionale Form gebracht.\n", "\n", - "Gleichzeitig wird die Fenstergr\u00f6\u00dfe definiert, da LSTMs den Vorteil haben, Dinge aus langen Sequenzen ohne direkte Abstraktion zu merken." + "Gleichzeitig wird die Fenstergröße definiert, da LSTMs den Vorteil haben, Dinge aus langen Sequenzen ohne direkte Abstraktion zu merken." ] }, { @@ -2972,7 +2998,7 @@ }, "source": [ "\n", - "Im n\u00e4chsten Schritt wird ein LSTM-Netzwerk erstellt, da die Daten jetzt in dreidimensionaler Form vorliegen. Daf\u00fcr wird das Netzwerk mit 100 Einheiten im ersten Schritt und einem zweiten mit 50 Einheiten erstellt. Dropout wird verwendet, um Overfitting zu vermeiden. Schlie\u00dflich wird eine einzelne Schicht, unsere Ausgabeschicht mit einer einzigen Einheit und der Sigma-Aktivierung, generiert, da hier ein bin\u00e4res Klassifikationsproblem vorliegt." + "Im nächsten Schritt wird ein LSTM-Netzwerk erstellt, da die Daten jetzt in dreidimensionaler Form vorliegen. Dafür wird das Netzwerk mit 100 Einheiten im ersten Schritt und einem zweiten mit 50 Einheiten erstellt. Dropout wird verwendet, um Overfitting zu vermeiden. Schließlich wird eine einzelne Schicht, unsere Ausgabeschicht mit einer einzigen Einheit und der Sigma-Aktivierung, generiert, da hier ein binäres Klassifikationsproblem vorliegt." ] }, { @@ -3268,7 +3294,7 @@ "id": "uQFaIgMfSNmy" }, "source": [ - "Im n\u00e4chsten Schritt werden wir die Testdaten vergleichen. Daf\u00fcr haben wir den letzten funktionierenden Zustand des Zyklus f\u00fcr jeden Feuermelder in den Testdaten gespeichert. Um die Ergebnisse vergleichen zu k\u00f6nnen, verwenden wir die letzte Sequenz f\u00fcr jeden Feuermelder in den Testdaten." + "Im nächsten Schritt werden wir die Testdaten vergleichen. Dafür haben wir den letzten funktionierenden Zustand des Zyklus für jeden Feuermelder in den Testdaten gespeichert. Um die Ergebnisse vergleichen zu können, verwenden wir die letzte Sequenz für jeden Feuermelder in den Testdaten." ] }, { @@ -3622,6 +3648,7 @@ } ], "metadata": { + "category": "Maintenance", "colab": { "name": "Minimax.ipynb", "provenance": [] @@ -3645,9 +3672,8 @@ "pygments_lexer": "ipython3", "version": "3.8.9" }, - "title": "Prediction of IOT system failures based on sensor data", - "category": "Maintenance" + "title": "Prediction of IOT system failures based on sensor data" }, "nbformat": 4, "nbformat_minor": 2 -} \ No newline at end of file +}