Pandas plot()でグラフ作成・データ可視化する方法【完全ガイド】

 

データ分析において、数値だけでは見えないパターンや傾向を発見するために、グラフによる可視化は欠かせません。Pandasのplot()メソッドを使えば、複雑なmatplotlibのコードを書かずに、簡単にデータを可視化できます。この記事では、Pandasのplot機能を使ったグラフ作成方法を基本から応用まで、実践的なサンプルコードとともに詳しく解説します。

基本的な準備とサンプルデータの作成

まず、可視化に使用するサンプルデータを作成し、必要なライブラリをインポートしましょう。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 日本語フォント設定(文字化け対策)
plt.rcParams['font.family'] = 'DejaVu Sans'

# サンプルデータの作成
np.random.seed(42)
dates = pd.date_range('2023-01-01', periods=12, freq='M')
df = pd.DataFrame({
    'sales': [100 + np.random.randint(-20, 20) for _ in range(12)],
    'profit': [30 + np.random.randint(-10, 10) for _ in range(12)],
    'expenses': [70 + np.random.randint(-15, 15) for _ in range(12)]
}, index=dates)

print(df.head())

このコードで、売上、利益、費用の月次データを持つDataFrameが作成されます。

基本的な線グラフの作成

単一列の線グラフ

最もシンプルな線グラフから始めましょう。

# 売上の推移を線グラフで表示
df['sales'].plot()
plt.title('月次売上推移')
plt.ylabel('売上 (万円)')
plt.show()

plot()メソッドだけで、すぐにグラフが作成できます。デフォルトでは線グラフが描画されます。

複数列の線グラフ

複数の指標を同時に表示する場合:

# 複数指標を同時表示
df[['sales', 'profit']].plot()
plt.title('売上と利益の推移')
plt.ylabel('金額 (万円)')
plt.legend(['売上', '利益'])
plt.show()

複数列を選択してplot()を呼ぶと、自動的に複数の線が描画されます。

様々なグラフの種類

棒グラフ(bar)

カテゴリ別の比較に適した棒グラフです。

# 月別売上の棒グラフ
df['sales'].plot(kind='bar')
plt.title('月別売上')
plt.ylabel('売上 (万円)')
plt.xticks(rotation=45)
plt.show()

kind='bar'パラメータで棒グラフを指定できます。

水平棒グラフ(barh)

ラベルが長い場合に便利な水平棒グラフ:

# 最新3ヶ月の水平棒グラフ
df.tail(3)['sales'].plot(kind='barh')
plt.title('直近3ヶ月の売上')
plt.xlabel('売上 (万円)')
plt.show()

ヒストグラム(hist)

データの分布を確認するヒストグラム:

# 売上データの分布
df['sales'].plot(kind='hist', bins=10, alpha=0.7)
plt.title('売上の分布')
plt.xlabel('売上 (万円)')
plt.ylabel('頻度')
plt.show()

散布図(scatter)

2つの変数間の関係を調べる散布図:

# 売上と利益の関係
df.plot(x='sales', y='profit', kind='scatter')
plt.title('売上と利益の関係')
plt.xlabel('売上 (万円)')
plt.ylabel('利益 (万円)')
plt.show()

箱ひげ図(box)

データの分布と外れ値を確認する箱ひげ図:

# 各指標の箱ひげ図
df.plot(kind='box')
plt.title('各指標の分布')
plt.ylabel('金額 (万円)')
plt.show()

高度なカスタマイズ

色とスタイルの変更

グラフの見た目をカスタマイズする方法:

# 色とスタイルをカスタマイズ
df['sales'].plot(color='red', linestyle='--', marker='o')
plt.title('売上推移(カスタマイズ版)')
plt.ylabel('売上 (万円)')
plt.grid(True)
plt.show()

サブプロット(複数グラフ)

複数のグラフを一度に表示:

# 2x2のサブプロット
fig, axes = plt.subplots(2, 2, figsize=(12, 8))

# 各サブプロットにグラフを描画
df['sales'].plot(ax=axes[0,0], title='売上推移')
df['profit'].plot(ax=axes[0,1], title='利益推移', color='green')
df['expenses'].plot(ax=axes[1,0], title='費用推移', color='red')
df.plot(ax=axes[1,1], title='全指標比較')

plt.tight_layout()
plt.show()

図のサイズとDPI設定

高品質な図を作成する設定:

# 高解像度の大きな図
df.plot(figsize=(10, 6), dpi=150)
plt.title('高解像度グラフ')
plt.ylabel('金額 (万円)')
plt.show()

実践的な可視化例

売上分析ダッシュボード

実際のビジネス分析で使えるダッシュボード:

# 売上分析ダッシュボード
fig, axes = plt.subplots(2, 2, figsize=(15, 10))

# 売上推移
df['sales'].plot(ax=axes[0,0], marker='o')
axes[0,0].set_title('売上推移')
axes[0,0].set_ylabel('売上 (万円)')

# 利益率の計算と表示
profit_rate = (df['profit'] / df['sales'] * 100)
profit_rate.plot(ax=axes[0,1], color='green', marker='s')
axes[0,1].set_title('利益率推移')
axes[0,1].set_ylabel('利益率 (%)')

