【Python初心者が知らない】ドットプロットでデータを可視化する簡単な方法

スポンサーリンク
Python
ゼロ知識の初心者がデータサイエンスを完全無料で学習する方法5選
データサイエンスの知識や技術、またはPythonについて学びたい。でも「大学に行くほど本気度がない」、「スクールに行くほどお金がない」、なんせ「時間がない」という方も多いはずです。というよりほとんどの方がそうだと思います(当然わたし...
初心者に人気のプログラミング言語Pythonは独学可能か?
Pythonは非常に人気のあるプログラミング言語で、まったくの初心者でも独学が可能と言われています。 Pythonはさまざまな目的に使える、汎用性のあるプログラミング言語です。 プログラミングは「独学が難しい」と言われていま...

データの可視化

データサイエンスにとって、収集したデータがモデルの前提条件に合致しているか。または、探索的にデータを関係性を確認する作業が必要です。

その作業をデータの可視化と呼びます。データの可視化は情報量が少ないと、解釈が簡単になります。反対に、情報量が多いと、解釈が難しくなります。

つまり、情報量と解釈がトレードオフになっています。

情報量が少なく、解釈が簡単なグラフ

棒グラフや折れ線グラフ
これらのグラフをみても、平均値と標準偏差、平均値と信頼区間しか分かりません。
数値そのままや頻度を表しただけのグラフなら問題ないですが、要約統計量のみのグラフでは問題がある可能性があります。(回りくどい言い方ですいません)

情報量が多く、解釈が困難なグラフ

散布図や今回紹介するドットプロット(どちらも同じようなものですが)
これらのグラフをみても、平均値や標準偏差は分かりません。しかし、おおまかなデータの分布は分かります。分布が分からないと、平均値や標準偏差などの基本統計量に意味はありません。分布が分からないと統計モデルも問題が生じる可能性があります。

下の論文でも、棒グラフしか提示しないのは問題だとしています。

Beyond Bar and Line Graphs: Time for a New Data Presentation Paradigm
A systematic review of research articles reveals widespread poor practice in the presentation of continuous data. The authors recommend training for investigato...

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でいろんなグラフを描く(棒グラフ編)

【Python】matplotlib.styleでいろんなグラフを描く(ヒストグラム編)

コメント

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