組み込み開発のためのPython · レッスン 139 / 238
Matplotlib Histograms:ヒストグラムを作る
ヒストグラムは連続値の分布をビンごとの件数で表します。ビン幅と範囲によって形が変わるため、標本数と設定を記録して解釈します。
ヒストグラムは連続値の分布をビンごとの件数で表します。ビン幅と範囲によって形が変わるため、標本数と設定を記録して解釈します。 仕組みだけでなく、検証方法と運用上の注意も具体例で確認します。
ヒストグラムが示す分布
ヒストグラムは連続値を区間に分け、それぞれへ入る観測数を棒で示します。測定値の中心、広がり、偏り、複数の山、外れた値を探索できます。棒グラフと異なり、隣の区間が連続している量を表すため通常は棒の間に隙間を作りません。見えている形はデータだけで決まるわけではなく、ビン幅や境界の位置によって変化します。標本数と設定を示し、少数の観測から分布の形を断定しないようにしてください。ヒストグラムは分布の要約であって、各観測の順序や時間変化は表しません。
Axes.histの使い方
Axes.histへ数値配列を渡すと、頻度を集計してヒストグラムを描きます。binsに整数を渡すと区間数を指定でき、境界配列を渡すと区間の位置を明示できます。返り値には各ビンの件数、境界、描画された棒などが含まれるため、想定した区間と件数を確認できます。入力値にNaNや無限大があると適切な範囲が決まらないことがあるため、描画前に有限値を検査します。データの単位と範囲を設定し、値がビンの境界上にある場合にどちらの区間へ含まれるかも確認してください。代表値を少数選んで集計結果を手作業で確かめると理解しやすくなります。
ビン数と幅の影響
ビン数が少なすぎると複数の群や尾の形が一つにまとめられ、多すぎると偶然の揺らぎが目立ちます。ビン幅を変えた図を並べ、主要な結論が設定だけに依存していないか確認しましょう。平方根則やSturges則などビン数の選び方がありますが、どの方法も全ての分布に最適とは限りません。標本数や外れ値、測定精度を考慮して設定し、使用した規則を記録します。自動設定を使う場合も、結果を確認せず採用しないでください。異なる群を比べる図では、同じビン境界を用いることで比較条件を揃えます。
ビンの境界と測定範囲
ビンの境界位置を変えると、同じデータでも棒の高さが変わることがあります。丸い値や規格上のしきい値と境界を合わせると、意味のある区間として読みやすくなる場合がありますが、都合のよい印象を作らないよう根拠を示してください。rangeを指定すると表示範囲外の値が集計されないことがあります。範囲から外れた件数を別に報告し、データが切り捨てられたことを明確にします。センサーの測定範囲や飽和値が端に多い場合、その値を通常の分布と混ぜずに説明してください。境界、範囲、包含規則を再現できるようコードと記録に残します。
頻度、確率密度、累積
histは件数、相対頻度、確率密度など異なる縦軸の意味を設定できます。density=Trueでは棒の面積の合計が概ね1となるよう正規化され、棒の高さをそのまま観測割合と解釈できない場合があります。ビン幅が異なると高さと面積の関係も変わるため、縦軸ラベルを正しく付けてください。累積ヒストグラムは指定した値以下の件数や割合を示します。観測数が群ごとに異なるデータを比較するときは、件数と割合のどちらが問いに合うか選びます。統計量や確率分布を重ねる場合は、そのスケールと仮定を明示します。
複数群の分布を比較する
異なる条件や機器の分布を比較するときは、同一のビン境界と同じ軸範囲を使うと違いを読み取りやすくなります。透明度を下げたヒストグラムを重ねる方法は群の重なりを示せますが、色の混合や順序によって一部の棒が見えにくくなります。横に並べる場合は棒の位置や幅を調整します。件数の大きく異なる群では、密度や相対頻度へ正規化するか、標本数を別に示してください。群を選ぶ基準や除外条件が異なると分布比較が不公平になります。分割図や箱ひげ図など別の表現も検討し、読者が群間差を誤解しない表示を選びます。
外れ値と裾の長い分布
外れ値が含まれると横軸範囲が広がり、大多数の値が狭い範囲に集まって見えることがあります。表示範囲を拡大した図を追加する場合は、全体範囲の図も示し、拡大図で隠れた値があることを説明します。外れ値を除外する前に、誤入力、測定異常、重要な事象のいずれかを調べてください。裾の長いデータは対数変換が役立つことがありますが、ゼロや負の値、変換後の解釈を考える必要があります。変換した値を描いた場合は軸名とキャプションに明記し、元スケールの値と混同しないようにします。
累積分布や箱ひげ図との比較
ヒストグラムはビン設定に依存するため、累積ヒストグラムや経験累積分布と比べると設定の影響を減らして分布を確認できます。中央値、四分位範囲、外れ値を比較するなら箱ひげ図が簡潔な場合があります。これらの図は保持する情報が異なるため、目的に応じて選んでください。ヒストグラムは頻度の山や細かな形を見せやすい一方、箱ひげ図は分布の詳細を隠します。複数の表現を併用するときは、それぞれが回答する質問を説明し、同じデータ範囲と標本を使っているか確認します。表現の違いを理解し、単一の図から過剰な結論を出さないようにします。
サンプル数と統計的解釈
標本数が少ないと、ビンごとの件数が変動し、母集団の分布を安定して表さないことがあります。標本数を図中またはキャプションに示し、棒の形が偶然の変動を反映している可能性を考えます。測定値が独立していない、同じ装置を繰り返し測った、特定の期間だけを選んだなど、データの収集方法も分布に影響します。ヒストグラムの形が正規分布に似ているだけで仮定を採用せず、必要ならQ-Qプロットや領域知識、正式な診断を使います。可視化は探索であり、母集団に関する推論には標本設計や不確実性の評価が必要です。
欠損と無効値を処理する
欠損値はヒストグラムのビンには入りません。無効値を除外した場合は、除外件数と規則を記録し、全体の件数と有効件数を区別してください。ゼロが無効値として使われていないか、測定限界で固定された値が多数ないか調べます。欠損をゼロへ置き換えると分布へ新しい山を作り、誤った解釈を生むことがあります。除外後に残るデータが特定の群へ偏っていないか確認し、欠損の理由が結果と関係する可能性も検討します。入力配列の長さ、有限値、最小・最大を検査し、空のデータを渡したときは明確な警告やエラーを出すようにします。
図のラベルと保存
横軸には測定対象と単位、縦軸には件数、割合、密度などを正しく記します。ビン数や範囲を図にすべて詰め込まず、キャプションに設定を記録する方法があります。savefigでPNGやPDFへ保存した後、棒の端、目盛り、タイトル、凡例が切れていないか確認してください。複数のヒストグラムを比較する場合、同じビン境界を再現できるよう設定をコードへ残します。ファイル名に条件やデータ版を含める場合は秘密情報を含めず、古い図を新しい結果と取り違えないよう生成日時を管理します。図に代替テキストを付け、重要な分布の傾向を文章でも説明します。
練習課題:ビン設定を比較する
同じセンサー測定値を複数のビン数で描き、分布の形がどう変わるか比較します。件数表示とdensity表示を作り、縦軸の意味、ビン幅、標本数をラベルと説明に記してください。次に二つの条件を同じビン境界で重ね、標本数が違うときに正規化した図も作ります。極端な値を含む全範囲の図と、範囲を拡大した図を並べ、外れ値を除外せずに見せる方法を考えます。空入力、欠損、無限大を含むデータをテストし、除外件数を報告してください。分布から言えることと追加の統計検証が必要なことを区別して文章にします。
コード例
手元のPython環境に貼り付ける前に、使用しているPythonの版と対象ライブラリの対応を確認してください。
import matplotlib.pyplot as plt
values = [9.8, 10.0, 10.1, 10.2, 9.9, 10.4, 9.7]
fig, ax = plt.subplots()
ax.hist(values, bins=5)
ax.set(xlabel="測定値", ylabel="件数")
plt.show()手を動かす課題
ビン数を変えたヒストグラムを並べ、標本が少ない場合に形を断定できない理由を説明してください。