16
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【kaggle】前処理まとめ(統計量、欠損値処理etc)

Posted at

#1.目的
2018年12月頃からプログラミング(python)の勉強を始めて、kaggleに取り組み始めたのはこの数か月です。

その中で、「これってどうやるんだろう」と思ったものがたくさんあり、色々調べながら進めていったので、今回はその「前処理」にフォーカスし、そのまとめをしておこうと思います。

#2.使用するデータと必要なもののインポート
kaggleではおなじみのタイタニックです。
https://www.kaggle.com/c/titanic

import matplotlib
import matplotlib.pyplot as plt
matplotlib.style.use('ggplot')
import seaborn as sns

import numpy as np
import pandas as pd

データの読み込みをしていきます。

df_train =  pd.read_csv(r"C:///train.csv")
df_test = pd.read_csv(r"C:///test.csv")

#3.データ外観(統計量)
##(1)データ数の確認【.shape】

df_train.shape
df_test.shape

これで訓練データが(891, 12)、テストデータが(418, 11)と分かります。

##(2)データをちょっと見る【.head()】
どんなデータが入っているのかを見るために、先頭5行を出してみます。

df_train.head()
df_test.head()

こんな感じのデータになっているようです。
キャプチャ1.PNG

df_test.head()もすればわかりますが、列は訓練データの列から目的変数である「Survived」が消えた列が表示されます。

##(3)データの型を見てみる【.info()】
訓練データとテストデータの情報を1つにまとめてみてみましょう。

df_train.info()
print("-"*48)
df_test.info()

各列のデータ数やデータ型をざっと確認することができます。

キャプチャ3.PNG

##(4)数値データ・カテゴリデータの情報を見てみる【.describe()】

###◆数値データ

df_train.describe()
キャプチャ4.PNG

数値データの情報が表示されます。

###◆カテゴリデータ

df_train.describe(include=['O'])
キャプチャ2.PNG

カテゴリ変数であるName,Sex,Ticket,Cabin,Embarkedがそれぞれの個数・ユニーク値、トップの頻度のカテゴリ、その出現回数が表示されます。

#4.訓練データとテストデータを統合する
これは初期のころに非常に躓いたので、私としては重要です。

最終的には訓練データとテストデータで分けて学習していくのですが、欠損値処理やカテゴリ変数処理といった前処理を訓練データとテストデータそれぞれに行うと煩雑なので、最初はまとめておき、後からまた分けていきます。

#TrainFlagという列を新たに作り、訓練データにはTrue、テストデータにはFalseとしておく。
df_train["TrainFlag"] = True
df_test["TrainFlag"] = False

#訓練データとテストデータを結合する
df_all = df_train.append(df_test)

#PassengerIdはおそらく特徴量には使われないと思われるので、消したい。
#しかし後からテストデータの提出の際にどうせ必要なので完全には削除しないために、
#インデックスとして残しておく
df_all.index = df_all["PassengerId"]
df_all.drop("PassengerId", axis = 1, inplace = True)

ここで、df_allを見てみると、このようになります。
インデックスがPassengerIdになり、一番右には先ほど追加したTrainFlag列があります。
Trueが訓練データ、(ここには写っていないですが)Falseがテストデータです。

キャプチャ5.PNG

#5.欠損値処理

##(1)欠損値の数を調べる
このようにすると、降順に並び替えられます。

df_all.isnull().sum().sort_values(ascending=False)
キャプチャ6.PNG

今回くらいの変数数ならいいのですが、もっと変数が増えた際に、全説明変数の欠損値の数値が出されたら非常に見づらいです。

そこで、「欠損値がある」変数だけに絞って、降順に並び替えてみましょう。

df_all.isnull().sum()[df_train.isnull().sum()>0].sort_values(ascending = False)
キャプチャ7.PNG

そうすると、欠損値がある変数だけが降順に並び替えられました!

##(2)欠損値処理を行う

###◆Cabin
df_all.shapeをすると、訓練データとテストデータを結合したらデータ数は1,309です。
このうちCabinの欠損は1,014もあるので、今回は分析の対象から列ごと外そうと思いますので、ここでの欠損値処理は行わないこととします。

###◆Age
Ageもそこそこ欠損値がありますが、すごく多いわけではないことと、今回は触れないのですが年齢はモデルに影響を与えそうなので、欠損値処理を行います。

やり方はいくるかあるのですが、今回はオーソドックスに平均値で埋めようと思います。

df_all["Age"] = df_all["Age"].fillna(df_all["Age"].mean())

###◆Embarked
df_all.describe(include=['O'])をすると、Embarkedはユニーク値が3つしかなく、しかもそのほとんどが「S」であることがわかるので、今回は欠損値をSで補完します。
※本来はもう少ししっかりデータ可視化や分析をした方がいいです。

キャプチャ8.PNG
df_all["Embarked"] = df_all["Embarked"].fillna("S")

##(3)最後に、欠損値がなくなったか確認

df_all.isnull().sum()[df_train.isnull().sum()>0].sort_values(ascending = False)

すると、Cabinのみ欠損が残った状態だとわかるので、欠損値処理はこれで完成です。

#6.不要行の削除
今回は細かい検討は割愛しますが、データ分析の結果、Cabin,Name,PassengerId,Ticketは今回のモデル構築には不要と判断したとします。

これらの列を消していきましょう。

df_all = df_train.drop(["Cabin", 'Name','PassengerId','Ticket'], axis = 1)

#7.カテゴリ変数の変換

df_all = pd.get_dummies(df_all, drop_first=True)

df_all.head()で確認すると、このようにカテゴリ変数が処理できたことが分かります。
キャプチャ9.PNG

以上で、めちゃくちゃオーソドックスな前処理が完了し、この後本格的なモデル構築へと進んでいきます。

#8.結び
中級以上の方には非常に初歩的な内容ですが、最初はこれらを調べながら進めていくのにもすごく苦労し、そのたびにストレスを抱えていました。

そのような方に、少しでも理解の深化の一助になりましたら幸いです。

16
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?