PR

Pythonデータ可視化マスターガイド:matplotlib・seaborn・plotlyで魅力的なグラフを作る実践テクニック

Pythonデータ可視化マスターガイド:matplotlib・seaborn・plotlyで魅力的なグラフを作る実践テクニック

はじめに

データ分析において、可視化は洞察を得るための最も重要な手法の一つです。Pythonには強力な可視化ライブラリが豊富に用意されており、適切に使い分けることで効果的なデータストーリーテリングが可能になります。

この記事では、matplotlib、seaborn、plotlyの3つの主要ライブラリを使った実践的な可視化テクニックを解説します。

1. 可視化ライブラリの特徴と使い分け

matplotlib:基盤となる可視化ライブラリ

import matplotlib.pyplot as plt
import numpy as np
# 基本的な線グラフ
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.figure(figsize=(10, 6))
plt.plot(x, y, linewidth=2, color='blue', label='sin(x)')
plt.title('基本的な線グラフ', fontsize=16)
plt.xlabel('X軸', fontsize=12)
plt.ylabel('Y軸', fontsize=12)
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()

seaborn:統計的可視化に特化

import seaborn as sns
import pandas as pd
# サンプルデータの作成
data = pd.DataFrame({
'カテゴリ': ['A', 'B', 'C', 'D'] * 25,
'値': np.random.normal(100, 15, 100),
'グループ': np.random.choice(['グループ1', 'グループ2'], 100)
})
# 箱ひげ図
plt.figure(figsize=(10, 6))
sns.boxplot(data=data, x='カテゴリ', y='値', hue='グループ')
plt.title('カテゴリ別データ分布', fontsize=16)
plt.show()

plotly:インタラクティブな可視化

import plotly.graph_objects as go
import plotly.express as px
# インタラクティブな散布図
fig = px.scatter(data, x='カテゴリ', y='値', color='グループ',
title='インタラクティブ散布図',
hover_data=['値'])
fig.show()

2. ビジネスシーンでの実践的可視化

売上データの時系列分析

# 売上データの可視化例
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# サンプル売上データ
dates = pd.date_range('2024-01-01', periods=365, freq='D')
sales_data = pd.DataFrame({
'日付': dates,
'売上': np.random.normal(1000000, 200000, 365) + 
np.sin(np.arange(365) * 2 * np.pi / 365) * 100000,
'商品カテゴリ': np.random.choice(['電子機器', '衣料品', '食品'], 365)
})
# 月別売上推移
monthly_sales = sales_data.groupby(sales_data['日付'].dt.to_period('M'))['売上'].sum()
plt.figure(figsize=(12, 6))
plt.plot(monthly_sales.index.astype(str), monthly_sales.values, 
marker='o', linewidth=2, markersize=6)
plt.title('月別売上推移', fontsize=16)
plt.xlabel('月', fontsize=12)
plt.ylabel('売上(円)', fontsize=12)
plt.xticks(rotation=45)
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()

相関関係の可視化

# 相関行列のヒートマップ
correlation_data = pd.DataFrame({
'広告費': np.random.normal(500000, 100000, 100),
'売上': np.random.normal(1000000, 200000, 100),
'Web訪問者数': np.random.normal(10000, 2000, 100),
'顧客満足度': np.random.normal(4.0, 0.5, 100)
})
# 相関係数を計算
correlation_matrix = correlation_data.corr()
# ヒートマップで可視化
plt.figure(figsize=(8, 6))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', 
center=0, square=True, fmt='.2f')
plt.title('変数間の相関関係', fontsize=16)
plt.tight_layout()
plt.show()

3. 高度な可視化テクニック

複数軸グラフの作成

# 売上と利益率の複数軸グラフ
fig, ax1 = plt.subplots(figsize=(12, 6))
# 第1軸:売上
ax1.plot(monthly_sales.index.astype(str), monthly_sales.values, 
'b-', linewidth=2, label='売上')
ax1.set_xlabel('月', fontsize=12)
ax1.set_ylabel('売上(円)', color='b', fontsize=12)
ax1.tick_params(axis='y', labelcolor='b')
# 第2軸:利益率
ax2 = ax1.twinx()
profit_rate = np.random.normal(0.15, 0.03, len(monthly_sales))
ax2.plot(monthly_sales.index.astype(str), profit_rate, 
'r--', linewidth=2, label='利益率')
ax2.set_ylabel('利益率', color='r', fontsize=12)
ax2.tick_params(axis='y', labelcolor='r')
plt.title('売上と利益率の推移', fontsize=16)
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

ダッシュボード風レイアウト

