Python

【Python】グラフの作成(csvやexcelも:散布図や折れ線・pandasライブラリやmatplotlibやopenpyxl)方法

当サイトでは記事内に広告を含みます
技術ブログ特化メルマガはこちら

データ可視化は、現代のデータ分析において最も重要なスキルの一つです。複雑なデータから意味のある洞察を得るためには、適切なグラフや図表を作成し、データの傾向やパターンを視覚的に表現することが不可欠です。

この記事では、Pythonの強力なライブラリを使用して、基本的なグラフ作成からCSVファイルを使った実用的な可視化までを初心者向けに詳しく解説します。matplotlib、pandasといった主要ライブラリの使い方を、各パラメータの詳細説明とともに学び、業務で即座に活用できる技術を身につけることができます。

適切なデータ可視化により、複雑なビジネスデータから価値ある洞察を抽出し、意思決定を支援する強力なツールを作成できるようになります。

Matplotlibの基本的なグラフ作成

それではまず、Matplotlibの基本的なグラフ作成について解説していきます。

基本的な折れ線グラフの作成

matplotlib.pyplotは、Pythonでグラフを作成するための最も基本的で重要なライブラリです。まずはシンプルな折れ線グラフから始めて、各パラメータの詳細を理解していきます。


import matplotlib.pyplot as plt

# 基本的な折れ線グラフ
months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun']
sales = [450, 520, 380, 680, 750, 620]

# グラフのサイズを設定(幅10インチ、高さ6インチ)
plt.figure(figsize=(10, 6))

# 折れ線グラフの作成
plt.plot(months, sales, 
         marker='o',          # マーカーの形状('o'=円、's'=四角、'^'=三角)
         linewidth=2,         # 線の太さ(数値が大きいほど太い)
         color='#2E86AB',     # 線の色(カラーコードまたは'red'、'blue'等)
         markersize=8,        # マーカーのサイズ
         alpha=0.8)           # 透明度(0=完全透明、1=完全不透明)

# グラフのタイトルと軸ラベル
plt.title('Monthly Sales Performance',    # タイトル文字列
          fontsize=16,                    # フォントサイズ
          fontweight='bold',              # フォントの太さ('normal'、'bold')
          pad=20)                         # タイトルとグラフの間隔

plt.xlabel('Month',                       # X軸のラベル
           fontsize=12)                   # フォントサイズ

plt.ylabel('Sales (thousands)',           # Y軸のラベル
           fontsize=12)

# グリッド(格子線)の表示
plt.grid(True,                           # グリッドを表示するか(True/False)
         alpha=0.3,                      # グリッドの透明度
         linestyle='-',                  # グリッドの線種('-'=実線、'--'=破線)
         linewidth=0.5)                  # グリッドの線の太さ

# レイアウトの自動調整
plt.tight_layout()

# グラフの表示
plt.show()

出力結果の例

このコードでは、6ヶ月間の売上推移が青色の線で表示され、各月に円形のマーカーが配置されます。

線の太さは2、マーカーサイズは8で、軽い透明度が適用されています。

複数の線を折れ線グラフの作成


# 複数の線を持つグラフ(詳細なパラメータ説明付き)
quarters = ['Q1', 'Q2', 'Q3', 'Q4']
product_alpha = [1200, 1450, 1380, 1620]
product_beta = [980, 1150, 1320, 1480]

plt.figure(figsize=(12, 7))

# 1本目の線
plt.plot(quarters, product_alpha, 
         marker='s',                     # 四角形のマーカー
         label='Product Alpha',          # 凡例に表示される名前
         linewidth=3,                    # 線の太さ
         color='#A23B72',               # 濃いピンク色
         markersize=10,                 # マーカーサイズ
         markerfacecolor='white',       # マーカーの内部色
         markeredgecolor='#A23B72',     # マーカーの枠線色
         markeredgewidth=2)             # マーカーの枠線の太さ

# 2本目の線
plt.plot(quarters, product_beta, 
         marker='^',                     # 三角形のマーカー
         label='Product Beta', 
         linewidth=3, 
         color='#F18F01',               # オレンジ色
         markersize=10,
         linestyle='--',                # 破線スタイル
         alpha=0.9)

plt.title('Quarterly Product Performance Comparison', 
          fontsize=18, 
          fontweight='bold', 
          pad=20,
          color='#2C3E50')              # タイトルの色

plt.xlabel('Quarter', 
           fontsize=14,
           fontweight='bold')

plt.ylabel('Revenue (thousands)', 
           fontsize=14,
           fontweight='bold')

