Die Kunst der Datenbereinigung in Python beherrschen – KDnuggets

Die Kunst der Datenbereinigung in Python beherrschen – KDnuggets

Quellknoten: 2939047

Beherrschen Sie die Kunst der Datenbereinigung in Python
Bild vom Autor
 

Die Datenbereinigung ist ein wichtiger Bestandteil jedes Datenanalyseprozesses. In diesem Schritt beseitigen Sie Fehler, behandeln fehlende Daten und stellen sicher, dass Ihre Daten in einem Format vorliegen, mit dem Sie arbeiten können. Ohne einen gut bereinigten Datensatz können alle nachfolgenden Analysen verzerrt oder falsch sein.

In diesem Artikel werden Ihnen mehrere wichtige Techniken zur Datenbereinigung in Python vorgestellt, die leistungsstarke Bibliotheken wie Pandas, Numpy, Seaborn und Matplotlib verwenden.

Bevor wir uns mit den Mechanismen der Datenbereinigung befassen, wollen wir deren Bedeutung verstehen. Daten aus der realen Welt sind oft chaotisch. Es kann doppelte Einträge, falsche oder inkonsistente Datentypen, fehlende Werte, irrelevante Merkmale und Ausreißer enthalten. All diese Faktoren können bei der Datenanalyse zu irreführenden Schlussfolgerungen führen. Dies macht die Datenbereinigung zu einem unverzichtbaren Bestandteil des Data Science-Lebenszyklus.

Wir werden die folgenden Datenbereinigungsaufgaben behandeln.
 

Beherrschen Sie die Kunst der Datenbereinigung in Python
Bild vom Autor

Bevor wir beginnen, importieren wir die erforderlichen Bibliotheken. Wir werden Pandas für die Datenmanipulation und Seaborn und Matplotlib für Visualisierungen verwenden.

Wir werden auch das Python-Modul „datetime“ importieren, um die Daten zu manipulieren.

import pandas as pd
import seaborn as sns
import datetime as dt
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

Zuerst müssen wir unsere Daten laden. In diesem Beispiel laden wir eine CSV-Datei mit Pandas. Wir fügen auch das Trennzeichenargument hinzu.

df = pd.read_csv('F:KDNuggetsKDN Mastering the Art of Data Cleaning in Pythonproperty.csv', delimiter= ';')

Als nächstes ist es wichtig, die Daten zu untersuchen, um ihre Struktur zu verstehen, mit welchen Variablen wir arbeiten und ob Werte fehlen. Da die von uns importierten Daten nicht riesig sind, werfen wir einen Blick auf den gesamten Datensatz.

# Look at all the rows of the dataframe
display(df)

So sieht der Datensatz aus.

 

Beherrschen Sie die Kunst der Datenbereinigung in Python
 

Sie können sofort erkennen, dass einige Werte fehlen. Außerdem sind die Datumsformate inkonsistent.

Schauen wir uns nun die DataFrame-Zusammenfassung mit der Methode info() an.

# Get a concise summary of the dataframe
print(df.info())

Hier ist die Codeausgabe.

 

Beherrschen Sie die Kunst der Datenbereinigung in Python
 

Wir können sehen, dass nur die Spalte „square_feet“ keine NULL-Werte hat, also müssen wir das irgendwie in den Griff bekommen. Auch die Spalten „advertisement_date“ und „sale_date“ sind Objektdatentypen, auch wenn es sich hierbei um ein Datum handeln sollte.

Der Spaltenstandort ist vollständig leer. Brauchen wir es?

Wir zeigen Ihnen, wie Sie mit diesen Problemen umgehen. Wir beginnen damit, zu lernen, wie man unnötige Spalten löscht.

Es gibt zwei Spalten im Datensatz, die wir in unserer Datenanalyse nicht benötigen, daher entfernen wir sie.

Die erste Spalte ist Käufer. Wir benötigen es nicht, da der Name des Käufers keinen Einfluss auf die Analyse hat.

Wir verwenden die Methode drop() mit dem angegebenen Spaltennamen. Wir setzen die Achse auf 1, um anzugeben, dass wir eine Spalte löschen möchten. Außerdem wird das Inplace-Argument auf True gesetzt, sodass wir den vorhandenen DataFrame ändern und keinen neuen DataFrame ohne die entfernte Spalte erstellen.

