Verstehen Sie den Status des Datenverlusts - Python vs. R.

Einführung

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).)

Überprüfen des Datenverluststatus in Python

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 titanic_fig1.png

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 titanic_fig2.png

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.

Bestätigung des Datenverluststatus in R.

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 titanic_fig3.png

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 titanic_fig4.png (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.)

Schließlich

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?)

Referenzen / Website

Recommended Posts

Verstehen Sie den Status des Datenverlusts - Python vs. R.
[Python3] Verstehe die Grundlagen von Beautiful Soup
[Python3] Grundlegendes zu Dateivorgängen
Vergleich von R, Python, SAS, SPSS aus Sicht europäischer Datenwissenschaftler
Die Geschichte des Lesens von HSPICE-Daten in Python
Überprüfen Sie den Status der Daten mit pandas_profiling
der Zen von Python
Den Inhalt der Daten in Python nicht kennen
Verwenden wir die offenen Daten von "Mamebus" in Python
14 Tests, um den überraschend verwirrenden Umfang von Python zu verstehen
Holen Sie sich mit Python den Betriebsstatus von JR West
Über die Funktionen von Python
Die Kraft der Pandas: Python
Versuchen Sie, COVID-19 Tokyo-Daten mit Python zu kratzen
Erleichtern Sie die Anzeige von Python-Modulausnahmen
[In kürzester Zeit verstehen] Python-Grundlagen für die Datenanalyse
Die Geschichte eines Rubinisten, der mit Python :: Dict-Daten mit Pycall kämpft
Vergleich der Datenrahmenbehandlung in Python (Pandas), R, Pig
[Python] Ich habe versucht, Daten mit der API von Wikipedia zu sammeln
Die Geschichte von Python und die Geschichte von NaN
[Python] Der Stolperstein des Imports
Erster Python 3 ~ Der Beginn der Wiederholung ~
Verstehen Sie den Inhalt der sklearn-Pipeline
Automatische Erfassung von Genexpressionsdaten durch Python und R.
Existenz aus Sicht von Python
pyenv-change die Python-Version von virtualenv
[Python] Die potenzielle Feldplanung von Python Robotics verstehen
Überprüfung der Grundlagen von Python (FizzBuzz)
Visualisieren Sie den Antwortstatus der Volkszählung 2020
Informationen zur Grundlagenliste der Python-Grundlagen
[Python] Ein Hinweis, dass ich das Verhalten von matplotlib.pyplot zu verstehen begann
Lernen Sie die Grundlagen von Python ① Grundlegende Anfänger
Einfacher Datenaustausch zwischen Python, R und Julia im Feather-Format
Python vs Ruby "Deep Learning von Grund auf neu" Kapitel 4 Implementierung der Verlustfunktion
Holen Sie sich den Schlüssel für die Migration von JSON-Daten auf der zweiten Ebene mit Python
Erläutern Sie den Mechanismus der PEP557-Datenklasse
Überprüfen Sie das Verhalten des Zerstörers in Python
Verstehen Sie den Komfort des Django Rest Framework
Übergeben Sie den Pfad des importierten Python-Moduls
Holen Sie sich die Spaltenliste und Datenliste von CASTable
Überprüfen Sie die Existenz der Datei mit Python
Informationen zur virtuellen Umgebung von Python Version 3.7
[Python3] Schreiben Sie das Codeobjekt der Funktion neu
Ich kannte die Grundlagen von Python nicht
Das Ergebnis der Installation von Python auf Anaconda
[Python] Probieren Sie pydash der Python-Version von lodash aus
[Python] Überprüfen Sie den Speicherverbrauch von Variablen
Überprüfen Sie den Pfad des importierten Python-Moduls
Die Geschichte der Manipulation globaler Python-Variablen
Grundlagen zum Ausführen von NoxPlayer in Python
Verstehen Sie den "temporären" Teil von UNIX / Linux
Pandas des Anfängers, vom Anfänger, für den Anfänger [Python]
Die Python-Projektvorlage, an die ich denke.
Empfehlung von Altair! Datenvisualisierung mit Python
Auf der Suche nach dem schnellsten FizzBuzz in Python
Python-Grundkurs (Ende 15)