▶ 初学者向けに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を使って描く
まず基本構文を確認しておきましょう。
xはヒストグラムを作成するための生データの配列を指定します。bins(オプション:defaultは10)で階級数(棒の数)を指定することができます。
さっそく確認してみましょう。
# ライブラリのインポート
import matplotlib.pyplot as plt
# matplotlibによるヒストグラムの描画
plt.figure(figsize=(4,3))
plt.hist(df['total'])
簡単に描けました!実質、
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)
この例では最大値と最小値が含まれるようにして、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()
このように描きたいデータごとにplt.hist()を実行すればOKです。plt.hist()内でlabel引数で凡例として表示したい文字列を指定して、最後にplt.legend()とすることで上記のようにそれぞれのヒストグラムが何を示しているのかを分かりやすく描画することができます。
seabornを使って描く
先ほどと同じようにまずは基本構文を確認しておきましょう。
オプションをたくさん書いてしまいましたが、必須なのはdataとxのみです。さっそく試してみましょう。
# ライブラリのインポート
import seaborn as sns
# seabornによるヒストグラムの描画
sns.displot(data=df,x='total')
こちらも簡単ですね。実質、
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)
先ほどの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)
普段matplotlibで描画していると、seabornでplt.figure(figsize=(4,3))の形式でplotサイズを指定できない時に戸惑うことがあるので覚えておくとよいでしょう。
次にmatplotlibの際にも紹介した、異なる集団のヒストグラムを描く場合です。seabornの場合はもっと簡単に描画することができます。
sns.displot(data=df,x='total', bins=edges,hue='payment')
このようにhueに集団をわける変数を指定するだけです。これだけで色分けしてそれぞれの集団のヒストグラムを描いてくれます。
最後にさらに他のカテゴリ変数と比較する場合も紹介しましょう。
sns.displot(data=df,x='total', bins=edges,hue='payment',col='pickup_borough')
このようにhueに加えてcolに集団を分ける変数を指定するだけです。colの代わりにrowを指定すると、行方向に分けて描画されます。
さらにseabornの基本構文でxだけでなく、yという引数も記載していましたね。これを指定すると2変量のヒストグラムを描くことができます。
sns.displot(data=df,x='total',y='distance')
これは散布図ではなく、各変数の各値でのカウント数を表しています。このようにseabornでは簡単なコードでいろんな描画をすることができます。
まとめ
今回はヒストグラムの描き方を基本から解説しました。描画ライブラリはいろいろありますが、今回はmatplotlibとseabornを使ってヒストグラムを描く方法を紹介しました。ヒストグラムは量的変数の分布を知るうえで重要な可視化になるのでしっかりおさせておきましょう。
コメント