df.drop('buyer', axis = 1, inplace = True)

Die zweite Spalte, die wir entfernen möchten, ist „Standort“. Obwohl es nützlich sein könnte, diese Informationen zu haben, handelt es sich hierbei um eine völlig leere Spalte, also entfernen wir sie einfach.

Wir gehen dabei genauso vor wie bei der ersten Spalte.

df.drop('location', axis = 1, inplace = True)

Natürlich können Sie diese beiden Spalten gleichzeitig entfernen.

df = df.drop(['buyer', 'location'], axis=1)

Beide Ansätze geben den folgenden Datenrahmen zurück.

 

Beherrschen Sie die Kunst der Datenbereinigung in Python

Doppelte Daten können aus verschiedenen Gründen in Ihrem Datensatz auftreten und Ihre Analyse verfälschen.

Lassen Sie uns die Duplikate in unserem Datensatz erkennen. Hier erfahren Sie, wie es geht.

Der folgende Code verwendet die Methode dupliziert () um Duplikate im gesamten Datensatz zu berücksichtigen. Die Standardeinstellung besteht darin, das erste Vorkommen eines Werts als eindeutig und die nachfolgenden Vorkommen als Duplikate zu betrachten. Sie können dieses Verhalten mit ändern halten Parameter. Beispielsweise würde df.duplicated(keep=False) alle Duplikate als wahr markieren, einschließlich des ersten Vorkommens.

# Detecting duplicates
duplicates = df[df.duplicated()]
duplicates

Hier ist die Ausgabe.

 

Beherrschen Sie die Kunst der Datenbereinigung in Python
 

Die Zeile mit Index 3 wurde als Duplikat markiert, da Zeile 2 mit denselben Werten zum ersten Mal vorkommt.

Jetzt müssen wir Duplikate entfernen, was wir mit dem folgenden Code tun.

# Detecting duplicates
duplicates = df[df.duplicated()]
duplicates

Das drop_duplicates() Die Funktion berücksichtigt alle Spalten und identifiziert Duplikate. Wenn Sie nur bestimmte Spalten berücksichtigen möchten, können Sie diese wie folgt als Liste an diese Funktion übergeben: df.drop_duplicates(subset=['column1', 'column2']).

 

Beherrschen Sie die Kunst der Datenbereinigung in Python
 

Wie Sie sehen können, wurde die doppelte Zeile gelöscht. Die Indizierung blieb jedoch gleich, Index 3 fehlte. Wir werden das bereinigen, indem wir die Indizes zurücksetzen.

df = df.reset_index(drop=True)

Diese Aufgabe wird mithilfe von ausgeführt reset_index() Funktion. Das Argument drop=True wird verwendet, um den ursprünglichen Index zu verwerfen. Wenn Sie dieses Argument nicht angeben, wird der alte Index als neue Spalte in Ihrem DataFrame hinzugefügt. Indem Sie drop=True festlegen, weisen Sie Pandas an, den alten Index zu vergessen und ihn auf den Standard-Integer-Index zurückzusetzen.

Versuchen Sie es zum Üben Entfernen Sie Duplikate aus diesem Microsoft-Datensatz.

Manchmal sind Datentypen möglicherweise falsch eingestellt. Beispielsweise könnte eine Datumsspalte als Zeichenfolge interpretiert werden. Sie müssen diese in die entsprechenden Typen konvertieren.

In unserem Datensatz machen wir das für die Spalten „advertisement_date“ und „sale_date“, da diese als Objektdatentyp angezeigt werden. Außerdem sind die Datumsangaben in den einzelnen Zeilen unterschiedlich formatiert. Wir müssen es konsistent machen und auf den neuesten Stand bringen.

Der einfachste Weg ist die Verwendung der to_datetime() Methode. Auch hier können Sie dies Spalte für Spalte tun, wie unten gezeigt.

Dabei setzen wir das Argument „dayfirst“ auf „True“, da einige Datumsangaben mit dem ersten Tag beginnen.

# Converting advertisement_date column to datetime
df['advertisement_date'] = pd.to_datetime(df['advertisement_date'], dayfirst = True) # Converting sale_date column to datetime
df['sale_date'] = pd.to_datetime(df['sale_date'], dayfirst = True)

Sie können auch beide Spalten gleichzeitig konvertieren, indem Sie die verwenden anwenden() Methode mit to_datetime().

