データ解析

探索的データ分析(EDA)のステップと方法について実データ×Pythonで理解しよう!

探索的データ分析
ウマたん
ウマたん
本記事では、データ分析において非常に重要な探索的データ分析(EDA)のステップと方法について解説していきます!地味に思えるかもしれませんが、非常に重要でEDAなしには精度の高いモデルは構築できませんし、意味のある意思決定はできません。

こんにちは!

消費財メーカーでデータ分析・デジタルマーケティングをやっているウマたん(@statistics1012)です!

データ分析において非常に重要なのですが、あまり日の目を見ないステップが探索的データ解析(EDA)。

どうしてもデータ分析というと機械学習の部分が注目されがちなのですが、精度の高い機械学習モデルを構築するためにはその前手のEDAが必要不可欠なんです!

そして、データ分析に費やす時間のうち9割以上は実はEDAやデータの前処理・特徴量エンジニアリングであるといっても過言ではありません。

ロボたん
ロボたん
え?!そんなに時間がかかるのー!?
ウマたん
ウマたん
機械学習モデル構築をする部分の比重が高そうに見えるんだけど実はそんなことがないんだよー!

この記事では、そんなEDAについてどんなことが必要になるのか解説しながら最終的に実データを使ってPythonでEDAをおこなっていきたいと思います。

それではいってみましょうー!

以下の動画でも詳しく解説していますのでチェックしてみてください!

探索的データ分析(EDA)とは

stories data

まずは、EDAとは。

そもそもEDA自体なかなか聞き慣れない言葉かもしれません。

EDAとは「Explanatory Data Analysis」の略であり、日本語に訳すと探索的データ分析となります。

データ分析のステップには様々な工程があり、「CRISP-DM」と呼ばれるステップが非常に有名です。

CRISP-DM

(出典:Wikipedia-‘Cross-industry standard process for data mining’)

CRISP-DMとは、「Cross-industry standard process for data mining」の略であり、データマイニング・データサイエンス・AI開発などにおいて業界横断で標準的に使えるデータ分析プロセスになります。

このCRISP-DMには全部で6つのプロセスがあります。

Business Understanding(ビジネス理解)
Data Understanding(データ理解)
Data Preparation(データ準備)
Modeling(モデル構築)
Evaluation(評価)
Deployment(実装)

この中でEDAはデータ理解の部分になります。

データの構造を理解して、前処理・特徴量エンジニアリングそしてモデル構築に進むための材料にします。

この部分を疎かにしてしまうと、結局意味のあるデータ分析は出来ません。

CRISP-DMの図でビジネス理解とデータ理解が行き来しているように、この工程ではEDAでデータを理解しながらビジネス課題の特定と筋の良い仮説出しをおこなっていきます。

非常に重要なステップだということが理解いただけたでしょうか?

CRISP-DMに関しては以下の動画や記事でも詳しく解説しているのでもう少し知りたいという方は是非見てみてください!

CRISP-DM
データ分析プロセスの「CRISP-DM」をデータサイエンティストが解説! こんにちは! 消費財メーカーのデータサイエンティスト、ウマたん(@statistics1012)です。 データ分析に...

探索的データ分析(EDA)のステップ

続いて、EDAのステップについて見ていきましょう!

どこにどんなデータがあるか確認する

stories Memory storage

当たり前ですが、どこにどんなデータがあるかまずは確認しなくてはいけません。

ER図などを基にして必ずどこにどんなデータがどのように格納されていてどのように関連付けられているか確認しましょう!

ER図とは、データベースの設計図のことで、Entity RelationshipからER図と呼ばれています。

ER図には様々なデータテーブルがどのように関連付けられていてどのようなカラムを持っているかが図で記載されています。

ER図イメージ

そして必要に応じてCRISP-DMのデータ準備の段階でそれぞれのデータテーブルの情報を連結するという作業が行われます。

例えば、Webサイトにおける顧客の行動ログデータのテーブルと顧客の会員情報のデータは別々のテーブルで管理されている、というような状況が考えられます。

