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).)
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
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
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".
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
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 (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}.)
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 ...)
Recommended Posts