# 凡例の設定
plt.legend(fontsize=12,                 # 凡例のフォントサイズ
          loc='upper left',             # 凡例の位置
          frameon=True,                 # 凡例の枠を表示
          fancybox=True,                # 角を丸くする
          shadow=True,                  # 影を付ける
          framealpha=0.9)               # 凡例背景の透明度

plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()

出力結果の例

複数線グラフでは、Product Alphaが実線の四角マーカー、Product Betaが破線の三角マーカーで表示されます。

各線は異なる色とスタイルで区別され、凡例には影と角丸効果が適用されています。

 

散布図の作成と設定

散布図は、2つの変数間の関係性を視覚的に分析するのに最適なグラフです。各パラメータの詳細を理解して、効果的な散布図を作成します。


import matplotlib.pyplot as plt
import numpy as np

# サンプルデータの生成
np.random.seed(42)
advertising_spend = np.random.normal(5000, 1500, 50)
sales_revenue = advertising_spend * 2.3 + np.random.normal(0, 2000, 50)

plt.figure(figsize=(12, 8))

# 散布図の作成
plt.scatter(advertising_spend,          # X軸のデータ
           sales_revenue,               # Y軸のデータ
           s=80,                        # マーカーのサイズ(面積)
           c='#E74C3C',                 # マーカーの色
           alpha=0.7,                   # 透明度
           edgecolors='black',          # マーカーの枠線色
           linewidth=0.5,               # 枠線の太さ
           marker='o')                  # マーカーの形状

plt.title('Advertising Spend vs Sales Revenue', 
          fontsize=18, 
          fontweight='bold', 
          pad=20)

plt.xlabel('Advertising Spend ($)', 
           fontsize=14,
           fontweight='bold')

plt.ylabel('Sales Revenue ($)', 
           fontsize=14,
           fontweight='bold')

# 軸の範囲を設定
plt.xlim(0, 9000)                       # X軸の表示範囲
plt.ylim(0, 25000)                      # Y軸の表示範囲

# 軸の目盛りをフォーマット
plt.ticklabel_format(style='plain',     # 数値表示スタイル
                    axis='both')        # 両軸に適用

plt.grid(True, 
         alpha=0.3,
         linestyle=':',                 # 点線スタイル
         linewidth=1)

plt.tight_layout()
plt.show()

出力結果の例

散布図では、50個のデータポイントが赤色の円で表示され、黒い枠線が付いています。各点の透明度は0.7に設定され、重なりが分かりやすくなっています。

 

複数の散布図


# カテゴリ別散布図(複数グループ)
categories = ['Electronics', 'Clothing', 'Books', 'Home']
colors = ['#3498DB', '#E74C3C', '#2ECC71', '#F39C12']
markers = ['o', 's', '^', 'D']          # 円、四角、三角、ダイヤモンド

plt.figure(figsize=(14, 10))

for i, category in enumerate(categories):
    # カテゴリごとのデータ生成
    x_data = np.random.normal(50 + i*20, 15, 30)
    y_data = np.random.normal(100 + i*25, 20, 30)
    
    plt.scatter(x_data, y_data, 
               label=category,
               s=100,                   # マーカーサイズ
               c=colors[i],             # カテゴリごとの色
               alpha=0.7,
               edgecolors='black',
               linewidth=0.5,
               marker=markers[i])       # カテゴリごとの形状

plt.title('Customer Satisfaction vs Purchase Amount by Category', 
          fontsize=18, 
          fontweight='bold', 
          pad=20)

plt.xlabel('Customer Satisfaction Score', 
           fontsize=14)

plt.ylabel('Purchase Amount ($)', 
           fontsize=14)

# 凡例の詳細設定
plt.legend(fontsize=12, 
          loc='upper left',
          ncol=2,                       # 凡例を2列に配置
          columnspacing=1,              # 列間の間隔
          handletextpad=0.5,            # マーカーとテキストの間隔
          markerscale=1.5)              # 凡例内マーカーのサイズ倍率

plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()

出力結果の例

カテゴリ別散布図では、4つの商品カテゴリーが異なる色と形状のマーカーで区別されます。凡例は2列配置で、各カテゴリのマーカーが分かりやすく表示されています。

 

棒グラフとヒストグラムの作成

棒グラフとヒストグラムは、カテゴリ別データの比較や分布の理解に最適です。各パラメータを詳しく理解して、見やすいグラフを作成します。


import matplotlib.pyplot as plt