この時、あるユーザーの購入確率みたいなものを予測する時には別々に存在するログデータ会員情報データを会員IDをキーにして紐づけて予測の元となるデータを構築していきます。

データの質と量をおおざっぱに把握する

続いてデータの質と量をおおざっぱに把握していきます。

データテーブルの行数と列数はどれくらいあるのか。

どんなカラムが入っているのか。

それぞれのカラムにはどんなデータがどんな型で格納されているのか。

ひとまずデータの質と量を確認することが大事です。

各種統計量を把握する

それぞれのカラムの平均値や最大値・最小値など基本的な統計量について確認していきましょう!

これによりデータの勘所を掴んでいきます。

相関関係を確認する

stories data trend

各種変数の相関関係を確認していきます。

仮にアイスクリームの売上を予測する際に気温を横軸に取って売上を縦軸に取った場合に気温が高ければ高いほど売上が高くなっていた場合は正の相関があるといい、相関関係は-1から1の間で表されます。

相関関係

ただ注意しておいてほしいのが相関関係があると分かっても因果関係があるとは言えないということ。

AとBが原因と結果の関係になっているもので相関関係とは微妙に違います。

例えば、耳の大きさと学力の高さに正の相関関係があったときに、実はその裏には年齢という隠された因子があるという状況が考えられます。

赤ちゃんを含む全年齢を対象とした時、年齢が高いほど耳が大きくなり年齢が高いほど学力が高くなるので、一見耳の大きさと学力の高さには相関関係が生まれるのですが、そこには直接的な因果関係がないことが分かります。

このように相関関係をそのまま言葉通り鵜呑みにしてさも因果関係があるかのようにふるまうのは危険であるということはおさえておきましょう。

相関関係 因果関係
相関関係と因果関係の違いについて例を挙げながら簡単に解説していく!当サイト【スタビジ】の本記事では、相関関係と因果関係の違いについて具体的な例を挙げながら分かりやすく簡単に解説していきます。相関関係と因果関係はビジネスシーンでつきまとう非常に重要な概念。違いについて明確に理解しておきましょう!...

欠損値を把握する

No data

続いて欠損値について確認していきましょう!

データによっては欠損値が存在する可能性があります。

欠損データをそのまま分析してしまうと様々な不都合が生じるので、欠損値に対しての対処方法はある程度おさえておくことが重要です。

欠損値については実はそれだけで1冊の書籍になってしまうのですが、ここでは簡単に確認しておきましょう!

実は欠損値には欠損の仕方によっていくつかのパターンがあります。

欠損値

そしてそんな欠損値の対処方法として欠損の生じているデータを削除してしまう方法や何らかの処理によって欠損値を埋める方法がいくつかあります。

ただ、実はLight gbmをはじめとする決定木モデルの機械学習手法では欠損値が生じていても問題なく利用できるんです。

線形回帰モデルニューラルネットワークを構築する場合は欠損値処理を行いましょう。

欠損値処理についてより詳しくは以下の記事で解説していますので是非チェックしてみてください!

欠損値
欠損値の発生パターンと補完方法!Pandasで確認・補完してみよう!当サイト【スタビジ】の本記事では、欠損があるデータの解析方法について説明していきます。欠損データ解析は非常に重要ですが知っておくべきことが多いので、まずは全体の概要と方法について理解してもらえたら嬉しいです。最後のパートではPandasで欠損値の補完をしていきますよ!...

外れ値を把握する

Data Trends

続いて外れ値を確認していきます。

外れ値があると推定精度が下がる可能性が高いので外れ値の有無を確認する作業は非常に大事です。

例えば、全く相関のないバラバラなデータがあったとき、そこに1つでも外れ値が紛れ込んでしまうと、一気に相関関係が生まれてしまうことになりかねません。

注意しましょう!

集計や層別を通してデータを可視化する

stories Data-pana

これ以外にもたくさんの切り口でEDAを行っていくことができます。