# Converting advertisement_date and sale_date columns to datetime
df[['advertisement_date', 'sale_date']] = df[['advertisement_date', 'sale_date']].apply(pd.to_datetime, dayfirst = True)

Beide Ansätze führen zum gleichen Ergebnis.

 

Beherrschen Sie die Kunst der Datenbereinigung in Python
 

Jetzt haben die Daten ein einheitliches Format. Wir sehen, dass nicht alle Daten konvertiert wurden. Es gibt einen NaT-Wert in „advertisement_date“ und zwei in „sale_date“. Das bedeutet, dass das Datum fehlt.

Überprüfen wir mithilfe von, ob die Spalten in Datumsangaben konvertiert werden die Info() Methode.

# Get a concise summary of the dataframe
print(df.info())

 

Beherrschen Sie die Kunst der Datenbereinigung in Python
 

Wie Sie sehen, haben beide Spalten nicht das Format datetime64[ns].

Versuchen Sie nun, die Daten hier von TEXT in NUMERIC zu konvertieren Airbnb-Datensatz.

In realen Datensätzen fehlen häufig Werte. Der Umgang mit fehlenden Daten ist von entscheidender Bedeutung, da bestimmte Algorithmen mit solchen Werten nicht umgehen können.

In unserem Beispiel fehlen auch einige Werte. Schauen wir uns also die beiden gängigsten Ansätze zum Umgang mit fehlenden Daten an.

Zeilen mit fehlenden Werten löschen

Wenn die Anzahl der Zeilen mit fehlenden Daten im Vergleich zur Gesamtzahl der Beobachtungen unbedeutend ist, können Sie erwägen, diese Zeilen zu löschen.

In unserem Beispiel enthält die letzte Zeile außer den Quadratfuß und dem Anzeigendatum keine Werte. Da wir solche Daten nicht verwenden können, entfernen wir diese Zeile.

Hier ist der Code, in dem wir den Index der Zeile angeben.

df = df.drop(8)

Der DataFrame sieht jetzt so aus.

 

Beherrschen Sie die Kunst der Datenbereinigung in Python
 

Die letzte Zeile wurde gelöscht und unser DataFrame sieht jetzt besser aus. Es fehlen jedoch noch einige Daten, die wir mit einem anderen Ansatz bearbeiten werden.

Fehlende Werte imputieren

Wenn erhebliche Datenmengen fehlen, könnte die Imputation eine bessere Strategie als das Löschen sein. Bei diesem Vorgang werden fehlende Werte anhand anderer Daten ergänzt. Bei numerischen Daten umfassen gängige Imputationsmethoden die Verwendung eines Maßes für die zentrale Tendenz (Mittelwert, Median, Modus).

In unserem bereits geänderten DataFrame haben wir NaT-Werte (Not a Time) in den Spalten „advertisement_date“ und „sale_date“. Wir imputieren diese fehlenden Werte mithilfe von bedeuten() Methode.

Der Code verwendet die fillna() Methode zum Suchen und Füllen der Nullwerte mit dem Mittelwert.

# Imputing values for numerical columns
df['advertisement_date'] = df['advertisement_date'].fillna(df['advertisement_date'].mean())
df['sale_date'] = df['sale_date'].fillna(df['sale_date'].mean())

Sie können dasselbe auch in einer Codezeile tun. Wir benutzen das anwenden() um die mit definierte Funktion anzuwenden Lambda. Wie oben verwendet diese Funktion die fillna() und bedeuten() Methoden zum Auffüllen der fehlenden Werte.

# Imputing values for multiple numerical columns
df[['advertisement_date', 'sale_date']] = df[['advertisement_date', 'sale_date']].apply(lambda x: x.fillna(x.mean()))

Die Ausgabe sieht in beiden Fällen so aus.

 

Beherrschen Sie die Kunst der Datenbereinigung in Python
 

Unsere Spalte „sale_date“ enthält jetzt Zeiten, die wir nicht benötigen. Entfernen wir sie.

Wir werden das benutzen strftime () Methode, die die Datumsangaben in ihre Zeichenfolgendarstellung und ein bestimmtes Format konvertiert.

df['sale_date'] = df['sale_date'].dt.strftime('%Y-%m-%d')

 

Beherrschen Sie die Kunst der Datenbereinigung in Python
 

