見出し画像

【DataCamp】22 Exploratory Data Analysis in Python-②Distributions

DataCampのExploratory Data Analysis in Python。①のRead, clean, and validateは今までの復習ですが、②Distributionsから難しくなってきます。

今回は、②Distributionsの内容をまとめてみました。また、Jupyter notebookで実行してみて、うまく動かない部分は補足しました。


HDF5ファイルをインポート

今回用意されているデータ、'gss'はHDF5ファイルです。HDF5とは、Hierarchical Data Format version 5の略。大量の数値データを保存するスタンダード。

今回のコースは、15 Introduction to Importing Data in Pythonの時とインポートの仕方が違います。まずは、15Introduction to Importing Data in Pythonの方法でインポートして、構造を調べてみました。

h5pyパッケージをインポートしてから、ファイルをインポートします。

画像21

dataの型は<class 'h5py._hl.files.File'>でした。

辞書と同様、keys()メソッドで構造を調べます。これは、辞書のすべてのキーを取り出すメソッドです。

画像22

一番上の階層はgssのみ。

画像23

次の階層は上のようになっていました。

それぞれの値を見てみましょう。

画像23

画像2



さて、今回のコースでは、pd.read_hdfでファイルをインポートしています。

gss=pd.read_hdf('gss.hdf5', 'gss')

一つ目の引数がファイル名なのはいいとして、2つ目の引数はなんでしょう?先ほど調べた構造の、一番上の階層のgssだとは思いますが。

画像3

2番目の引数 key:記憶容量の中のグループの識別子。HDFファイルが一つしかpandas objectを持っていない時は省略できる。

画像4

今回は、一番上の階層がgssだけなので、省略しても出力は同じでした。


PMF(確率質量変数)

Pmfprobability mass function(確率質量変数)を計算するクラスです。

xを取得する可能性

Pmfクラスはempiricaldistライブラリ経由でアクセスできます。Python library that represents empirical distribution functions. empiricaldistは経験分布関数を表すライブラリ。

まずはAnaconda Promptでempiricaldistをインストールします。(コマンドプロンプトでインストールしても、Anacondaで使えない?)

empiricaldist 0.6.2

pip install empiricaldist


早速使ってみましょう。

画像5

あれ?エラー…。

画像6

normalize消して出てきたのは何だろう?

画像7

from_seqでも、答え違う…。

画像8

ヒストグラムを見ると、DataCampのスライドとy軸の値がかなり異なります。教育期間が12.5-13.75年の人数が25,000人弱ですが、スライドでは60,000人弱でした。コースのトップ画面からダウンロードできるgss.hdf5ファイルのデータと、本編で扱っているデータが違うようです。(何で???)

画像9

値が違うのはあきらめて、進めてみましょう。

教育年数ごとの人数の最初の5行を出力します。normalize=False

画像10

あれ?head()なのに3行しか表示されない…。カウントなのに列名はprobsなのもややこしい。


画像11

12年教育を受けたのは19,145人。


カウントではなく割合が知りたい場合は、normalize=True(デフォルトなのでなくてもよい)にする。

画像30

画像13

12年教育を受けたのは約3割。

PMFを棒グラフにすると

画像14

高校卒業の12年に一番のピークがある。大学2年卒の14、大学4年卒の16にもピークがある。ヒストグラムよりも、どこにピークがあるか分かりやすい。

ちなみに、PmfはPmf.bar()(棒グラフ)Pmf.plot()(線グラフ)の2つのplotting functionsを提供します。


CDF(累積分布関数)

Cumulative distribution function

x以下の値を取得する可能性

Cdfクラス

画像15

Cdfオブジェクトは関数として利用できるため、年齢を指定すると対応する確率が返される。

画像16

回答者の66%が51歳以下。

CDFは可逆関数なので、確率pの対応するqを調べることができる。

画像18

画像17

回答者の25%が30歳以下で、75%が57歳以下。

30歳はこの分布の25%点(Q1)、57歳は75%点(Q3)。

四分位範囲(IQR)はQ3-Q1。分布の広がりを表すため、標準偏差や分散に似ている。分散のように外れ値やエラーによる影響がない。


回答者の男女別の年齢分布。スライド通りに書くと凡例が表示されないので、plt.legend()を忘れずに。

画像23

男女でやや差があるが、誤差。

CDFでもやってみる。

画像23

一般的にPMFよりCDFの方が滑らか。ランダム性を平らにするため。分布間の違いをより見ることができる。


1995年以前と以後の収入のPMF。固有値が多すぎる。PMFはノイズが多すぎて、分布の形がわからない。

画像24

CDFを利用すると、より鮮明になる。

画像25

高所得者の収入は増加している。


PDF(確率密度関数)

まずはsampleという標準正規分布に従う仮のデータを作成し、そのCDFをプロットする。

np.random 
numpy.randomモジュール。randomモジュールと違い、numpyをインポートすると使える。

np.random.normal(loc=0.0, scale=1.0, size=None)
normal distribution(正規分布)に従う乱数を返す。デフォルトはloc(平均)=0, scale(標準偏差)=1の標準正規分布。

画像28

正規分布から1000個のランダム値を生成し、そのCDFをプロット。

画像26

シグモイド曲線は、正規分布で見られる。


次に正規分布を作成する。

np.linspace(start, stop, num=50, …)
最初の値=start、最後の値=stop、要素数=numの等差数列を生成する。要素数のデフォルトは50個。

画像29

Scipyはnormと呼ばれる正規分布を表すオブジェクトを提供する。

画像27

注意! ここのcdfはfrom empiricaldist import Cdfではないので、Cdf.from_seqにしない。

sampleのCDFは、全範囲で通常のCDFに近い。これが実際のデータである場合、正規分布がデータの適切なモデルであると結論付ける。

normオブジェクトは確率密度関数(PDF)を評価する.pdfも提供する。

画像30

典型的なベルカーブ。

残念ながら、このPDFをsampleのPMFと比較するとうまく機能しない。

画像31

ランダムサンプルではすべての値が一意なので、確率はすべて1/1000になる。

しかし、サンプル内のポイントを使用して、それらが由来する分布のPDFを推定することができる。このプロセスをカーネル密度推定(KDE)と呼ぶ。これはPMFからPDFに移行する方法

KDEプロットを生成するために、Seabornをインポートする。Seabornはサンプルを取得し、PDFを推定し、それをプロットするkdeplotを提供する。

画像32

KDEプロットと通常のPDFを比較する。

画像33

KDEプロットと通常のPDFはよくマッチしているように見えるが、CDF同士を比較した時よりは違いが大きく見える。

PDFは違いを見るのにより感度が高いが、多くの場合感度が高すぎる。明らかな違いを意味するのか、単にランダムなのかを判断するのは難しい。


まとめ

一般に、データを探索するときはCDFを使用する。

CDFにあまり慣れていない観衆に結果を提示する場合、一意の値が少ない分布はPMF、多い分布はKDEを使用する。





この記事が気に入ったらサポートをしてみませんか?