Explanatory Data Analysis(略してEDA):探索的データ解析
正直、Pythonには便利なライブラリがたくさんあるため、つい軽視してましたが、
やはり分布は大事
最近そう思うことが多々ありました。
そこでPythonのヴィジュアライゼーションライブラリのseabornを自分用に簡単に纏めてみます。
データセットはTitanic。簡単なデータ前処理を行って早速、データの可視化を進めてまいりましょう。
参考↓↓
[Python: seaborn を使った可視化を試してみる]
(https://blog.amedama.jp/entry/seaborn-plot)
[Seabornの全メソッドを解説(その1:グラフ一覧)]
(https://own-search-and-study.xyz/2017/05/02/seaborn%E3%81%AE%E5%85%A8%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%82%92%E8%A7%A3%E8%AA%AC%EF%BC%88%E3%81%9D%E3%81%AE%EF%BC%91%EF%BC%9A%E3%82%B0%E3%83%A9%E3%83%95%E4%B8%80%E8%A6%A7%EF%BC%89/)
[seabornの細かい見た目調整をあきらめない]
(https://qiita.com/skotaro/items/7fee4dd35c6d42e0ebae)
import
#matplotlibはpltで読み込むことが多く、seabornはsnsで読み込むことが多いです
import seaborn as sns
import matplotlib.pyplot as plt
#下記によりグラフ内文字の日本語が正常に表示されます。
import japanize_matplotlib
Relational Plot
Scatterplot(散布図)
sns.scatterplotで散布図を描画することが可能です。
オプションとしてhue=色分け、style=プロットの形変える size=プロットの大きさ変えることができます
#下記で表示グラフのサイズ調整が出来ます
plt.figure(figsize=(20, 10))
sns.scatterplot(data=train_x, x="Age" ,y="Fare",hue="Sex",style="Sex",size="Pclass")
年齢と運賃にはあまり相関はなさそう。
↓試しに相関を表示したらやはり全くない↓
res = train_x["Age"].corr(train_x["Fare"])
print(res)
0.09668842218036484
lineplot(折れ線グラフ)
#下記でサイズの調整が可能。
plt.figure(figsize=(30,5))
sns.lineplot(data=line_plot_test[line_plot_test["month"]=="February"],x="year",y="passengers")
#replotを使うことで、複数の折れ線グラフを表示することができます
sns.relplot(data=line_plot_test,kind="line",x="year",y="passengers",col="month",col_wrap=5)
Categorical Plot
Scatterplot(ストリップチャート)
sns.stripplot(data=titanic,x="pclass",y="age",hue="sex",dodge=True)
↓dodge = Falseを選択するとcol毎に分枯れていたグラフが統一される↓
sns.stripplot(data=titanic,x="pclass",y="age",hue="sex",dodge=False)
↓catplotでオプションcolを指定すると複数のグラフに分けることができる↓
sns.catplot(data=titanic,kind="strip",x="pclass",y="age",hue="sex",col="survived",dodge=True)
Swarmplot(スワムチャート)
ストリップチャートは要素が重なっていたけど、重なりを除外したものがこちら。 swarmplot() 関数を使うことで描画できる。
sns.swarmplot(data=titanic,x="pclass",y="age")
Boxplot(箱ひげ図)
sns.boxplot(data=titanic,x="pclass",y="age")
#stripchartと同様、catplotを利用するが(kind="box")を指定する
sns.catplot(data=titanic,kind="box",x="pclass",y="age",hue="survived",col="sex")
violinplot(バイオリン図)
#"inner"を指定すると内部を編集できる
sns.violinplot(data=titanic,x="pclass",y="age",inner="stick")
#グラフを重ね合わせることも可能
ax=sns.violinplot(data=titanic,x="pclass",y="age",inner="stick")
sns.stripplot(data=titanic,x="pclass",y="age",color="k",ax=ax)
#hueを指定することでグラフの色を分けて表示することも可能
sns.violinplot(data=titanic,x="pclass",y="age",hue="survived",split=True)
#複数表示する時は、同様にcatplotを利用
sns.catplot(data=titanic,x="pclass",y="age",kind="violin",hue="survived",col="sex",split=True)
boxen plot(箱ひげ図改良グラフ)
sns.boxenplot(data=titanic,x="pclass",y="age",hue="survived")
#こちらもcatplotで複数グラフの表示が可能。kind="boxen"
sns.catplot(data=titanic,x="pclass",y="age",kind="boxen",col="sex")
Point Plot
#平均値と信頼区間だけの表示に絞られたシンプルなグラフ。
sns.pointplot(data=titanic,x="pclass",y="age",hue="sex")
#複数表示させる時はcatplotにして、kind=pointとする
sns.catplot(data=titanic,x="pclass",y="age",kind="point",hue="survived",col="sex",color="b")
barplot(棒グラフ)
sns.barplot(data=titanic,x="pclass",y="age",color="b",hue="sex")
ヒゲはブートストラップ信頼区間らしいのですが、いまいちよく分からないので調べます。
あと棒グラフの値は平均値を表しています。これもestimaterという引数で変更できそう。
#複数グラフを描く時は、kind="bar"を指定する
sns.catplot(data=titanic,kind="bar",x="pclass",y="age",col="sex",hue="survived",color="b")
countplot
sns.countplot(data=titanic,x="pclass",hue="sex",color="b")
sns.countplot(data=titanic,y="pclass",hue="sex",color="b")
sns.catplot(data=titanic,kind="count",y="pclass",col="sex",hue="survived",color="b")
Distribution Plot
displot(ヒストグラム)
iris = sns.load_dataset("iris")
iris.head()
#階級の数はbinsで指定できる
sns.distplot(iris.petal_length,bins=20)
#kdeオプションで確率密度関数を削除できる
sns.distplot(iris.petal_length,bins=20,kde=False)
#heightやaspectで大きさ調整
sns.distplot(iris.petal_length,,bins=10,height=5,aspect=2)
kdeplot
KDE (Kernel Density Estimation) はカーネル密度推定という。 分布から確率密度関数を推定するのに用いる。
確率密度関数についてはもっとよく勉強しますが、単純なヒストグラフを連続にしたイメージ?
sns.kdeplot(iris.sepal_length)
sns.kdeplot(iris.petal_length,iris.sepal_length,shade=True)
rugplot
値の登場する位置に特化したグラフ。
sns.rugplot(iris.petal_length)
#重ね合わせて使うと値の出現とその個数の関連性が見える?
ax = sns.distplot(iris.petal_length)
sns.rugplot(iris.petal_length,ax=ax)
joint plot
joint plot は二つのグラフの組み合わせ。 デフォルトでは散布図とヒストグラムが同時に見られる。
sns.jointplot(data=iris,x="petal_length",y="petal_width")
#kind = "kde"を指定すると確率密度関数になります
sns.jointplot(data=iris,x="petal_length",y="petal_width",kind="kde")
#kind="hex"にすると特徴的なグラフになります
sns.jointplot(data=iris,x="petal_length",y="petal_width",kind="hex")
parplot
sns.pairplot(data=iris)
表示する次元を絞る時はvarsオプションで指定
sns.pairplot(data=iris,hue="species",vars=["petal_length","petal_width"])
kind="reg"を指定すると一次回帰直線も表示できる
sns.pairplot(data=iris,kind="reg")
Matrix Plot
heat map
#annot=Trueをつけることで実際の値を表示することも可能
sns.heatmap(data=iris.corr(),annot=True)