Die Daten sehen jetzt alle aufgeräumt aus.

Wenn Sie verwenden müssen strftime () Auf mehreren Spalten können Sie es erneut verwenden Lambda auf folgende Weise.

df[['date1_formatted', 'date2_formatted']] = df[['date1', 'date2']].apply(lambda x: x.dt.strftime('%Y-%m-%d'))

Sehen wir uns nun an, wie wir fehlende kategoriale Werte unterstellen können.

Bei kategorialen Daten handelt es sich um einen Datentyp, der zum Gruppieren von Informationen mit ähnlichen Merkmalen verwendet wird. Jede dieser Gruppen ist eine Kategorie. Kategoriale Daten können numerische Werte annehmen (z. B. „1“ für „männlich“ und „2“ für „weiblich“), diese Zahlen haben jedoch keine mathematische Bedeutung. Sie können sie beispielsweise nicht addieren.

Kategoriale Daten werden normalerweise in zwei Kategorien unterteilt:

  1. Nenndaten: Dabei sind die Kategorien nur beschriftet und können nicht in einer bestimmten Reihenfolge angeordnet werden. Beispiele hierfür sind Geschlecht (männlich, weiblich), Blutgruppe (A, B, AB, O) oder Farbe (rot, grün, blau).
  1. Ordnungsdaten: Hier können die Kategorien geordnet oder in eine Rangfolge gebracht werden. Auch wenn die Abstände zwischen den Kategorien nicht gleichmäßig verteilt sind, hat die Reihenfolge der Kategorien eine Bedeutung. Beispiele hierfür sind Bewertungsskalen (Bewertung eines Films von 1 bis 5), ein Bildungsniveau (High School, Undergraduate, Graduate) oder Krebsstadien (Stadium I, Stadium II, Stadium III).

Für die Imputation fehlender kategorialer Daten wird typischerweise der Modus verwendet. In unserem Beispiel handelt es sich bei der Spalte property_category um kategoriale (nominale) Daten, und in zwei Zeilen fehlen Daten.

Ersetzen wir die fehlenden Werte durch mode.

# For categorical columns
df['property_category'] = df['property_category'].fillna(df['property_category'].mode()[0])

Dieser Code verwendet die fillna() Funktion zum Ersetzen aller NaN-Werte in der Spalte property_category. Es ersetzt es durch mode.

Darüber hinaus wird der Teil [0] verwendet, um den ersten Wert aus dieser Reihe zu extrahieren. Wenn mehrere Modi vorhanden sind, wird hierdurch der erste ausgewählt. Wenn es nur einen Modus gibt, funktioniert es immer noch einwandfrei.

Hier ist die Ausgabe.

 

Beherrschen Sie die Kunst der Datenbereinigung in Python
 

Die Daten sehen jetzt ziemlich gut aus. Jetzt bleibt nur noch zu prüfen, ob es Ausreißer gibt.

Hier können Sie den Umgang mit Nullen üben Meta-Interviewfrage, wobei Sie NULL-Werte durch Nullen ersetzen müssen.

Ausreißer sind Datenpunkte in einem Datensatz, die sich deutlich von den anderen Beobachtungen unterscheiden. Sie können außergewöhnlich weit von den anderen Werten im Datensatz entfernt sein und sich außerhalb eines Gesamtmusters befinden. Sie gelten als ungewöhnlich, da ihre Werte im Vergleich zu den übrigen Daten entweder deutlich höher oder niedriger sind.

Ausreißer können aus verschiedenen Gründen auftreten, z. B.:

  • Mess- oder Eingabefehler
  • Datenkorruption
  • Echte statistische Anomalien

Ausreißer können die Ergebnisse Ihrer Datenanalyse und statistischen Modellierung erheblich beeinflussen. Sie können zu einer verzerrten Verteilung oder Verzerrung führen oder die zugrunde liegenden statistischen Annahmen ungültig machen, die geschätzte Modellanpassung verzerren, die Vorhersagegenauigkeit von Vorhersagemodellen verringern und zu falschen Schlussfolgerungen führen.

Einige häufig verwendete Methoden zur Erkennung von Ausreißern sind Z-Score, IQR (Interquartilbereich), Boxplots, Streudiagramme und Datenvisualisierungstechniken. In einigen fortgeschrittenen Fällen kommen auch Methoden des maschinellen Lernens zum Einsatz.