# 基本的な棒グラフ
departments = ['Engineering', 'Marketing', 'Sales', 'HR', 'Finance']
employee_counts = [45, 23, 38, 12, 19]
colors = ['#1ABC9C', '#3498DB', '#9B59B6', '#E74C3C', '#F39C12']

plt.figure(figsize=(12, 8))

# 棒グラフの作成
bars = plt.bar(departments,             # X軸のカテゴリ
              employee_counts,          # 棒の高さ
              color=colors,             # 各棒の色
              alpha=0.8,                # 透明度
              edgecolor='black',        # 棒の枠線色
              linewidth=1,              # 枠線の太さ
              width=0.6)                # 棒の幅(0.0-1.0)

# 各棒の上に値を表示
for bar, count in zip(bars, employee_counts):
    plt.text(bar.get_x() + bar.get_width()/2,  # X座標(棒の中央)
             bar.get_height() + 0.5,            # Y座標(棒の上部+余白)
             str(count),                        # 表示する文字
             ha='center',                       # 水平方向の配置(center/left/right)
             va='bottom',                       # 垂直方向の配置(bottom/center/top)
             fontsize=12, 
             fontweight='bold',
             color='black')

plt.title('Employee Distribution by Department', 
          fontsize=18, 
          fontweight='bold', 
          pad=20)

plt.xlabel('Department', 
           fontsize=14)

plt.ylabel('Number of Employees', 
           fontsize=14)

# X軸ラベルの回転
plt.xticks(rotation=45,                 # 回転角度
          fontsize=12,
          ha='right')                   # 右寄せで見やすく

# Y軸の設定
plt.ylim(0, 50)                        # Y軸の範囲
plt.yticks(range(0, 51, 10),           # Y軸の目盛り(0, 10, 20, ...)
          fontsize=12)

plt.grid(axis='y',                     # Y軸のみにグリッド表示
         alpha=0.3,
         linestyle='-')

plt.tight_layout()
plt.show()

出力結果の例

棒グラフでは、5つの部署の従業員数が異なる色で表示され、各棒の上に具体的な数値が表示されます。X軸のラベルは45度回転されており、Y軸のみにグリッドが表示されています。

 

ヒストグラムの作成


# ヒストグラムの作成
np.random.seed(42)
test_scores = np.random.normal(75, 12, 500)  # 平均75、標準偏差12のデータ

plt.figure(figsize=(12, 8))

# ヒストグラムの作成
n, bins, patches = plt.hist(test_scores,    # データ
                           bins=25,         # ビン(階級)の数
                           alpha=0.7,       # 透明度
                           color='#3498DB', # 棒の色
                           edgecolor='black', # 棒の枠線色
                           linewidth=0.5,   # 枠線の太さ
                           density=False,   # 密度表示(False=頻度表示)
                           rwidth=0.9)      # 棒の幅の比率

# 統計情報の追加
mean_score = np.mean(test_scores)
std_score = np.std(test_scores)

# 平均値の線
plt.axvline(mean_score,                 # X座標
           color='red',                 # 線の色
           linestyle='--',              # 線のスタイル('--'=破線)
           linewidth=2,                 # 線の太さ
           alpha=0.8,
           label=f'Mean: {mean_score:.1f}')

# 標準偏差の線
plt.axvline(mean_score + std_score, 
           color='orange', 
           linestyle=':', 
           linewidth=2,
           alpha=0.8,
           label=f'+1 SD: {mean_score + std_score:.1f}')

plt.axvline(mean_score - std_score, 
           color='orange', 
           linestyle=':', 
           linewidth=2,
           alpha=0.8,
           label=f'-1 SD: {mean_score - std_score:.1f}')

plt.title('Distribution of Test Scores', 
          fontsize=18, 
          fontweight='bold', 
          pad=20)

plt.xlabel('Test Score', 
           fontsize=14)

plt.ylabel('Frequency', 
           fontsize=14)

# 凡例の設定
plt.legend(fontsize=12,
          loc='upper right',
          framealpha=0.9)

plt.grid(axis='y', alpha=0.3)
plt.tight_layout()
plt.show()

出力結果の例

ヒストグラムでは、500個のテストスコアが25個のビンに分けられて青色で表示されます。

平均値が赤い破線、標準偏差がオレンジの点線で示され、データの分布特性が視覚的に理解できます。

 

CSVファイルを使ったグラフ作成

続いてはCSVファイルを使ったグラフ作成を確認していきます。

CSVファイルの読み込みと基本的なグラフ

