【Python】ヒストグラムの基本から応用までをわかりやすく解説
はじめに
Pythonでデータを扱うとき、ある数値の分布がどのような形をしているか知りたいと思うことはありませんか。
そのようなときに役立つのがヒストグラムです。
ヒストグラムは数値データを複数の区間(ビン)に分割して、それぞれの区間に該当するデータの個数を棒グラフのように可視化する方法です。
データの偏りや中心がどこにあるのかなど、分布の特徴をすぐに把握できる利点があります。
この記事では、Pythonでヒストグラムを作成し、実務の場でも活かせるようになるまでの流れをわかりやすく解説します。
実際の開発現場では売上や在庫、センサーからのログやアクセス解析など、さまざまな数値データを扱います。
そしてヒストグラムを活用できるようになると、データがどのように分布しているかを直感的に把握できるようになります。
最終的には数行のPythonコードでパッと可視化することも可能です。
ここでは、初心者がつまづきやすいポイントを踏まえながら、具体的なソースコード例を通じて説明します。
そしてMatplotlibやSeaborn、Plotlyといった代表的なライブラリでの作り方や活用例にも触れますので、ぜひ最後まで読んでみてください。
この記事を読むとわかること
- ヒストグラムとはどのようなグラフなのか
- Pythonでヒストグラムを作成する基本的な手順
- MatplotlibやSeaborn、Plotlyを使った作例
- データ分析や実務でヒストグラムを活かすポイント
- ヒストグラムをカスタマイズして見やすくする方法
ヒストグラムの概要
ヒストグラムは、データがどのように分散しているかを棒グラフ状に表現したものです。
たとえば、ある商品の売上個数を100個ほど集計し、その売上個数が「010」「1120」「21~30」…という区間のどこにどれだけ集中しているかを視覚的に把握できます。
また工場の生産工程では、不良品が発生する誤差範囲がどの程度に集中しているかを確認するときなどにもヒストグラムが利用されます。
これにより、品質の偏りや異常値の有無などを検討するときに役立ちます。
Pythonでは、数値データをリストや配列形式で持っていれば、すぐにヒストグラムを作成できます。
特別な準備がなくても、標準ライブラリと少しの追加ライブラリで一通りのグラフを描ける点は大きな魅力です。
Pythonでヒストグラムを作成するときの基本ライブラリ
Pythonでヒストグラムを描くとき、代表的な方法として以下のライブラリが挙げられます。
Matplotlib
棒グラフや折れ線グラフ、散布図など基本的な可視化に幅広く対応
Seaborn
Matplotlibをベースに、より見た目が整ったスタイルや高度な統計可視化機能を提供
Plotly
インタラクティブな可視化が可能。Webブラウザ上での操作性に優れ、拡張性も高い
それぞれで書き方や見た目のデフォルト設定が異なるので、目的や好みに応じて使い分けられます。
以下の表は、各ライブラリの特徴を簡単にまとめたものです。
ライブラリ | 主な特徴 | コードの書きやすさ | インタラクティブ機能 |
---|---|---|---|
Matplotlib | グラフ描画の標準的ライブラリ | 比較的書きやすい | 基本は静的 |
Seaborn | 統計可視化に強くスタイルが美しい | かなり簡単に書ける | 基本は静的 |
Plotly | Webブラウザ上で操作可能なグラフ | 直感的に書ける | 非常にリッチ |
ヒストグラムだけでなく、複数の種類のグラフを組み合わせるケースも多いので、必要に応じて複数のライブラリを覚えておくと便利です。
ヒストグラムを描画するときの流れ
ここでは大まかな流れを示します。
1. データの用意
ヒストグラムにしたい数値データをリストやNumPy配列、PandasのSeries形式などで準備します。
2. ライブラリのインポート
必要なライブラリ(例: matplotlib.pyplot
や seaborn
、plotly.express
)をインポートします。
3. 描画用の関数を呼び出す
ライブラリごとのヒストグラムを作成する関数を使って、データをヒストグラム化します。
たとえばMatplotlibだと plt.hist()
、Seabornだと sns.histplot()
のように異なります。
4. 軸ラベルやタイトルを設定
どのようなデータなのかをわかりやすくするために、軸ラベルやグラフのタイトルを付けます。
5. グラフを表示する
最後にグラフを表示して出来上がりです。
それぞれのライブラリで作図のために呼び出す関数は異なりますが、基本的にはこの流れで作っていきます。
Matplotlibでのヒストグラム作成例
まずはベーシックにMatplotlibを使ったヒストグラムのコード例を見てみましょう。
import matplotlib.pyplot as plt import numpy as np # サンプルデータを作成 data = np.random.normal(loc=50, scale=10, size=100) # ヒストグラムを描画 plt.hist(data, bins=10, color="skyblue", edgecolor="black") # 軸ラベルやタイトルを設定 plt.xlabel("Value") plt.ylabel("Frequency") plt.title("Histogram with Matplotlib") # グラフを表示 plt.show()
np.random.normal()
を使って平均50、標準偏差10の正規分布に沿ったデータを100個作成していますplt.hist()
はヒストグラムを作成する関数ですbins
で区間の数を指定color
やedgecolor
で見た目を調整
plt.xlabel()
やplt.ylabel()
などで見やすさを向上
実務では、このようなデータ生成の部分が実際の売上データやセンサーログデータに置き換わると考えるとイメージしやすいのではないでしょうか。
ヒストグラムをカスタマイズする方法(Matplotlib編)
Matplotlibは汎用的な可視化ライブラリなだけに、カスタマイズの幅が広いです。
ここでは、代表的なカスタマイズ項目をいくつか紹介します。
ビンの数や範囲を指定する
ビンの数を変えると、データの分布を細かく見るか、大まかに見るかが調整できます。
plt.hist(data, bins=20) # bins=20で区間数を増やす
また、特定の範囲だけに絞ってヒストグラムを作成したい場合は range=(最小値, 最大値)
を使います。
plt.hist(data, bins=10, range=(30, 70))
例えばマシンの誤差データで、30~70の範囲内で分布を見たいときに便利です。
細かいレイアウトを変える
figsize
を使うことでグラフのサイズを指定したり、title
を追加したりすることで見た目を整えます。
import matplotlib.pyplot as plt plt.figure(figsize=(8,6)) plt.hist(data, bins=10, color="lightgreen", edgecolor="black") plt.title("Custom Histogram Layout") plt.xlabel("Measured Value") plt.ylabel("Frequency") plt.show()
さらに、グラフ全体にグリッドを追加したい場合には、plt.grid(True)
を呼び出すだけでOKです。
Seabornでのヒストグラム作成例
Seabornは統計的な可視化をシンプルに実装するのが得意なライブラリです。
ヒストグラムの作成には histplot()
や displot()
などの関数を利用します。
import seaborn as sns import numpy as np import matplotlib.pyplot as plt # データ作成 data = np.random.gamma(shape=2, scale=2, size=200) # Seabornのヒストグラムを描画 sns.histplot(data, bins=15, color="salmon", kde=True) plt.xlabel("Random Gamma Value") plt.ylabel("Count") plt.title("Histogram with Seaborn") plt.show()
sns.histplot()
ではbins
とkde
がよく使われますbins
は区間数kde=True
で滑らかな分布曲線を同時に描画
- データとしてはガンマ分布を例示しているので、実際のアプリケーションに合わせて変えましょう
Seabornを使うと、スタイルがあらかじめ整っているため、見栄えを整えるコードが少なく済むのが特徴です。
Plotlyでのヒストグラム作成例
Plotlyを使うと、マウスオーバーでツールチップを表示できたり、グラフを拡大・縮小できたりするインタラクティブなヒストグラムを簡単に作れます。
import plotly.express as px import numpy as np # サンプルデータ data = np.random.exponential(scale=1.0, size=300) # Plotlyでヒストグラムを作成 fig = px.histogram(data, nbins=10, title="Histogram with Plotly", color_discrete_sequence=["royalblue"]) fig.update_layout( xaxis_title="Exponential Data", yaxis_title="Count" ) fig.show()
px.histogram()
でヒストグラムを作成nbins
でビンの数を指定update_layout()
で軸ラベルなどの表示内容を調整
Plotlyの場合は結果をHTMLとして保存し、Webブラウザ上で操作する形が主流です。
データ分析から社内プレゼンテーションまで、幅広い用途に適しています。
実務で役立つヒストグラムの活用シーン
ここで、ヒストグラムが実務でどのように役立つかを考えてみましょう。
売上データの分析
小売店やECサイトなどであれば、1日の売上金額が「平均的にはいくらぐらいか」「売上がとび抜けて多い日はどれぐらいあるのか」などを確認したい場合があります。
ヒストグラムを使うと、売上が集中しているレンジをひと目で把握できるため、売上分布をベースにマーケティング戦略を立案するときに役立ちます。
不良品や誤差の検証
製造工程で発生する誤差や不良品の検査データをヒストグラムにすると、品質が一定範囲に収まっているかどうかを視覚的に確認できます。
何らかの異常値が多くを占めるようになれば、すぐに製造ラインを見直すアクションへつなげられます。
センサーログの分布確認
IoT機器や工場のセンサーから定期的に取得する温度や圧力などの数値データが大きく偏っていないか、ヒストグラムをチェックすることで傾向をつかみやすくなります。
極端に高い値が多いときは故障や異常が発生していないかなど、追加の調査をすぐに始める手がかりとなります。
ヒストグラムと他のグラフとの比較
ヒストグラムは分布の確認に適したグラフですが、他にも似たようなグラフがあります。
棒グラフ (Bar Chart)
名目データ(カテゴリ)ごとに値を表す。ヒストグラムが「区間」で分けるのに対し、棒グラフはカテゴリで分けるのが基本。
散布図 (Scatter Plot)
2つの数値データの相関関係を可視化するもの。分布の形よりも、2つの変数がどのように関係しているかを見たいときに利用。
ヒストグラムは数値データの“分布”を対象にしている点が大きな特徴です。
ヒストグラムを扱う上での注意点
ヒストグラムは便利な反面、設定によっては誤解を招きやすいことがあります。
ビンの数による分布の見え方の違い
ビンの数が少なすぎると、全体がざっくりしすぎて分布の特徴を正しく捉えられない場合があります。
逆に多すぎると、ばらつきが大きく見えることも。
適切なビンの数はデータ数や分析目的によって変わるため、何度か試行して見やすい区切りを探してみましょう。
外れ値に引きずられる
一部の極端に大きな値や小さな値(外れ値)によって、分布が歪んだ見え方になる場合があります。
その場合は、外れ値を確認して別途処理を検討するか、ヒストグラムの表示範囲を調整して、通常の範囲内の分布を優先的に表示する方法も考慮しましょう。
データの正規化や対数変換が必要な場合
金額やアクセス数など、値のレンジが大きく異なるデータを扱う場合には、ヒストグラム作成前にデータを正規化したり対数変換したりすることがあります。
たとえば売上0円の日と100万円の日を同じグラフでプロットすると、ほとんどの区間が0に近い棒で埋まってしまい、全体像がわかりづらくなることがあります。
そういったときに対数変換を施すと、より傾向を把握しやすくなることがあります。
ヒストグラムの読み方と実務への結びつけ
ヒストグラムを見たとき、どこに注目すればよいかがポイントです。
分布の中心
ヒストグラムの山が最も高い付近が、データの最頻値や平均を示唆します。平均値や中央値を確認すると同時に、ピークの位置にも注目します。
裾の長さ
左右どちらかに大きく伸びている場合は偏りが大きい可能性があるため、原因分析のきっかけとなります。
複数の山 (モード) の存在
データが1つの山だけでなく、複数の山を持つことがあります。これは混合分布の可能性があり、背後に異なる母集団が隠れているケースもあるため、追加の分析が必要となるでしょう。
たとえば、売上データで2つの山がある場合、休日と平日で購入者層が異なり、売上水準も変化していることが考えられます。
その場合はデータを曜日ごとに分けて分析するとさらなる発見があるかもしれません。
複数のデータを重ねて比較する
ヒストグラムを活用するケースとしては、2つ以上のデータ分布を比較したいこともよくあります。
たとえば「キャンペーン前の売上データ」「キャンペーン後の売上データ」を重ねて表示して、どの区間で変化が大きかったのかを視覚的に比較するのです。
Matplotlibを使った重ね表示の例
import matplotlib.pyplot as plt import numpy as np data_before = np.random.normal(40, 5, 200) data_after = np.random.normal(50, 5, 200) plt.hist(data_before, bins=10, alpha=0.5, label="Before") plt.hist(data_after, bins=10, alpha=0.5, label="After") plt.xlabel("Value") plt.ylabel("Frequency") plt.title("Comparison Histogram") plt.legend() plt.show()
alpha
パラメータを設定することで、重なった部分が半透明になります- ラベル付きで2つのデータ分布をまとめて比較できるので、キャンペーンによる効果などが読み取りやすくなるでしょう
グループ別の分布を確認するヒント
データがカテゴリを含んでいる場合(例: 複数の製造ライン、複数の店舗など)、グループ別にヒストグラムを描くのも役立ちます。
Seabornの histplot()
には hue
パラメータを指定することで、同じグラフ内に色分けして重ね描きすることも簡単にできます。
import seaborn as sns import pandas as pd # サンプルのデータフレーム作成 df = pd.DataFrame({ "value": np.random.normal(30, 5, 100).tolist() + np.random.normal(40, 5, 100).tolist(), "group": ["A"]*100 + ["B"]*100 }) sns.histplot(data=df, x="value", hue="group", bins=15)
これにより、グループAとグループBがどのような違いを持った分布をしているかがひと目でわかるようになります。
見やすいヒストグラムを作るためのポイント
ヒストグラムを作るだけでなく、それを「読者(他のエンジニアやチームメンバー)」に分かりやすく提示するためにも、以下の工夫を取り入れることがおすすめです。
軸ラベルを明確にする
何の値なのかをはっきり書く。単位がある場合は(℃、円、個など)併記すると理解が早まります。
タイトルでグラフの主題を伝える
単なる「Histogram」ではなく、「2023年1月の売上分布」など具体的に書くことで、グラフの意図が伝わりやすくなります。
複雑になりすぎない
一度に5種類も6種類ものデータを重ねると、逆に見にくくなってしまいます。主要なものから順に比較し、必要に応じてグラフを分割して使うほうが理解しやすくなるでしょう。
実務でのデータ前処理とヒストグラム
実務では、手元のデータがそのままヒストグラムに適していることはあまり多くありません。
欠損値や異常値、さらにはカテゴリや文字列が混在していることもあるからです。
欠損値(NaN)の処理
Pandasなどで読み込んだデータには NaN
が入っていることがよくあります。
ヒストグラム作成前に、欠損値を除外するか、あるいは平均や中央値で補完するかなどの方針を決めましょう。
外れ値(Outliers)の確認
先ほど少し触れたように、一部の極端な値が全体像を歪める場合があります。
そうした外れ値をあえて除外するグラフを作成すると、日常的な範囲の分布がより見やすくなります。
もちろん除外する判断をする前に、なぜ外れ値が存在するのか原因を把握することは大切です。
数値型データへの変換
文字列が混在していて数値型に変換できないケースも考えられます。
たとえば「売上(単位:円)」のように文字が含まれていれば、それを削除や置換で数値のみ取り出してから型変換する必要があります。
こうした前処理がしっかりできて初めて、ヒストグラムに反映される分布が正確なものになります。
ヒストグラムと統計学の関係
ヒストグラムは、統計学の最初の一歩と言えるツールでもあります。
たとえば、ヒストグラムをきっかけに以下のような指標を検討することがあります。
平均値
全データの合計値をデータ数で割った値
中央値
データを小さい順に並べたときの中央の値
最頻値
最も頻繁に出現する値
標準偏差
データが平均値の周囲にどれほど散らばっているかを示す指標
これらと合わせてヒストグラムを見ると、データがどこを中心として、どれぐらいのばらつきがあるのかがより立体的に理解できます。
また、正規分布に近い形をしているなら「中心極限定理」に基づいて一定の推測が立てられるかもしれません。
このようにヒストグラムが「データに興味を持つ入り口」となるケースは多々あります。
ヒストグラム以外の発展的な可視化手法
分布をチェックしたい場合、ヒストグラム以外にもさまざまな手法があります。
箱ひげ図 (Box Plot)
四分位数を利用して、外れ値や中央値をコンパクトに示す
密度プロット (KDE Plot)
データの分布を平滑化した曲線で表現する
バイオリンプロット (Violin Plot)
箱ひげ図と密度プロットを組み合わせたような形で、分布の形状まで一目でわかる
ヒストグラムだけでなく、これらも状況に応じて組み合わせると、より立体的な分析が可能となります。
データ分析プロジェクトでのヒストグラムの位置づけ
実務でデータ分析をする場合、以下のようなフローで進めることが一般的です。
1. ビジネス要件の確認
分析の目的やゴールを明確にする
2. データ収集・前処理
欠損値や外れ値の処理、必要なテーブルの結合など
3. データの概観を把握
ヒストグラムや散布図などを使い、データの傾向や分布を把握する
4. 詳細分析・モデリング
統計モデルや機械学習モデルを構築し、予測や分類などを行う
5. 結果の解釈と活用
結果をレポートやダッシュボードにまとめて意思決定に活かす
ヒストグラムは主にステップ3の「データの概観を把握」で多用されます。
データの傾向を大まかに掴んでから、詳細な分析をどのように進めるかを判断するのに欠かせないツールです。
Pythonでヒストグラムを練習するときのポイント
初心者の方がヒストグラムを練習するときには、まずはランダムデータから始めると楽です。
numpy.random
を使って、いろいろな分布のデータを生成し、それぞれの形状をヒストグラムで確かめてみましょう。
import matplotlib.pyplot as plt import numpy as np # 一様分布 data_uniform = np.random.rand(1000) plt.hist(data_uniform, bins=20) plt.title("Uniform Distribution") plt.show() # 正規分布 data_normal = np.random.randn(1000) plt.hist(data_normal, bins=20) plt.title("Normal Distribution") plt.show() # 指数分布 data_exponential = np.random.exponential(scale=1.0, size=1000) plt.hist(data_exponential, bins=20) plt.title("Exponential Distribution") plt.show()
一様分布だと棒がほぼ均等に並んだり、正規分布だと中央が高く両端が低い形になったり、分布の形の違いを直感的に理解できます。
社内共有のために気をつけたいポイント
実務でヒストグラムを社内やクライアントに共有するとき、グラフ自体がわかりやすくても、その前後の説明が足りないと情報が伝わりづらい場合があります。
グラフの前提条件
どんなデータセットを使ったのか、いつの期間のものなのか
データのサンプリング方法
全量データなのか一部抜粋なのか
軸の説明
横軸はどういった区間、縦軸は何を数えているのか
これらを明確にすることで、ヒストグラムの結果がより説得力を持ち、意思決定に活かされやすくなります。
複数の担当者が同じデータを分析する場合は、データの取り扱いルールを事前にしっかり共有しておくことも重要です。
ヒストグラムでよくあるQ&A
ビンの幅を自動的に最適化する方法はありますか?
SeabornやNumPyの関数には、ある程度自動的にビン数を決めてくれるオプションがあります。
たとえば、Seabornの histplot()
で bins="auto"
とすると、デフォルトのアルゴリズムに沿ってビンの数を計算してくれます。
ただし「最適」なビン幅は分析目的によって異なるため、最終的には手動で微調整することが多いです。
データサイズが大きすぎて描画が遅いです。
大量のデータ(数百万レコードなど)をヒストグラムにかける場合は、一部をサンプリングして描画する方法がとられることがあります。
また、PandasやDaskを使って効率的にデータを集約し、必要最小限のバケット情報だけをヒストグラム化する方法なども検討するとよいでしょう。
ヒストグラムをHTMLに埋め込みたいのですが?
Plotlyのようにインタラクティブなライブラリを使って、HTML形式のレポートに直接埋め込むことが可能です。
Matplotlibでも、画像ファイルとして出力してからWebページに表示する形であれば対応できます。
トラブルシューティング
ここでは、初めてヒストグラムを試すときにつまづきやすい点をまとめます。
ライブラリのインストールエラー
pip install matplotlib
のように、事前にライブラリをインストールしているかを確認しましょう。
Jupyter Notebookでグラフが表示されない
Notebookの場合は、%matplotlib inline
を先頭セルなどで指定する必要があります。
データが文字列で数値に変換できない
文字列のクリーニングや置換が必要です。Pandasの str.replace()
や astype(float)
などを活用しましょう。
ヒストグラムを学ぶメリット
初心者がヒストグラムを扱えるようになると、データ分析のハードルが一気に下がります。
なぜなら、数値データがどうなっているのかを「絵として」把握できるからです。
ソフトウェア開発の実務では、バグトラッキングやログ解析、売上管理やリソース配分の検討など、多様な場面でデータが出てきます。
その都度、「ヒストグラムを描いてみよう」と思えるだけで、問題の原因や傾向を素早く探れるようになります。
まとめ
ここまで、Pythonでヒストグラムを作成する方法から、実務での活用シーン、さらにはカスタマイズや他の可視化手法との比較まで幅広く解説しました。
ヒストグラムは数値データの分布を一目で捉えるという強力な武器です。
初心者の皆さんは、まずはランダムデータで遊んでみて、ビン数や色、ラベルなどをいろいろ変えながら試行錯誤してみてください。
実務では売上データ、不良品データ、センサーからのログなど、さまざまな情報を同じように取り扱えます。
グラフを見て気づいたことがあれば、さらにデータを絞り込んだり、別のグラフと組み合わせたりしながら、根本原因や新たな発見につなげましょう。
ぜひPythonのヒストグラムを日々のデータ分析や課題発見に活用してみてください。
ヒストグラムに限らず、データを可視化することで新たな知見が得られる場合が多いです。皆さんもぜひいろいろなデータセットで試してみましょう。