Python

Python初学者向け:ヒストグラムと棒グラフを基本から解説

スポンサーリンク

 

この記事はこんな方におススメです
  • Pythonを始めたばかりで基本から学びたい方
  • Pythonの基本的な部分を速習してまずは全体像を把握しておきたい方

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

はじめに

今回はmaplotlibでヒストグラムと棒グラフを描画する方法を基本から解説します。データを手にしたらまずは各変数の基本統計量や分布の確認、可視化をしてデータの概要を把握しましょう。まずは基本となるヒストグラムと棒グラフをおさえましょう。

データを可視化する

データの概要を把握するのにグラフを描くのは有効な手段です。今回はヒストグラムと棒グラフを扱います。ヒストグラムは連続変数の分布の確認に使います。棒グラフはデータの大小を比較するのに使いますが、カテゴリ変数の個数を描いて分布を確認するときにも使います。

今回もseabornにあらかじめ準備されている学習用のデータセットを使うことにします。

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

# データセットの読み込み
df = sns.load_dataset('tips')
df.head()
tipsデータセット

ヒストグラム

ヒストグラムはデータをいくつかの階級に分けて、各階級のデータ個数を表したものです。横軸にデータの階級、(階級幅が揃っていれば)縦軸にデータの個数をあらわしたものです。
※階級幅が異なる場合は、面積でデータの個数を比較することができます。

まず書式を確認しておきましょう。

plt.hist(x)

xにデータの分布をみたい連続変数を指定します。早速やってみましょう。

# ヒストグラムの描画
plt.hist(df['total_bill'])
ヒストグラムの描画

今回はtipsデータセットの「total_bill」の分布をみてみました。このように1行のコードで一発で描画できます。便利ですね。

棒グラフ

棒グラフは、棒の高さでデータの大小を表したグラフです。カテゴリ変数の大小の比較などに使います。こちらもまずは書式を確認しておきましょう。

plt.bar(x, height)

xにカテゴリ変数、heightに棒の高さにしたい値を指定します。やってみましょう。

# 性別ごとの平均チップ額を算出
tip_by_sex = df.groupby('sex').mean()[['tip']].reset_index()
tip_by_sex
性別ごとの平均チップ額

これを棒グラフで表してみましょう。

# 性別ごとの平均チップ額を描画
plt.bar('sex', 'tip',data=tip_by_sex)
性別ごとの平均チップ額

このようにxに比較したいカテゴリ変数、heightに値を入れればOKです。データフレームやSeriesの棒グラフは別の書き方もあります。次の書式です。

df.plot(x, y, kind=’bar’)

先ほどのheightがyにあたります。kindで描くグラフの種類を指定します。棒グラフ以外のグラフも描くことができるため、「height」とせずに「y」と表現しているのですね。これも試しておきましょう。

# データフレームのメソッドを使って描く
tip_by_sex.plot('sex','tip',kind='bar')
データフレームのメソッドを使って描く

これはSeriesにも用意されているメソッドです。書式は以下のようになります。

Series.plot(x, kind=’bar’)

確認しておきましょう。

# Seriesに用意されているメソッドで描く
df.groupby('sex').mean()['tip'].plot(kind='bar')
Seriesに用意されているメソッドで描く

このようにいろんな書き方ができます。このSeriesからプロットする書き方を知っておくと、例えばカテゴリ変数の各値の数をvalue_counts()したときの結果を瞬時に棒グラフで比較することができます。

# データセットの男性と女性のレコード数
df['sex'].value_counts().plot(kind='bar')
データセットの男性と女性のレコード数

これも便利ですが、もっと便利なものがあります。それがseabornです。matplotlibのラッパーライブラリで美しいグラフを簡単に描くことができます。例えば、男性と女性のレコードの数であれば、次のように書けます。

# seabornを使ってカウントを描画
sns.catplot('sex',data=df,kind='count')
seabornを使ってカウントを描画

defaultで色分けしてくれるのもありがたいですね。また、先ほどの男女別の平均チップ額も次のように書けます。

# seabornを使って男女別の平均チップ額を描画
sns.catplot('sex','tip',data=df,kind='bar',ci=None)
seabornを使って男女別の平均チップ額を描画

plt.bar()で描いたときには先に男女別の平均チップ額を算出していましたが、sns.catplot()で描くときには、描画と同時に平均の算出をすることができます。

sns.catplot(x, y, data=df, kind=’bar’)

kindで描くグラフの種類を指定します。「count」を指定すると個数をカウントしてプロットし、「bar」を指定するとxで指定したカテゴリごとにyで指定した値をの平均を計算して棒グラフを描きます。

このように描画とともに計算を実行してくれ、さらに見やすいので、可視化のプロセスではseabornで描くことが多いです。

sns.catplot(x, y, data=df, kind=’bar’)はsns.barplot(x, y, data=df)のように書くこともできます。

スポンサーリンク

まとめ

今回はヒストグラム、棒グラフについてみました。ヒストグラムはもちろん、seabornでも描くことができますが、今回は割愛しました。seabornでの描画として今後まとめることにします。一方、棒グラフではseabornで描くことの方が多いので、matplotlibだけでなくseabornでの描画方法も解説しました。

ヒストグラム

plt.hist(x)

棒グラフ
  • plt.bar(x, height)が基本
  • Seriesから直接、Series.plot(x, kind=’bar’)と書くこともできる
    ※groupbyやvalue_countsなどと一緒に使うことが多い
  • データフレームから直接、df.plot(x, y, kind=’bar’)と書くこともできる
  • seabornを使うとsns.catplot(x, y, kind=’bar’) でyに指定した値の平均値を高さとした棒グラフを描くことができる

コメント

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