ある変数に注目して集計や層別を行うことが非常に重要です。

例えば、顧客の購入単価が毎年下がっていたとしても男女の性別データでデータを層別して見てみると男性は上がっていて女性が大きく下がっているのかもしれません。

月別に見てみると、冬のシーズンは変わらず夏のシーズンだけ極端に購入単価が下がっているかもしれません。

切り口を変えるとキリがないのですが、様々な観点でデータを切って可視化し比較していくクセはつけるようにしましょう!

探索的データ分析(EDA)を実データ×Pythonで実践!

pc python

それでは早速探索的データ分析(EDA)を実践してみましょう!

データコンペから実データを持ってこよう!

ここでは、Nishikaというデータコンペプラットフォームの一部のデータセットを使います。

データコンペのデータから不動産価格データというデータを選びそこからtrain.zipをダウンロードしてください。

train.zipを開くと中には以下のように複数のCSVファイルが入っています。

Matplotlib

今回はこれらをデータフレームとして結合させるところからデータの確認・可視化をおこなっていきます。

そのためにまずはライブラリをImportしてあげましょう!

globはディレクトリに格納されたファイル名を抽出するのに便利なライブラリで、今回は複数のファイルがtrainフォルダ内にデータとして格納されているのでそれらのファイル名を抽出するのに必要になります。

現在trainというフォルダにファイルが入っているとすると、以下のように記述することでtrain内のファイル名を全て抽出することができます。

この時、*はワイルドカードと呼ばれ、このようにワイルドカードを指定することで全てのファイル名を該当させることができます。

filesを見てみると以下のようになっていることが分かります。

