HOWTO · Seaborn
Seaborn のラインプロットを作成する方法
このチュートリアルでは、Seaborn モジュールを使って Python でラインプロットを作成する方法を実演します。カスタマイズ可能なラインプロット、信頼区間、比較分析のための複数の線を使って、データを効果的に可視化する方法を学びましょう。データ可視化のスキルを高めたい初心者にも経験者にも最適です。
このページの内容
Seaborn のラインプロットは、x 変数と y 変数の値を、線で結ばれた点にマッピングします。時系列によく使われますが、x は順序付きまたは連続的な変数であれば何でもかまいません。seaborn.lineplot() 関数は、繰り返しの観測を要約したり、カテゴリごとに別々の線を描いたりもできるため、測定値がどのように変化するかを調べたり、グループを比較したりするのに役立ちます。
Seaborn を始める
Seaborn は、Matplotlib 上に構築された統計プロットライブラリです。以下の例では pandas の DataFrame を使用します。これは名前付きの列をまとめて保持する便利な方法です。Seaborn とその依存関係がまだ Python 環境で利用できない場合はインストールし、その後 Seaborn と Matplotlib をインポートしてください。プロットの例では、別のインストールコマンドは必要ありません。
このチュートリアルの例は、Python 3.12 上の Seaborn 0.13.2、Matplotlib 3.11.2、pandas 3.1.0 で実行して検証されており、以下の図はいずれも、それらの例が実際に出力した結果です。
基本的なラインプロットを作成する
DataFrame を data に渡し、x と y の列を指定します。次の例では固定値を使用しているため、描かれる点は再現可能です。plt.show() を呼び出すと、対話型環境で図が開きます。ノートブックでは、図は通常セルの結果として表示されます。
この例を実行してください。
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
data = pd.DataFrame({
"day": [1, 2, 3, 4, 5],
"visitors": [12, 15, 13, 18, 21],
})
sns.lineplot(data=data, x="day", y="visitors")
plt.xlabel("Day")
plt.ylabel("Visitors")
plt.title("Visitors by day")
plt.tight_layout()
plt.show()
横軸は day を使用し、縦軸は visitors を使用します。これらの名前と値を、あなたのテーブルの列に置き換えてください。行が x の値を共有している場合、Seaborn はその位置の y の観測を集計し、不確実性のバンドを表示することがあります。次のセクションでは、そうした特徴の解釈方法を説明します。
ラインプロットをカスタマイズする
外観の設定は、読者が系列を区別したり、その値を追ったりする助けになります。たとえば、color は線の色を設定し、marker は各観測に記号を配置し、linestyle は線のスタイルを変更します。これらは視覚的な選択です。グループを作成したり、どの行がデータに属するかを変えたりはしません。図が読まれるサイズでも区別しやすい色とマーカーを選んでください。
インポートと data の定義を含むスクリプトで、上記と同じ決定的なテーブルを使用してください。この完全なバリエーションは、破線で点を強調します。
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
data = pd.DataFrame({
"day": [1, 2, 3, 4, 5],
"visitors": [12, 15, 13, 18, 21],
})
sns.lineplot(data=data, x="day", y="visitors", color="darkorange", marker="o", linestyle="--")
plt.xlabel("Day")
plt.ylabel("Visitors")
plt.title("Visitors by day")
plt.tight_layout()
plt.show()
別の外観にするには、これらの引数を変更するか、Matplotlib のメソッドを使ってラベルとタイトルを設定してください。後の読者が各点が何を表すか分かるよう、x と y のマッピングは明示的に保ってください。
信頼区間を追加する
線の周りの不確実性のバンドは、推定の周りの変動や不確実性を要約します。その意味はデータと推定量に依存します。複数の観測が 1 つの x の位置に寄与する場合、中心線がそれらを要約し、バンドがその要約の周りの不確実性を伝えます。これは単に標準偏差の別名ではありません。標準偏差は観測間のばらつきを表し、信頼区間は推定された量の不確実性を表します。
次の例では、各日に 3 つの観測値を割り当てます。コードはまず各グループの平均を出力するので、描かれた線を単純な数値と照らし合わせることができます。
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
data = pd.DataFrame({
"day": [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4],
"visitors": [10, 12, 14, 14, 16, 18, 13, 15, 17, 19, 21, 23],
})
print(data.groupby("day")["visitors"].mean())
sns.lineplot(data=data, x="day", y="visitors", marker="o")
plt.xlabel("Day")
plt.ylabel("Visitors")
plt.title("Mean visitors by day with 95% confidence band")
plt.tight_layout()
plt.show()
出力:
day
1 12.0
2 16.0
3 15.0
4 21.0
Name: visitors, dtype: float64
中心線は、出力された平均(12、16、15、21)を通ります。繰り返しの観測がある場合、lineplot() はデフォルトで各 x グループを平均で集計します。網掛けのバンドは、その平均に対する 95% 信頼区間であり、ブートストラップによって計算されます。グループのばらつきが大きいほどバンドは広くなります。個々の観測値がどこに落ちるかについては何も語りません。
バンドを解釈する前に、各 x の値に繰り返しの観測があるかどうか、そしてそれらの観測が何を表すかを確認してください。たとえば、同じ被験者からの繰り返し測定は、必ずしも独立したサンプルを表すわけではありません。各 x の値に観測が 1 つしかない場合、同じ方法で変動を推測するための位置内の反復がありません。適切な解釈は、使用する Seaborn のバージョンとプロットオプションにも依存します。ここでの例では、Seaborn 0.12 から利用できる errorbar パラメータを使用します。Seaborn 0.13.2 でのデフォルトは errorbar=("ci", 95) で、errorbar="sd" を指定すると、代わりに平均の両側に 1 標準偏差分のバンドが描かれます。推定量や区間の方法を制御する必要がある場合は、インストールされているバージョンのドキュメントを参照してください。バンドがあなたのデータにとって意味を持たない場合は、それに応じてプロットを設定するか、バンドを省略し、線がどのように計算されたかを説明してください。
バンドに意味がない場合は、errorbar=None でオフにしてください。集計は引き続き行われ、線はグループ平均を結びますが、バンドは描かれません。
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
data = pd.DataFrame({
"day": [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4],
"visitors": [10, 12, 14, 14, 16, 18, 13, 15, 17, 19, 21, 23],
})
sns.lineplot(data=data, x="day", y="visitors", marker="o", errorbar=None)
plt.xlabel("Day")
plt.ylabel("Visitors")
plt.title("Mean visitors by day without uncertainty band")
plt.tight_layout()
plt.show()
2 つの図は同じ平均を描いており、異なるのはバンドだけです。どちらの図が見た目にすっきりしているかではなく、不確実性の要約が読者の助けになるかどうかで選んでください。
複数の線をプロットする
カテゴリベースの比較では、カテゴリ列を含めて hue にマッピングします。Seaborn はカテゴリごとに異なる色の線を描き、凡例を追加します。線のスタイルが視覚的な区別をさらに提供できる場合は、style を同じカテゴリ列または別のカテゴリ列にマッピングしてください。カテゴリは、行が同じ x と y の測定を共有する場合にのみ使用し、ラベルと単位をグループ間で一貫させてください。
固定された観測値を使った、グループ化データの完全な例を次に示します。
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
data = pd.DataFrame({
"week": [1, 2, 3, 1, 2, 3],
"orders": [8, 11, 14, 6, 9, 10],
"store": ["North", "North", "North", "South", "South", "South"],
})
sns.lineplot(data=data, x="week", y="orders", hue="store", style="store", markers=True, dashes=True)
plt.xlabel("Week")
plt.ylabel("Orders")
plt.title("Orders by store")
plt.tight_layout()
plt.show()
データが代わりに系列ごとに別々の数値列を持つ場合は、1 つの値列と 1 つの系列名列を持つ長いテーブルに再構成し、系列名を hue にマッピングしてください。あるいは、各 y 列を共有の Matplotlib の軸上にプロットし、凡例を追加する前に各線にラベルを割り当ててください。どちらの方法でも、凡例はすべての線を識別し、そのデータと一致している必要があります。異なる単位やスケールを隠すためにカテゴリのスタイルを使わないでください。直接比較が誤解を招く場合は、別々の軸や別々の図を検討してください。
列名のスペルミスを修正する
x と y に渡す名前は、data の列名と正確に一致しなければなりません。名前のスペルが間違っていると、lineplot() は何も描画する前にエラーを発生させます。この呼び出しは visitor という列を求めていますが、DataFrame にあるのは visitors だけです。
import pandas as pd
import seaborn as sns
data = pd.DataFrame({
"day": [1, 2, 3, 4, 5],
"visitors": [12, 15, 13, 18, 21],
})
sns.lineplot(data=data, x="day", y="visitor")
出力:
ValueError: Could not interpret value `visitor` for `y`. An entry with this name does not appear in `data`.
メッセージには引数(y)、失敗した値(visitor)、そして理由が示されるため、このエラーはすぐに修正できます。名前を実際の列と比較し(data.columns を出力すると一覧できます)、スペルを修正してください。同じエラーは、x や、スペルを間違えた hue 列や style 列でも発生します。
まとめ
seaborn.lineplot() を使って x の値に沿って y の測定値を結び、外観の設定やカテゴリのマッピングを選んで図を読みやすくしてください。不確実性のバンドを解釈する前に、繰り返しの観測がどのように要約されるかを確認し、比較する各系列に明確なラベルを付けてください。
よくある質問
- Seaborn は Matplotlib に何を追加しますか? Seaborn は統計グラフィックスのための高レベルのインターフェースを提供し、図の表示や追加の書式設定のために Matplotlib と連携します。
- pandas の DataFrame を渡せますか? はい。
dataを DataFrame に設定し、列名をxとyに渡してください。 - 線の外観を変更するにはどうすればよいですか?
color、marker、linestyleなどのオプションを使用してください。これらは外観を変更します。一方、hueはカテゴリを別々の線にマッピングします。 - 網掛けされたバンドは何を意味しますか? プロットされた推定に関連する不確実性の要約を表します。その解釈は、繰り返しの観測、推定量、選択した区間の方法に依存し、自動的に標準偏差になるわけではありません。
- 複数の線を比較するにはどうすればよいですか? カテゴリ列を
hueにマッピングするか、共有の軸上に別々にラベル付けした系列を描いてください。凡例が各線を正確に名付けていることを確認してください。 - 網掛けされたバンドを取り除くにはどうすればよいですか?
errorbar=Noneを渡してください。線は引き続き繰り返しの観測を平均で集計します。省略されるのは不確実性バンドだけです。