Exploratory Data Analysis - 探索的データ解析
Exploratory Data Analysisとは
データの理解をすること。ざっくりと、
データの型、分布の形状や性質、欠損値や異常値の確認
前処理を含む
- inforによるデータ型、欠損値の確認
- 上記で発見した不具合、不都合の処理
- boxplotを使った異常値の確認
- describeによる基本統計量の確認
- pairplotで散布図に
- 相関係数をheatmapで視覚化
- 必要であればOne-Hot処理
実践編
データ準備
UCIからアワビのとりよせ
Ring(年輪)を予想するモデルを作る
import requests import io import pandas as pd url = 'http://archive.ics.uci.edu/ml/machine-learning-databases/abalone/abalone.data' data = requests.get(url ,verify = False) df = pd.read_csv(io.StringIO(data.content.decode('utf-8')), header=None) #こちらからNameデータを #http://archive.ics.uci.edu/ml/machine-learning-databases/abalone/abalone.names column_names =['Sex', 'Length', 'Diameter', 'Height', 'Whole weight', 'Shucked weight', 'Viscera weight','Shell weight', 'Rings'] df.columns=column_names
データの観察
眺める
df.head() df.tail() df.info()
列はきれいに集められている模様。アワビのオス・メスってどうやってみわけるんだろう。
欠損値なし。データも数値として認識されている。
データの前処理
データの成型
- 型を変更したり
- to_numeric()
- to_string(),
_ to_datetime()
- データsplitしたり
- テーブルを結合したり
- pd.merge()
- .join()
いろいろやってみる
欠損値処理
- dropna()
- fillna()
Box plotで分布の広がりと異常値を観察
import matplotlib as mpl import matplotlib.pyplot as plt #Ringsは目的変数なのでdrop df.drop('Rings',axis=1).boxplot(figsize=(20,6)) plt.show()
Whole weightの広がりが大きい。異常値であると判断すれば処理。
実力不足により自分では処理できないので、Zepprixさまの記事を参考にさせていただきました。自分でも記事書きたいです。
qiita.com
基本統計量の確認
df.describe()
とてもお手軽。HeightとShuckedのminが気になるところ。
組み合わせ散布図 Pair Plot
import seaborn as sns sns.pairplot(df)
これまたとてもお手軽。Ringsにたいして関係が深そうなものを更なる探索対象にする。
全体的にまとまりにかける。Heightは除いてもよさそう。
相関行列のHeat Map
cor = df.corr() plt.figure(figsize=(10,6)) sns.heatmap(cor, square=True, cmap='plasma', vmax=1,vmin=-1, annot=True) plt.show()
やはり全体的にRingに対する相関が低め。
その後
所与のデータでうまくいきそうなら、次にはモデルの選択とチューニングへ
ダメそうなら特徴量エンジニアリングで目的変数と説明変数の関係性が何か見いだせないか分析
特徴量エンジニアリング
Unsupervised-Larningによって特徴量を操作
- 次元の削減
- 次元が大きすぎると、Machine-Learningの必要時間が増える
- 多重共線性の回避
- 統計的なあれ