Die Visualisierung von Daten kann dabei helfen, Ausreißer zu erkennen. Der Boxplot von Seaborn ist hierfür praktisch.

plt.figure(figsize=(10, 6))
sns.boxplot(data=df[['advertised_price', 'sale_price']])

Wir verwenden plt.figure(), um die Breite und Höhe der Figur in Zoll festzulegen.

Dann erstellen wir den Boxplot für die Spalten beworbener_Preis und Verkaufspreis, der so aussieht.

 

Beherrschen Sie die Kunst der Datenbereinigung in Python
 

Der Plot kann zur einfacheren Verwendung verbessert werden, indem dies zum obigen Code hinzugefügt wird.

plt.xlabel('Prices')
plt.ylabel('USD')
plt.ticklabel_format(style='plain', axis='y')
formatter = ticker.FuncFormatter(lambda x, p: format(x, ',.2f'))
plt.gca().yaxis.set_major_formatter(formatter)

Wir verwenden den obigen Code, um die Beschriftungen für beide Achsen festzulegen. Wir bemerken auch, dass die Werte auf der y-Achse in der wissenschaftlichen Notation vorliegen und wir diese nicht für die Preiswerte verwenden können. Also ändern wir dies mit der Funktion plt.ticklabel_format() in einen einfachen Stil.

Dann erstellen wir den Formatierer, der die Werte auf der y-Achse mit Kommas als Tausendertrennzeichen und Dezimalpunkten anzeigt. Die letzte Codezeile wendet dies auf die Achse an.

Die Ausgabe sieht nun so aus.

 

Beherrschen Sie die Kunst der Datenbereinigung in Python
 

Wie identifizieren und entfernen wir nun den Ausreißer?

Eine Möglichkeit ist die Verwendung der IQR-Methode.

IQR oder Interquartile Range ist eine statistische Methode zur Messung der Variabilität durch Aufteilung eines Datensatzes in Quartile. Quartile unterteilen einen nach Rang geordneten Datensatz in vier gleiche Teile, und Werte im Bereich des ersten Quartils (25. Perzentil) und des dritten Quartils (75. Perzentil) bilden den Interquartilbereich.

Der Interquartilbereich wird verwendet, um Ausreißer in den Daten zu identifizieren. So funktioniert das:

  1. Berechnen Sie zunächst das erste Quartil (Q1) und das dritte Quartil (Q3) und bestimmen Sie dann den IQR. Der IQR wird als Q3 – Q1 berechnet.
  2. Jeder Wert unter Q1 – 1.5IQR oder über Q3 + 1.5IQR gilt als Ausreißer.

In unserem Boxplot stellt die Box tatsächlich den IQR dar. Die Linie innerhalb der Box ist der Median (oder das zweite Quartil). Die „Whisker“ des Boxplots stellen den Bereich innerhalb von 1.5*IQR von Q1 und Q3 dar.

Alle Datenpunkte außerhalb dieser Whiskers können als Ausreißer betrachtet werden. In unserem Fall ist es der Wert von 12,000,000 $. Wenn Sie sich das Boxplot ansehen, werden Sie sehen, wie klar dies dargestellt ist, was zeigt, warum die Datenvisualisierung für die Erkennung von Ausreißern wichtig ist.

Lassen Sie uns nun die Ausreißer entfernen, indem wir die IQR-Methode im Python-Code verwenden. Zuerst entfernen wir die Ausreißer beim beworbenen Preis.

Q1 = df['advertised_price'].quantile(0.25)
Q3 = df['advertised_price'].quantile(0.75)
IQR = Q3 - Q1
df = df[~((df['advertised_price'] (Q1 - 1.5 * IQR)) |(df['advertised_price'] > (Q3 + 1.5 * IQR)))]

Wir berechnen zunächst das erste Quartil (oder das 25. Perzentil) anhand des Quantil() Funktion. Dasselbe machen wir für das dritte Quartil bzw. das 75. Perzentil.

Sie zeigen die Werte an, unter denen 25 % bzw. 75 % der Daten liegen.

Dann berechnen wir die Differenz zwischen den Quartilen. Bisher geht es nur darum, die IQR-Schritte in Python-Code zu übersetzen.

Als letzten Schritt entfernen wir die Ausreißer. Mit anderen Worten, alle Daten kleiner als Q1 – 1.5 * IQR oder mehr als Q3 + 1.5 * IQR.

