Das erste, was zu tun ist, wenn Daten in der Datenanalyse angegeben werden, ist, den Umriss des Inhalts zu erfassen. Wir versuchen zu verstehen, was die Funktionen und welche Datentypen sind, indem wir die Daten in eine Tabelle konvertieren. Gleichzeitig ist die Untersuchung fehlender Werte zu erledigen. Da das Vorhandensein oder Fehlen von Datenverlust die Datenoperationen beeinflusst, überprüfen Sie zuerst das Vorhandensein oder Fehlen und dann die Häufigkeit fehlender Werte. In diesem Artikel erfahren Sie, wie dies in Python und R funktioniert.
(Die Programmierumgebung ist Jupyter Notebook + Python 3.5.2 und Jupyter Notebook + IRkernel (R 3.2.3).)
Wir haben uns entschieden, "Titanic" von Kaggle als Datensatz zu verwenden. Viele Menschen haben die Daten möglicherweise gesehen, aber dies klassifiziert "überlebt" / "nicht überlebt" basierend auf den Merkmalen der Passagiere. Wie später beschrieben wird, ist dies ein Datensatz, der fehlende Werte enthält.
Laden Sie zuerst die Daten mit Python in den Pandas DataFrame.
def load_data(fn1='./data/train.csv', fn2='./data/test.csv'):
train = pd.read_csv(fn1)
test = pd.read_csv(fn2)
return train, test
train, test = load_data()
train.head()
train.csv
Wie in der obigen Abbildung gezeigt, sehen Sie bereits in den ersten 5 Datenzeilen, der Cabin-Spalte, die Angabe von 'NaN'. Schauen wir uns auch test.csv an.
test.csv
In ähnlicher Weise wurde festgestellt, dass 'NaN' in der Kabine aufgereiht war. Übrigens ist die Größe (Form) der Daten nicht so groß wie ein Datensatz, da der Zug (891, 12) und der Test (418, 11) ist.
Als nächstes überprüfen wir, welche Feature-Menge (Spalte) Datenverlust enthält.
# check if NA exists in each column
train.isnull().any(axis=0)
# output
'''
PassengerId False
Survived False
Pclass False
Name False
Sex False
Age True
SibSp False
Parch False
Ticket False
Fare False
Cabin True
Embarked True
dtype: bool
'''
isnull () ist eine Funktion, die bestimmt, ob es sich um NA handelt oder nicht, und any () ist eine Funktion, die mehrere Stellen umfassend betrachtet und die Wahrheit zurückgibt. Da any () die Achsenoption verwendet, setzen Sie axis = 0 (kann weggelassen werden, da dies der Standardwert ist), wenn Sie sie in "Spalten" -Einheiten einschließen möchten (= in "Zeilen" -Richtung scannen). Schauen wir uns auch den Test an.
# check if NA exists in each column
test.isnull().any()
# output
'''
PassengerId False
Pclass False
Name False
Sex False
Age True
SibSp False
Parch False
Ticket False
Fare True
Cabin True
Embarked False
dtype: bool
'''
Wie oben erwähnt, enthält ['Alter', 'Kabine', 'Eingeschifft'] in Zugdaten Datenverlust, und in Testdaten enthält ['Alter', 'Fahrpreis', 'Kabine'] Datenverlust. Es stellte sich heraus. Basierend darauf: "Lassen Sie uns ein Modell erstellen, das keine Merkmalsmengen ('Alter', 'Tarif', 'Kabine', 'Eingeschifft') mit Datenverlust als Prototyp des Zielklassifikators verwendet." , "Aber 'Alter' (Alter) scheint die Klassifizierung zu beeinflussen (Überleben oder nicht)" und so weiter.
Zählen Sie als Nächstes die Anzahl der Datenverluste. Zuerst Zugdaten.
# count NA samples
train.isnull().sum()
# output
'''
PassengerId 0
Survived 0
Pclass 0
Name 0
Sex 0
Age 177
SibSp 0
Parch 0
Ticket 0
Fare 0
Cabin 687
Embarked 2
dtype: int64
'''
Ebenso Testdaten.
# count NA samples
test.isnull().sum()
# output
'''
PassengerId 0
Pclass 0
Name 0
Sex 0
Age 86
SibSp 0
Parch 0
Ticket 0
Fare 1
Cabin 327
Embarked 0
dtype: int64
'''
Aus den obigen Ergebnissen konnten die folgenden Punkte erfasst werden.
--- 'Alter' enthält Datenverluste mit einer bestimmten Rate sowohl im Zug als auch im Test.
Als Methode zur Datenklassifizierung ist es möglich, die Richtlinie wie "Vorerst modellieren wir" Kabine "durch Entfernen aus der Merkmalsmenge!" Und "Dropna (), weil" Eingebettet "2 Fälle sind" zu bestimmen.
Machen Sie dasselbe wie in Python mit R. Lesen Sie zuerst die Datei in den Datenrahmen.
# Reread not to conver sting to factor
train <- read.csv("./data/train.csv", header=T, stringsAsFactors=F)
test <- read.csv("./data/test.csv", header=T, stringsAsFactors=F)
header
ist eine Option zum Festlegen der Behandlung von Kopfzeilen und stringsAsFactors
ist eine Option zum Festlegen, ob eine Zeichenfolge in einen Faktortyp (Faktor) konvertiert werden soll. Wenn Sie die obige Datei eingeben, sieht der Zugdatenrahmen wie folgt aus.
train.csv
Das Alter von 'Moran, Mr. James' mit ID = 6 ist 'NA'. Überprüfen Sie anschließend in jeder Spalte, ob Werte fehlen.
# any() usage:
is_na_train <- sapply(train, function(y) any(is.na(y)))
is_na_test <- sapply(test, function(y) any(is.na(y)))
Hier wird any () wie in Python verwendet. Zählen Sie als nächstes die Anzahl der fehlenden Werte.
# count na
na_count_train <- sapply(train, function(y) sum(is.na(y)))
na_count_train
# output
# PassengerId 0
# Survived 0
# Pclass 0
# Name 0
# Sex 0
# Age 177
# SibSp 0
# Parch 0
# Ticket 0
# Fare 0
# Cabin 0
# Embarked 0
Verstehst du? Es unterscheidet sich von dem obigen Ergebnis von Python. Schauen Sie sich auch die Testdaten an.
# count na
na_count_test <- sapply(test, function(y) sum(is.na(y)))
# output
# PassengerId 0
# Pclass 0
# Name 0
# Sex 0
# Age 86
# SibSp 0
# Parch 0
# Ticket 0
# Fare 1
# Cabin 0
# Embarked 0
Dies ist auch im Vergleich zur Anzahl der in Python erhaltenen NAs erheblich reduziert (insbesondere in "Cabin"). Warum?
Tatsächlich ist der Grund für diesen Unterschied (Python vs. R), dass die Behandlung von Leerzeichen ("", Leerzeichen) unterschiedlich ist.
train.csv (In Python befand sich NaN beim Lesen bereits im roten Rahmen.)
Die von Python-Pandas unterstützte Funktion "isnull ()" bestimmt auch, dass ein Leerzeichen ("") null ist, während
Rs is.na ()
setzt keine Leerzeichen in na. Aus diesem Grund ist die Anzahl von na niedrig.
Diesmal sind die 'Cabin'-Daten der Titanic die ID der Kabine, daher ist das "Leerzeichen" wahrscheinlich darauf zurückzuführen, dass es keine Aufzeichnungen gibt (obwohl spekuliert wird). Außerdem ist es für Leerzeichen sehr wahrscheinlich, dass der Datenanalysefluss (von der Verarbeitung mit Kabinendaten) getrennt wird. Daher ist es für das Programm vorzuziehen, Leerzeichen als NA zu zählen. Wechseln Sie daher zu einem R-Skript, das Leerzeichen ("") wie Python-Code als NA behandelt.
# Reread data with na.string option
train <- read.csv("./data/train.csv", header=T, stringsAsFactors=F,
na.strings=(c("NA", "")))
test <- read.csv("./data/test.csv", header=T, stringsAsFactors=F,
na.strings=(c("NA", "")))
Durch Angabe der Option na.strings von read.csv () als na.strings = (c (" NA "," "))
werden Leerzeichen ("") in NA konvertiert. Danach wurde die NA wie folgt gezählt.
# Counting NA
na_count_train <- sapply(train, function(y) sum(is.na(y)))
na_count_test <- sapply(test, function(y) sum(is.na(y)))
Ausgabeergebnis:
# --- Train dataset ---
# PassengerId 0
# Survived 0
# Pclass 0
# Name 0
# Sex 0
# Age 177
# SibSp 0
# Parch 0
# Ticket 0
# Fare 0
# Cabin 687
# Embarked 2
# --- Test dataset ---
# PassengerId 0
# Pclass 0
# Name 0
# Sex 0
# Age 86
# SibSp 0
# Parch 0
# Ticket 0
# Fare 1
# Cabin 327
# Embarked 0
Dies stimmt mit dem Python-Ergebnis überein. Auf diese Weise wurde festgestellt, dass die Definition von NA zwischen Python (Pandas) und R unterschiedlich ist. Zum Vergleich scheint R eine strengere Klassifizierung von Null / NaN / NA zu haben. Bei Pandas werden Blank / NA / NaN von isnull () alle als NA beurteilt, aber es scheint, dass es im praktischen Gebrauch kein Problem gibt. (Um es schlecht auszudrücken, die Behandlung von Pandas ist "mehrdeutig".)
Das Folgende wird aus der Python-Pandas-Dokumentation (http://pandas.pydata.org/pandas-docs/version/0.18.1/missing_data.html) zitiert.
Note: The choice of using NaN internally to denote missing data was largely for simplicity and performance reasons. It differs from the MaskedArray approach of, for example, scikits.timeseries. We are hopeful that NumPy will soon be able to provide a native NA type solution (similar to R) performant enough to be used in pandas.
Leerzeichen werden nicht erwähnt, aber Pandas sagt, dass sie aus Gründen der Einfachheit und Leistung so implementiert sind, wie sie jetzt sind. Ich selbst bin noch nie auf einen Fall gestoßen, in dem NA-Daten streng in Blank / NA / NaN unterteilt werden müssen. Wie wird also in Python beschrieben, wie in diesem Artikel beschrieben (in R, wie man Blank in NA konvertiert)? ) Ich möchte mich erinnern.
(Als Referenz handelt es sich um eine Konvertierung von Blank nach NA, aber ich habe bestätigt, dass der Konvertierungsprozess mit derselben Option (na.strings) in fread () des R-Pakets {data.table} ausgeführt wird.)
Kaggle Titanic ist Kaggles Tutorial-ähnlicher Wettbewerb, aber im Leader Board gibt es große Unterschiede in den Punktzahlen von ausgezeichnet bis mittelmäßig. Es wird angenommen, dass einer der Punkte, um die Punktzahl hier zu erhöhen, die Parameteranpassung des Klassifikators ist, und der andere die Methode zum Interpolieren des fehlenden Werts der Daten, insbesondere des fehlenden Werts von 'Alter'. Im Moment sind es noch Tage bis zum Stichtag (31.12.2016), daher möchte ich die Gelegenheit nutzen, den Titanic-Wettbewerb erneut zu versuchen. (Die Top-Gruppe hat eine Genauigkeitsrate von 1,0 erreicht. Wie geht das?)
Recommended Posts