Python自動化で図解
はじめに
近年、データサイエンスや機械学習の分野で大量の数値データを扱う機会が増え、Pythonはその主要言語として定着しています。Python自動化を活用すれば、データ取得から前処理、可視化までを一連のスクリプトで完結でき、作業効率が飛躍的に向上します。特にMatplotlibはPythonで最も広く使われるグラフ描画ライブラリで、折れ線グラフ、棒グラフ、ヒストグラム、散布図など多彩な図解を簡単に作成できます。この記事では、Python自動化とMatplotlibを組み合わせて、データ可視化の基本から応用までを実践的に解説します。読者は、実際にコードを書きながら、分析結果を図解化し、レポートやプレゼン資料に活用できるスキルを身につけることができます。
基礎知識・概念
まずは、Python自動化とMatplotlibの基本概念を整理します。Python自動化とは、定型作業をスクリプトで自動化し、手作業のミスを減らし、時間を節約する手法です。Matplotlibは、NumPyやPandasと組み合わせてデータを可視化するための低レベルから高レベルまでのAPIを提供します。以下の用語を押さえておくと、実装がスムーズになります。
- Figure:図全体を表すオブジェクト。複数のAxesを含むことができる。
- Axes:1つのグラフ領域。X軸・Y軸、タイトル、ラベルを持つ。
- Plot:データ点を描画する操作。
plot()、bar()、hist()、scatter()などがある。 - Style:色、線種、フォントなどの見た目を設定する。
- Savefig:Figureを画像ファイルとして保存する。
これらの概念を理解した上で、実際にPythonスクリプトを書いてみましょう。
実装・設定の詳細
以下では、Python自動化とMatplotlibを使ったデータ可視化の実装例をステップバイステップで紹介します。まずは環境構築から始めます。
1. 環境構築
Python 3.10以降をインストールし、仮想環境を作成します。
python -m venv venv
source venv/bin/activate # Windowsの場合は venv\Scripts\activate
pip install matplotlib pandas numpy
次に、サンプルデータを用意します。ここではPandasを使ってCSVを読み込み、日付と売上データを生成します。
import pandas as pd
import numpy as np
# サンプルデータ作成
dates = pd.date_range(start='2025-01-01', periods=30, freq='D')
sales = np.random.randint(100, 500, size=30)
df = pd.DataFrame({'date': dates, 'sales': sales})
df.to_csv('sales.csv', index=False)
2. 折れ線グラフの作成
売上の推移を折れ線グラフで可視化します。
import matplotlib.pyplot as plt
df = pd.read_csv('sales.csv', parse_dates=['date'])
plt.figure(figsize=(10, 5))
plt.plot(df['date'], df['sales'], marker='o', linestyle='-', color='steelblue')
plt.title('日別売上推移')
plt.xlabel('日付')
plt.ylabel('売上')
plt.grid(True)
plt.tight_layout()
plt.savefig('line_chart.png')
plt.show()
ポイントは、plt.figure()でFigureサイズを指定し、tight_layout()で余白を自動調整する点です。これにより、ラベルが重なることを防げます。
3. 棒グラフ・ヒストグラム・散布図の作成
次に、売上の分布を棒グラフ、ヒストグラム、散布図で表現します。
# 棒グラフ
plt.figure(figsize=(8, 4))
plt.bar(df['date'].dt.strftime('%Y-%m-%d'), df['sales'], color='orange')
plt.xticks(rotation=45, ha='right')
plt.title('日別売上(棒グラフ)')
plt.tight_layout()
plt.savefig('bar_chart.png')
plt.show()
# ヒストグラム
plt.figure(figsize=(6, 4))
plt.hist(df['sales'], bins=10, color='green', edgecolor='black')
plt.title('売上の分布(ヒストグラム)')
plt.xlabel('売上')
plt.ylabel('頻度')
plt.tight_layout()
plt.savefig('histogram.png')
plt.show()
# 散布図(売上と日付の関係を可視化)
plt.figure(figsize=(8, 5))
plt.scatter(df['date'], df['sales'], color='purple')
plt.title('日付と売上の散布図')
plt.xlabel('日付')
plt.ylabel('売上')
plt.tight_layout()
plt.savefig('scatter_plot.png')
plt.show()
散布図では、日付をX軸に取ると数値として扱われるため、plt.scatter()のX座標にPandasのDatetimeIndexを渡すと自動で変換されます。
4. カスタマイズのテクニック
Matplotlibはカスタマイズ性が高く、以下のような設定が可能です。
- 色パレットの変更:
plt.style.use('seaborn-darkgrid') - フォントサイズの統一:
plt.rcParams['font.size'] = 12 - 凡例の位置調整:
plt.legend(loc='upper left') - 複数Axesを同時に描画:
fig, ax = plt.subplots(2, 1)
例えば、複数のグラフを1枚のFigureにまとめる場合は次のようにします。
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
axes[0, 0].plot(df['date'], df['sales'], color='red')
axes[0, 0].set_title('折れ線グラフ')
axes[0, 1].bar(df['date'].dt.strftime('%Y-%m-%d'), df['sales'], color='orange')
axes[0, 1].set_title('棒グラフ')
axes[0, 1].tick_params(axis='x', rotation=45)
axes[1, 0].hist(df['sales'], bins=10, color='green', edgecolor='black')
axes[1, 0].set_title('ヒストグラム')
axes[1, 1].scatter(df['date'], df['sales'], color='purple')
axes[1, 1].set_title('散布図')
fig.tight_layout()
plt.savefig('combined.png')
plt.show()
このように、Python自動化スクリプト内で複数の図を一括生成し、レポート用にまとめることができます。
応用テクニック
基本的な折れ線グラフや棒グラフを超えて、データ可視化をさらに高度にするテクニックを紹介します。実務で役立つポイントを押さえておきましょう。
1. 時系列データの季節性解析
売上データに季節性がある場合、移動平均や季節調整を行い、トレンドと周期を分離します。Matplotlibだけでなく、Statsmodelsのseasonal_decomposeを併用すると便利です。
from statsmodels.tsa.seasonal import seasonal_decompose
result = seasonal_decompose(df['sales'], model='additive', period=7)
fig = result.plot()
fig.set_size_inches(10, 8)
plt.tight_layout()
plt.savefig('seasonal.png')
plt.show()
この図では、観測値、トレンド、季節成分、残差が同時に表示され、売上の周期的変動を可視化できます。
2. カラーマップを使ったヒートマップ
複数の変数を同時に可視化したい場合、Pandasのpivot_tableとMatplotlibのimshowを組み合わせてヒートマップを作成します。
pivot = df.pivot_table(index='date', columns='sales', values='sales', aggfunc='size')
plt.figure(figsize=(8, 6))
plt.imshow(pivot, cmap='viridis', aspect='auto')
plt.colorbar(label='頻度')
plt.title('売上ヒートマップ')
plt.xlabel('売上')
plt.ylabel('日付')
plt.tight_layout()
plt.savefig('heatmap.png')
plt.show()
ヒートマップは、売上の高頻度領域を一目で把握できるため、プロモーション効果の分析に有効です。
3. インタラクティブな可視化
Matplotlibは静的ですが、PlotlyやBokehと連携すれば、ブラウザ上でズームやホバー情報を提供するインタラクティブグラフが作れます。以下はPlotlyを使った例です。
import plotly.express as px
fig = px.line(df, x='date', y='sales', title='インタラクティブ日別売上')
fig.update_traces(mode='markers+lines')
fig.write_html('interactive.html')
生成されたinteractive.htmlをブラウザで開くと、データポイントにカーソルを合わせると詳細情報が表示されます。
トラブルシューティング
Python自動化とMatplotlibを使う際に直面しやすいエラーとその対処法をまとめます。
1. 文字化け(日本語フォントが表示されない)
Matplotlibはデフォルトで日本語フォントをサポートしていないため、文字化けが発生します。対策は以下の通りです。
import matplotlib.font_manager as fm
import matplotlib.pyplot as plt
# 日本語フォントを指定
font_path = '/usr/share/fonts/truetype/fonts-japanese-gothic.ttf' # OSに合わせて変更
font_prop = fm.FontProperties(fname=font_path)
plt.rcParams['font.family'] = font_prop.get_name()
plt.rcParams['axes.unicode_minus'] = False
2. 画像が保存されない/ファイルが上書きされる
plt.savefig()を呼び出す前にplt.clf()やplt.close()を実行しないと、前回のFigureが残ってしまい、期待した画像が生成されないことがあります。
plt.savefig('chart.png')
plt.close() # もしくは plt.clf()
3. 大量データで描画が遅い
データ数が数万件を超えると描画速度が低下します。対策としては、plt.plot(..., markersize=0)でマーカーを非表示にしたり、aggバックエンドを使用する、あるいはPlotlyに切り替えることが有効です。
まとめ
この記事では、Python自動化とMatplotlibを組み合わせたデータ可視化の実装方法を、折れ線グラフ・棒グラフ・ヒストグラム・散布図から始まり、カスタマイズ、時系列解析、ヒートマップ、インタラクティブ化まで幅広く解説しました。実務での活用を想定し、以下のポイントを押さえてください。
- FigureとAxesを明示的に管理し、
tight_layout()で余白を自動調整する。 - 日本語フォントを設定し、文字化けを防止。
- 大量データはPlotlyやBokehに切り替えることで描画速度を改善。
- 複数Axesを同時に描画し、レポート用にまとめる。
Python自動化スクリプトを活用すれば、データ取得から可視化までを自動化し、分析結果を図解化してレポートに組み込むことが可能です。ぜひ、この記事で紹介したテクニックを実務に取り入れ、データ可視化のスキルをさらに高めてください。
コメント
コメントを投稿