Der Operator „~“ negiert die Bedingung, sodass nur die Daten übrig bleiben, die keine Ausreißer sind.

Dann können wir das Gleiche mit dem Verkaufspreis machen.

Q1 = df['sale_price'].quantile(0.25)
Q3 = df['sale_price'].quantile(0.75)
IQR = Q3 - Q1
df = df[~((df['sale_price'] (Q1 - 1.5 * IQR)) |(df['sale_price'] > (Q3 + 1.5 * IQR)))]

Natürlich können Sie es mit dem auch prägnanter machen for-Schleife.

for column in ['advertised_price', 'sale_price']: Q1 = df[column].quantile(0.25) Q3 = df[column].quantile(0.75) IQR = Q3 - Q1 df = df[~((df[column] (Q1 - 1.5 * IQR)) |(df[column] > (Q3 + 1.5 * IQR)))]

Die Schleife durchläuft die beiden Spalten. Für jede Spalte berechnet es den IQR und entfernt dann die Zeilen im DataFrame.

Bitte beachten Sie, dass dieser Vorgang nacheinander ausgeführt wird, zuerst für beworbener_Preis und dann für Verkaufspreis. Dadurch wird der DataFrame für jede Spalte direkt geändert und Zeilen können entfernt werden, da sie in einer Spalte einen Ausreißer darstellen. Daher führt dieser Vorgang möglicherweise zu weniger Zeilen, als wenn Ausreißer für beworbener_Preis und Verkaufspreis unabhängig voneinander entfernt würden und die Ergebnisse anschließend kombiniert würden.

In unserem Beispiel ist die Ausgabe in beiden Fällen gleich. Um zu sehen, wie sich das Boxplot verändert hat, müssen wir es erneut mit demselben Code wie zuvor plotten.

plt.figure(figsize=(10, 6))
sns.boxplot(data=df[['advertised_price', 'sale_price']])
plt.xlabel('Prices')
plt.ylabel('USD')
plt.ticklabel_format(style='plain', axis='y')
formatter = ticker.FuncFormatter(lambda x, p: format(x, ',.2f'))
plt.gca().yaxis.set_major_formatter(formatter)

Hier ist die Ausgabe.

 

Beherrschen Sie die Kunst der Datenbereinigung in Python
 

Sie können die Berechnung von Perzentilen in Python üben, indem Sie das Problem lösen Interviewfrage zur Generalversammlung.

Die Datenbereinigung ist ein entscheidender Schritt im Datenanalyseprozess. Obwohl es zeitaufwändig sein kann, ist es wichtig, die Genauigkeit Ihrer Ergebnisse sicherzustellen.

Glücklicherweise macht das umfangreiche Python-Ökosystem an Bibliotheken diesen Prozess einfacher zu handhaben. Wir haben gelernt, wie man unnötige Zeilen und Spalten entfernt, Daten neu formatiert und mit fehlenden Werten und Ausreißern umgeht. Dies sind die üblichen Schritte, die für die meisten Daten ausgeführt werden müssen. Allerdings wird es manchmal auch notwendig sein Kombinieren Sie zwei Spalten zu einer, Überprüfen Sie die vorhandenen Daten, Weisen Sie ihm Beschriftungen zu, oder Entfernen Sie die Leerzeichen.

All dies ist eine Datenbereinigung, da es Ihnen ermöglicht, chaotische, reale Daten in einen gut strukturierten Datensatz umzuwandeln, den Sie sicher analysieren können. Vergleichen Sie einfach den Datensatz, mit dem wir begonnen haben, mit dem, mit dem wir am Ende gelandet sind.

Wenn Sie in diesem Ergebnis keine Genugtuung sehen und die sauberen Daten Sie nicht seltsam begeistern, was in aller Welt machen Sie dann in der Datenwissenschaft?
 

Nate Rosidi ist Data Scientist und in der Produktstrategie. Er ist auch außerplanmäßiger Professor für Analytik und Gründer von StrataScratch, eine Plattform, die Datenwissenschaftlern hilft, sich mit echten Interviewfragen von Top-Unternehmen auf ihre Interviews vorzubereiten. Verbinde dich mit ihm auf Twitter: StrataScratch or LinkedIn.

Zeitstempel:

Mehr von KDnuggets