機械学習やデータ分析をする上で避けて通れないのがデータの前処理です。アプリを作るシリーズで扱った前処理をまとめています。アプリを作るシリーズは以下から読めます。
![](https://masamunetogetoge.com/wp-content/uploads/2019/06/masamune②-160x90.jpg)
![](https://masamunetogetoge.com/wp-content/uploads/2019/06/masamune②-160x90.jpg)
欠損値の扱い
人が取ったデータにはほぼ確実に欠損値やタイプミスが含まれます。これをどう処理するか定番の方法があります。
欠損値の割合が少ない場合
全体のデータの中で、欠損値を含むデータが殆どない場合は、単純に欠損値を省く事が多いです。pythonでは、pandas のdropnaで実行できます。
ラベルの扱い
文字データのラベル化
生データでは、英数字の羅列で商品などが管理されている事が多いです。例えばティファールの電気ケトルについている BF805170 などです。
この時、文字のままだと機械学習で処理できないので、必要に応じて文字の一部分を切り取ってラベルにします。 BF805170 だったら、最初の文字のBFを抜き取っておきます。
タイタニック号の生存者に関するデータで例を見てみます。
![](https://masamunetogetoge.com/wp-content/uploads/2019/09/titanic_data-1024x172.png)
タイタニック号事故の生存率には、年齢と性別が大きく関わっています。名前に大体Mr. とMs. とかが付いていて、その部分が有効な特徴量になります。
名前のデータから、その部分をラベルとして取り出します。以下のように書けます。
import pandas as pd
df = pd.read_csv('train.csv')
df['Title'] = df.Name.str.extract(' ([A-Za-z]+)\.', expand=False)
Title という列を新たに生成して、そこにMr.とかを入れてます。 1 extract はpandas で正規表現を使う時の関数です。正規表現については以下のサイトを見てください。文字の塊+ .(ドット)の形の文字の集合を検索してます。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-412672c5f0600ab9a64263b751f1bc81.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9JUU1JTg4JTg2JUUzJTgxJThCJUUzJTgyJThBJUUzJTgyJTg0JUUzJTgxJTk5JUUzJTgxJTg0cHl0aG9uJUUzJTgxJUFFJUU2JUFEJUEzJUU4JUE2JThGJUU4JUExJUE4JUU3JThGJUJFJUUzJTgxJUFFJUU0JUJFJThCJnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnR4dC1jb2xvcj0lMjMyMTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9NTYmcz0zYmYwZGZkMTg0MGZiNDY5NWYzMGFlNjczNjc0OTcyNA&mark-x=142&mark-y=57&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9NzcwJnR4dD0lNDBsdW9oYW8wNDA0JnR4dC1jb2xvcj0lMjMyMTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9MzYmdHh0LWFsaWduPWxlZnQlMkN0b3Amcz0xZGM1ZWMwZmE2YTU2OTA0NTZhMjg0NWViMTRkYmU5MQ&blend-x=142&blend-y=486&blend-mode=normal&s=8956fa7683fe92bef495335b11745ceb)
ラベルの数値化
ラベルにしても、ラベルのままでは機械学習のモデルに与える事は出来ません。という訳で、ラベルを数字にしなくてはいけません。そのような処理をone hot encoding と言います。titanic のデータでは、Embarked のデータがその対象になります。
やり方としては、pandasのget_dummies があります。
Emb = pd.get_dummies(df.Embarked)
df=pd.concat(df, Emb], axis=1)
![](https://masamunetogetoge.com/wp-content/uploads/2019/09/titanic_data_emb.png)
数値の正規化
機械学習の理論には、データが正規化された前提の物があります。そのような手法を用いない場合でも、特徴量の分布に大きな偏りがあると解析が上手くいかない場合が多数です。
ポピュラーなやり方としては、特徴量の平均を引いて、分散で割ります。
titanic データの Fareを正規化してみます。2
fare = df.Fare
norm_fare = (fare - fare.mean() )/ fare.std()
plt.figure(figsize=(12,4))
plt.subplot(1,2,1)
sns.distplot(fare)
plt.subplot(1,2,2)
sns.distplot(norm_fare)
![](https://masamunetogetoge.com/wp-content/uploads/2019/09/normed_fare.png)
殆どが0~100に固まっていた分布が0~2に縮まりました。分布の形自体は変わっていないことに注意が必要です。
今回のアプリ作成で行った前処理は以上です。定番の物はもう少しあるので、機会があれば記事にしたいと思います。
まとめ
- 欠損値を処理した
- 文字列から必要なラベルを抜き出した
- ラベルをベクトルに変換した
- 正規化した