0Pricing
Pandas & NumPy Academy · レッスン

棒グラフとヒストグラム

ax.bar()でカテゴリ別の件数を、ax.hist()でデータ分布を可視化し、ビン数と境界線の色を調整します。

「棒グラフとヒストグラム」はCoddyKit上の無料Pandas & NumPy Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPandas & NumPy Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Pandas & NumPy Academyコースには全4レッスンが含まれています。

棒グラフとヒストグラム

棒グラフはカテゴリデータを表示します。カテゴリごとに1本の棒を配置し、値に比例した高さで表します。「各カテゴリの量はどれくらいか」という問いに答えるグラフです。ヒストグラムは連続する数値変数の分布を表示します。データを区間に分け、各区間の棒の高さで個数や頻度を表します。「これらの値はどのように分布しているか」という問いに答えるグラフです。それぞれax.bar()とax.hist()を使います。

縦棒グラフにax.bar()を使う

ax.bar(x, height)は、縦棒グラフを描画します。xはカテゴリの位置(またはラベル)の系列、heightは棒の値です。主なパラメータには、棒の幅を間隔に対して指定するwidth(デフォルトは0.8)、color、edgecolor、align('center'または'edge')があります。Rectangle artistオブジェクトのリストを返します。

import matplotlib.pyplot as plt
import numpy as np

categories = ['East', 'West', 'North', 'South']
values = [420, 380, 310, 290]

fig, ax = plt.subplots(figsize=(7, 4))
ax.bar(categories, values, color='steelblue', edgecolor='white', width=0.6)
ax.set_title('Regional Revenue')
ax.set_xlabel('Region')
ax.set_ylabel('Revenue (USD)')
# plt.show()
plt.close()

棒の見た目をカスタマイズする

いくつかのカスタマイズで、棒グラフは大幅に読みやすくなります。すべての棒に1色のアクセントカラーを使う(または棒ごとに区別するため色の配列を使う)、ax.bar_label()で各棒の上に値ラベルを追加する、余白ができるように棒の幅を調整する、といった方法があります。また、ax.set_ylim(0, max * 1.15)で最も高い棒の上にラベル用のスペースを確保します。

fig, ax = plt.subplots(figsize=(7, 4))
bars = ax.bar(categories, values, color='steelblue', edgecolor='white', width=0.6)

# Add value labels above bars
ax.bar_label(bars, fmt='%d', padding=3, fontsize=10)

# Give space above bars for labels
ax.set_ylim(0, max(values) * 1.15)
ax.set_title('Regional Revenue')
plt.tight_layout()
plt.close()

ax.barh()で横棒グラフを作成する

横棒グラフにはax.barh(y, width)を使います。カテゴリラベルが長い場合(左から右へ自然に読めるため)や、カテゴリが多い場合(よりコンパクトに積み重ねられるため)には、横棒グラフが適しています。その他のカスタマイズパラメータは同じです。heightで棒の太さを制御し、ax.barh_label()(またはax.bar_label())でテキストラベルを追加します。

import pandas as pd
df = pd.DataFrame({'region': categories, 'revenue': values})
df_sorted = df.sort_values('revenue')

fig, ax = plt.subplots(figsize=(7, 4))
ax.barh(df_sorted['region'], df_sorted['revenue'],
        color='steelblue', edgecolor='white', height=0.5)
ax.set_title('Revenue by Region (Sorted)')
ax.set_xlabel('Revenue (USD)')
plt.tight_layout()
plt.close()

グループ化棒グラフ

複数のグループを横に並べて比較するには、棒の位置を手動でずらしてグループ化棒グラフを作成します。各グループの中央位置を計算し、サブグループごとに一定のオフセットを引くか加えます。棒の合計幅とグループ間の間隔の合計を1.0にすると、棒が重ならなくなります。ax.set_xticks()を設定すると、グループ化した棒の中央に目盛りラベルを配置できます。

products = ['A', 'B', 'C']
q1 = [80, 120, 95]
q2 = [90, 110, 105]

x = np.arange(len(products))
width = 0.35

fig, ax = plt.subplots(figsize=(7, 4))
ax.bar(x - width/2, q1, width, label='Q1', color='steelblue')
ax.bar(x + width/2, q2, width, label='Q2', color='coral')

ax.set_xticks(x)
ax.set_xticklabels(products)
ax.legend()
ax.set_title('Q1 vs Q2 Sales by Product')
plt.close()

積み上げ棒グラフ

積み上げ棒グラフは、複数のサブグループによる合計の構成を示します。bottomパラメータを使い、2番目のグループの棒を1番目のグループの棒の終点から開始します。その後の各層のbottomには、それまでのすべての層の累積合計を指定します。積み上げ棒グラフは、合計と各構成要素の寄与を同時に示す場合に便利です。

q1_arr = np.array(q1)
q2_arr = np.array(q2)

fig, ax = plt.subplots(figsize=(7, 4))
ax.bar(products, q1_arr, label='Q1', color='steelblue')
ax.bar(products, q2_arr, bottom=q1_arr, label='Q2', color='coral')

ax.legend()
ax.set_title('Stacked Q1 + Q2 Sales by Product')
ax.set_ylabel('Total Sales')
plt.close()

ヒストグラムにax.hist()を使う

ax.hist(data, bins)はヒストグラムを作成します。binsパラメータで、データをいくつの等間隔の区間に分けるかを指定します(デフォルトは10)。区間の境界値のリストを渡して、不均等な区間にすることもできます。主なパラメータには、ヒストグラムを確率密度に正規化するdensity=True、棒の間に境界線を追加するedgecolor、見た目を制御するcolorとalphaがあります。