# 月別比較(棒グラフ)
df[['sales', 'expenses']].plot(kind='bar', ax=axes[1,0])
axes[1,0].set_title('売上vs費用(月別)')
axes[1,0].set_ylabel('金額 (万円)')
axes[1,0].tick_params(axis='x', rotation=45)

# 累積売上
df['sales'].cumsum().plot(ax=axes[1,1], color='purple')
axes[1,1].set_title('累積売上')
axes[1,1].set_ylabel('累積売上 (万円)')

plt.tight_layout()
plt.show()

時系列データの詳細分析

# 移動平均の追加
df_ma = df.copy()
df_ma['sales_ma3'] = df['sales'].rolling(window=3).mean()

# 元データと移動平均を比較
ax = df_ma['sales'].plot(label='実際の売上', alpha=0.7)
df_ma['sales_ma3'].plot(ax=ax, label='3ヶ月移動平均', color='red', linewidth=2)
plt.title('売上推移(移動平均付き)')
plt.ylabel('売上 (万円)')
plt.legend()
plt.show()

カテゴリ別分析

# カテゴリ別売上データの作成
category_data = pd.DataFrame({
    'A商品': [25, 30, 28, 35],
    'B商品': [20, 25, 30, 28],
    'C商品': [15, 20, 18, 22]
}, index=['Q1', 'Q2', 'Q3', 'Q4'])

# 積み上げ棒グラフ
category_data.plot(kind='bar', stacked=True)
plt.title('四半期別商品売上(積み上げ)')
plt.ylabel('売上 (万円)')
plt.xticks(rotation=0)
plt.show()

グラフの保存とエクスポート

高品質な画像として保存

# 高品質でグラフを保存
df['sales'].plot(figsize=(10, 6))
plt.title('売上推移')
plt.ylabel('売上 (万円)')
plt.savefig('sales_chart.png', dpi=300, bbox_inches='tight')
plt.show()

複数形式での保存

# 複数の形式で保存
def save_chart_multiple_formats(plot_data, filename):
    """グラフを複数形式で保存"""
    plot_data.plot()
    plt.title('データ推移')
    
    # PNG, PDF, SVG形式で保存
    formats = ['png', 'pdf', 'svg']
    for fmt in formats:
        plt.savefig(f'{filename}.{fmt}', format=fmt, bbox_inches='tight')
    
    plt.show()

# 使用例
save_chart_multiple_formats(df['sales'], 'sales_analysis')

パフォーマンスとベストプラクティス

大量データの可視化

# 大量データの効率的な可視化
def plot_large_dataset(data, sample_size=1000):
    """大量データを効率的にプロット"""
    if len(data) > sample_size:
        # サンプリングして表示
        sampled_data = data.sample(n=sample_size)
        sampled_data.plot(alpha=0.6)
        plt.title(f'データサンプル表示 (n={sample_size})')
    else:
        data.plot()
        plt.title('全データ表示')
    
    plt.show()

# 使用例
large_data = pd.Series(np.random.randn(10000))
plot_large_dataset(large_data)

メモリ効率的な描画

# メモリ効率を考慮した描画
def memory_efficient_plot(df, columns):
    """メモリ効率的なプロット"""
    with plt.style.context('seaborn'):  # 一時的なスタイル適用
        df[columns].plot()
        plt.title('効率的なプロット')
        plt.show()
        plt.close()  # メモリ解放

# 使用例
memory_efficient_plot(df, ['sales', 'profit'])

plotメソッドのパラメータ一覧

主要なパラメータとその使用例:

# 包括的なパラメータ使用例
df['sales'].plot(
    kind='line',           # グラフの種類
    x=None,               # x軸データ
    y=None,               # y軸データ
    color='blue',         # 色
    alpha=0.8,            # 透明度
    style='-',            # ライン種類
    title='売上推移',      # タイトル
    figsize=(10, 6),      # 図のサイズ
    grid=True,            # グリッド表示
    legend=True,          # 凡例表示
    fontsize=12           # フォントサイズ
)
plt.show()

エラーの回避とトラブルシューティング

よくあるエラーと対処法

# 安全なプロット関数
def safe_plot(data, plot_type='line', **kwargs):
    """エラー処理を含む安全なプロット"""
    try:
        if data.empty:
            print("警告: データが空です")
            return
        
        if plot_type in ['scatter'] and len(data.columns) < 2:
            print("警告: 散布図には2列以上必要です")
            return
        
        data.plot(kind=plot_type, **kwargs)
        plt.show()
        
    except Exception as e:
        print(f"プロットエラー: {e}")

# 使用例
safe_plot(df['sales'], 'line', title='安全なプロット')

まとめ

Pandasのplot()メソッドは、データ可視化を簡単かつ効率的に行うための強力なツールです。この記事で紹介した手法を活用することで、様々な可視化ニーズに対応できます。

主なポイント:

  • plot()メソッドで簡単にグラフ作成
  • kindパラメータで様々なグラフタイプを指定
  • カスタマイズオプションで見た目を調整
  • サブプロットで複数グラフを同時表示
  • 実践的なダッシュボード作成
  • 大量データでのパフォーマンス考慮

データ分析において可視化は洞察を得るための重要なステップです。Pandasのplot機能を活用して、効果的なデータストーリーテリングを実現しましょう。