実際のデータ分析では、CSVファイルからデータを読み込んでグラフを作成することが多くあります。pandasとmatplotlibを組み合わせて、効率的にデータ可視化を行います。


import pandas as pd
import matplotlib.pyplot as plt

# CSVファイルの読み込み
df = pd.read_csv('sales_data.csv')      # ファイルパスを指定

# 日付列を日付型に変換
df['Date'] = pd.to_datetime(df['Date'], 
                           format='%Y-%m-%d')  # 日付フォーマットの指定

print("データの最初の5行:")
print(df.head())

print("\nデータの基本情報:")
print(df.info())                        # データ型と欠損値の確認

print("\nデータの統計情報:")
print(df.describe())                    # 基本統計量の表示

# 製品別売上の集計
product_sales = df.groupby('Product')['Sales'].agg([
    'sum',                              # 合計
    'mean',                             # 平均
    'count'                             # 件数
])

print("\n製品別売上集計:")
print(product_sales)

# 製品別売上の棒グラフ
product_total = df.groupby('Product')['Sales'].sum()

plt.figure(figsize=(12, 8))

bars = plt.bar(product_total.index,     # X軸(製品名)
              product_total.values,     # Y軸(売上金額)
              color=['#3498DB', '#E74C3C', '#2ECC71', '#F39C12'], 
              alpha=0.8,
              edgecolor='black',
              linewidth=1,
              capsize=5)                # エラーバーのキャップサイズ

# 各棒の上に金額を表示
for bar, value in zip(bars, product_total.values):
    plt.text(bar.get_x() + bar.get_width()/2, 
             bar.get_height() + value * 0.01,    # 高さの1%上に配置
             f'${value:,.0f}',                   # カンマ区切りの金額表示
             ha='center', 
             va='bottom', 
             fontsize=12, 
             fontweight='bold')

plt.title('Total Sales by Product Category', 
          fontsize=18, 
          fontweight='bold', 
          pad=20)

plt.xlabel('Product', 
           fontsize=14)

plt.ylabel('Total Sales ($)', 
           fontsize=14)

# Y軸の数値フォーマット
plt.ticklabel_format(style='plain',     # 科学記法を使わない
                    axis='y')

plt.grid(axis='y',                      # Y軸のみグリッド表示
         alpha=0.3, 
         linestyle='-')

plt.tight_layout()
plt.show()

出力結果の例

データの最初の5行:
Date Product Sales Region
0 2023-01-15 Laptop 12500 North
1 2023-01-20 Tablet 8900 South
2 2023-01-25 Smartphone 15600 East
3 2023-02-10 Laptop 11200 West
4 2023-02-15 Tablet 9800 North

製品別売上の棒グラフでは、各製品の合計売上が色分けされて表示され、具体的な金額が各棒の上にカンマ区切りで表示されます。データの読み込み時には、日付の変換や基本統計量の確認も行われます。

CSVファイルからのデータ読み込みと基本的なグラフ作成をマスターすることで、実際のビジネスデータを効果的に可視化できるようになります。各パラメータの意味を理解して、データの特性に応じた適切な設定を選択することが重要です。

まとめ 【Python】グラフの作成(散布図や折れ線・matplotlibやopenpyxl)方法

この記事では、Pythonを使ったデータ可視化の基本技術について、初心者向けに詳しく解説しました。

Matplotlibを使った基本的なグラフ作成では、折れ線グラフ、散布図、棒グラフ、ヒストグラムの作成方法を学びました。各パラメータの詳細な説明により、線の太さ(linewidth)、マーカーサイズ(markersize、s)、透明度(alpha)、色(color)、線のスタイル(linestyle)などの設定方法を理解できました。

重要なパラメータとしては、`figsize`でグラフサイズを調整し、`fontsize`や`fontweight`でフォントを設定し、`alpha`で透明度を調整することで、見やすく美しいグラフを作成できます。また、`grid`や`legend`の設定により、情報を分かりやすく伝えることができます。

CSVファイルを使ったグラフ作成では、pandasライブラリと組み合わせることで、実際のデータファイルから効率的にグラフを生成する方法を習得しました。`pd.read_csv()`でデータを読み込み、`groupby()`で集計し、matplotlib のパラメータを活用して視覚的に魅力的なグラフを作成できます。

これらの基本技術を身につけることで、ビジネスデータの分析、研究データの可視化、レポート作成など、様々な場面で効果的なデータ可視化を実現できるようになります。重要なのは、データの性質と目的に応じて適切なグラフ形式を選択し、パラメータを調整して見る人にとって分かりやすい表現を心がけることです。