np.random.seed(42)
data = np.random.randn(500)  # 500 samples from standard normal

fig, ax = plt.subplots(figsize=(7, 4))
ax.hist(data, bins=30, color='steelblue', edgecolor='white', alpha=0.7)
ax.set_title('Distribution of Values')
ax.set_xlabel('Value')
ax.set_ylabel('Count')
plt.close()

区間の数を選ぶ

ヒストグラムの見た目は、ビンの数に大きく左右されます。ビンが少なすぎるとデータの構造が隠れ、多すぎるとノイズのような突起が生じます。よく使われる経験則には、Sturgesの公式(≈ log2(n) + 1)、Scottの公式、Freedman-Diaconisの公式があります。Matplotlibでは、これらを文字列で指定できます:bins='auto'、bins='scott'、bins='fd'。探索的分析では、いくつかの値を手動で試してみてください。プレゼンテーションでは、形状を最もよく伝えられるビン数を選びます。

fig, axes = plt.subplots(1, 3, figsize=(12, 4))

for ax, b in zip(axes, [5, 30, 'auto']):
    ax.hist(data, bins=b, edgecolor='white', color='steelblue', alpha=0.7)
    ax.set_title(f'bins={b}')
    ax.set_xlabel('Value')

plt.tight_layout()
plt.close()

比較のためのヒストグラムの重ね合わせ

同じ座標軸上で2つの分布を比較するには、異なるデータと色を指定してax.hist()を2回呼び出します。重なりが見えるように、両方にalpha=0.5を指定してください。ラベルを追加し、ax.legend()を呼び出します。サンプルサイズが異なる場合は、density=Trueを使うと両方のヒストグラムが同じ尺度に正規化され、形状を直接比較できます。

group_a = np.random.randn(300)
group_b = np.random.randn(300) + 1.5  # shifted right

fig, ax = plt.subplots(figsize=(7, 4))
ax.hist(group_a, bins=25, alpha=0.5, color='steelblue', label='Group A', density=True)
ax.hist(group_b, bins=25, alpha=0.5, color='coral', label='Group B', density=True)
ax.legend()
ax.set_title('Distribution Comparison')
plt.close()

PandasのSeriesとDataFrameのプロット

.plot.bar()と.plot.hist()は、どちらもDataFrameおよびSeriesのメソッドとして利用でき、Matplotlibの図を自動的に生成します。既存のAxesに描画するためのaxパラメータも受け取ります。これは、グループ化したPandasデータから棒グラフを作成する最も簡単な方法です。まずgroupby集計を計算し、結果に対して.plot.bar()を呼び出し、その後、返されたAxesをカスタマイズします。

import pandas as pd
import numpy as np

df_sales = pd.DataFrame({
    'region': ['East', 'West', 'North', 'South'],
    'revenue': [420, 380, 310, 290]
}).set_index('region')

fig, ax = plt.subplots(figsize=(7, 4))
df_sales['revenue'].plot.bar(ax=ax, color='steelblue', rot=0)
ax.set_title('Revenue by Region')
plt.tight_layout()
plt.close()

棒グラフとヒストグラムの使い分け

棒グラフとヒストグラムのどちらを使うかは、データ型によって決まります。x軸が異なる順序を持たない個別のカテゴリ(製品名、地域、ユーザーセグメントなど)を表し、各棒がカテゴリごとの集計値を表す場合は、棒グラフを使います。x軸が連続的な数値変数で、値が範囲全体にどのように分布しているかを示したい場合は、ヒストグラムを使います。両者を取り違えると、データ型について読み手に誤解を与える、よくある可視化上の誤りになります。

# Bar chart: categorical x-axis (product names)
products = ['Widget', 'Gadget', 'Doohickey']
revenue = [500, 300, 200]
fig, ax = plt.subplots(figsize=(5, 3))
ax.bar(products, revenue, color='steelblue')
ax.set_title('Revenue per Product (Bar Chart)')
plt.close()

# Histogram: continuous x-axis (order sizes)
order_sizes = np.random.exponential(scale=50, size=300)
fig, ax = plt.subplots(figsize=(5, 3))
ax.hist(order_sizes, bins=20, color='coral', edgecolor='white')
ax.set_title('Distribution of Order Sizes (Histogram)')
plt.close()

確認テスト

このレッスンで学んだ棒グラフとヒストグラムについて、理解度を確認しましょう。

レッスンのまとめ

このレッスンでは、ax.bar()で垂直棒グラフを、ax.barh()で水平棒グラフを作成する方法、bottomで積み上げ棒グラフを作成する方法、binsでビン数を制御しながらax.hist()でヒストグラムを作成する方法、そしてdensity=Trueで比較しやすいようにヒストグラムを正規化する方法を学びました。次は、軸ラベルやタイトルを追加し、出版品質の図を保存します。

よくある質問

「棒グラフとヒストグラム」レッスンは無料ですか?

はい。「棒グラフとヒストグラム」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Pandas & NumPy Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Pandas & NumPy Academyコースには全4レッスンが含まれています。

「棒グラフとヒストグラム」で何を学びますか?

ax.bar()でカテゴリ別の件数を、ax.hist()でデータ分布を可視化し、ビン数と境界線の色を調整します。 ブラウザで直接実行するハンズオンコードでPandas & NumPy Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Pandas & NumPy Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPandas & NumPy Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「棒グラフとヒストグラム」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPandas & NumPy Academyレッスンでコードを書いて実行できますか?

はい。すべてのPandas & NumPy Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. FigureとAxesの構造
  2. 折れ線グラフと散布図
  3. 棒グラフとヒストグラム
  4. ラベル、タイトル、図の保存
← Pandas & NumPy Academyに戻る