[‘train/40.csv’,
‘train/41.csv’,
‘train/43.csv’,
‘train/42.csv’,
‘train/46.csv’,
‘train/47.csv’,
‘train/45.csv’,
‘train/44.csv’,
‘train/37.csv’,
‘train/23.csv’,
‘train/22.csv’,
・・・

各ファイル名がリスト形式で格納されていることが分かりますねー!

globは非常によく使うので是非覚えておいてください。

このデータフレームの中身を見てみると・・・

以下のようになっていることが分かります。

Nishika data

各ファイルそれぞれの格納されているサンプル数は違いますが、全て同じカラムになっています。

そのため、これらのデータをfor文で回して結合させ1つのデータフレームにしていきましょう!

これにて使うデータの準備が完了です。

データの量と質・欠損値を確認していこう!

それでは、先程の流れの通り、まずはデータの量と質を確認していきます。

このように記述してあげることで、データがどれくらいの行数・列数で格納されているのかが分かります。

(637351, 27)

63万行ものデータ数がありますが、実務でログデータなどを扱う場合は何千万行ものデータ数を扱うことも多いので、それほど多くはないです。

カラムの数は27個あるようです。

それぞれのカラムについて確認してみましょう!

以下のように記述してあげることで、データフレームのカラムについて確認することが可能です。

Nishika data2

カラム名の隣にNon-Null Countというのがあり、ここは欠損していないデータがどのくらいあるかが記載してあります。

よくよく見てみると、0 Non-Null Countというカラムが結構ありますねー!

実はこれは、データが1つも入っていないゴミカラムです。

ロボたん
ロボたん
え?!そんな状況あり得るの!?
ウマたん
ウマたん
設計時はデータがあったけど、計測時はデータとして入ってきていないようなデータはあるあるだよー!

そうなんです。実データってかなり汚いんです。

EDAをせずにそのままモデルに投入すると大変なことになるのがなんとなく分かりますね。

さらにカラムの型がObjectになっていることが分かります。

Object型とは各要素の型が異なっており、文字列のstr型や数値のInt型で格納されています。

例えば、面積(㎡)もObject型になっていますがどんなデータが格納されているのか確認してみましょう!

以下のように記述してあげることで、面積にはどんなデータが格納されているのかが分かります。

出力される行が省略されないようにpd.set_optionで最大出力を500行にしています。

出力されたデータを見てみると、実は2000㎡以上という文字列データが隠れていることが分かります。

このデータに関しては2000に変換してあげた方がよさそうですね。

以下のように変換してあげることで全て文字列が数値型にすることができました。

この時、ポイントなのはfloat型に変換してあげることです。

この場合は、面積データに欠損値すなわちNull値がないのでfloatの部分をintにしてあげても問題ないのですが、Null値がある場合はint型に変換することができません。

実はNull値はfloat型として定義されているのです。

Pandasのデータフレームの型変換で数値型に変換する際はfloat型で変換するのがベターです。

統計量を見ていこう!

続いて統計量を見ていきましょう!

describeを利用することで、簡単な統計量を確認することができます。

count 637351.000000
mean 58.663570
std 26.712019
min 10.000000
25% 45.000000
50% 65.000000
75% 75.000000
max 2000.000000
Name: 面積(㎡), dtype: float64

データ数、平均値、標準偏差、最小値、4分位点、最大値などが分かります。

面積の最小値は10㎡、最大値は2000㎡となっており、平均値は58㎡ほどのようです。

面積ごとのヒストグラムを見てみましょう!

ここでデータ可視化のライブラリMatplotlibの出番です!

Nishika ヒストグラム

200㎡以上は非常に少数になっているので200㎡以下でX軸を切っています。

50㎡〜80㎡あたりが家族世帯でのボリュームゾーンになっていて、25㎡部分が一人暮らし需要によりボリュームゾーンになっていることが見て取れますね。

相関関係を見ていこう!

続いて、これらの面積と不動産の売上の相関関係について見ていきましょう!

相関係数を計算してみると・・・

0.382755

であり小〜中程度の相関があることが分かります。

また、以下のように散布図を見てみると・・・

 

Nishika 散布図

やはり中程度の相関があることが分かります。

この時2000㎡以上のデータは非常に少数であり、全て2000㎡に丸めてしまっているので相関係数に大きな影響を与えている可能性があります。

相関係数は外れ値の影響を非常に受けやすいのです。

念の為2000㎡以上のデータを除外して相関係数を見てみましょう!

0.390629!

それほど変わらないですね。

探索的データ分析(EDA)のステップ まとめ

ここまでで探索的データ分析(EDA)についてまとめてきました!

EDAを学ぶにはやはりしっかり手を動かしながら学ぶことが大事です。

ここで取り上げたステップを様々なデータで試してみながらEDAの勘所を掴んでいきましょう!

EDAをおこなった後はデータの前処理や特徴量エンジニアリングといった作業に進んでいきます。

CRISP-DMでいうところのData preparation(データ準備)の工程であり地味ですが非常に重要であり、この部分がモデルの精度を左右します。

Data preparationにおいて重要な特徴量エンジニアリングについては以下の記事で解説していますので是非チェックしてみてください!

特徴量エンジニアリング
機械学習で重要な特徴量エンジニアリングとは?当サイト【スタビジ】の本記事では、精度の高いモデルを構築する上で非常に重要な特徴量エンジニアリングについて簡単に解説していきます。特徴量エンジニアリングの流れやテクニックを知っているのと知っていないのとではたたき出すアウトプットの質が全く違うので必ず理解しておきましょう!...

また機械学習手法については以下の記事でまとめていますので合わせてチェックしてみてください!

機械学習
機械学習入門に必要な知識と勉強方法をPythonとRの実装と一緒に見ていこう!当サイト【スタビジ】の本記事では、入門者向けに機械学習についてカンタンにまとめていきます。最終的にはどのように機械学習を学んでいけばよいかも見ていきます。細かい手法の実装もPython/Rを用いておこなっていくので適宜参考にしてみてください。...
Pythonを初学者が最短で習得する勉強法

Pythonを使うと様々なことができます。しかしどんなことをやりたいかという明確な目的がないと勉強は捗りません。

Pythonを習得するためのロードマップをまとめましたのでぜひチェックしてみてくださいね!