よくある質問#

これは、seabornに関してよく寄せられる質問への回答を集めたものです。

はじめに#

seabornをインストールしたのに、インポートできないのはなぜですか?#

pip install seabornを実行してseabornを正常にインストールしたように見えますが、インポートできません。実行すると「ModuleNotFoundError: No module named 'seaborn'」のようなエラーが発生します。

これはおそらく、seabornの問題では*ありません*。コンピュータに複数のPython環境がある場合、ある環境でpip installを実行し、別の環境でライブラリをインポートしようとした可能性があります。Unixシステムでは、ターミナルコマンドwhich pipwhich python、および(該当する場合)which jupyterが同じbin/ディレクトリを指しているかどうかを確認できます。そうでない場合は、$PATH変数の定義を整理する必要があります。

pipでインストールするための2つの代替パターンも、この問題に対してより堅牢である可能性があります。

  • pip install <package>ではなく、python -m pip install <package>を使用してコマンドラインでpipを呼び出します。

  • Jupyterノートブックで%pip install <package>を使用して、カーネルと同じ場所にインストールします。

seabornをインポートできません。インストールしたはずなのに!#

seabornを正しい場所にインストールしたことは確実ですが、インポートすると長いトレースバックとわかりにくいエラーメッセージが表示されます。たとえば、ImportError: DLL load failed: The specified module could not be foundのようなメッセージです。

このようなエラーは通常、Pythonライブラリがコンパイル済みのリソースを使用する方法に問題があることを示しています。seabornは純粋なPythonであるため、これらの問題に直接遭遇することはありませんが、その依存関係(numpy、scipy、matplotlib、およびpandas)が遭遇する可能性があります。問題を解決するには、まずトレースバックを読み、エラー時にどの依存関係がインポートされていたかを把握する必要があります。次に、関連するパッケージのインストールドキュメントを参照してください。ドキュメントには、特定のシステムでインストールを機能させるためのアドバイスが記載されている場合があります。

これらの問題の最も一般的な原因は、多くのコンパイル済みコンポーネントを持つscipyです。seabornバージョン0.12以降では、scipyはオプションの依存関係であるため、これらの問題の頻度が減るはずです。

プロットが表示されないのはなぜですか?#

seabornの関数(ターミナルまたは統合されたIPythonコンソールを備えたIDEで使用している可能性があります)を呼び出していますが、プロットが表示されません。

matplotlibでは、図を*作成*することと*表示*することには区別があり、場合によっては、プロットを表示したいときにmatplotlib.pyplot.show()を明示的に呼び出す必要があります。そのコマンドはデフォルトでブロックされ、常に望ましいとは限らない(たとえば、ディスクにファイルを保存するスクリプトを実行している場合)ため、seabornはここで標準のmatplotlibプラクティスから逸脱しません。

しかし、seabornドキュメントのほとんどの例にはこの行がありません。これは、それを必要としないように回避する方法が複数あるためです。「inline」(デフォルト)または「widget」バックエンドを備えたJupyterノートブックでは、セルの実行後にmatplotlib.pyplot.show()が自動的に呼び出されるため、すべての図がセルの出力に表示されます。JupyterまたはIPythonインターフェースで%matplotlibを実行するか、Pythonの任意の場所でmatplotlib.pyplot.ion()を呼び出すことで、よりインタラクティブなエクスペリエンスを有効にすることもできます。どちらの方法でも、すべてのプロットコマンドの後に図を表示または更新するようにmatplotlibが構成されます。

なぜノートブックのセルごとに何かがプリントされるのですか?#

Jupyterノートブックでseabornを使用しており、すべてのセルでプロットを表示する前に、<AxesSuplot:>または<seaborn.axisgrid.FacetGrid at 0x7f840e279c10>のようなものがプリントされます。

