Comprendre l'état de la perte de données - Python vs R

introduction

La première chose à faire lorsque des données sont fournies dans l'analyse des données est de saisir le contour du contenu. Nous essayons de comprendre quelles sont les fonctionnalités et quels sont les types de données en convertissant les données en une table. Le travail à faire en même temps est l'investigation des valeurs manquantes. Étant donné que la présence ou l'absence de perte de données affecte les opérations de données, vérifiez d'abord la présence ou l'absence, puis vérifiez la fréquence des valeurs manquantes. Dans cet article, nous verrons comment faire cela en Python et R.

(L'environnement de programmation est Jupyter Notebook + Python 3.5.2 et Jupyter Notebook + IRkernel (R 3.2.3).)

Vérification de l'état de perte de données en Python

Nous avons décidé d'utiliser "Titanic" fourni par Kaggle comme ensemble de données. Beaucoup de gens ont peut-être vu les données, mais cela classifie «survécu» / «non survécu» en fonction des caractéristiques des passagers. Comme cela sera décrit plus loin, il s'agit d'un ensemble de données contenant des valeurs manquantes.

Tout d'abord, chargez les données dans le pandas DataFrame avec Python.

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

Comme le montre la figure ci-dessus, vous pouvez déjà voir l'indication «NaN» dans les 5 premières lignes de données, la colonne Cabine. Regardons également test.csv.

test.csv titanic_fig2.png

De même, il a été constaté que «NaN» était aligné dans la cabine. À propos, la taille (forme) des données n'est pas aussi grande qu'un ensemble de données car le train est (891, 12) et le test est (418, 11).

Ensuite, vérifions quelle quantité de caractéristiques (colonne) contient une perte de données.

# 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 () est une fonction qui détermine si oui ou non elle est NA, et any () est une fonction qui regarde de manière exhaustive plusieurs emplacements et renvoie la vérité. Étant donné que any () prend l'option axis, si vous voulez l'inclure dans les unités "colonne" (= scan dans le sens "ligne"), définissez axis = 0 (peut être omis car c'est la valeur par défaut). De même, regardons test.

# 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
'''

Comme mentionné ci-dessus, dans les données de train, ['Age', 'Cabin', 'Embarked'] contient une perte de données, et dans les données de test, ['Age', 'Fare', 'Cabin'] contient une perte de données. Cela s'est avéré. Sur cette base, "Faisons un modèle qui n'utilise pas de quantités de caractéristiques ('Âge', 'Tarif', 'Cabine', 'Embarqué') avec la perte de données comme prototype du classificateur cible.» , "Mais" l'âge "(âge) semble affecter la classification (survie ou non)" et ainsi de suite.

Ensuite, comptez le nombre de pertes de données. Commencez par former les données.

# 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
'''

De même, testez les données.

# 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
'''

À partir des résultats ci-dessus, les points suivants peuvent être appréhendés.

--- «Age» contient la perte de données à un certain taux à la fois en train et en test.

Comme méthode de classification des données, il est possible de décider de la politique telle que "Pour le moment, modélisons" Cabine "en la supprimant de la quantité de caractéristiques!" Et "Dropna () car" Embarqué "est 2 cas".

Confirmation de l'état de perte de données dans R

Faites la même chose que vous avez fait en Python avec R. Tout d'abord, lisez le fichier dans le bloc de données.

# 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 est une option pour spécifier la gestion des lignes d'en-tête, et stringsAsFactors est une option pour spécifier s'il faut convertir une chaîne de caractères en un type de facteur (facteur). Si vous entrez le fichier ci-dessus, la trame de données du train sera la suivante.

train.csv titanic_fig3.png

L'âge de «Moran, M. James» avec ID = 6 est «NA». Ensuite, vérifiez les valeurs manquantes dans chaque colonne.

# any() usage:
is_na_train <- sapply(train, function(y) any(is.na(y)))
is_na_test <- sapply(test, function(y) any(is.na(y)))

Ici, any () est utilisé comme en Python. Ensuite, comptez le nombre de valeurs manquantes.

# 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

Comprenez vous? Il est différent du résultat obtenu par Python ci-dessus. De même, regardez les données de test.

# 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

Ceci est également significativement réduit (en particulier dans "Cabin") par rapport au nombre de NA obtenus en Python. Pourquoi?

En fait, la raison de cette différence (Python vs R) est que le traitement des blancs ("", blancs) est différent.

train.csv titanic_fig4.png (En Python, NaN était déjà dans le cadre rouge lors de la lecture.)

La fonction ʻisnull () `prise en charge par les pandas Python détermine qu'un vide (" ") est également nul, alors que «Is.na ()» de R n'inclut pas d'espaces dans na. Pour cette raison, le nombre de na est faible.

Cette fois, les données de la «Cabine» du Titanic indiquent l'ID de la cabine, donc le «blanc» est probablement dû au fait qu'il n'y a pas d'enregistrement (bien que cela soit spéculé). De plus, pour les blancs, il est très probable que le flux d'analyse des données soit séparé (du traitement avec'Cabin'data), il est donc préférable que le programme compte les blancs comme NA. Par conséquent, passez à un script R qui traite les espaces ("") comme NA comme le code Python.

# 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", "")))

En spécifiant l'option na.strings de read.csv () comme na.strings = (c (" NA "," ")), les espaces ("") sont convertis en NA. Après cela, le NA a été compté comme suit.

# Counting NA
na_count_train <- sapply(train, function(y) sum(is.na(y)))
na_count_test <- sapply(test, function(y) sum(is.na(y)))

Résultat de sortie:

# --- 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

Ceci est en accord avec le résultat Python. De cette façon, il a été constaté que la définition de NA est différente entre Python (pandas) et R. A titre de comparaison, R semble avoir une division plus stricte de null / NaN / NA. Dans les pandas, les blancs / NA / NaN sont tous jugés comme NA par isnull (), mais il semble qu'il n'y ait aucun problème d'utilisation pratique. (Pour le dire mal, le traitement des pandas est "ambigu".)

Ce qui suit est extrait de la documentation Python pandas (http://pandas.pydata.org/pandas-docs/version/0.18.1/missing_data.html).

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.

Il n'y a aucune mention de blancs, mais pandas dit qu'il est implémenté tel qu'il est maintenant pour la simplicité et les performances. Je n'ai moi-même jamais rencontré de cas où les données NA doivent être strictement divisées en blanc / NA / NaN, alors comment les gérer en Python décrit dans cet article (en R, comment convertir un blanc en NA) ) Je veux me souvenir.

(Pour référence, il s'agit d'une conversion de Blank en NA, mais j'ai confirmé que le processus de conversion est effectué avec la même option (na.strings) dans fread () du package R {data.table}.)

finalement

Kaggle Titanic est la compétition de type Tutoriel de Kaggle, mais en regardant le classement, il y a une grande variation dans les scores d'excellent à médiocre. On suppose que l'un des points pour élever le score ici est l'ajustement des paramètres du classifieur, et l'autre est la méthode d'interpolation de la valeur manquante des données, en particulier la valeur manquante de «Âge». Pour le moment, il reste encore des jours avant la date limite (31/12/2016), alors j'aimerais en profiter pour essayer à nouveau la compétition Titanic. (Le groupe Top a atteint un taux de précision de 1.0, comment faire ...)

Références / site Web

Recommended Posts

Comprendre l'état de la perte de données - Python vs R
[Python3] Comprendre les bases de Beautiful Soup
[Python3] Comprendre les bases des opérations sur les fichiers
Comparaison de R, Python, SAS, SPSS du point de vue des data scientists européens
L'histoire de la lecture des données HSPICE en Python
Vérifiez l'état des données à l'aide de pandas_profiling
le zen de Python
Ne pas être conscient du contenu des données en python
Utilisons les données ouvertes de "Mamebus" en Python
14 quiz pour comprendre la portée étonnamment compliquée de Python
Obtenez l'état de fonctionnement de JR West avec Python
À propos des fonctionnalités de Python
Le pouvoir des pandas: Python
Essayez de gratter les données COVID-19 Tokyo avec Python
Facilitez la compréhension de l'affichage des exceptions du module Python
[Comprendre au plus court] Principes de base de Python pour l'analyse des données
L'histoire du rubyiste aux prises avec Python :: Dict data with pycall
Comparaison de la gestion des trames de données en Python (pandas), R, Pig
[Python] J'ai essayé de collecter des données en utilisant l'API de wikipedia
L'histoire de Python et l'histoire de NaN
[Python] La pierre d'achoppement de l'importation
First Python 3 ~ Le début de la répétition ~
Comprendre le contenu du pipeline sklearn
Acquisition automatique des données de niveau d'expression génique par python et R
Existence du point de vue de Python
pyenv-changer la version python de virtualenv
[Python] Comprendre le potentiel_field_planning de Python Robotics
Revue des bases de Python (FizzBuzz)
Visualisez l'état de la réponse du recensement national 2020
À propos de la liste de base des bases de Python
[python] Une note que j'ai commencé à comprendre le comportement de matplotlib.pyplot
Apprenez les bases de Python ① Débutants élémentaires
Échangez facilement des données entre Python, R et Julia à l'aide du format Feather
Python vs Ruby "Deep Learning from scratch" Chapitre 4 Implémentation de la fonction de perte
Obtenez la clé pour la migration de la deuxième couche de données JSON avec python
Expliquer le mécanisme de la classe de données PEP557
Vérifiez le comportement du destroyer en Python
Comprendre la commodité de Django Rest Framework
Passez le chemin du module python importé
Obtenez la liste des colonnes et la liste des données de CASTable
Vérifier l'existence du fichier avec python
À propos de l'environnement virtuel de Python version 3.7
[Python3] Réécrire l'objet code de la fonction
Je ne connaissais pas les bases de Python
Le résultat de l'installation de python sur Anaconda
[Python] Essayez pydash de la version Python de lodash
[python] Vérifier la consommation de mémoire des variables
Vérifiez le chemin du module importé Python
L'histoire de la manipulation des variables globales Python
Principes de base pour exécuter NoxPlayer en Python
Comprendre la partie "temporaire" d'UNIX / Linux
Pandas du débutant, par le débutant, pour le débutant [Python]
Le modèle de projet Python auquel je pense.
Recommandation d'Altair! Visualisation des données avec Python
À la recherche du FizzBuzz le plus rapide en Python
Cours de base Python (à la fin de 15)