# サブプロットを使った総合ダッシュボード
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(15, 10))
# 1. 売上推移
ax1.plot(monthly_sales.index.astype(str), monthly_sales.values)
ax1.set_title('月別売上推移')
ax1.tick_params(axis='x', rotation=45)
# 2. カテゴリ別売上
category_sales = sales_data.groupby('商品カテゴリ')['売上'].sum()
ax2.pie(category_sales.values, labels=category_sales.index, autopct='%1.1f%%')
ax2.set_title('カテゴリ別売上構成')
# 3. 売上分布
ax3.hist(sales_data['売上'], bins=30, alpha=0.7, color='skyblue')
ax3.set_title('日別売上分布')
ax3.set_xlabel('売上(円)')
ax3.set_ylabel('頻度')
# 4. 箱ひげ図
sales_data['月'] = sales_data['日付'].dt.month
monthly_box_data = [sales_data[sales_data['月'] == i]['売上'].values 
for i in range(1, 13)]
ax4.boxplot(monthly_box_data, labels=range(1, 13))
ax4.set_title('月別売上分布')
ax4.set_xlabel('月')
ax4.set_ylabel('売上(円)')
plt.tight_layout()
plt.show()

4. plotlyでインタラクティブダッシュボード

動的なダッシュボードの作成

import plotly.graph_objects as go
from plotly.subplots import make_subplots
# サブプロットの作成
fig = make_subplots(
rows=2, cols=2,
subplot_titles=('売上推移', 'カテゴリ別売上', '売上分布', '相関分析'),
specs=[[{"secondary_y": False}, {"type": "pie"}],
[{"secondary_y": False}, {"secondary_y": False}]]
)
# 1. 売上推移
fig.add_trace(
go.Scatter(x=monthly_sales.index.astype(str), 
y=monthly_sales.values,
mode='lines+markers',
name='売上推移'),
row=1, col=1
)
# 2. 円グラフ
fig.add_trace(
go.Pie(labels=category_sales.index, 
values=category_sales.values,
name="カテゴリ別売上"),
row=1, col=2
)
# 3. ヒストグラム
fig.add_trace(
go.Histogram(x=sales_data['売上'], 
name='売上分布',
nbinsx=30),
row=2, col=1
)
# 4. 散布図
fig.add_trace(
go.Scatter(x=correlation_data['広告費'], 
y=correlation_data['売上'],
mode='markers',
name='広告費vs売上'),
row=2, col=2
)
fig.update_layout(height=800, showlegend=True, 
title_text="売上分析ダッシュボード")
fig.show()

5. 可視化のベストプラクティス

色の効果的な使用

# カラーパレットの活用
colors = ['#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4', '#FFEAA7']
plt.figure(figsize=(12, 6))
for i, category in enumerate(category_sales.index):
plt.bar(category, category_sales[category], 
color=colors[i % len(colors)], alpha=0.8)
plt.title('カテゴリ別売上(カラー最適化版)', fontsize=16)
plt.ylabel('売上(円)', fontsize=12)
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

フォントとレイアウトの最適化

# 日本語フォント設定
plt.rcParams['font.family'] = 'DejaVu Sans'
plt.rcParams['font.size'] = 12
# プロフェッショナルなスタイル設定
plt.style.use('seaborn-v0_8-whitegrid')
fig, ax = plt.subplots(figsize=(12, 8))
ax.plot(monthly_sales.index.astype(str), monthly_sales.values, 
linewidth=3, color='#2E86AB', marker='o', markersize=8)
ax.set_title('月別売上推移', fontsize=20, fontweight='bold', pad=20)
ax.set_xlabel('月', fontsize=14, fontweight='bold')
ax.set_ylabel('売上(円)', fontsize=14, fontweight='bold')
# グリッドの調整
ax.grid(True, alpha=0.3, linestyle='--')
ax.set_facecolor('#F8F9FA')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

6. パフォーマンス最適化

大量データの効率的な可視化

# 大量データの処理
large_data = pd.DataFrame({
'x': np.random.randn(100000),
'y': np.random.randn(100000),
'category': np.random.choice(['A', 'B', 'C'], 100000)
})
# サンプリングによる高速化
sample_data = large_data.sample(n=5000)
plt.figure(figsize=(10, 8))
for category in sample_data['category'].unique():
subset = sample_data[sample_data['category'] == category]
plt.scatter(subset['x'], subset['y'], 
label=f'カテゴリ {category}', alpha=0.6)
plt.title('大量データの効率的可視化', fontsize=16)
plt.xlabel('X値', fontsize=12)
plt.ylabel('Y値', fontsize=12)
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()

まとめ

Pythonでのデータ可視化は、適切なライブラリの選択と効果的なテクニックの組み合わせが重要です:

重要なポイント:

  1. ライブラリの使い分け:matplotlib(基本)、seaborn(統計)、plotly(インタラクティブ)
  2. ビジネス価値の重視:データから洞察を得られる可視化を心がける
  3. デザインの最適化:色、フォント、レイアウトで見やすさを向上
  4. パフォーマンス考慮:大量データでも快適に動作する工夫

これらのテクニックを活用して、データから価値ある洞察を導き出す効果的な可視化を実現しましょう。

次回は、機械学習モデルの可視化と解釈について詳しく解説します。

コメント

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