Python

【Python】探索的データ解析(EDA)の基礎について初心者向けに解説

Python

はじめに

  • 探索的データ解析(EDA)とは、データサイエンティストが行う最初の一手で、データの特徴を探求し、構造を理解することが目的の解析です。

では、探索的データ解析(EDA)を実際どのようにやるのか?という基礎的な部分について今回は解説します。

探索的データ解析(EDA)を理解するには、統計の基礎も理解する必要があります。統計に不安のある方は、こちらの記事も参考にしてみてください。

開発環境について

Project Jupyter - Wikipedia

今回の記事は、Jupyter Notebookで行います。インストール方法や立ち上げ方がわからない方は、こちらの記事を参考ください。

データセットについて

アイリス, 花, フローラ, 青, 自然, 植物, 希望, 美しい, アヤメ科, 塞ぎます, 濃い紫色, 紫

今回は、アヤメデータを用います。

アヤメデータとは?

このデータセットの特徴量(説明変数)は、下記の4つの項目が含まれています。

  • Sepal Length :がく片の長さ(cm)
  • Sepal Width :がく片の幅(cm)
  • Petal Length :花弁の長さ(cm)
  • Petal Width :花弁の幅(cm)

このデーアセットの目的変数は、あやめの種類を表します。

  • Iris-Setosa(アイリスセトサ):0
  • Iris-Versicolor(アイリスバージカラー):1
  • Iris-Virginica(アイリスバージニカ):2

では実際にPythonでデータを読み出して確認してみましょう。

Pythonによるアヤメデータの読み出しと整形

ライブラリをインポート

今回は以下のライブラリを使用します。

  • Pandas
  • matplotlib
  • sklearn
  • seaborn
import pandas as pd
import matplotlib.pyplot as plt
from sklearn import datasets
import seaborn as sns

特徴量の読み出し

#データのロード
iris = datasets.load_iris()

#目的変数の読み出し
X = pd.DataFrame(iris.data, columns=iris.feature_names)
X

出力結果は以下です。

目的変数の読み出し

カラムの名前をtarget_namesとして、Pandasのデータフレーム形式で格納します。

Y = pd.DataFrame(iris.target,columns = {"target_names"})
Y

出力結果は以下です。

連結

一つのテーブルの方が見やすいと思うので、連結します。

  • pandas DataFrameの連結には、concatを使用する

df = pd.concat([X,Y],axis=1)
df
  • axis=1で配列の横方向に連結するという意味になります。
  • axis=0で配列の縦方向に連結するといういみになります。

ここでは、横方向に連結したいので、axis=1を選択します。

出力結果は以下です。

一番右の列に目的変数が追加されたことが分かります。

探索的データ解析(EDA)の基礎

探索的データ解析(EDA)の基礎について、アヤメデータを元に解説していきたいと思います。

データを確認

以下のように入力するとpandas DataFrameは表示することができます。

df

上端の部分だけを確認したい場合は以下です。

df.head()

下端の部分だけを確認したい場合は以下です。

df.tail()

欠損値と型の確認

次に、欠損値とデータ型の確認をしていきます。

  • 欠損値観測において、変数に値が格納されない状態を表す
  • データ:変数がどのような意味を持った変数かを定義するもの(詳細は以下表参照のこと)
  • データ概要の確認方法:info()と記述
  • 欠損値の確認方法:df.isnull().any()

データ型概要詳細記述例
str文字列文字、文字列
” ” ダブルクォーテーション、もしくは’ ‘ シングルクォーテーションで囲って定義
str = ‘Hello’
int整数小数点を含まない数値num = 12345
float浮動小数点小数点を含む数値num = 1.2345
boolブールTrue、Falseで真、偽を表すbool = True
bool = False
datetime日付年月日時間を表すことができるdate1 = datetime.datetime(2020, 1, 31, 12, 36, 45)
list配列1.複数の要素(文字列、整数、論理など)を格納したデータ。
2.[ ] を使って定義し、各要素の間はカンマ’,’で区切る。
3.格納した各要素の変更が可能。
list = [‘Hello’, 123456, True]
tupleタプル1.複数の要素(文字列、整数、論理など)を格納したデータ。
2.( ) を使って定義し、各要素の間はカンマ’,’で区切る。
3.格納した各要素の変更は不可能。
tuple = (‘Hello’, 123456, True)
dictionary辞書1.複数の要素(文字列、整数、論理など)を格納したデータ。。
2.{ }を使って定義し、各要素は、キーと組合せて間にコロン’:’を挟み記述する。
3.キー値と合わせて値を設定することにより、キー値を元に値を参照できる。
4.格納した各要素の変更は可能。
dict = {‘Key1’ : ‘Val1’, ‘Key2’ : ‘Val2’}
info()
df.info()

