 Herzlich Willkommen zum fünften Coding Video in der zweiten Data Science Vorlesung zu Deep Learning und Neural Networks. In diesem Video werden wir einen ersten Schritt zu einem richtigen eigenen Datenprojekt mit Ihnen durchnehmen. Die Analyse, die Exploration sowie die analytische Auswertung lasse ich Ihnen offen. Hier können Sie entweder auf Kegel die Rechenkerne anderer Nutzer und Teilnehmer sich betrachten oder Sie können hier selber daran rumspielen. Was ich hier gemacht habe ist folgendes. Ich habe zu einem Kegel-Datensatz über die US-Shooting bis 2015 eine Auswertung gefahren und ich habe mich um den Teil der Daten gekümmert, den die anderen Teilnehmer liebevoll links liegen gelassen haben, weil dieser Datensatz aus mehreren Tabellen besteht. Eine Tabelle ist schön formatiert. Da geht es darum, wer von wem, warum erschossen wurde und unter welchen Bedingungen. Und es gibt noch vier, fünf andere Datentabellen, in denen es darum geht, welche Stadt hat welche Ethnizität und welche Bildungs-Hintergrund und so weiter. Und diesen Datensatz haben die wenigsten angefasst, weil dieser Datensatz alles beinhaltet, was das Data-Cleaning interessant macht, falsche Kodierungen, redundante differierende Werte, Blanks, Lücken, sonstiges, alles, was das Herz zu wünschen überglässt. Und ich habe unter den 200 von diesen 700 Rechenkehren, die ich durchgesehen habe, bis auf die Kodierungs-Challenge niemanden gefunden, der hier bereit war, einen fertigen Datensatz zur Verfügung zu stellen. Also habe ich mir gedacht, ist das doch perfekt für unseren Kurse, ihn mal zu zeigen, wie man von Grund auf nur in Python, ohne vorher in MS Excel oder in den Tabellen selber etwas zu verändern, einen Datensatz bereinigen kann, rein mit Python, einen Datensatz cleanen kann, das Klang in den Vorlesungen immer so lapidar. Wir machen Data-Cleansing in den bisherigen Veranstaltungen, haben sie auch nur saubere Datensätze vorgesetzt bekommen. Und jetzt kümmern wir uns mal wirklich um einen sehr ekelhaften Datensatz, in dem wirklich sehr viel falsch ist. Sie können natürlich auch sich das Ganze auf Kegel selbst ansehen, da finden Sie das Ganze, was wir hier machen ist. Ich scroll hier mal runter. Wir importieren hier unsere Lieblingspakete, die Sie bereits kennen und eine Reduce-Funktion, die wir später benötigen. Sie geben den Pfad ein. Wir laden uns hier die einzelnen CSV-Daten in DataFrames hinein. Hier geht es einmal um das mediane Haushaltseinkommen im Jahr 2015. Den Prozentanteil der Menschen unterhalb der Armutsgrenze, diejenigen über 25 im Prozent, die einen Highschool-Abschluss aufzuweisen haben und den ethnizitären Anteil jeder Stadt für sich und das große Thema war erst mal, ja, die Kodierungen dieser Tabellen sind falsch. Das machen Sie, indem Sie hier encoding gleich Unicode Escape verwenden. Dann haben Sie das Kodierungsproblem bereits gelöst, Challenge bestanden, Haken dran. Was wir hier machen wollen, ist ganz simpel. Wir nehmen diese Datensätze, die Sie hier vorfinden. Wir nehmen diese Datensätze und Mergen die zusammen. Ich möchte einen Datensatz haben, in dem zu jedem Landkreis, zu jeder Stadt, die ganzen Daten kondensiert in einer großen Liste vorhanden sind. Und wie machen wir das? Wir bilden erst einmal eine Liste dieser DataFrames. Und dann nehmen wir unsere Reduce-Funktion, um eben diese DataFrames zu merken. Und wir verbinden diese mit einem Inner Join, und zwar auf Basis der Städte. Und was wir nicht mehr brauchen, sind hier redundante Werte der geografischen Gegend, die eben durch diese Merge gedoppelt werden. Anschließend gehen wir hierher und werden noch einige Kolumnamen umbenennen. Das heißt, die Spaltenvariablenamen werden wir ändern, so dass eben die Namensgebung konsistent ist. Und was werden wir danach machen? Wir haben danach ziemlich schnell festgestellt, ups. Ja, wir müssen uns das hier mal angucken. Deswegen zeige ich Ihnen das hier. Das ist bei mir noch auskommentiert. Das werde ich hier mal schnell wieder einkommentieren. Das ist jetzt nicht, das ist das falsche. Das hier müssten wir mal einkommentieren. Ich habe mich hier gerade selber schon gefragt, habe ich Ihnen dieses Skript hier geschrieben, ohne sich die Daten anzugucken? Nein, wir können uns die Daten hier anschauen. Das werden wir auch noch tun. Und danach geht es erst mal darum, okay, der Datensatz ist so miserabel, dass wir redundante Städtenamen haben. Das heißt, was machen wir? Wir müssen einen eindeutigen Identifier kreieren. Der ist unser Laub, jede Stadt einen eindeutigen Werten zuzuordnen. Deswegen haben wir hier eine neue Spalte kreiert, die nennt sich CAT Anderson, Anderscore City. Und die macht nichts anderes, wie einen neuen String zu bilden zwischen der geografischen Area und der dazugehörigen Stadt. Das heißt, wir haben das geografische Gebiet und die Stadt kombiniert als einen eindeutigen Identifier. Was es uns danach erlauben wird, einfach nur Doppler und alles andere, was nicht dazugehört, hinauszuschmeißen. Und wir müssen erst mal gucken, wie viel Redundanzen haben wir. Denn wir fangen damit erst mal an zu schauen, wie viele Nullwerte haben wir hier drin. Das lassen wir uns in einer Heatmap ausgeben, da erkläre ich nachher noch einige Worte dazu. Dann werden wir diese NA-Werte droppen. Das bedeutet, dass wir natürlich hergehen müssen und alle Werte rausschmeißen, die uns nichts helfen. Was wir hier machen werden, ist, wir werden alle Zeilen entfernen, die nicht vollständig sind. Das bedeutet, wir werden alle Zeilen dieses gemörgten DataFrame entfernen, die nicht vollständig sind. Und wir werden feststellen, das ist ein Datensatz, der überhaupt nicht vollständig ist. Es gibt keine einzige Zeile, in die es ein Datensatz gemörgt, die vollständig ist. Deswegen ist es auch ein bisschen schwierig hier. Deswegen kommentiere ich das auch mal wieder aus, weil wir dann einfach einen Lern-DataFrame zurückbekommen. Das heißt, das ist ein bisschen schwierig. Das heißt, wir haben mehrere Probleme. Das heißt, es ist keine Zeile vollständig und wir haben sehr viele Redundanzen. Das heißt, was war meine Idee, die auch funktioniert? Meine Idee war, einen geklienten, einen bereinigten DataFrame zu erzeugen, der hier unten erstellt wird, der Folgendes tut. Ich möchte für die Feature sagen wir mal, wir haben den Anteil der mexikanischen Bevölkerung in Start X. Und da habe ich jetzt zehnmal dieselbe Start mit unterschiedlichen Prozentzahlen für die Anzahl der mexikanischen Bevölkerung. Und was mache ich damit? Ich bilde hier den Mittelwert. Das heißt, ich mache einen Average über die redundanten Werte und rechne danach mit Mittelwerten weiter, weil ich keine Datierung dieser Erfassungsdaten habe. Die stellt Kegel nicht zur Verfügung. Das bedeutet, ich habe zehnmal dieselbe Start mit zehn verschiedenen Anteilen mexikanischer Einwohner. Und ich weiß nicht, wann das aktuell ist, ob das aktuell ist. Und theoretisch müsste man diesen Datensatz eigentlich in die Tonne klopfen, um es mal ganz harsh zu formulieren. Aber ich bin zur Idee gekommen, wie ich diese unvollständigen Zeilen loswerte und auch noch in der Lage bin, weiter zu rechnen, um einen schönen bereinigten Datensatz zu erhalten und das sind zwei Schritte. Der erste Schritt, such mir bitte alle Stadt-Gebietskombinationen raus. Mach bitte eine große, große, große Schleifer. Nimm bitte jede Stadt, also quasi die zehn Zeilen pro Stadt, die redundant sind. Und bilde hier, nachdem du hier auf dieser Ebene, in dieser Schleifenebene, die Nannenwerte rausgeworfen hast, den Mittelwert über die Verbleibenden und schreib mir das bitte wieder in einen schönen bereinigten DataFrame. Und auf dem Weg dahin wirft bitte noch manche, wie Sie hier sehen können, manche Blanks und manche Füllwerte oder falsche Werte raus, die da einfach mit drin stehen. Und das macht er hier. Und zwar für die ganzen 30, 40.000 Städte, die hier drin sind. Das heißt, dieses Skript rechnet acht Stunden mit einem Kern. Und man kann das natürlich auch mit Multiprocessing etwas beschleunigen. Ich habe Ihnen hier diesen bereinigten Datensatz, der hier unten rauskommt, mit in Moodle hinterlegt. Das heißt, den stelle ich Ihnen zur Verfügung. Da müssen Sie nicht acht Stunden darauf warten, bis das hier fertig gerechnet hat. Oder sonstige Optimierungen vornehmen. Das bedeutet das, bedeutet DataCleaning. Das ist das, was man eigentlich machen muss, bevor man irgendwelche witzigen Maschinen-Learning-Algorithmen und sonstiges tun muss. Ich habe dieses Skript Ihnen mal mitzugefügt, nachdem wir jetzt auch ein Anti-Video gehört haben. Was muss ich denn tun, um ein echt Datenprojekt ordentlich zu bereinigen und halbwegs retten zu können? Dass der Traurige an dieser Geschichte ist, dass dieser Schrottdatensatz, den wir hier gerade aufwendig bereinigt haben oder bereinigen werden, offizielle US-Statistiken sind, die auf offiziellen Datenbankwellen beruhen. Und da können wir uns gerne einmal darüber unterhalten, wie unsere Verwaltung eigentlich oder die US-Verwaltung teilweise mit Daten umgeht. Ich möchte Ihnen jetzt zumindest den Teil des Skriptes zeigen, mit dem wir etwas anfangen können. So, Sie sehen, ich habe hier noch einige Fehler drin. Das sind die Sachen, die ich vorher ausgeblendet habe. Was Sie sehen, wir machen das jetzt mal live. Was möchte ich denn nicht? Police-Killing-Stater-Not-Defined, das kann ich Ihnen genau sagen, warum das ist. Weil wir in diesem Bereinigungsschritt hier, das mag ja hier unten nicht, das können wir auch rauswerfen, diese Zeile hier. Die war vorher drin, weil ich gedacht habe, ich nehme alle fünf Tabellen, die in diesem Datensatz vorhanden sind, auf einmal mit rein, bis ich festgestellt habe, okay, da gibt es mehr zu bereinigen, wie nötig. Ich lasse die Police-Shootings wieder mit raus. Das ist der Datensatz, auf den sich die anderen Teilnehmer gestürzt haben, weil der schön ordentlich bereinigt ist. Deswegen löschen wir das hier jetzt einfach mal raus und versuchen das Ganze einfach noch einmal. Und hoffen, dass hier jetzt natürlich nicht noch mehr Fehler auftreten. Das wäre mir natürlich sehr gelegen, wenn wir hier natürlich loslegen können. Wir können hier schon mal ein Teil besprechen. Sie sehen hier die geografische Gegend. Er rechnet gerade ein bisschen, warten wir mal, bis er mit der Heatmap fertig ist. Das ist die Heatmap, die mir anzeigt, wie viel Blanks ich denn und wie viel Nullwerte ich in meinen Daten habe. Wir bleiben aber erstmal hier in der Konsole. Sie sehen, ich habe hier die geografische Area. Ich habe meine Stadt und ich habe meinen Medienhaushaltseinkommen. Poverty Rate, Percentage, Hispanic, White, Black, Native American, Asian und nochmal Hispanic. Das heißt, Sie sehen quasi, dass ich hier allein für diese Stadt hier für die Abbeyville City aus AL habe ich hier allein schon abweichende Werte bei den Anzahl der Weißen und Schwarzen. Sie sehen, dass die Werte hier nicht übereinstimmen. Deswegen, ich später hergehen werde, eine Schleife schreiben werde, die mir diese Kombination AL und Abbeyville City zum Beispiel in eine Schleife lädt. Hier die Leerzeichen sollten Sie vorhanden sein Rausschmeiß, das heißt Blanks, Nullwerte und sonstiges nicht verarbeitbares. Wird hier rausgeworfen und werden über alle Werte hier wird ein Mittelwert gebildet, so dass ich eine durchschnittliche prozentuale Anzahl bekomme, mit der wir dann weiterarbeiten können. Und die wir dann halt in Anbetracht der schlechten Datenlage, die hier von den US Behörden publiziert werden, dennoch weiterarbeiten können. Was wir hier jetzt haben, ich mache das mal groß. Ich hoffe, das geht jetzt hier genau, das geht auch und wir sehen hier, was sehen wir hier, denn wir sehen, dass wir hier genau einen einzigen Datenpunkt haben im Medieninkam, wo ein Nullwert drin ist, wo ein Fehlerwert drin ist. Das ist der, den wir anschließend auch wegwerfen werden. Ich schließe das hier nochmal und jetzt sehen wir natürlich hier die Index Werte der neuen Data Frames, die ich hier gebaut habe. Und an dieser Stelle werde ich auch abbrechen, weil an dieser Stelle beginnt nämlich der Algorithmus, hier unten jede einzelne Stadtgebietskombination durchzurechnen, die Fehlerwerte zu entfernen und eben diese Mittelwerte zu bilden. Was ich machen kann, ich springe ihn einfach mal in diese Excel-Tabelle, damit sie das sehen können, damit sie sehen können, wie das dann aussieht. Wenn wir hier fertig sind, ich habe das direkt hier, lassen Sie mich das aufmachen, dann kann ich Ihnen zeigen, wie dieser bereinigte Datensatz am Ende aussieht. Ich ziehe das hier einfach mal in das Bild hier mit rein und ich werde das Ganze hier mal nochmal so groß machen, dass wir das sehen können. Sie sehen hier, das hier ist mein ein eindeutiger Identifier, weil wir sehen auch, dass ein Abbeyville City gibt, ist nicht nur in einer geografischen Gegend, sondern in mehreren geografischen Gegenden. Und was wir hier sehen können, ist der Durchschnitt hier, überall diese Werte, das heißt wir haben hier einen Datensatz, ich springe hier einfach mal kurz nach unten. Wir haben hier knappe 30.000 Städte, die jetzt nun einen schön bereinigten Datensatz aufweisen, den wir natürlich mit Machine Learning Methoden und anderen Methoden auswerten können. Und das ist der große Vorteil diesen Datensatz können wir verbinden, wenn wir dieses Projekt hier weitertreiben würden, könnten wir diesen Datensatz verbinden mit eben den US Police Shooting Datensätzen, die schon von vornherein bereinigt wurden. Das heißt, hier kann man wirklich dann, wenn man sich ein bisschen ins Detail frisst, sagen in welcher Stadt, in welchem County, in welcher regionalen Gegend würde, welcher Anteil, an welcher Ethnizität, aus welcher Bildungsschicht mit einem High School Abschluss über 25 oder nicht über oder unterhalb der Armutsgrenze von welchen Polizisten mit welcher Ethnizität warum erschossen. Sie merken, hier können wir sehr detailliert dann in die Daten hineingehen und das, meine Damen und Herren, das überlasse ich Ihnen. Das ist Ihre Hausaufgabe, wenn Sie sich wirklich tiefer mit Data Science befassen wollen. Ich habe Ihnen hier den Datensatz hier zur Verfügung gestellt. Die Auswertung können Sie für Ihr Training selbst durchführen. Das wird nicht mehr Teil dieser Veranstaltung sein, wenn Sie eine visuelle Auswertung dieser Shooting Datensätze haben wollen. Ohne jetzt diese ganzen vier Datensätze, die ich jetzt bereinigt habe dazu zu nehmen, dann können Sie auf Kekkel gerne schauen. Sie können natürlich auch auf Kekkel diesen Algorithmus einsehen, der ist publiziert und ich hoffe, Sie haben hier ein bisschen mitbekommen, was für ein Aufwand ist, denn ist bereits erhobene Daten überhaupt bereinigen zu können. Also das ist kein trivialer Teil, Daten zu bereinigen. Und ich hoffe, Sie haben ja was gelernt und wir sehen uns im nächsten Video.