見出し画像

Python初心者 無料で学習を極める(8)

「機械学習のためのpython入門講座」SkillupAI様のday7目の講座から学んだことを記載していきます☆
本記事は、「あ!どんなふうにあれ使うっけ?」っと言うときに参考にしてもらえると嬉しいです。一通りpythonに慣れてきたら、実際のプログラムを載せるなどして皆さんと一緒にレベルアップができればと思います!

それでは7日目行ってみましょう!
day7:データの前処理
    ※前処理の実施!

情報が過多になった為、分割してday7を記載しました。前の情報を見たい方はこちらをみてね。

前処理のステップ6:前処理の実施

大きく5つのステップを行います。

6-1)データ加工して意味のある特徴を抽出

【仮説】名前についている敬称は影響があるのではないか。
という考えのもと、Name列の特徴を抽出し、加工を行いましょう

#  <処理1>名前は敬称だけ抜き取る
#「正規表現」を用いる為、import  に re  を使用する
import re
def get_title(name):

# 大文字小文字. となる部分を抽出してね。と言うのが下のコード
title_search = re.search(' ([A-Za-z]+)\.', name)
if title_search:
return title_search.group(1)
return ""

#  <処理2>"Title"という列を作り、その中に全員分の敬称を収録する
for df in [train,test]:
df['Title'] = df['Name'].apply(get_title)

ここで、trainデータ と test データを比較しましょう。この時に、
・サンプル数が少ないデータはないか
・双方のデータの特徴数(Mr とか Missなど)は同じか
を考える必要があります。ここで異なる場合は、敬称の置き換え作業を行う必要があります。

for df in [train, test]:
# "Mlle","Ms","Mme" は Miss に置き換え
df['Title'] =df['Title'].replace(["Mlle","Ms","Mme"],"Miss")
# それ以外はOthersへ
df['Title'] = df['Title'].replace(['Lady', 'Countess','Capt', 'Col','Don', 'Dr', 'Major', 'Rev', 'Sir', 'Jonkheer', 'Dona'], 'Others')

6-2)欠損値処理

欠損値のデータ数によって考える必要があります。
1)欠損値データが少ない場合(文字)
例えば、データが欠損している値が2つ程度であれば、一番個数が高い値へ補完することがよいでしょう。
今回のデータセットでいうと、 Embarked  で欠損値が2つあった為、2つだけを補完することを考えます。

#pandas の fillna()関数 を用いる
#fillna() は、欠損値を任意の値で置き換えることが可能
#今回の例だと、Sに置き換え を実施する
train.Embarked=train.Embarked.fillna("S")

2)欠損値データが少ない場合(数字)
数字の特徴量としているモノに対して、欠損値があった場合は、無難に中央値を代入することを利用すると良い。

#testのFareを埋める
test.Fare=test.Fare.fillna(test.Fare.median())

2)欠損値データが多めにある場合
平均値を用いた計算を行うことがありますが、平均値だととてもばらつきがあり、それが正しいのか。疑問が残ります。
そこで、前項で実施した特徴あるデータに変更した敬称を用いてみましょう。

#敬称毎に平均値を求め、欠損値データが含まれていれば、そこに平均値を代入
for df in [train, test]:
mean = df.groupby("Title")["Age"].mean()
for title in mean.keys():
df.loc[(df.Age.isnull())&(df.Title==title),"Age"] = mean[title]

3)欠損値データの有無の確認
処理は実施しましたので、最後に欠損値データの確認。isnull().sum() を実施

ここまでで、欠損値データの残りは大量に欠損しており、データの特徴量が活用できなさそうなCabinのみとなりました。

6-3)数値データのカテゴライズ化

学習を行うモデルには、統計的に意味のある特徴 を用いて算出を行いたい と考えます。その為、例えば年齢に対して一つずつの数値データの傾向をみるのではなく、10代・20代・30代といったグループ分けを行い傾向を確認していくことも重要になります。

#ここでカテゴライズ化する関数として pdf.cut() を用いります
pd.cut(x , bin ,  labels , right )
#x ;分割するデータ
#bins : 分割基準のりすと 。 [0 , 10 , 30 ] とすると 0-10,10-30
#label : 分割ごとのカテゴリの値のリスト
#right : 境界値の小さい方をグループに含めるTrue,大きい方を含めるFalse
for df in [train, test]:
df['Age_band'] = pd.cut(df["Age"], [0, 22, 30, 37, 59, 100], labels=range(5), right=False)
train['Age_band'].head()

カテゴライズ化した結果は、グラフかを行い傾向を確認しましょう。
下記の様な特徴から、運賃が高い方の傾向が生存率が高くなっている
といった傾向を感じることができますね。

傾向

6-4)不要データの削除

欠損値処理を行う事で分かった不要なデータを削除していきます。
また意味合いとして別の意味を持たせた内容(例えば、年齢や名前)は削除してもいいですね。

#削除したい列名をリストに格納
drop_columns = ['PassengerId', 'Name', 'Ticket', 'Cabin','Age','Fare']
#trainとtestから削除
train = train.drop(drop_columns, axis = 1)
test = test.drop(drop_columns, axis = 1)

6-5)文字列データの数値への置き換え

文字列を学習することはできない為、素直に数値への置き換えを考えましょう。下記が例です。

for df in [train, test]:
# 性別を数字でおきかえ
df.loc[df['Sex']=="female", "Sex"]=0
df.loc[df['Sex']=='male','Sex']=1

# 敬称を数字で置き換え
df.loc[df['Title']=='Mr', 'Title']=0
df.loc[df['Title']=='Miss', 'Title']=1
df.loc[df['Title']=='Mrs', 'Title']=2
df.loc[df['Title']=='Master', 'Title']=3
df.loc[df['Title']=='Others', 'Title']=4

# 乗船した港3種類を数字でおきかえ
df.loc[df['Embarked']=='S', 'Embarked']=0
df.loc[df['Embarked']=='C', 'Embarked']=1
df.loc[df['Embarked']=='Q', 'Embarked']=2

ここまでで、すべての文字列も数字化できました!!

6-6)データフレームの保存

ここまでの間で処理を実施したデータをpythonで読み書きが可能なpickle形式で保存を実施します。これを行うことで、いつでも読み出しを行う事が可能です!

# データを保存
# train
train.to_pickle("./titanic/titanic_train.pkl")
# test
test.to_pickle("./titanic/titanic_test.pkl")
#データを読み込み
train = pd.read_pickle("./titanic/titanic_train.pkl")
test = pd.read_pickle("./titanic/titanic_test.pkl")

以上で前処理が終わりました~~。ついに、次は学習ですね!楽しみ~

今までの内容はこちらに☆


よろしければサポート頂けると幸いです!子供へのパパ時間提供の御礼(お菓子)に活用させて頂きます☆