出力結果は以下です。

Rangeindex:150に対して、各データ列が150のデータが存在していることから、欠損値がないと判断できます。

データの型は、float64であることがわかります。

.isnull().any()

欠損値の有無をより端的に調べるには、以下を使うと便利です。

df.isnull().any()
  • 欠損値ありの場合:True
  • 欠損値なしの場合:False

アヤメデータには、欠損値がないことがわかります。

変数の調査

変数の中身を調べるのに、以下二つの関数はよく用います。

  •  unique():指定のデータ列がどのような値で構成されているかを把握できる
  • value_counts() 指定のデータ列を構成している値の数(度数)を把握できる
 unique()
df["target_names"].unique()

出力結果は、以下です。0,1,2で構成されていることが分かります。

value_counts() 
df["target_names"].value_counts()

出力結果は、以下です。0,1,2がそれぞれ50ずつで構成されていることが分かります。

目的変数の数に偏りがあると機械学習などでモデル生成が上手くいかないことがあるので、この調査は非常に大切です。

目的変数と特徴量の関係の把握

大きく分けて、二つ方法があります。

  1. 全データを目的変数を縦軸としてプロット
  2. 目的変数の値毎に平均値をとってプロット

全データを目的変数を縦軸としてプロット

  •  sns.pairplot(df,hue=”目的変数のカラム名”):目的変数の値毎に色を変えてプロット

この方法は、以下二つを得られるとても使える手法なので覚えましょう。

  • 目的変数の値毎の各特徴量毎のヒストグラムを得ることができる
  • 散布図で目的変数の値毎に色を変化させて二つの特徴量のプロットを得ることができる
sns.pairplot(df, hue='target_names')

目的変数の値毎に平均値をとってプロット

  •  groupby([“目的変数のカラム名“]).describe():目的変数の値毎に各特徴量の統計量を把握することができます

データの把握は、なるべく生データからやるべきです。生データを見ることを飛ばして統計量を取ると見落とすこともあるので注意しましょう。

例えば、縦軸に目的変数をとった場合、ピークが二つある特徴量などです。

# アヤメの種類毎の特徴量のデータ分散を確認してみる
df_des = df.groupby(['target_names']).describe()
df_des

出力結果は以下です。

平均値など、特定の統計量は以下のようにとります。

  •  groupby().mean():平均値
  • groupby().min():最小値
  • groupby().max():最大値
  • groupby().std():標準偏差
  • groupby().size():度数

df_mean = df.groupby(['target_names']).mean()

出力結果は以下です。

可視化します。

for i in df_mean.columns:
    plt.bar(df_mean.index,df_mean[i])
    plt.show()

以上の結果から、petal lengthとpetal widthの違いが、目的変数を分類する上で重要なパラメータであるとの見立てをすることができますね。

まとめ

探索的データ解析(EDA)の基礎についてアヤメデータを使って、初心者向けに解説しました。

大切なポイントは以下です。

  • データの出力方法
  • Pandas DataFrameの連結方法
  • seabornによるペアプロット
  • unique()による指定のデータの構成把握
  • value_counts() :指定のデータの度数の把握
  • groupbyを使った目的変数値毎の統計量の把握方法

もっとPythonを学んでみたいという方は、こちらの記事を参考にしてみてください。

Pythonを使って統計学の基礎を学びたい方は、こちらの記事を参考にしてみてください。

今回の記事は、以上です。

最後までお読みいただきありがとうございました。

コメント

タイトルとURLをコピーしました