

データの可視化
データサイエンスにとって、収集したデータがモデルの前提条件に合致しているか。または、探索的にデータを関係性を確認する作業が必要です。
その作業をデータの可視化と呼びます。データの可視化は情報量が少ないと、解釈が簡単になります。反対に、情報量が多いと、解釈が難しくなります。
つまり、情報量と解釈がトレードオフになっています。
情報量が少なく、解釈が簡単なグラフ
棒グラフや折れ線グラフ
これらのグラフをみても、平均値と標準偏差、平均値と信頼区間しか分かりません。
数値そのままや頻度を表しただけのグラフなら問題ないですが、要約統計量のみのグラフでは問題がある可能性があります。(回りくどい言い方ですいません)
情報量が多く、解釈が困難なグラフ
散布図や今回紹介するドットプロット(どちらも同じようなものですが)
これらのグラフをみても、平均値や標準偏差は分かりません。しかし、おおまかなデータの分布は分かります。分布が分からないと、平均値や標準偏差などの基本統計量に意味はありません。分布が分からないと統計モデルも問題が生じる可能性があります。
下の論文でも、棒グラフしか提示しないのは問題だとしています。
Python初心者が勉強する資料には、棒グラフや折れ線グラフ、または散布図はあっても、意外とドットプロットはありません。
【Python初心者】matplotlibとseabornで散布図を描いてみよう(データの可視化)
ということで、今回はPythonでドットプロットを描く方法をみていきましょう。
必要なライブラリをインポート
import matplotlib.pyplot as plt import seaborn as sns import japanize_matplotlib %matplotlib inline plt.style.use("ggplot")
アイリスデータを使用する
iris = sns.load_dataset("iris") iris
iris.info()
“sepal_length”は小数点を含む数値(float64)
“species”は文字(object)
であることが分かります。では、”species”別に、”sepal_length”の数値を可視化するために、ドットチャートを描画してみましょう。
その前に、グラフ化のたびに、sepal_lengthやspeciesと入力するのは面倒なので、短い文字でできるようにします。
グラフ化する変数を指定する
val = "sepal_length" # "sepal_length"を val と指定する tgt = "species" # "species"を tgt と指定する
ドットプロットを描画する
seabornのcatplotで描画
sns.catplot(x=tgt, y=val, data=iris, jitter=False) plt.title(tgt+" - "+val) plt.show()
グラフのタイトルはどうでもいいですが、1行でドットプロットが描画できます。簡単ですね。これで、各点の配置が分かります。
しかし、このグラフでは点が重なっているため、多くの点が密集していたら、よく分かりません。各点が分かるように、点を横にずらしてみましょう。
sns.catplot(x=tgt, y=val, data=iris) plt.title(tgt+" - "+val) plt.show()
これで、点の重なりがなくなり、より分布が分かりやすくなりましたね。
matplotlibのscatterで描画
fig=plt.figure(figsize=(6,4),dpi=150) plt.scatter(iris[tgt], y=iris[val],s=10) plt.title(tgt+" - "+val,size=10) plt.show()
出力:
scatter(散布図)でも同じようなドットプロットが描けます。
好みの問題ですね。
fig=plt.figure(figsize=(6,4), dpi=150) plt.scatter(iris[tgt], y=iris[val], s=10) plt.title(tgt+" - "+val,size=10) plt.xlim(-0.3, 2.3) # x軸の描画範囲を指定 plt.ylim(0, 8.2) # y軸の描画範囲を指定 plt.show()
基本的にはデータがある範囲だけがグラフ化されますが、びっくりグラフにならないように、y軸を0から描画させることも大切です(割合が知りたい場合など)
seabornのswarmplotで描画
plt.figure(figsize=(6,4), dpi=150) sns.swarmplot(x=iris[tgt], y=iris[val], data=iris) plt.title(tgt+" - "+val, size=10) plt.ylabel(val) plt.show()
このグラフは点が多い箇所は横に広がるため、よりデータの分布が分かりやすいですね。
seabornのboxplotと一緒に描画
plt.figure(figsize=(6,4), dpi=150) sns.boxplot( x=iris[tgt], y=iris[val], width=0.5) sns.swarmplot(x=iris[tgt], y=iris[val], data=iris, color="r") plt.title(tgt+" - "+val, size=10) plt.ylabel(val) plt.show()
ドットプロットのみでは、データの解釈分からない場合は、箱ひげ図も一緒に描画してみましょう。
中央値や四分位範囲、外れ値が分かりやすいですね。
【Python】matplotlib.styleでいろんなグラフを描く(棒グラフ編)
コメント