Python

Python初学者向け:ヒストグラムの描き方を基本から解説(matplotlib/seaborn)

スポンサーリンク

 

この記事はこんな方におススメです
  • データ分析をはじめたいが、どのように学習を進めればよいかわからない方
  • データ分析の基本的な部分の全体像を把握しておきたい方
  • データ分析の勉強を始めたが、進め方に迷っている方

▶ 初学者向けにPythonを使ったデータ分析に役立つ記事を書いています

▶ matplotlibによる可視化を基本から解説しています。以下の投稿も合わせてご覧ください。

はじめに

今回はヒストグラムの描き方を基本から解説します。ヒストグラムは量的データの分布や傾向を視覚的に表現するグラフの一種です。データの範囲や偏り、山や谷などの特徴を一目で把握することができます。また、異常値や外れ値を検出するのにも役立ちます。データを分析の初期段階である「データの理解」の工程で確認する癖をつけましょう。

環境

  • Windows11
  • Python 3.11.4
  • pandas 2.0.3
  • numpy: 1.25.0
  • matplotlib: 3.7.1
  • seaborn: 0.12.2

サンプルデータ

まずはサンプルデータを準備しましょう。今回はseabornにあらかじめ用意されている「taxis」データを使うことにしましょう。

# ライブラリのインポート
import seaborn as sns

# データの読み込み&先頭5行の表示
df =sns.load_dataset('taxis')
df.head()

ヒストグラムの描き方

Pythonでグラフを描く際には可視化ライブラリを使うと便利です。ここでは、matplotlibとseabornというライブラリを使ったヒストグラムの描き方を紹介します。

  • matplotlib
    Pythonでグラフを描くための基本的なライブラリであり、他のライブラリとの互換性が高いです。様々な種類のグラフを自由にカスタマイズできるので、細かい調整が必要な場合に便利です。
  • seaborn
    matplotlibをベースにしたライブラリであり、コードがシンプルで読みやすいです。統計的なデータ分析に適したグラフが多く用意されており、美しいデザインで可視化できます。

順にそれぞれのライブラリでのヒストグラムの描き方を解説しますが、私個人としてはヒストグラムを描く場合はseabornで描くことが多いです。

matplotlibを使って描く

まず基本構文を確認しておきましょう。

plt.hist(x, bins)

xはヒストグラムを作成するための生データの配列を指定します。bins(オプション:defaultは10)で階級数(棒の数)を指定することができます。

さっそく確認してみましょう。

# ライブラリのインポート
import matplotlib.pyplot as plt

# matplotlibによるヒストグラムの描画
plt.figure(figsize=(4,3))
plt.hist(df['total'])
matplotlibによるヒストグラムの描画

簡単に描けました!実質、

plt.hist(df[‘total’])

この1行だけで描けるってすごいですよね。ビンの数を指定していないので、デフォルトで10が適用されています。次にビンの数を指定してみましょう。ビンの数は例えば、次のようにするとよいでしょう。

max_total = int(df['total'].max())
min_total = int(df['total'].min())
edges = range(min_total, max_total, 10)

plt.figure(figsize=(4,3))
plt.hist(df['total'], bins=edges)
matplotlibで非sとグラムの描画:ビンの数を指定

この例では最大値と最小値が含まれるようにして、range関数で連続した数値を作成しています。このようにbinsでは整数だけではなく、シーケンス(連続した数字)を指定することもできます。ヒストグラムは階級幅の取り方によってだいぶ印象が変わってきますよね。このようにビンの指定によって階級幅を調整する方法を知っておくとよいでしょう。

matplotlibで異なる集団のヒストグラムを描く場合も紹介しておきましょう。例えば、支払方法ごとにヒストグラムを描いて比較してみます。

pay_by_credit = df.query('payment=="credit card"')
pay_by_cash = df.query('payment=="cash"')

plt.figure(figsize=(4,3))
plt.hist(pay_by_credit['total'],label='credit')
plt.hist(pay_by_cash['total'],label='cash')
plt.legend()
matplotlibで複数のヒストグラムを描く

このように描きたいデータごとにplt.hist()を実行すればOKです。plt.hist()内でlabel引数で凡例として表示したい文字列を指定して、最後にplt.legend()とすることで上記のようにそれぞれのヒストグラムが何を示しているのかを分かりやすく描画することができます。

seabornを使って描く

先ほどと同じようにまずは基本構文を確認しておきましょう。

sns.displot(data, x, y, bins, hue, col, height, aspect)

オプションをたくさん書いてしまいましたが、必須なのはdataとxのみです。さっそく試してみましょう。

# ライブラリのインポート
import seaborn as sns

# seabornによるヒストグラムの描画
sns.displot(data=df,x='total')
seabornでヒストグラムを描く

こちらも簡単ですね。実質、

sns.displot(data=df,x=’total’)

この一行のみです!次にビン数の指定をしてみましょう。

max_total = int(df['total'].max())
min_total = int(df['total'].min())
edges = range(min_total, max_total, 10)

sns.displot(data=df,x='total', bins=edges)
seabornでビン数を指定してヒストグラムを描画

先ほどのmatplotlibと同じように指定できます。sns.displot()でヒストグラムを描くときには描画領域をplt.figure(figsize=(4,3))のように指定することができません。サイズは高さ(height)と縦横比(aspect)で指定することができます。

max_total = int(df['total'].max())
min_total = int(df['total'].min())
edges = range(min_total, max_total, 10)

sns.displot(data=df,x='total', bins=edges,height=4,aspect=4/3)
seabornでheight/aspectを指定してヒストグラムを描画

普段matplotlibで描画していると、seabornでplt.figure(figsize=(4,3))の形式でplotサイズを指定できない時に戸惑うことがあるので覚えておくとよいでしょう。

次にmatplotlibの際にも紹介した、異なる集団のヒストグラムを描く場合です。seabornの場合はもっと簡単に描画することができます。

sns.displot(data=df,x='total', bins=edges,hue='payment')
seabornでhueを指定してヒストグラムを描画

このようにhueに集団をわける変数を指定するだけです。これだけで色分けしてそれぞれの集団のヒストグラムを描いてくれます。

最後にさらに他のカテゴリ変数と比較する場合も紹介しましょう。

sns.displot(data=df,x='total', bins=edges,hue='payment',col='pickup_borough')
hue,colを指定してヒストグラムを描画

このようにhueに加えてcolに集団を分ける変数を指定するだけです。colの代わりにrowを指定すると、行方向に分けて描画されます。

さらにseabornの基本構文でxだけでなく、yという引数も記載していましたね。これを指定すると2変量のヒストグラムを描くことができます。

sns.displot(data=df,x='total',y='distance')

これは散布図ではなく、各変数の各値でのカウント数を表しています。このようにseabornでは簡単なコードでいろんな描画をすることができます。

スポンサーリンク

まとめ

今回はヒストグラムの描き方を基本から解説しました。描画ライブラリはいろいろありますが、今回はmatplotlibとseabornを使ってヒストグラムを描く方法を紹介しました。ヒストグラムは量的変数の分布を知るうえで重要な可視化になるのでしっかりおさせておきましょう。

コメント

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