Pythonで平均・標準偏差をエラーバー付きグラフにする|実験データを可視化

Pythonでエラーバーを描く。平均±標準偏差のグラフを表示したノートPCと、シリーズ共通の白いデスク背景。 Python・データ解析

複数回の測定を平均値だけでグラフにすると、全体の変化は見えますが、測定値のばらつきは分かりません。今回は、平均値の点に上下の線を付けて、平均 ± 標準偏差のエラーバー付きグラフを描きます。

ゴールは、3つのCSVから求めた平均と標準偏差を、Matplotlibで1枚のグラフに表示できるようになることです。

今回使うデータとColabの準備

第3記事と同じ3つのCSVを使います。説明用の架空の測定データですが、この記事の数値とグラフは、配布CSVを実際に読み込んで計算した結果です。

・run_01.csv
・run_02.csv
・run_03.csv

列はtime_s(時間・秒)とvoltage_v(電圧・V)です。3ファイルとも6行で、同じ行の時刻が0〜5秒の順に一致しています。このコードは行番号をそろえて計算するため、行数・時刻・順番が一致し、欠損のないCSVを使います。

Google Colabでノートブックを開き、次のセルを実行するとdataフォルダを作れます。

from pathlib import Path
Path("data").mkdir(exist_ok=True)

左側のフォルダアイコンを開き、dataを右クリックして「アップロード」から3つのCSVを入れます。今回はこの3件だけを置いてください。※Colabのセッションが終了すると、アップロードしたファイルは消えることがあります。

まず次のコードを1つのセルに貼り付けて実行し、描画に使う表valuesを用意します。第3記事で求めたものと同じです。

import pandas as pd
import matplotlib.pyplot as plt
from pathlib import Path

files = sorted(Path("data").glob("*.csv"))
data_list = []

for file in files:
    df = pd.read_csv(file)
    data_list.append(df["voltage_v"].rename(file.stem))

values = pd.concat(data_list, axis=1)
measurement_cols = values.columns
values["mean"] = values[measurement_cols].mean(axis=1)
values["std"] = values[measurement_cols].std(axis=1)

first_df = pd.read_csv(files[0])
values.insert(0, "time_s", first_df["time_s"])

values[["time_s", "mean", "std"]]

平均・標準偏差を求めるところから確認したい場合は、Pythonで複数CSVの平均・標準偏差を求めるを参考にしてください。measurement_colsは測定値の列だけを計算に使い、追加した平均や時刻を混ぜないために控えています。

配布CSVから再計算した結果です。電圧は小数第2位まで表示しています。std()は第3記事と同じ、既定のddof=1の標本標準偏差です。

time_s(秒)mean(V)std(V)
00.200.05
10.850.05
21.400.05
31.850.05
42.150.05
52.350.05

まず平均値だけグラフにする

ここからは新しいセルを追加して進めます。横軸に時間、縦軸に平均電圧を置き、まずは普通の折れ線グラフを描きます。

plt.figure(figsize=(6, 4))
plt.plot(values["time_s"], values["mean"], "o-")
plt.xlabel("Time (s)")
plt.ylabel("Voltage (V)")
plt.tight_layout()
plt.show()
0〜5秒の平均電圧を結んだ6点の折れ線グラフ。0秒0.20 Vから5秒2.35 Vへ増加。
配布CSV3件から求めた平均値。ここではばらつきは表示していません。

標準偏差をエラーバーとして表示する

次はplt.plot()の代わりにplt.errorbar()を使います。次のコード全体を新しいセルで実行してください。

plt.figure(figsize=(6, 4))
plt.errorbar(
    values["time_s"],
    values["mean"],
    yerr=values["std"],
    fmt="o-",
    capsize=4
)
plt.xlabel("Time (s)")
plt.ylabel("Voltage (V)")
plt.tight_layout()
plt.show()
6つの平均電圧の点に上下0.05 Vの標準偏差を付けたエラーバーグラフ。横軸は時間、縦軸は電圧。
点は平均、上下のエラーバーは3回の測定値の標準偏差(±0.05 V)です。

6つの平均値の点に、上下のエラーバーと端の短い横線が表示されたら成功です。今回は標準偏差が0.05 Vと小さいため、エラーバーも短くなります。fmt="o-"は、丸い点を線で結ぶ指定です。

yerrとは何か

yerr=values["std"]

この指定で、平均値から上下に標準偏差の大きさだけエラーバーを表示します。yerrへ渡すのは上端・下端そのものではなく、平均からの幅です。

例えば2秒では、平均1.40 V、標準偏差0.05 Vなので、下端は1.40 − 0.05 = 1.35 V、上端は1.40 + 0.05 = 1.45 Vです。つまり1.35 V〜1.45 Vの範囲を線で示します。

capsizeとは何か

capsize=4は、エラーバーの端に付く短い横線の長さを指定しています。単位はポイントです。値を変えると端の見た目は変わりますが、標準偏差やエラーバーの上下の範囲は変わりません。

エラーバーは「測定誤差」とは限らない

今回のエラーバーが表しているのは、3回の測定値の標準偏差です。値のばらつきを表しており、真の値からのずれや測定器の精度を直接示しているわけではありません。

エラーバーには標準誤差や信頼区間などを使うこともあります。そのため、グラフを見せるときは「何をエラーバーにしたか」を添えます。この記事では「平均 ± 標準偏差、測定3回」と説明すれば意味が伝わります。

CSV読み込みからグラフ作成までの完成コード

dataフォルダに3つのCSVを置いたら、次を1つのセルに貼り付けて実行できます。読み込み、電圧列の横結合、平均・標準偏差の計算、時刻の追加、描画までをまとめています。

import pandas as pd
import matplotlib.pyplot as plt
from pathlib import Path

files = sorted(Path("data").glob("*.csv"))
data_list = []

for file in files:
    df = pd.read_csv(file)
    data_list.append(df["voltage_v"].rename(file.stem))

values = pd.concat(data_list, axis=1)
measurement_cols = values.columns
values["mean"] = values[measurement_cols].mean(axis=1)
values["std"] = values[measurement_cols].std(axis=1)

first_df = pd.read_csv(files[0])
values.insert(0, "time_s", first_df["time_s"])

plt.figure(figsize=(6, 4))
plt.errorbar(
    values["time_s"],
    values["mean"],
    yerr=values["std"],
    fmt="o-",
    capsize=4
)
plt.xlabel("Time (s)")
plt.ylabel("Voltage (V)")
plt.tight_layout()
plt.show()

やり直すときは、このセル全体を再実行してください。No objects to concatenateが出たら、data内にCSVがあるか確認します。KeyErrorなら、列名がtime_s・voltage_vと一致しているか確認してください。

まとめ

複数CSVから計算した平均に、yerr=values["std"]で標準偏差のエラーバーを付けられました。平均の変化と測定値のばらつきを、1枚で確認できます。

これで、CSVを読み込むところから、複数の測定をまとめ、平均とばらつきを可視化するところまで一通りつながりました。自分のデータでも、同じ測定点を比べていることと、エラーバーの意味を確認して使ってみてください。

参考:Matplotlib公式:errorbar / pandas公式:std

Google Colabで動作確認(2026年9月24日):Python 3.13.15/pandas 2.2.3/Matplotlib 3.10.0。画面やライブラリの更新により表示が多少異なる場合があります。

コメント

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