diff --git a/CRM/Increase customer satisfaction/notebook.ipynb b/CRM/Increase customer satisfaction/notebook.ipynb index 495672e27f4abcc678f45da42ada27f5d35a8ad1..02aeb80212f81a2616124c4875fda441163a3ca7 100644 --- a/CRM/Increase customer satisfaction/notebook.ipynb +++ b/CRM/Increase customer satisfaction/notebook.ipynb @@ -6,14 +6,28 @@ "metadata": { "editable": true, "include": true, - "paragraph": "BusinessUnderstanding", + "paragraph": "Business", + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "# 1. Business Understanding" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "include": true, + "paragraph": "Business", "slideshow": { "slide_type": "" }, "tags": [] }, "source": [ - "# 1. Business Understanding\n", "\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", @@ -32,14 +46,28 @@ "metadata": { "editable": true, "include": true, - "paragraph": "DataUnderstanding", + "paragraph": "Daten", + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "# 2. Data Understanding " + ] + }, + { + "cell_type": "markdown", + "metadata": { + "editable": true, + "include": true, + "paragraph": "Daten", "slideshow": { "slide_type": "" }, "tags": [] }, "source": [ - "# 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ä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." ] @@ -52,6 +80,24 @@ "## 2.1 Import von relevanten Modulen" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "include": true, + "paragraph": "Daten", + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "Dieser Code-Block importiert Bibliotheken und Module, die für Datenanalyse, statistische Modellierung,\n", + "maschinelles Lernen und Visualisierung in Python verwendet werden.\n" + ] + }, { "cell_type": "code", "execution_count": 1, @@ -59,9 +105,9 @@ "outputs": [], "source": [ "import numpy as np\n", - "import pandas as pd\n", + "import pandas as pd\n", "import statsmodels.api as sm\n", - "import matplotlib.pyplot as plt\n", + "import matplotlib.pyplot as plt<\n", "from sklearn.preprocessing import StandardScaler\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.tree import DecisionTreeClassifier\n", @@ -122,6 +168,26 @@ "### Datenverständnis" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "include": true, + "paragraph": "Daten", + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "Die Tabelle listet Filme mit verschiedenen Attributen wie \n", + "Budget, Genres, Webseite, ID, Schlüsselwörter, Originalsprache, Originaltitel, Zusammenfassung, \n", + "Popularität, Produktionsfirmen, Laufzeit, gesprochene Sprachen, Status, Tagline, Titel, \n", + "durchschnittliche Bewertung, Anzahl der Stimmen, Film-ID, Besetzung und Crew auf." + ] + }, { "cell_type": "code", "execution_count": 5, @@ -387,10 +453,32 @@ "original_data.head()" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "include": true, + "paragraph": "Daten", + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "Die Tabelle fasst verschiedene Eigenschaften von Filmen zusammen, \n", + "wie Budget, Genres, Homepage, ID, Schlüsselwörter, Originalsprache, Originaltitel, Zusammenfassung, \n", + "Popularität, Produktionsfirmen, Laufzeit, gesprochene Sprachen, Status, Tagline, Titel, \n", + "durchschnittliche Bewertung, Anzahl der Stimmen, Film-ID, Besetzung und Crew." + ] + }, { "cell_type": "code", "execution_count": 6, - "metadata": {}, + "metadata": { + "scrolled": true + }, "outputs": [ { "data": { @@ -823,10 +911,30 @@ "original_data.describe(include=\"all\")" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "include": true, + "paragraph": "Daten", + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "Das ist eine Zusammenfassung eines Pandas DataFrame mit 4809 Einträgen und 23 Spalten, die verschiedene Informationen über Filme enthält, wie Budget, Genres, Homepage, ID, Schlüsselwörter, Sprache, Titel, Popularität, Produktionsfirmen, Einnahmen, Laufzeit, Bewertung, Stimmenzahl,\n", + "Besetzung und Crew." + ] + }, { "cell_type": "code", "execution_count": 7, - "metadata": {}, + "metadata": { + "scrolled": true + }, "outputs": [ { "name": "stdout", @@ -885,6 +993,24 @@ "### Auf Nullwerte prüfen" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "include": true, + "paragraph": "Daten", + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "Die Tabelle zeigt die Anzahl der fehlenden Werte in jeder Spalte eines DataFrame an, wobei z.B. die Spalte 'homepage' 3096 fehlende Werte hat, \n", + "während viele andere Spalten keine fehlenden Werte aufweisen." + ] + }, { "cell_type": "code", "execution_count": 8, @@ -928,6 +1054,13 @@ "original_data.isnull().sum()" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Der Code entfernt alle Zeilen im DataFrame original_data, die mindestens einen fehlenden Wert (NaN) enthalten, und speichert das Ergebnis in df_wo_null." + ] + }, { "cell_type": "code", "execution_count": 9, @@ -937,10 +1070,23 @@ "df_wo_null = original_data.dropna(axis=0)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Der Code gibt für jeden Spaltennamen im DataFrame df_wo_null die Anzahl der fehlenden Werte (NaN) zurück." + ] + }, { "cell_type": "code", "execution_count": 10, - "metadata": {}, + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, "outputs": [ { "data": { @@ -988,6 +1134,13 @@ "### Auf Duplikate prüfen" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Der Code filtert den DataFrame df_wo_null und gibt alle Zeilen zurück, die Duplikate enthalten, wobei alle Vorkommen der Duplikate beibehalten werden." + ] + }, { "cell_type": "code", "execution_count": 11, @@ -1068,6 +1221,23 @@ "## 2.4 Test auf Multikollinearität" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "include": true, + "paragraph": "Daten", + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "Die Tabelle zeigt, dass es keine fehlenden Werte in den Spalten für verschiedene Merkmale wie Budget, Genres, Homepage, usw. gibt." + ] + }, { "attachments": {}, "cell_type": "markdown", @@ -1076,6 +1246,23 @@ "Keine nicht-signifikanten Variablen mehr. Das endgültige Modell wird erstellt." ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "include": true, + "paragraph": "Daten", + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "Der Code erstellt eine Wärmebildkarte, die die Korrelationen zwischen den Spalten des DataFrames df_wo_null zeigt." + ] + }, { "cell_type": "code", "execution_count": 12, @@ -1101,6 +1288,15 @@ "plt.show()" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "Der Code entfernt die Spalten 'tagline', 'homepage', 'id' und 'movie_id' aus dem DataFrame df_wo_null.\n" + ] + }, { "cell_type": "code", "execution_count": 13, @@ -1110,6 +1306,24 @@ "df_wo_null = df_wo_null.drop(['tagline', 'homepage', 'id', 'movie_id'], axis = 1)" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "include": true, + "paragraph": "Daten", + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "Der Code erstellt und zeigt eine große Wärmebildkarte der Korrelationen \n", + "zwischen den Spalten von df_wo_null mit Beschriftungen, Linien und einem Titel an.\n" + ] + }, { "cell_type": "code", "execution_count": 14, @@ -1143,6 +1357,13 @@ "## 2.5 Deskriptive Analysise " ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Der Code df_wo_null = df_wo_null.drop(['status', 'original_title', 'overview'], axis=1) entfernt die Spalten status, original_title und overview aus dem DataFrame df_wo_null." + ] + }, { "cell_type": "code", "execution_count": 15, @@ -1152,6 +1373,13 @@ "df_wo_null = df_wo_null.drop(['status', 'original_title', 'overview'], axis = 1)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Der Code entfernt die Spalten production_countries, original_language, crew und spoken_languages aus dem DataFrame df_wo_null." + ] + }, { "cell_type": "code", "execution_count": 16, @@ -1161,6 +1389,13 @@ "df_wo_null = df_wo_null.drop(['production_countries', 'original_language', 'crew', 'spoken_languages'], axis = 1)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Der Code entfernt die Spalten runtime, keywords, vote_average und budget aus dem DataFrame df_wo_null." + ] + }, { "cell_type": "code", "execution_count": 17, @@ -1170,6 +1405,24 @@ "df_wo_null = df_wo_null.drop(['runtime', 'keywords', 'vote_average', 'budget'], axis = 1)" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "include": true, + "paragraph": "Daten", + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "Die Tabelle listet Filme mit ihren Genres, Popularität, Produktionsfirmen, Veröffentlichungsdatum, Einnahmen, Titel, \n", + "Anzahl der Stimmen und Besetzung auf." + ] + }, { "cell_type": "code", "execution_count": 18, @@ -1311,7 +1564,7 @@ "metadata": { "editable": true, "include": true, - "paragraph": "DataPreparation", + "paragraph": "Datenvorbereitung", "slideshow": { "slide_type": "" }, @@ -1321,6 +1574,22 @@ "# 3. Datenaufbereitung" ] }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "editable": true, + "include": true, + "paragraph": "Datenvorbereitung", + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "In diesem Abschnitt, werden die textlichen Daten in der Spalte genres des DataFrames df_wo_null aufzubereiten, indem das zweite Element nach dem Komma in der neuen Spalte genre1 und das vierte Element nach dem Komma in der neuen Spalte genre2 speichert. Anschließend wird beides nach Doppelpunkten und Anführungszeichen aufteilt, und das zweite Element in jeder Spalte zurückspeichert" + ] + }, { "attachments": {}, "cell_type": "markdown", @@ -1329,6 +1598,13 @@ "## 3.1 Erfassung kategorialer Variablen" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Der Code teilt die Zeichenfolgen in der Spalte genres von df_wo_null anhand des Kommas (,) auf und speichert das zweite Element (Index 1) der resultierenden Liste in der neuen Spalte genre1." + ] + }, { "cell_type": "code", "execution_count": 19, @@ -1338,6 +1614,13 @@ "df_wo_null['genre1'] = df_wo_null['genres'].str.split(',').str[1]" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Der Code teilt die Zeichenfolgen in der Spalte genre1 von df_wo_null anhand des Doppelpunkts (:) auf und speichert das zweite Element (Index 1) der resultierenden Liste wieder in der Spalte genre1." + ] + }, { "cell_type": "code", "execution_count": 20, @@ -1347,6 +1630,13 @@ "df_wo_null['genre1'] = df_wo_null['genre1'].str.split(':').str[1]" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Der Code nimmt den Inhalt der Spalte genre1 im DataFrame df_wo_null, teilt ihn anhand des Anführungszeichens (\") auf und speichert das zweite Element (Index 1) der resultierenden Liste zurück in der Spalte genre1." + ] + }, { "cell_type": "code", "execution_count": 21, @@ -1357,12 +1647,26 @@ ] }, { - "cell_type": "code", - "execution_count": 22, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "df_wo_null['genre2'] = df_wo_null['genres'].str.split(',').str[3]" + "Der Code extrahiert das vierte Element (Index 3) aus der durch Kommas getrennten Liste von Genres in der Spalte genres des DataFrames df_wo_null und speichert es in der neuen Spalte genre2." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "df_wo_null['genre2'] = df_wo_null['genres'].str.split(',').str[3]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Der Code teilt die Zeichenfolgen in der Spalte genre2 von df_wo_null anhand des Doppelpunkts (:) und speichert das zweite Element (Index 1) der resultierenden Liste wieder in der Spalte genre2." ] }, { @@ -1374,6 +1678,13 @@ "df_wo_null['genre2'] = df_wo_null['genre2'].str.split(':').str[1]" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Der Code teilt die Zeichenfolgen in der Spalte genre2 von df_wo_null anhand des Anführungszeichens (\") und speichert das zweite Element (Index 1) der resultierenden Liste wieder in der Spalte genre2." + ] + }, { "cell_type": "code", "execution_count": 24, @@ -1383,6 +1694,13 @@ "df_wo_null['genre2'] = df_wo_null['genre2'].str.split('\"').str[1]" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Der Code entfernt die Spalte genres aus dem DataFrame df_wo_null und speichert das Ergebnis in df_1." + ] + }, { "cell_type": "code", "execution_count": 25, @@ -1392,6 +1710,24 @@ "df_1 = df_wo_null.drop(['genres'], axis = 1)" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "include": true, + "paragraph": "Datenvorbereitung", + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "Die Tabelle zeigt die Anzahl der fehlenden Werte in den angegebenen Spalten eines DataFrames,\n", + "wobei z.B. 'genre2' 232 fehlende Werte und 'popularity' keine fehlenden Werte aufweist.\n" + ] + }, { "cell_type": "code", "execution_count": 26, @@ -1439,6 +1775,24 @@ "df_2 = df_1.drop(['genre1', 'genre2'], axis = 1)" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "include": true, + "paragraph": "Datenvorbereitung", + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "Die Tabelle zeigt die Anzahl der fehlenden Werte in bestimmten Spalten eines DataFrames, \n", + "wobei die Spalte 'new_genres' 232 fehlende Werte und die anderen aufgeführten Spalten keine fehlenden Werte aufweisen.\n" + ] + }, { "cell_type": "code", "execution_count": 29, @@ -1467,6 +1821,13 @@ "df_2.isnull().sum()" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Der Code entfernt alle Zeilen aus dem DataFrame df_2, die mindestens einen fehlenden Wert enthalten, und speichert das bereinigte DataFrame wieder in df_2." + ] + }, { "cell_type": "code", "execution_count": 30, @@ -1476,6 +1837,13 @@ "df_2 = df_2.dropna(axis=0)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Der Code extrahiert das Jahr aus der Spalte release_date im DataFrame df_2, indem er die Zeichenfolge an den Bindestrichen trennt und das erste Element (Index 0) der resultierenden Liste in der neuen Spalte year speichert." + ] + }, { "cell_type": "code", "execution_count": 31, @@ -1485,6 +1853,13 @@ "df_2['year'] = df_2['release_date'].str.split('-').str[0]" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Der Code wandelt die Werte in der Spalte year des DataFrames df_2 in Ganzzahlen (Integer) um." + ] + }, { "cell_type": "code", "execution_count": 32, @@ -1494,6 +1869,25 @@ "df_2['year'] = df_2['year'].astype(int)" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "include": true, + "paragraph": "Datenvorbereitung", + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "Die Tabelle beschreibt einen Pandas DataFrame mit 1262 Einträgen und 9 Spalten, \n", + "die verschiedene Filmattribute wie Popularität, Produktionsfirmen, Veröffentlichungsdatum, \n", + "Einnahmen, Titel, Stimmenanzahl, Besetzung, #neue Genres und Jahr enthalten, wobei keine Spalte fehlende Werte aufweist." + ] + }, { "cell_type": "code", "execution_count": 33, @@ -1526,6 +1920,13 @@ "df_2.info()" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Der Code entfernt die Spalte release_date aus dem DataFrame df_2 und speichert das bereinigte DataFrame in df_3." + ] + }, { "cell_type": "code", "execution_count": 34, @@ -1535,6 +1936,24 @@ "df_3 = df_2.drop(['release_date'], axis = 1)" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "include": true, + "paragraph": "Datenvorbereitung", + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "Die Tabelle enthält Informationen über Filme mit Attributen wie Popularität, Produktionsfirmen, \n", + "Einnahmen, Titel, Stimmenanzahl, Besetzung, Genres und Jahr für insgesamt 1262 Filme.\n" + ] + }, { "cell_type": "code", "execution_count": 35, @@ -1763,6 +2182,13 @@ "df_3" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Der Code extrahiert das sechste Element (Index 5) aus der durch Kommas getrennten Liste in der Spalte 'cast' des DataFrames df_3 und speichert es zurück in der Spalte 'cast'." + ] + }, { "cell_type": "code", "execution_count": 36, @@ -1772,6 +2198,13 @@ "df_3['cast'] = df_3['cast'].str.split(',').str[5]" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Der Code teilt die Zeichenfolgen in der Spalte 'cast' des DataFrames df_3 anhand des Doppelpunkts (:) auf und speichert das zweite Element (Index 1) der resultierenden Liste zurück in der Spalte 'cast'." + ] + }, { "cell_type": "code", "execution_count": 37, @@ -1781,6 +2214,13 @@ "df_3['cast'] = df_3['cast'].str.split(':').str[1]" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Der Code teilt die Zeichenfolgen in der Spalte 'cast' des DataFrames df_3 anhand des Anführungszeichens (\") auf und speichert das zweite Element (Index 1) der resultierenden Liste zurück in der Spalte 'cast'." + ] + }, { "cell_type": "code", "execution_count": 38, @@ -1790,6 +2230,13 @@ "df_3['cast'] = df_3['cast'].str.split('\"').str[1]" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Der Code teilt die Zeichenfolgen in der Spalte 'production_companies' des DataFrames df_3 anhand des Kommas (') auf und speichert das erste Element (Index 0) der resultierenden Liste zurück in der Spalte 'production_companies'." + ] + }, { "cell_type": "code", "execution_count": 39, @@ -1799,6 +2246,13 @@ "df_3['production_companies'] = df_3['production_companies'].str.split(',').str[0]" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Der Code teilt die Zeichenfolgen in der Spalte 'production_companies' des DataFrames df_3 anhand des Doppelpunkts (:) auf und speichert das zweite Element (Index 1) der resultierenden Liste zurück in der Spalte 'production_companies'." + ] + }, { "cell_type": "code", "execution_count": 40, @@ -1808,6 +2262,13 @@ "df_3['production_companies'] = df_3['production_companies'].str.split(':').str[1]" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Der Code teilt die Zeichenfolgen in der Spalte 'production_companies' des DataFrames df_3 anhand des Anführungszeichens (\") auf und speichert das zweite Element (Index 1) der resultierenden Liste zurück in der Spalte 'production_companies'." + ] + }, { "cell_type": "code", "execution_count": 41, @@ -1817,10 +2278,30 @@ "df_3['production_companies'] = df_3['production_companies'].str.split('\"').str[1]" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "include": true, + "paragraph": "Datenvorbereitung", + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "Der Code bearbeitet die Spalten 'cast' und 'production_companies', \n", + "um bestimmte Informationen zu extrahieren und zu trennen, wobei fehlende Werte in diesen Spalten identifiziert werden.\n" + ] + }, { "cell_type": "code", "execution_count": 42, - "metadata": {}, + "metadata": { + "scrolled": true + }, "outputs": [ { "data": { @@ -1860,7 +2341,7 @@ "metadata": { "editable": true, "include": true, - "paragraph": "Modeling", + "paragraph": "Datenmodell", "slideshow": { "slide_type": "" }, @@ -1878,10 +2359,30 @@ "## 4.1 Test und Trainieren der Daten" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "include": true, + "paragraph": "Datenmodell", + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "Die Tabelle listet Filme mit ihren Popularitätsbewertungen, Produktionsfirmen, Einnahmen, Titeln, \n", + "Stimmenanzahl, Hauptdarstellern, Genres und Erscheinungsjahren auf.\n" + ] + }, { "cell_type": "code", "execution_count": 44, - "metadata": {}, + "metadata": { + "scrolled": true + }, "outputs": [ { "data": { @@ -2006,6 +2507,13 @@ "df_5.head()" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Der Code benennt die Spalte 'cast' in 'star' im DataFrame df_5 um und speichert das Ergebnis in df_6." + ] + }, { "cell_type": "code", "execution_count": 45, @@ -2015,6 +2523,24 @@ "df_6 = df_5.rename({\"cast\":\"star\"}, axis=1)" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "include": true, + "paragraph": "Datenmodell", + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "Die Tabelle enthält Informationen über den Erfolg von Filmen, darunter Popularität, \n", + "Produktionsunternehmen, Einnahmen, Titel, Stimmenzahl, Hauptdarsteller, Genres und Jahr der Veröffentlichung." + ] + }, { "cell_type": "code", "execution_count": 46, @@ -2143,6 +2669,13 @@ "df_6.head()" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Der Code entfernt die Spalte 'year' aus dem DataFrame df_6 und speichert das bereinigte DataFrame in df_7." + ] + }, { "cell_type": "code", "execution_count": 47, @@ -2152,6 +2685,13 @@ "df_7 = df_6.drop(['year'], axis = 1)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Der Code entfernt alle Zeilen aus dem DataFrame df_7, die mindestens einen fehlenden Wert enthalten, und speichert das bereinigte DataFrame in df_cleaned." + ] + }, { "cell_type": "code", "execution_count": 48, @@ -2161,6 +2701,24 @@ "df_cleaned = df_7.dropna(axis=0)" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "include": true, + "paragraph": "Datenmodell", + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "Die Ausgabe zeigt ein Array von Diagrammen, das die Verteilung der Popularität, \n", + "Einnahmen und Stimmenzahl der Filme in der Tabelle visualisiert.\n" + ] + }, { "cell_type": "code", "execution_count": 49, @@ -2194,6 +2752,24 @@ "df_cleaned.hist(figsize=(10,10), bins=50)" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "include": true, + "paragraph": "Datenmodell", + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "Diese Meldung warnt davor, dass die Funktion distplot in zukünftigen Versionen von Seaborn nicht mehr unterstützt wird \n", + "und stattdessen displot oder histplot verwendet werden sollte.\n" + ] + }, { "cell_type": "code", "execution_count": 50, @@ -2232,6 +2808,13 @@ "sns.distplot(df_cleaned['popularity'])" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Der Code berechnet das 99. Perzentil (Quantil) der Spalte 'popularity' im DataFrame df_cleaned und erstellt dann data_1, einen neuen DataFrame, der nur die Zeilen aus df_cleaned enthält, deren 'popularity' kleiner als dieses 99. Perzentil ist." + ] + }, { "cell_type": "code", "execution_count": 51, @@ -2243,6 +2826,24 @@ "data_1 = df_cleaned[df_cleaned['popularity']<q]" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "include": true, + "paragraph": "Datenmodell", + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "Die Meldung weist darauf hin, dass die Funktion distplot in zukünftigen Versionen nicht mehr unterstützt wird \n", + "und empfiehlt die Verwendung von displot oder histplot als Alternative." + ] + }, { "cell_type": "code", "execution_count": 52, @@ -2281,6 +2882,13 @@ "sns.distplot(data_1['popularity'])" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Der Code berechnet das 1. Perzentil (Quantil) der Spalte 'vote_count' im DataFrame data_1 und erstellt dann data_2, einen neuen DataFrame, der nur die Zeilen aus data_1 enthält, deren 'vote_count' größer als dieses 1. Perzentil ist." + ] + }, { "cell_type": "code", "execution_count": 53, @@ -2292,6 +2900,24 @@ "data_2 = data_1[data_1['vote_count']>q]" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "include": true, + "paragraph": "Datenmodell", + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "Die Tabelle liefert statistische Informationen über die Popularität, Einnahmen und Stimmenzahl von Filmen, \n", + "einschließlich der Anzahl der Datensätze, Durchschnittswerte, Standardabweichungen und Quartile." + ] + }, { "cell_type": "code", "execution_count": 54, @@ -2397,6 +3023,24 @@ "data_2.describe()" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "include": true, + "paragraph": "Datenmodell", + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "Die Meldung informiert darüber, dass die Funktion distplot in Zukunft nicht mehr unterstützt wird \n", + "und empfiehlt stattdessen die Verwendung von displot oder histplot." + ] + }, { "cell_type": "code", "execution_count": 55, @@ -2446,6 +3090,24 @@ "data_3 = data_2[data_2['revenue']<1.5e+09]" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "include": true, + "paragraph": "Datenmodell", + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "Die Ausgabe zeigt ein Array von Diagrammen, das die Verteilung der Popularität, \n", + "Einnahmen und Stimmenzahl von Filmen visualisiert." + ] + }, { "cell_type": "code", "execution_count": 57, @@ -2479,6 +3141,13 @@ "data_3.hist(figsize=(25,25), bins=50)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Der Code setzt den Index des DataFrame data_3 zurück und speichert das Ergebnis in data_final, wobei der alte Index verworfen wird." + ] + }, { "cell_type": "code", "execution_count": 58, @@ -2488,13 +3157,38 @@ "data_final = data_3.reset_index(drop=True)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Der Code wandelt die Werte in der Spalte revenue des DataFrames data_final in Fließkommazahlen (float) um." + ] + }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [], "source": [ - "data_final['revenue'] = data_final['revenue'].astype(float)" + "data_final['revenue'] = data_final['revenue'].astype(float)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "include": true, + "paragraph": "Datenmodell", + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "Die Tabelle enthält Informationen über die Popularität, Produktionsunternehmen, Einnahmen, Titel, \n", + "Stimmenanzahl, Hauptdarsteller und Genres von verschiedenen Filmen." ] }, { @@ -2619,10 +3313,32 @@ "data_final.head()" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "include": true, + "paragraph": "Datenmodell", + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "Die Tabelle gibt statistische Zusammenfassungen über die Merkmale \"Popularität\", \"Produktionsunternehmen\", \n", + "\"Einnahmen\", \"Titel\", \"Stimmenanzahl\", \"Hauptdarsteller\" und \"Genres\" von Filmen an, \n", + "einschließlich Anzahl der Datensätze, eindeutiger Werte, häufigster Wert, Mittelwerte, \n", + "Standardabweichungen, und Quartile." + ] + }, { "cell_type": "code", "execution_count": 61, - "metadata": {}, + "metadata": { + "scrolled": true + }, "outputs": [ { "data": { @@ -2806,6 +3522,24 @@ "data_final.describe(include='all')" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "include": true, + "paragraph": "Datenmodell", + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "Die Tabelle zeigt, dass es keine fehlenden Werte für die Merkmale \n", + "\"Popularität\", \"Produktionsunternehmen\", \"Einnahmen\", \"Titel\", \"Stimmenanzahl\", \"Hauptdarsteller\" und \"Genres\" gibt." + ] + }, { "cell_type": "code", "execution_count": 62, @@ -2854,6 +3588,24 @@ "data_final.columns.values" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "include": true, + "paragraph": "Datenmodell", + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "Der Code definiert ein Pandas DataFrame mit 1205 Einträgen und 7 Spalten, \n", + "die verschiedene Datentypen wie Float, Integer und Object enthalten." + ] + }, { "cell_type": "code", "execution_count": 64, @@ -2884,6 +3636,25 @@ "data_final.info()" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "include": true, + "paragraph": "Datenmodell", + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "Der Code berechnet die VIF (Variance Inflation Factor) für numerische Variablen wie \n", + "\"Einnahmen\" und \"Stimmenanzahl\" \n", + "aus einem DataFrame und speichert die Ergebnisse zusammen mit den Variablennamen in einem neuen DataFrame." + ] + }, { "cell_type": "code", "execution_count": 65, @@ -2906,6 +3677,24 @@ "vif[\"Features\"] = variables.columns" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "include": true, + "paragraph": "Datenmodell", + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "Die Tabelle zeigt die berechneten VIF (Variance Inflation Factor) Werte für die Merkmale \n", + "\"Einnahmen\" und \"Stimmenanzahl\", sowie die zugehörigen Merkmalsnamen.\n" + ] + }, { "cell_type": "code", "execution_count": 66, @@ -2977,6 +3766,24 @@ "data_final = data_final.drop(['star', 'production_companies'],axis=1)" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "include": true, + "paragraph": "Datenmodell", + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "Die Tabelle bietet eine statistische Zusammenfassung der Merkmale \"Popularität\", \"Einnahmen\", \"Titel\", \"Stimmenanzahl\" und \"Genres\" von Filmen, einschließlich der Anzahl der Datensätze, der eindeutigen Werte, des am häufigsten auftretenden Titels, der Durchschnittswerte,\n", + "der Standardabweichungen und der Quartile." + ] + }, { "cell_type": "code", "execution_count": 68, @@ -3127,6 +3934,13 @@ "data_final.describe(include='all')" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Der Code erstellt Dummy-Variablen für kategorische Variablen im DataFrame data_final, wobei die erste Kategorie jeder Variable entfernt wird, und speichert das Ergebnis in data_with_dummies." + ] + }, { "cell_type": "code", "execution_count": 69, @@ -3136,6 +3950,25 @@ "data_with_dummies = pd.get_dummies(data_final, drop_first=True)" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "include": true, + "paragraph": "Datenmodell", + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "Die Tabelle enthält binäre Indikatoren für das Vorhandensein bestimmter Filme in den Spalten \n", + "\"Titel\" und Genres, zusammen mit numerischen Daten wie \"Popularität\", \n", + "\"Einnahmen\" und \"Stimmenanzahl\" für jede dieser Filme.\n" + ] + }, { "cell_type": "code", "execution_count": 70, @@ -3380,6 +4213,13 @@ "data_with_dummies.head()" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Der Code teilt den DataFrame data_with_dummies in zwei Teile auf: target enthält die Spalte 'popularity', die als Zielvariable verwendet wird, während predictors den Rest des DataFrames umfasst, bei dem die Spalte 'popularity' entfernt wurde und daher als Vorhersagevariablen fungiert." + ] + }, { "cell_type": "code", "execution_count": 71, @@ -3400,6 +4240,24 @@ "X_train, X_test, y_train, y_test = train_test_split(predictors, target, test_size=0.2, random_state=123)" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "include": true, + "paragraph": "Datenmodell", + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "Der Code standardisiert die Merkmale eines Trainingsdatensatzes \n", + "und wendet dieselbe Transformation auf Trainings- und Testdaten an.\n" + ] + }, { "cell_type": "code", "execution_count": 73, @@ -3413,6 +4271,23 @@ "X_test = scaler.transform(X_test)" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "include": true, + "paragraph": "Datenmodell", + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "Der Code erstellt ein lineares Regressionsmodell und passt es an den Trainingsdatensatz an." + ] + }, { "cell_type": "code", "execution_count": 74, @@ -3434,6 +4309,24 @@ "reg.fit(X_train,y_train)" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "include": true, + "paragraph": "Datenmodell", + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "Der Code berechnet die Leistung eines linearen Regressionsmodells auf dem Trainingsdatensatz \n", + "und dem Testdatensatz und gibt die Ergebnisse aus." + ] + }, { "cell_type": "code", "execution_count": 75, @@ -3465,6 +4358,24 @@ "## 4.2 Lineare Regression" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "editable": true, + "include": true, + "paragraph": "Datenmodell", + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "Der Code führt eine Vorhersage basierend auf einem Modell durch, vergleicht die Vorhersagen mit den tatsächlichen Werten \n", + "und visualisiert die Ergebnisse durch Diagramme und Streudiagramme mit einer Regressionslinie.\n" + ] + }, { "cell_type": "code", "execution_count": 76, @@ -3503,50 +4414,76 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] + "cell_type": "markdown", + "metadata": { + "editable": true, + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "# 5. Evaluation" + ] }, { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] + "cell_type": "markdown", + "metadata": { + "editable": true, + "include": true, + "paragraph": "Evaluation", + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "Die Analyse des Datensatzes aus dem tmdb-Dataset zur Verbesserung der Filmempfehlungen auf Netflix legt nahe, \n", + "dass eine Vielzahl von Faktoren die Beliebtheit oder Bewertungen der Filme beeinflussen können.\n", + "Dazu gehören sowohl numerische als auch kategoriale Daten wie Crewmitglieder, Besetzung und eindeutige IDs. \n", + "Durch die Anwendung von maschinellem Lernen auf diese Daten können Strategien entwickelt werden, \n", + "um die Kundenzufriedenheit zu erhöhen und Abbruchquoten zu senken. \n", + "Eine gründliche Analyse und Modellierung dieser Faktoren ermöglicht es, personalisierte Empfehlungen zu generieren \n", + "und das Nutzererlebnis zu verbessern. Das Fazit dieser Umsetzung ist, dass die Daten eine solide Grundlage bieten, \n", + "um innovative Lösungen zur Filmempfehlung zu entwickeln, die die Zufriedenheit der Netflix-Nutzer steigern können." + ] }, { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] + "cell_type": "markdown", + "metadata": { + "editable": true, + "include": true, + "paragraph": "", + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "# 6. Umsetzung " + ] }, { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] + "cell_type": "markdown", + "metadata": { + "editable": true, + "include": true, + "paragraph": "Umsetzung", + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "source": [ + "Um die Abbruchquoten bei Netflix zu senken und die Kundenzufriedenheit zu steigern, können maschinelles Lernen und Datenanalyse genutzt werden, um relevante Faktoren wie Crewmitglieder, Besetzung und Genre zu identifizieren und ein Modell zu trainieren, das die Beliebtheit oder Bewertungen von Filmen vorhersagt,\n", + "was zu personalisierten Empfehlungen führt." + ] } ], "metadata": { - "category": "CRM", + "branche": "Medien", + "dataSource": "https://www.kaggle.com/tmdb/tmdb-movie-metadata", + "funktion": "Marketing", "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", @@ -3562,10 +4499,12 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.3" + "version": "3.9.2" }, - "skipNotebookInDeployment": true, - "title": "Increase customer satisfaction" + "repoLink": "https://gitlab.reutlingen-university.de/ki_lab/machine-learning-services/-/tree/main/CRM/Increase%20customer%20satisfaction?ref_type=heads", + "skipNotebookInDeployment": false, + "teaser": "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. 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.", + "title": "Erhöhung der Kundenzufriedenheit" }, "nbformat": 4, "nbformat_minor": 4