Python pandasを用いた データの前処理についてメモ
はじめに
機械学習などでデータ処理を行うために
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)
ゆるふわPandasチートシート
https://qiita.com/tanemaki/items/2ed05e258ef4c9e6caac