Python pandasを用いた データの前処理についてメモ

2019-12-18

はじめに

機械学習などでデータ処理を行うために
Python pandasを使いデータの前処理:欠損値確認についてメモ

前処理次第でアルゴリズムの精度が大きくかわってくるので非常に大事になってくる
今回はあくまで前処理の一例として、Python pandasの基礎的な使い方、触りの部分をあげている

データはKaggle:Titanic: Machine Learning from Disasterのデータをサンプルとして使用
https://www.kaggle.com/c/titanic

データの状態を確認

csvデータを読み込みデータの状態を確認する

import numpy as np
import pandas as pd

df_train = pd.read_csv("train.csv")
df_test = pd.read_csv("test.csv")

df_train.head()
 |PassengerId|Survived|Pclass|                                             Name|   Sex| Age|SibSp|Parch|          Ticket|   Fare|Cabin|Embarked|
---------------------------------------------------------------------------------------------------------------------------------------------------
0|          1|       0|     3|                          Braund, Mr. Owen Harris|  male|22.0|    1|    0|       A/5 21171| 7.2500|  NaN|       S|
1|          2|       1|     1|Cumings, Mrs. John Bradley (Florence Briggs Th...|female|38.0|    1|    0|        PC 17599|71.2833|  C85|       C|
2|          3|       1|     3|                           Heikkinen, Miss. Laina|female|26.0|    0|    0|STON/O2. 3101282| 7.9250|  NaN|       S|
3|          4|       1|     1|     Futrelle, Mrs. Jacques Heath (Lily May Peel)|female|35.0|    1|    0|          113803|53.1000| C123|       S|
4|          5|       0|     3|                         Allen, Mr. William Henry|  male|35.0|    0|    0|          373450| 8.0500|  NaN|       S|

データの欠損を手っ取り早く確認する

df.info()メソッドを使う

df_train.info()
---------------------------------------------------------
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
PassengerId    891 non-null int64
Survived       891 non-null int64
Pclass         891 non-null int64
Name           891 non-null object
Sex            891 non-null object
Age            714 non-null float64
SibSp          891 non-null int64
Parch          891 non-null int64
Ticket         891 non-null object
Fare           891 non-null float64
Cabin          204 non-null object
Embarked       889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.6+ KB

データ数891に対してAge(float64)とCabin(object)とEmbarked(object)が少ないので、データの欠損が確認できる
Cabin(object)は使えなそうなのでスルー

RangeIndex: 891 entries, 0 to 890

Age:714
Cabin:204
Embarked:889

いくつかobject型のデータがあるが、性別データは使えそうなので数値型に変換しよう、など判断できるようになる

ここから前処理として値変換したり、欠損値を埋めていくことになる

各数値データー間の相関係数を確認

df.corr()メソッドを使う
corr()はデータ型が数値型・ブール型の列が計算対象

引数:methodで出方法の指定する
‘pearson’: ピアソンの積率相関係数(デフォルト)
‘kendall’: ケンドールの順位相関係数
‘spearman’: スピアマンの順位相関係数

例:

df_train.corr(method='pearson')

まずは欠損値を埋めずに相関係数を確認する

train_corr = df_train.corr()
train_corr
---------------------------------------------------------
           |PassengerId| Survived|   Pclass|      Age|    SibSp|    Parch|     Fare|
PassengerId|   1.000000|-0.005007|-0.035144| 0.036847|-0.057527|-0.001652| 0.012658|
Survived   |  -0.005007| 1.000000|-0.338481|-0.077221|-0.035322| 0.081629| 0.257307|
Pclass     |  -0.035144|-0.338481| 1.000000|-0.369226| 0.083081| 0.018443|-0.549500|
Age        |   0.036847|-0.077221|-0.369226| 1.000000|-0.308247|-0.189119| 0.096067|
SibSp      |  -0.057527|-0.035322| 0.083081|-0.308247| 1.000000| 0.414838| 0.159651|
Parch      |  -0.001652| 0.081629| 0.018443|-0.189119| 0.414838| 1.000000| 0.216225|
Fare       |   0.012658| 0.257307|-0.549500| 0.096067| 0.159651| 0.216225| 1.000000|

まだデータに欠けやobject型があるので
Pclass、Fare以外は相関が弱い

欠損値を埋める

※欠損値を埋めずにそれぞれのデータとして扱ったほうが、高い精度が出る場合もあります。

仮に中央値(メジアン)でAgeの欠損値を埋めるとすると以下のようになる

df_train.Age = df_train.Age.fillna(df_train.Age.median())

仮にEmbarkedの欠損を中央値で埋めると以下のようになる
※Embarkedt値は[‘C’, ‘S’, ‘Q’]

df_train.Embarked = df_train.Embarked.fillna("S")

データ型を変換

性別、Embarkedは使えそうなので数値型に変換する
Embarkedは(搭乗場所)でSはSouthampton、CはCherbourg、QはQueenstown

性別を[0, 1]、Embarkedを[0, 1, 2]で変換する

df_train.Sex = df_train.Sex.replace(['male', 'female'], [0, 1])
df_train.Embarked = df_train.Embarked.replace(['C', 'S', 'Q'], [0, 1, 2])

今回行った前処理(欠損値埋め、データ型変換)後のデータを確認してみる

df_train.info()
---------------------------------------------------------
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
PassengerId    891 non-null int64
Survived       891 non-null int64
Pclass         891 non-null int64
Name           891 non-null object
Sex            891 non-null int64
Age            891 non-null float64
SibSp          891 non-null int64
Parch          891 non-null int64
Ticket         891 non-null object
Fare           891 non-null float64
Cabin          204 non-null object
Embarked       891 non-null int64
dtypes: float64(2), int64(7), object(3)
memory usage: 83.6+ KB

きれいにデータがそろったことが確認できる
Sex 891 non-null int64
Age 891 non-null float64
Embarked 891 non-null int64

※Cabinはスルー

前処理後に相関係数を確認してみる

Ageの欠損値を埋めたあとで相関係数を確認してみると
相関係数に変化がある

train_corr = df_train.corr()
train_corr
---------------------------------------------------------
           |PassengerId| Survived|   Pclass|      Sex|      Age|    SibSp|    Parch|     Fare| Embarked|
PassengerId|   1.000000|-0.005007|-0.035144|-0.042939| 0.034212|-0.057527|-0.001652| 0.012658|-0.017443|
Survived   |  -0.005007| 1.000000|-0.338481| 0.543351|-0.064910|-0.035322| 0.081629| 0.257307|-0.125953|
Pclass     |  -0.035144|-0.338481| 1.000000|-0.131900|-0.339898| 0.083081| 0.018443|-0.549500| 0.305762|
Sex        |  -0.042939| 0.543351|-0.131900| 1.000000|-0.081163| 0.114631| 0.245489| 0.182333|-0.022521|
Age        |   0.034212|-0.064910|-0.339898|-0.081163| 1.000000|-0.233296|-0.172482| 0.096688|-0.040166|
SibSp      |  -0.057527|-0.035322| 0.083081| 0.114631|-0.233296| 1.000000| 0.414838| 0.159651| 0.030874|
Parch      |  -0.001652| 0.081629| 0.018443| 0.245489|-0.172482| 0.414838| 1.000000| 0.216225|-0.035957|
Fare       |   0.012658| 0.257307|-0.549500| 0.182333| 0.096688| 0.159651| 0.216225| 1.000000|-0.268865|
Embarked   |  -0.017443|-0.125953| 0.305762|-0.022521|-0.040166| 0.030874|-0.035957|-0.268865| 1.000000|

仮にSurvivedだけに注目してみるとSurvivedに対してSex、Fare、Embarkedに大きな相関があることがわかる

           |PassengerId| Survived|   Pclass|      Sex|      Age|    SibSp|    Parch|     Fare| Embarked|
Survived   |  -0.005007| 1.000000|-0.338481| 0.543351|-0.064910|-0.035322| 0.081629| 0.257307|-0.125953|

以上で今回のデータの前処理を終わる
ここからいろいろな学習手法を試して、最適な精度が出るものを探していくことになる。

参照:
Titanic : EDA to ML (Beginner)
https://www.kaggle.com/dejavu23/titanic-eda-to-ml-beginner/notebook

ゆるふわPandasチートシート
https://qiita.com/tanemaki/items/2ed05e258ef4c9e6caac