Jupyterノートブックは、セルの最後のステートメントの結果を出力の一部として表示し、seabornのプロット関数のそれぞれは、プロットを含むmatplotlibまたはseabornオブジェクトへの参照を返します。これが気になる場合は、いくつかの方法でこの出力を抑制できます。

  • 常に最後のステートメントの結果を変数に割り当てます(例:ax = sns.histplot(...)

  • 最後のステートメントの最後にセミコロンを追加します(例:sns.histplot(...);

  • 戻り値がない関数(たとえば、plt.show()。これは必要ではありませんが、問題も発生しません)で各セルを終了します。

  • ノートブックを別の表現に変換する場合は、セルのメタデータタグを追加します。

Jupyterノートブックでプロットがぼやけて見えるのはなぜですか?#

デフォルトの「inline」バックエンド(IPythonによって定義されています)は、図の出力に異常に低いdpi(「dots per inch」)を使用します。これは省スペース対策です。dpiが低い図は、ディスク容量をあまり消費しません。(また、dpiの低いインライングラフィックは、PNGとして表示されるため、*物理的に*小さく見えます。PNGは厳密には解像度の概念を持っていません。)したがって、経済性と品質のトレードオフに直面します。

matplotlib APIを使用してrcパラメーターをリセットすることにより、DPIを増やすことができます。

plt.rcParams.update({"figure.dpi": 96})

または、seabornテーマをアクティブにするときに行います。

sns.set_theme(rc={"figure.dpi": 96})

高ピクセル密度モニターをお持ちの場合は、「retina mode」を使用してプロットをより鮮明にすることができます。

%config InlineBackend.figure_format = "retina"

これにより、Jupyterインターフェースでのプロットの表示サイズは変わりませんが、他のコンテキスト(つまり、GitHub上)では非常に大きく表示される可能性があります。また、4倍のディスク容量を消費します。または、SVGプロットを作成することもできます。

%config InlineBackend.figure_format = "svg"

これにより、matplotlibは「無限の解像度」を持つベクターグラフィックを出力するように構成されます。欠点は、ファイルサイズがプロット内のアーティストの数と複雑さに比例するようになり、場合によっては(たとえば、大きな散布図行列)、読み込みがブラウザの応答性に影響を与えることです。

ややこしい概念#

「figure-level」と「axes-level」とはどういう意味ですか?#

seabornのドキュメント、StackOverflowの回答、またはGitHubスレッドで、「figure-level」または「axes-level」という用語を目にしたことはあるかもしれませんが、その意味がわかりません。

簡単に言うと、seabornのすべてのプロット関数は、次の2つのカテゴリのいずれかに分類されます。

  • 関数が呼び出されたときに存在するかもしれないし、存在しないかもしれない単一のサブプロットにプロットする「axes-level」関数

  • matplotlib図を内部的に作成する「figure-level」関数。複数のサブプロットが含まれる可能性があります。

この設計は、次の2つの目的を達成することを意図しています。

  • seabornは、matplotlibメソッドの「ドロップイン」代替となる関数を提供する必要があります。

  • seabornは、個別のサブプロットに「ファセット」または周辺分布を示す図を生成できる必要があります。

figure-level関数は常に、1つ以上のaxes-level関数とレイアウトを管理するオブジェクトを組み合わせます。したがって、たとえば、relplot()は、scatterplot()またはlineplot()のいずれかをFacetGridと組み合わせるfigure-level関数です。対照的に、jointplot()は、複数の異なるaxes-level関数(デフォルトではscatterplot()histplot())をJointGridと組み合わせることができるfigure-level関数です。

もし、seabornの関数を一度呼び出すだけでプロットを作成しているだけであれば、あまり気にする必要はありません。しかし、各関数のAPIが提供する以上のレベルでカスタマイズしたい場合には重要になります。また、さまざまな混乱の原因にもなるため、少なくとも大まかに理解し、覚えておくべき重要な区別です。

この点については、チュートリアルこのブログ記事で詳しく説明されています。

「カテゴリカルプロット」または「カテゴリカル関数」とは何ですか?#

この概念は、図レベル/軸レベルの区別と並んで、おそらく混乱を招く2番目に大きな原因でしょう。

いくつかのseaborn関数は、プロットのxまたはy変数がカテゴリカル(つまり、変数が有限の非数値の値を取る)ユースケースをサポートするように設計されているため、「カテゴリカル」と呼ばれています。

これらの関数が作成された当時、matplotlibは非数値データ型を直接サポートしていませんでした。そのため、seabornは内部的に、データ内の一意の値から0ベースの整数インデックスへのマッピングを構築し、それをmatplotlibに渡しています。データが文字列の場合、それは素晴らしいことであり、matplotlibが現在文字列型のデータを処理する方法とほぼ一致します。

ただし、注意すべき点は、これらの関数は、x変数とy変数の両方が数値の場合でも、*デフォルトで常にこれを行う*ということです。これにより、特にカテゴリカルプロットと非カテゴリカルプロット(例えば、棒グラフと折れ線グラフの組み合わせ)を混在させると、多くの混乱を招く動作が発生します。

v0.13リリースでは、この動作を制御できるnative_scaleパラメーターが追加されました。デフォルトではFalseですが、Trueに設定すると、カテゴリカルグループ化に使用されるデータの元のプロパティが保持されます。

データの指定#

データはどのように整理する必要がありますか?#

seabornを最大限に活用するには、データは「ロングフォーム」または「tidy」な表現である必要があります。データフレームでは、これは、各変数が独自の列を持ち、各観測値が独自の行を持ち、各値が独自のセルを持つことを意味します。ロングフォームのデータを使用すると、データセット内の変数(列)をプロット内の役割に割り当てることで、視覚化を簡潔かつ正確に指定できます。

データの整理は、データがロングフォームで収集または保存されないことが多いため、初心者にとって共通のつまずきやすい点です。したがって、プロットする前にpandasを使用してデータをリシェイプする必要があることがよくあります。データのリシェイプは、データフレームの構造とpandas APIの両方の確かな把握を必要とする複雑な作業になる可能性があります。このスキルを開発するために時間を費やすと、大きな利益が得られる可能性があります。

しかし、seabornはロングフォームのデータが提供された場合に*最も*強力ですが、ほぼすべてのseaborn関数は「ワイドフォーム」データも受け入れてプロットします。これは、他のプロット変数(xy、...)を指定せずに、seabornのdata=パラメーターにオブジェクトを渡すことでトリガーできます。ワイドフォームデータを使用する場合は制限されます。各関数は、1種類のワイドフォームプロットしか作成できません。ほとんどの場合、seabornは、同じ構造のデータセットでmatplotlibまたはpandasが実行する内容と一致させようとします。データをロングフォームにリシェイプすると、柔軟性が大幅に向上しますが、プロセスの非常に早い段階でデータをすばやく確認するのに役立ち、seabornはこれを可能にしようとします。

データがどのように表現されるべきか、そしてデータが乱雑な状態から始まる場合にそれをどのように取得するかを理解することは、seabornを効率的かつ完全に利用するために非常に重要であり、ユーザーガイドで詳細に説明されています。

seabornはpandasでのみ機能しますか?#

一般的に、そうではありません。seabornは、データセットがどのように表現される必要があるかについて非常に柔軟です

ほとんどの場合、複数のベクトル型で表現されるロングフォームデータを、xy、またはその他のプロットパラメーターに直接渡すことができます。または、DataFrameではなく、ベクトル型の辞書をdataに渡すこともできます。また、ワイドフォームデータでプロットする場合は、2D numpy配列またはネストされたリストを使用して、ワイドフォームモードでプロットできます。

いくつかの古い関数(具体的には、catplot()lmplot())は、pandas.DataFrameを渡す必要があります。しかし、現時点ではこれらは例外であり、次のいくつかのリリースサイクルでより柔軟になるでしょう。

レイアウトの問題#

図のサイズを変更するにはどうすればよいですか?#

これは、matplotlibで図のサイズを変更する方法が複数あり、seabornの図レベル/軸レベルの区別があるため、思ったより複雑になります。

matplotlibでは、通常、rcパラメーター、特にfigure.figsizeを通じて、すべての図のデフォルトサイズを設定できます。また、図を作成するときに個々の図のサイズを設定できます(例えば、plt.subplots(figsize=(w, h)))。軸レベルのseaborn関数を使用している場合、これらは両方とも期待どおりに機能します。

図レベルの関数は、デフォルトの図のサイズを無視し、図のサイズを異なる方法でパラメーター化します。図レベルの関数を呼び出すときは、各*サブプロット*のサイズを(大まかに)設定するために、height=aspect=に値を渡すことができます。ここでの利点は、ファセット変数を追加すると、図のサイズが自動的に調整されることです。しかし、混乱を招く可能性があります。

幸い、関数に依存しない方法で正確な図のサイズを設定する一貫した方法があります。図を作成するときに図のサイズを設定する代わりに、プロット後にobj.figure.set_size_inches(...)を呼び出すことで変更します。ここで、objはmatplotlibの軸(通常はaxに割り当てられます)またはseabornのFacetGrid(通常はgに割り当てられます)のいずれかです。

FacetGrid.figureはseaborn >= 0.11.2でのみ存在することに注意してください。それより前では、FacetGrid.figにアクセスする必要があります。

また、pngを作成している場合(またはJupyterノートブックで)、dpiを変更することで、すべてのプロットを拡大または縮小できます(おそらく驚くかもしれませんが)。

seabornが指示した場所にプロットを描画しないのはなぜですか?#

1つ以上のサブプロットを含むmatplotlibの図を明示的に作成し、その上にseabornプロットを描画しようとしましたが、余分な図と空白のサブプロットが表示されてしまいます。おそらく、あなたのコードは次のようになります。

f, ax = plt.subplots()
sns.catplot(..., ax=ax)

これは、図レベル/軸レベルの落とし穴です。図レベルの関数は常に独自の図を作成するため、軸レベルの関数で行うことができるように、既存の軸に向けることはできません。ほとんどの関数は、この状況が発生すると警告し、適切な軸レベルの関数を提案し、ax=パラメーターを無視します。一部の古い関数は(内部的に軸レベルの関数にaxを渡すため)、プロットを目的の場所に配置する可能性がありますが、それでも余分な図を作成します。後者の動作はバグと見なされるべきであり、依存すべきではありません。

現在の仕組みでは、matplotlibの図を自分で設定するか、図レベルの関数を使用できますが、両方を同時に行うことはできません。

棒/箱/ストリップ/バイオリンプロットの上に線を描画できないのはなぜですか?#

複数のseaborn関数を使用して1つのプロットを作成しようとしています。おそらく、barplotまたはviolinplotの上にlineplotまたはregplotを描画しようとしています。線が各ボックス(など)の平均値を通過することを期待していますが、位置がずれているように見えるか、完全に横にずれている可能性があります。

あなたは「カテゴリカルプロット」を別のプロットタイプと組み合わせようとしています。もしあなたのx変数が数値型の場合、これはうまくいくように思えるかもしれません。しかし、思い出してください。seabornのカテゴリカルプロットは、カテゴリカル軸上の一意な値を整数インデックスにマッピングします。したがって、もしあなたのデータが一意なx値として1, 6, 20, 94を持っていた場合、対応するプロット要素は0, 1, 2, 3に描画されます(そして、ティックラベルは実際の値を表すように変更されます)。

折れ線グラフや回帰プロットは、このマッピングが行われたことを認識していないため、実際の数値を使用し、プロットはまったく揃いません。

現時点では、これを回避する方法は2つあります。線を引く必要がある状況では、同じく「カテゴリカル」関数であり、同じルールを使用してプロットを描画する(やや誤解を招く名前の)pointplot()関数を使用できます。もしこれが問題を解決しない場合(例えば、lineplot()ほど視覚的な柔軟性がない場合)、実際の値から整数インデックスへのマッピングを自分で実装し、その方法でプロットを描画できます。

unique_xs = sorted(df["x"].unique())
sns.violinplot(data=df, x="x", y="y")
sns.lineplot(data=df, x=df["x"].map(unique_xs.index), y="y")

これは、計画されている将来のリリースではより簡単になります。カテゴリカル関数が数値データを数値として扱うことが可能になるためです。(v0.12の時点では、native_scale=Trueを使用することで、stripplot()swarmplot()でのみ可能です)。

凡例を移動するにはどうすればいいですか?#

セマンティックマッピングをプロットに適用すると、seabornは自動的に凡例を作成し、図に追加します。しかし、凡例の配置を自動的に選択するのは、常に理想的とは限りません。

seaborn v0.11.2以降では、move_legend()関数を使用してください。

古いバージョンでは、プロット後にax.legend(loc=...)を呼び出すのが一般的なパターンでした。これは凡例を移動するように見えますが、実際には、軸にアタッチされているラベル付きアーティストを使用して、新しい凡例で置き換えています。これはプロットタイプ間で一貫して機能しません。また、マルチ変数凡例のフォーマットに使用される凡例タイトルや位置調整も伝播しません。

move_legend()関数は、その名前が示すよりも実際には強力で、プロット後に他の凡例パラメータ(フォントサイズ、ハンドルの長さなど)を変更するためにも使用できます。

その他のカスタマイズ#

図の何かを変更するにはどうすればよいですか?#

あなたは非常に特定のプロットを作成したいのですが、seabornのデフォルトではうまくいきません。

seabornの図をカスタマイズするには、基本的に4つの階層があります。

  1. 明示的なseaborn関数のパラメータ

  2. 渡されるmatplotlibのキーワード引数

  3. Matplotlibの軸メソッド

  4. Matplotlibのアーティストメソッド

まず、関連するseaborn関数のAPIドキュメントをよく読んでください。それぞれに多くのパラメータ(おそらく多すぎるほど)があり、seaborn自身のAPIを使用して目的のカスタマイズを実現できる場合があります。

しかし、seabornは多くのカスタマイズをmatplotlibに委譲します。ほとんどの関数には、署名に**kwargsがあり、余分なキーワード引数をキャッチして、基になるmatplotlib関数に渡します。たとえば、scatterplot()には多くのパラメータがありますが、内部で呼び出すmatplotlib.axes.Axes.scatter()の有効なキーワード引数も使用できます。

キーワード引数を渡すことでデータを表すアーティストをカスタマイズできますが、多くの場合、ラベル、目盛り、タイトルなど、図の他の側面をカスタマイズする必要があります。これは、seabornのプロット関数が返すオブジェクトでメソッドを呼び出すことで実行できます。 軸レベルまたは図レベルの関数を呼び出しているかどうかに応じて、これはmatplotlib.axes.Axesオブジェクトまたはseabornラッパー(seaborn.FacetGridなど)である場合があります。どちらのオブジェクトにも、図のほぼすべてのものをカスタマイズするために呼び出すことができる多数のメソッドがあります。最も簡単なのは、通常、一度に複数の属性を変更できるmatplotlib.axes.Axes.set()またはseaborn.FacetGrid.set()を呼び出すことです。たとえば、以下のようにします。

ax = sns.scatterplot(...)
ax.set(
    xlabel="The x label",
    ylabel="The y label",
    title="The title"
    xlim=(xmin, xmax),
    xticks=[...],
    xticklabels=[...],
)

最後に、最も深いカスタマイズでは、matplotlib軸に「到達」し、そこに保存されているアーティストを調整する必要がある場合があります。これらは、ax.linesax.collectionsax.patchesなどのアーティストリストにあります。

警告: matplotlibもseabornも、プロット関数によって生成された特定のアーティストを安定したAPIの一部とは考えていません。アーティストの種類や保存順序に対する今後の変更について、適切に警告することができないため、これらの属性と対話するコードは予期せず破損する可能性があります。そうは言っても、seabornはこの種の変化を避けるように努力しています。

え、matplotlibの使い方も学ぶ必要があるのですか?#

それは、どれくらいのカスタマイズが必要かによって大きく異なります。seaborn APIを主に使用または排他的に使用しながら、多くの探索的データ分析を実行できます。しかし、プレゼンテーションや出版物用に図を洗練させている場合は、少なくともmatplotlibがどのように機能するかを少し理解する必要があることに気づくでしょう。matplotlibは非常に柔軟で、十分に掘り下げれば図のすべてを文字通り制御できます。

seabornはもともと、非常に高度なAPIを通じて特定の定義された一連の操作を処理し、ユーザーが追加のカスタマイズを望む場合はmatplotlibに「ドロップダウン」できるようにするという考えで設計されました。これは非常に強力な組み合わせであり、すでにmatplotlibの使い方を知っていれば、かなりうまく機能します。しかし、seabornがより多くの機能を取得するにつれて、まずseabornを学ぶことがより実行可能になりました。その状況では、APIを切り替える必要性が少し混乱/不満を引き起こす傾向があります。これが、高レベルと低レベルの両方の図の指定に、よりまとまりのあるAPIを提供することを目的としたseabornの新しいオブジェクトインターフェースの開発の動機となっています。うまくいけば、成熟するにつれて「2つのライブラリの問題」が軽減されるでしょう。

そうは言っても、matplotlibが提供する深い制御レベルは本当に素晴らしいので、非常に特定のことに関心がある場合は、学ぶ価値があります。

matplotlibのオブジェクト指向インターフェースでseabornを使用するにはどうすればよいですか?#

コードの推論や保守が容易になるため、matplotlibの明示的なまたは「オブジェクト指向」インターフェースを使用することを好みます。ただし、オブジェクト指向インターフェースはmatplotlibオブジェクトのメソッドで構成されていますが、seabornは独立した関数を提供します。

これも、図レベル/軸レベルの区別を念頭に置いておくことが役立つケースです。

軸レベルの関数は、任意のmatplotlib軸メソッドのように使用できますが、ax.func(...)を呼び出す代わりに、func(..., ax=ax)を呼び出します。また、軸オブジェクトも返します(matplotlibのグローバル状態にアクティブな図がない場合は、作成された可能性があります)。 matplotlib.pyplot.figure()またはmatplotlib.pyplot.subplots()から開始しなかった場合でも、そのオブジェクトのメソッドを使用してプロットをさらにカスタマイズできます。

ax = sns.histplot(...)
ax.set(...)

図レベル関数は既存の図に向けることはできませんが、返されるFacetGridオブジェクト(seabornのドキュメントでは常にgという変数に代入されます)にmatplotlibオブジェクトを格納します。

図レベル関数が1つのサブプロットのみを作成した場合、直接アクセスできます。

g = sns.displot(...)
g.ax.set(...)

複数のサブプロットがある場合は、FacetGrid.axes(常に軸の2D配列)またはFacetGrid.axes_dict(行/列のキーを対応するmatplotlibオブジェクトにマッピングします)を使用できます。

g = sns.displot(..., col=...)
for col, ax in g.axes_dict.items():
    ax.set(...)

ただし、すべてのサブプロットで属性を一括設定する場合は、個々の軸を反復処理するのではなく、FacetGrid.set()メソッドを使用してください。

g = sns.displot(...)
g.set(...)

基になるmatplotlibのfigureにアクセスするには、seaborn >= 0.11.2ではFacetGrid.figureを使用します(または他のバージョンではFacetGrid.figを使用します)。

棒グラフに棒の値を注釈付けできますか?#

このような機能はseabornには組み込まれていませんが、matplotlib v3.4.0で便利な関数(matplotlib.axes.Axes.bar_label())が追加され、比較的簡単になりました。いくつかレシピを紹介します。棒グラフが図レベル関数または軸レベル関数のどちらから生成されたかによって、異なるアプローチを使用する必要があることに注意してください。

# Axes-level
ax = sns.histplot(df, x="x_var")
for bars in ax.containers:
    ax.bar_label(bars)

# Figure-level, one subplot
g = sns.displot(df, x="x_var")
for bars in g.ax.containers:
    g.ax.bar_label(bars)

# Figure-level, multiple subplots
g = sns.displot(df, x="x_var", col="col_var)
for ax in g.axes.flat:
    for bars in ax.containers:
        ax.bar_label(bars)

seabornをダークモードで使用できますか?#

seabornには直接的なサポートはありませんが、matplotlibには"dark_background"というスタイルシートがあり、これを使用できます。例:

sns.set_theme(style="ticks", rc=plt.style.library["dark_background"])

"dark_background"を使用すると、デフォルトのカラーパレットが"Set2"に変更され、set_theme()で定義したパレットが上書きされることに注意してください。別のカラーパレットを使用したい場合は、sns.set_palette()を別途呼び出す必要があります。デフォルトのseabornパレット("deep")は暗い背景に対してコントラストが低いため、"muted"、"bright"、または"pastel"を使用する方が良いでしょう。

統計に関する問い合わせ#

seabornの統計変換の結果にアクセスできますか?#

seabornはプロットを作成する際にいくつかの統計操作(集計、ブートストラップ、回帰モデルの適合)を実行するため、一部のユーザーは計算された統計にアクセスしたいと考えています。これは不可能です。統計モデルを照会するためのAPIを提供することは、seaborn(視覚化ライブラリ)の範囲外であると明示的に考えられています。

seabornが正しく動作していることを検証したいだけの場合(または自分のコードと一致することを確認したい場合)は、オープンソースであるため、コードを自由に読んでください。または、Pythonであるため、統計を計算するプライベートメソッドを呼び出すこともできます(ただし、本番コードではこれを行わないでください)。ただし、scipystatsmodelsの方が適している機能をseabornが提供することを期待しないでください。

信頼区間ではなく標準誤差を表示できますか?#

v0.12以降では、新しいerrorbar APIを使用することで、ほとんどの場所でこれが可能になりました(詳細については、チュートリアルを参照してください)。

KDEプロットのy軸が1を超えるのはなぜですか?#

kdeplot()を使用してデータの確率分布を推定しましたが、y軸が1を超えています。確率は1で制限されていませんか?これはバグですか?

これはバグではありませんが、よくある誤解です(カーネル密度プロットと確率分布について広く誤解されています)。連続確率分布は、確率密度関数によって定義され、kdeplot()が推定します。確率密度関数は、確率を出力するわけではありません。連続確率変数は無限の数の値を取ることができるため、特定の値を観測する確率は無限に小さくなります。ある範囲内に入る値を観測する確率についてのみ意味のある議論ができます。可能な値の完全な範囲内に入る値を観測する確率は1です。同様に、確率密度関数は、その下の面積(つまり、関数が定義されている領域全体の積分)が1になるように正規化されます。可能性の高い値の範囲が狭い場合、これを可能にするには曲線が1を超える必要があります。

よくある疑問#

seabornがsnsとしてインポートされるのはなぜですか?#

これはライブラリの名前の由来への曖昧な参照ですが、「seaborn namespace」と考えることもできます。

ggplotはseabornよりもはるかに優れているのはなぜですか?#

良い質問です。おそらく、「geom」という言葉をたくさん使えるからでしょう。言うのが楽しいんです。「Geom」。 「ジーーオーム」。