Pythonのplot関数でデータを散布図でプロットする10の方法

plot関数の徹底解説Python
この記事は約35分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

基本的な知識があればサンプルコードを活用して機能追加、目的を達成できるように作ってあります。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を凌駕する現役のプログラマチームによって監修されています。

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

●Pythonのplot関数で散布図を描く基礎知識

今回はPythonを使って散布図を描く方法について詳しく解説していきます。

散布図は、データの分布や関係性を視覚的に理解するための強力なツールです。

特に、複雑なデータセットを扱う際に非常に役立ちます。

○散布図とは?データ可視化における重要性

散布図は、2つの変数の関係を平面上の点で表現するグラフです。

各点の位置が、それぞれの変数の値を示します。

例えば、身長と体重の関係を調べる場合、X軸に身長、Y軸に体重をとり、各人のデータを点としてプロットします。

データ可視化において散布図が重要な理由は、データの傾向やパターンを一目で把握できる点にあります。

相関関係、外れ値、クラスタリングなどの特徴を視覚的に確認できるため、データの初期分析や仮説の立案に非常に有効です。

例えば、マーケティング部門で顧客の年齢と購買金額の関係を調べる場合、散布図を使えば年齢層ごとの購買傾向を瞬時に把握できます。

また、研究者が実験データの関係性を調べる際にも、散布図は欠かせないツールとなります。

○Pythonでの散布図作成に必要なライブラリ

Pythonで散布図を作成するには、主に次のライブラリを使用します。

  1. Matplotlib: Pythonの基本的な描画ライブラリです。
  2. シンプルな散布図から複雑なグラフまで、幅広い可視化が可能です。
  3. NumPy: 数値計算のためのライブラリで、データの生成や操作に使用します。
  4. Pandas: データ分析のためのライブラリで、データの読み込みや前処理に便利です。

まず、必要なライブラリをインストールしましょう。

ターミナルで次のコマンドを実行します。

pip install matplotlib numpy pandas

インストールが完了したら、Pythonスクリプトの冒頭で次のようにライブラリをインポートします。

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

○plot関数の基本的な使い方

Matplotlibのplot関数を使って、基本的な散布図を作成する方法を見ていきましょう。

まず、簡単なデータセットを作成します。

x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 4, 5, 4, 5])

plt.plot(x, y, 'o')
plt.xlabel('X軸')
plt.ylabel('Y軸')
plt.title('基本的な散布図')
plt.show()

このコードを実行すると、5つの点からなる散布図が表示されます。

plot関数の’o’引数は、データポイントを丸い点で表示することを指定しています。

xlabel、ylabel、titleはそれぞれX軸のラベル、Y軸のラベル、グラフのタイトルを設定します。

実行結果は次のようになります。

[散布図の画像が表示されます]

この基本的な散布図から、データポイントの分布を視覚的に確認できます。

例えば、X値が増加するにつれてY値も概ね増加していることがわかります。

plot関数には多くのオプションがあり、マーカーのスタイル、色、サイズなどをカスタマイズできます。

例えば、赤い三角形のマーカーを使用したい場合は、次のように記述します。

plt.plot(x, y, 'r^')

‘r’は赤色を、’^’は三角形のマーカーを指定しています。

plot関数を使いこなすことで、データの特性や関係性を効果的に可視化できます。

散布図の基本を押さえたところで、さらに深く掘り下げていきましょう。

●10の魅力的な散布図作成テクニック

データを効果的に可視化することは非常に重要です。

適切に作成された散布図は、複雑なデータセットの中から重要なパターンや傾向を浮き彫りにし、洞察を得るための強力な手段となります。

それでは、実際のコード例を交えながら、順を追って解説していきましょう。

○サンプルコード1:シンプルな散布図の作成

まずは、基本に立ち返ってシンプルな散布図を作成します。

シンプルであることの美しさと重要性を忘れてはいけません。

import matplotlib.pyplot as plt
import numpy as np

# データの生成
x = np.random.rand(50)
y = np.random.rand(50)

# 散布図の作成
plt.figure(figsize=(8, 6))
plt.scatter(x, y)
plt.xlabel('X軸')
plt.ylabel('Y軸')
plt.title('シンプルな散布図')
plt.grid(True)
plt.show()

このコードでは、numpy.random.rand()を使用してランダムなデータポイントを生成しています。

plt.scatter()関数を使用して散布図を作成し、軸ラベルとタイトルを設定しています。

plt.grid(True)でグリッド線を追加し、データポイントの位置をより正確に把握できるようにしています。

実行すると、シンプルな散布図の画像が表示されます。

シンプルな散布図でさえ、データの分布や傾向を一目で把握するのに役立ちます。

例えば、データポイントが特定の領域に集中しているか、または均等に分布しているかを確認できます。

○サンプルコード2:カラフルな散布図でデータを区別する

データセットに複数のカテゴリーが含まれている場合、色分けは非常に効果的です。

import matplotlib.pyplot as plt
import numpy as np

# データの生成
np.random.seed(0)
x = np.random.rand(150)
y = np.random.rand(150)
colors = np.random.rand(150)
sizes = 1000 * np.random.rand(150)

# 散布図の作成
plt.figure(figsize=(10, 8))
plt.scatter(x, y, c=colors, s=sizes, alpha=0.5, cmap='viridis')
plt.colorbar()
plt.xlabel('X軸')
plt.ylabel('Y軸')
plt.title('カラフルな散布図')
plt.show()

このコードでは、plt.scatter()関数のc引数に色情報を、s引数にサイズ情報を渡しています。

cmap=’viridis’でカラーマップを指定し、plt.colorbar()でカラーバーを追加しています。

alpha=0.5で透明度を設定し、重なりを視覚化しています。

実行すると、カラフルな散布図の画像が表示されます。

色とサイズを使用することで、データポイントに追加の次元を与えることができます。

例えば、マーケティングデータの分析では、色で顧客セグメントを、サイズで購買金額を表現できるでしょう。

○サンプルコード3:マーカーサイズでデータの重要度を表現

データポイントの重要度や大きさを視覚的に表現したい場合、マーカーサイズの調整が効果的です。

import matplotlib.pyplot as plt
import numpy as np

# データの生成
x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 4, 5, 4, 5])
sizes = np.array([100, 200, 500, 1000, 2000])  # マーカーサイズ

# 散布図の作成
plt.figure(figsize=(10, 8))
plt.scatter(x, y, s=sizes, alpha=0.5)
plt.xlabel('X軸')
plt.ylabel('Y軸')
plt.title('マーカーサイズでデータの重要度を表現')

# 凡例の追加
for i in range(len(sizes)):
    plt.scatter([], [], s=sizes[i], c='gray', alpha=0.5, label=f'サイズ {sizes[i]}')
plt.legend(scatterpoints=1, frameon=False, labelspacing=1, title='マーカーサイズ')

plt.show()

このコードでは、plt.scatter()関数のs引数に異なるサイズの配列を渡しています。

また、凡例を追加して各サイズの意味を説明しています。

実行すると、マーカーサイズが異なる散布図の画像が表示されます。

マーカーサイズの違いは、データポイントの重要度や影響力を直感的に伝えます。

例えば、人口統計データを可視化する際、都市の人口をマーカーサイズで表現できます。

○サンプルコード4:透明度を調整してデータの密度を表現

データポイントが密集している領域を強調したい場合、透明度(アルファ値)の調整が有効です。

import matplotlib.pyplot as plt
import numpy as np

# データの生成
np.random.seed(19680801)
n = 10000
x = np.random.normal(0, 1, n)
y = np.random.normal(0, 1, n)

# 散布図の作成
plt.figure(figsize=(10, 8))
plt.scatter(x, y, alpha=0.1, s=5)
plt.xlabel('X軸')
plt.ylabel('Y軸')
plt.title('透明度を調整してデータの密度を表現')
plt.colorbar()
plt.show()

このコードでは、大量のデータポイント(10,000個)を生成し、plt.scatter()関数のalpha引数で透明度を0.1に設定しています。

実行すると、透明度が調整された散布図の画像が表示されます。

透明度を低く設定することで、データポイントが重なっている領域がより濃く表示され、データの密度分布を視覚化できます。

例えば、顧客の行動データを分析する際、よく訪れる場所や頻繁に行われる行動パターンを特定するのに役立ちます。

○サンプルコード5:回帰直線を追加して傾向を可視化

データの傾向を把握するために、回帰直線を追加するのは効果的な方法です。

import matplotlib.pyplot as plt
import numpy as np
from scipy import stats

# データの生成
np.random.seed(0)
x = np.random.rand(100) * 10
y = 2 * x + 1 + np.random.randn(100)

# 回帰直線の計算
slope, intercept, r_value, p_value, std_err = stats.linregress(x, y)
line = slope * x + intercept

# 散布図と回帰直線の作成
plt.figure(figsize=(10, 8))
plt.scatter(x, y, alpha=0.5)
plt.plot(x, line, color='r', label=f'y = {slope:.2f}x + {intercept:.2f}')
plt.xlabel('X軸')
plt.ylabel('Y軸')
plt.title('回帰直線を追加した散布図')
plt.legend()
plt.show()

print(f"R-squared: {r_value**2:.4f}")

このコードでは、scipy.stats.linregress()を使用して回帰分析を行い、その結果を基に回帰直線を描画しています。

また、決定係数(R-squared)も計算して表示しています。

実行すると、回帰直線が追加された散布図の画像が表示されます。

R-squared: 0.7837

回帰直線を追加することで、データの全体的な傾向を一目で把握できます。

例えば、販売データの分析では、広告費と売上の関係を視覚化し、その効果を定量的に評価できます。

○サンプルコード6:エラーバーを追加して精度を表現

データ分析において、測定値の不確かさや変動を表現することは非常に重要です。

エラーバーを追加することで、データポイントの信頼性や精度を視覚的に表現できます。

特に実験データや統計データを扱う研究者の皆さんにとって、エラーバーは欠かせない要素でしょう。

それでは、エラーバーを含む散布図を作成するコードを見ていきましょう。

import matplotlib.pyplot as plt
import numpy as np

# データの生成
np.random.seed(0)
x = np.arange(10)
y = 2.5 * x + 1.0 + np.random.normal(0, 2.0, 10)
yerr = np.random.uniform(0.5, 1.5, 10)

# 散布図の作成
plt.figure(figsize=(10, 8))
plt.errorbar(x, y, yerr=yerr, fmt='o', capsize=5, capthick=2)
plt.xlabel('X軸')
plt.ylabel('Y軸')
plt.title('エラーバーを追加した散布図')
plt.grid(True)
plt.show()

このコードでは、plt.errorbar()関数を使用してエラーバー付きの散布図を作成しています。

yerr引数でY軸方向のエラーの大きさを指定し、fmt=’o’で点のマーカーを丸に設定しています。

capsize引数とcapthick引数でエラーバーの端の線の長さと太さを調整しています。

実行すると、エラーバーが追加された散布図の画像が表示されます。

エラーバーを追加することで、各データポイントの不確実性や変動範囲が一目でわかります。

例えば、科学実験の結果を報告する際、測定誤差を含めた結果の信頼性を表すことができます。

○サンプルコード7:ラベルとタイトルで情報を補完

グラフの見栄えを良くするだけでなく、データの理解を深めるために、適切なラベルとタイトルを付けることは非常に重要です。

ここでは、ラベルやタイトル、さらには注釈を追加して情報量の多い散布図を作成する方法を紹介します。

import matplotlib.pyplot as plt
import numpy as np

# データの生成
np.random.seed(0)
x = np.random.rand(50) * 10
y = 2 * x + 1 + np.random.randn(50)

# 散布図の作成
fig, ax = plt.subplots(figsize=(12, 9))
scatter = ax.scatter(x, y, c=y, cmap='viridis', s=100)

# ラベルとタイトルの設定
ax.set_xlabel('X軸: 独立変数', fontsize=12)
ax.set_ylabel('Y軸: 従属変数', fontsize=12)
ax.set_title('詳細な情報を含む散布図', fontsize=16)

# カラーバーの追加
cbar = plt.colorbar(scatter)
cbar.set_label('Y値', rotation=270, labelpad=15)

# グリッドの追加
ax.grid(True, linestyle='--', alpha=0.7)

# 注釈の追加
ax.annotate('興味深いデータポイント', xy=(8, 18), xytext=(6, 20),
            arrowprops=dict(facecolor='black', shrink=0.05))

# 凡例の追加
ax.legend(['データポイント'], loc='upper left')

plt.tight_layout()
plt.show()

このコードでは、ax.set_xlabel()、ax.set_ylabel()、ax.set_title()を使用してラベルとタイトルを設定しています。

plt.colorbar()でカラーバーを追加し、ax.annotate()で特定のデータポイントに注釈を付けています。

ax.legend()で凡例を追加し、plt.tight_layout()でレイアウトを自動調整しています。

実行すると、ラベル、タイトル、注釈が追加された散布図の画像が表示されます。

適切なラベルとタイトル、そして注釈を追加することで、グラフの情報量が大幅に増加します。

例えば、マーケティングデータの分析結果を上司に報告する際、グラフだけでストーリーが伝わるような工夫ができます。

○サンプルコード8:サブプロットを使用して複数の散布図を比較

複数のデータセットを比較したい場合、サブプロットを使用して複数の散布図を並べて表示することができます。

これで、データセット間の違いや関連性を一目で把握することが可能になります。

import matplotlib.pyplot as plt
import numpy as np

# データの生成
np.random.seed(0)
x1 = np.random.rand(50) * 10
y1 = 2 * x1 + 1 + np.random.randn(50)
x2 = np.random.rand(50) * 10
y2 = 3 * x2 - 2 + np.random.randn(50)

# サブプロットの作成
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16, 6))

# 左側の散布図
ax1.scatter(x1, y1, c='blue', alpha=0.6)
ax1.set_xlabel('X軸')
ax1.set_ylabel('Y軸')
ax1.set_title('データセット1')
ax1.grid(True)

# 右側の散布図
ax2.scatter(x2, y2, c='red', alpha=0.6)
ax2.set_xlabel('X軸')
ax2.set_ylabel('Y軸')
ax2.set_title('データセット2')
ax2.grid(True)

plt.tight_layout()
plt.show()

このコードでは、plt.subplots()を使用して2つのサブプロットを作成しています。

各サブプロットに対して異なるデータセットの散布図を描画し、それぞれにラベルとタイトルを設定しています。

実行すると、2つの散布図が並んで表示された画像が表示されます。

サブプロットを使用することで、複数のデータセットを効果的に比較できます。

例えば、異なる実験条件下でのデータを並べて表示し、条件による結果の違いを視覚的に理解することができます。

○サンプルコード9:3Dの散布図で多次元データを表現

3次元のデータを扱う場合、3Dの散布図を使用すると非常に効果的です。

3Dプロットを使用することで、データの空間的な分布や関係性をより直感的に理解することができます。

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

# データの生成
np.random.seed(0)
n = 100
x = np.random.rand(n) * 4 - 2
y = np.random.rand(n) * 4 - 2
z = x**2 + y**2 + np.random.rand(n) * 2

# 3D散布図の作成
fig = plt.figure(figsize=(12, 9))
ax = fig.add_subplot(111, projection='3d')

scatter = ax.scatter(x, y, z, c=z, cmap='viridis')

ax.set_xlabel('X軸')
ax.set_ylabel('Y軸')
ax.set_zlabel('Z軸')
ax.set_title('3D散布図')

# カラーバーの追加
plt.colorbar(scatter)

plt.tight_layout()
plt.show()

このコードでは、mpl_toolkits.mplot3dモジュールを使用して3D散布図を作成しています。

fig.add_subplot(111, projection=’3d’)で3D軸を作成し、ax.scatter()で3Dデータをプロットしています。

実行すると、3D散布図の画像が表示されます。

3D散布図は、3つの変数間の複雑な関係を視覚化するのに非常に有効です。

例えば、機械学習の分野で特徴量の関係を探索する際や、物理シミュレーションの結果を可視化する場合に活用できます。

○サンプルコード10:アニメーション散布図で時系列変化を表現

データの時間的変化を表現することは、多くの分析シナリオで重要です。

アニメーション散布図を使用すると、時系列データの動的な変化を視覚的に捉えることができます。

特に、経済データや気象データなど、時間とともに変化するデータセットの分析に有効です。

それでは、アニメーション散布図を作成するコードを見ていきましょう。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.animation import FuncAnimation

# データの生成
np.random.seed(0)
n_points = 50
n_frames = 50
x = np.random.randn(n_points, n_frames)
y = np.random.randn(n_points, n_frames)

# 図の初期化
fig, ax = plt.subplots(figsize=(10, 8))
scatter = ax.scatter([], [], c=[], cmap='viridis', s=100)
ax.set_xlim(-3, 3)
ax.set_ylim(-3, 3)
ax.set_xlabel('X軸')
ax.set_ylabel('Y軸')
ax.set_title('アニメーション散布図')

# アニメーション更新関数
def update(frame):
    scatter.set_offsets(np.c_[x[:, frame], y[:, frame]])
    scatter.set_array(np.hypot(x[:, frame], y[:, frame]))
    return scatter,

# アニメーションの作成
anim = FuncAnimation(fig, update, frames=n_frames, interval=100, blit=True)

plt.colorbar(scatter)
plt.tight_layout()
plt.show()

このコードでは、matplotlib.animation.FuncAnimationを使用してアニメーション散布図を作成しています。

update関数で各フレームのデータを更新し、FuncAnimationでアニメーションを生成しています。

実行すると、アニメーション散布図が表示されます。

点が動きながら色が変化していきます。

アニメーション散布図を使用することで、データの時間的変化を直感的に理解できます。

例えば、株価の日中変動を可視化したり、気象データの季節変化を表現したりすることができます。

●散布図作成時のよくあるエラーと対処法

Pythonを使って散布図を作成する際、様々なエラーに遭遇することがあります。

ここでは、よく発生するエラーとその対処法について解説します。

エラーに直面したときの焦りや不安を感じる気持ちはよくわかります。

しかし、落ち着いて原因を特定し、適切に対処することで、多くの問題は解決できます。

○「ValueError: x and y must have same first dimension」の解決方法

このエラーは、x軸とy軸のデータの長さが一致していない場合に発生します。

データ分析の過程で、異なるソースからデータを結合する際によく起こるエラーです。

例えば、次のようなコードでエラーが発生したとします。

import matplotlib.pyplot as plt
import numpy as np

x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 4, 6, 8])  # yのデータ数がxより1つ少ない

plt.scatter(x, y)
plt.show()

このコードを実行すると、「ValueError: x and y must have same first dimension」というエラーメッセージが表示されます。

解決方法は、x軸とy軸のデータの長さを一致させることです。

次のように修正します。

import matplotlib.pyplot as plt
import numpy as np

x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 4, 6, 8, 10])  # yのデータ数をxと同じに調整

plt.scatter(x, y)
plt.show()

修正後のコードを実行すると、エラーなく散布図が表示されます。

実際のデータ分析では、データの長さが一致しない原因を慎重に調査する必要があります。

欠損値の処理や、データのフィルタリングが適切に行われているか確認しましょう。

○散布図が表示されない場合の確認ポイント

散布図のコードを実行したにもかかわらず、グラフが表示されない場合があります。

このような状況は、特に初心者の方にとってはとてもフラストレーションがたまる経験でしょう。

主な原因と確認ポイントを見ていきましょう。

□plt.show()の呼び出し忘れ

最も多い原因の一つが、plt.show()の呼び出し忘れです。

次のコードを見てみましょう。

import matplotlib.pyplot as plt
import numpy as np

x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 4, 6, 8, 10])

plt.scatter(x, y)
# plt.show()が呼び出されていない

このコードでは、散布図は作成されていますが、表示されません。

plt.show()を追加することで解決します。

import matplotlib.pyplot as plt
import numpy as np

x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 4, 6, 8, 10])

plt.scatter(x, y)
plt.show()  # この行を追加

□データ範囲の問題

データの範囲が極端に小さい場合や大きい場合、点が見えないことがあります。

例えば、

import matplotlib.pyplot as plt
import numpy as np

x = np.array([0.0001, 0.0002, 0.0003, 0.0004, 0.0005])
y = np.array([0.0002, 0.0004, 0.0006, 0.0008, 0.0010])

plt.scatter(x, y)
plt.show()

このコードでは、点が非常に小さく見えるかもしれません。

軸の範囲を調整することで解決できます。

import matplotlib.pyplot as plt
import numpy as np

x = np.array([0.0001, 0.0002, 0.0003, 0.0004, 0.0005])
y = np.array([0.0002, 0.0004, 0.0006, 0.0008, 0.0010])

plt.scatter(x, y)
plt.xlim(0, 0.0006)  # x軸の範囲を指定
plt.ylim(0, 0.0012)  # y軸の範囲を指定
plt.show()

□マーカーサイズの問題

マーカーサイズが小さすぎる場合、点が見えないことがあります。

s引数でサイズを調整しましょう。

import matplotlib.pyplot as plt
import numpy as np

x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 4, 6, 8, 10])

plt.scatter(x, y, s=100)  # マーカーサイズを大きく設定
plt.show()

○メモリ不足エラーへの対応策

大量のデータを扱う際、メモリ不足エラーに遭遇することがあります。

このエラーは特に、ビッグデータを扱う現場で頭を悩ませる問題です。対応策をいくつか紹介します。

□データのサンプリング

すべてのデータポイントをプロットする代わりに、データの一部をサンプリングして使用します。

import matplotlib.pyplot as plt
import numpy as np

# 大量のデータを生成
np.random.seed(0)
x = np.random.rand(1000000)
y = np.random.rand(1000000)

# データをサンプリング
sample_size = 10000
indices = np.random.choice(len(x), sample_size, replace=False)
x_sample = x[indices]
y_sample = y[indices]

plt.figure(figsize=(10, 8))
plt.scatter(x_sample, y_sample, alpha=0.5)
plt.xlabel('X軸')
plt.ylabel('Y軸')
plt.title('サンプリングしたデータの散布図')
plt.show()

□データの分割処理

大きなデータセットを小さな塊に分割して処理します。

import matplotlib.pyplot as plt
import numpy as np

# 大量のデータを生成
np.random.seed(0)
x = np.random.rand(1000000)
y = np.random.rand(1000000)

# データを分割して処理
chunk_size = 100000
plt.figure(figsize=(10, 8))

for i in range(0, len(x), chunk_size):
    x_chunk = x[i:i+chunk_size]
    y_chunk = y[i:i+chunk_size]
    plt.scatter(x_chunk, y_chunk, alpha=0.5)

plt.xlabel('X軸')
plt.ylabel('Y軸')
plt.title('分割処理した大規模データの散布図')
plt.show()

□2Dヒストグラムの使用

散布図の代わりに2Dヒストグラムを使用することで、メモリ使用量を大幅に削減できます。

import matplotlib.pyplot as plt
import numpy as np

# 大量のデータを生成
np.random.seed(0)
x = np.random.rand(1000000)
y = np.random.rand(1000000)

plt.figure(figsize=(10, 8))
plt.hist2d(x, y, bins=100, cmap='viridis')
plt.colorbar(label='頻度')
plt.xlabel('X軸')
plt.ylabel('Y軸')
plt.title('2Dヒストグラムによる大規模データの可視化')
plt.show()

この対策を適用することで、大規模なデータセットでもメモリ不足エラーを回避しつつ、効果的な可視化を実現できます。

●Pythonのplot関数による散布図の応用例

Pythonのplot関数を使った散布図の基本的な作成方法や様々なテクニックを解説してきました。

ここからは、実際のデータ分析や可視化の現場で役立つ応用例を紹介します。

データサイエンティストやアナリストの皆さんが日々直面する課題に、散布図がどのように貢献できるのか、具体的なシナリオを交えて解説していきます。

○サンプルコード11:機械学習モデルの性能評価

機械学習モデルの性能を評価する際、散布図は非常に有用なツールとなります。

特に、回帰モデルの予測値と実際の値の関係を視覚化する場合に効果的です。

例えば、ボストン住宅価格データセットを使用して、線形回帰モデルの性能を評価してみましょう。

from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
import numpy as np

# データのロードと前処理
boston = load_boston()
X = boston.data
y = boston.target

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# モデルの学習と予測
model = LinearRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)

# 散布図の作成
plt.figure(figsize=(10, 8))
plt.scatter(y_test, y_pred, alpha=0.5)
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--', lw=2)
plt.xlabel('実際の価格')
plt.ylabel('予測価格')
plt.title('ボストン住宅価格:実際の価格 vs 予測価格')
plt.tight_layout()
plt.show()

# R-squared scoreの計算
r2 = model.score(X_test, y_test)
print(f"R-squared score: {r2:.4f}")

このコードでは、scikit-learnライブラリを使用してボストン住宅価格データセットをロードし、線形回帰モデルを学習させています。

そして、テストデータに対する予測結果と実際の値をscatter関数を使って散布図にプロットしています。

実行すると、散布図が表示されます。

x軸が実際の価格、y軸が予測価格を示し、点が散らばっている様子が見えます。

また、赤い破線で完全に予測が当たった場合の直線が引かれています。

R-squared score: 0.7254

この散布図から、モデルの予測性能を視覚的に評価できます。

点が赤い破線(完全な予測を表す)に近いほど、モデルの予測精度が高いことを表します。

また、R-squared scoreも計算していますが、この値が1に近いほどモデルの説明力が高いことを意味します。

○サンプルコード12:株価データの時系列分析

金融データの分析は、多くのデータアナリストにとって重要なタスクです。

ここでは、株価データの時系列分析を散布図を使って行う方法を紹介します。

import yfinance as yf
import matplotlib.pyplot as plt
from datetime import datetime, timedelta

# データの取得
end_date = datetime.now()
start_date = end_date - timedelta(days=365)
ticker = "AAPL"
data = yf.download(ticker, start=start_date, end=end_date)

# 散布図の作成
plt.figure(figsize=(12, 8))
plt.scatter(data.index, data['Close'], alpha=0.5)
plt.plot(data.index, data['Close'], color='red', alpha=0.7)
plt.title(f'{ticker}の株価推移(過去1年間)')
plt.xlabel('日付')
plt.ylabel('終値 (USD)')
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

# 簡単な統計情報の表示
print(f"期間中の最高値: ${data['Close'].max():.2f}")
print(f"期間中の最安値: ${data['Close'].min():.2f}")
print(f"期間中の平均値: ${data['Close'].mean():.2f}")

このコードでは、yfinanceライブラリを使用してApple社(AAPL)の過去1年間の株価データを取得し、終値の推移を散布図と折れ線グラフで表現しています。

実行すると、散布図が表示されます。

x軸が日付、y軸が株価を示し、赤い線で株価の推移が表現されています。

この散布図により、株価の日々の変動と全体的なトレンドを同時に把握できます。

散布図の各点が日々の終値を、赤い線が全体的な推移を表現しています。

また、簡単な統計情報も併せて表示することで、データの概要を数値でも確認できます。

○サンプルコード13:地理データの可視化

地理データの可視化は、位置情報を含むデータを分析する上で非常に重要です。

ここでは、世界の主要都市の位置データを散布図で表現する方法を紹介します。

import matplotlib.pyplot as plt
import pandas as pd

# サンプルデータの作成(実際のプロジェクトではCSVファイルなどから読み込むことが多いです)
data = {
    'city': ['東京', 'ニューヨーク', 'ロンドン', 'パリ', 'シドニー'],
    'lat': [35.6762, 40.7128, 51.5074, 48.8566, -33.8688],
    'lon': [139.6503, -74.0060, -0.1278, 2.3522, 151.2093],
    'population': [37400000, 18819000, 9304000, 10901000, 5312000]
}

df = pd.DataFrame(data)

# 世界地図の背景を追加
plt.figure(figsize=(15, 10))
img = plt.imread('world_map.png')  # 世界地図の画像ファイル
plt.imshow(img, extent=[-180, 180, -90, 90], alpha=0.5)

# 散布図の作成
scatter = plt.scatter(df['lon'], df['lat'], s=df['population']/100000, alpha=0.6, c=df['population'], cmap='viridis')

# 都市名のラベル追加
for i, txt in enumerate(df['city']):
    plt.annotate(txt, (df['lon'][i], df['lat'][i]), xytext=(5,5), textcoords='offset points')

plt.colorbar(scatter, label='人口')
plt.title('世界の主要都市の位置と人口')
plt.xlabel('経度')
plt.ylabel('緯度')
plt.tight_layout()
plt.show()

このコードでは、世界の主要都市の位置(緯度・経度)と人口データを使用して散布図を作成しています。

背景に世界地図を表示し、都市の位置を点で、人口を点の大きさと色で表現しています。

実行すると、世界地図を背景にした散布図が表示されます。

各都市の位置に点が打たれ、その大きさと色で人口が表現されています。

この散布図により、都市の地理的な位置関係と人口規模を同時に把握することができます。

都市間の距離や、特定の地域における都市の集中度なども視覚的に理解しやすくなります。

○サンプルコード14:センサーデータのリアルタイム表示

IoT(Internet of Things)デバイスやセンサーから得られるデータをリアルタイムで可視化することは、多くの産業で重要な役割を果たしています。

ここでは、温度センサーのデータをリアルタイムで散布図に表示する方法を紹介します。

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.animation import FuncAnimation

# ダミーのセンサーデータを生成する関数
def get_sensor_data():
    time = np.datetime64('now')
    temperature = np.random.normal(25, 2)  # 平均25度、標準偏差2度の正規分布
    return time, temperature

# 初期化関数
def init():
    ax.set_ylim(0, 50)
    ax.set_xlim(np.datetime64('now') - np.timedelta64(1, 'm'), np.datetime64('now'))
    return ln,

# アニメーション更新関数
def update(frame):
    time, temp = get_sensor_data()
    times.append(time)
    temperatures.append(temp)

    # 最新の1分間のデータのみを表示
    start_time = np.datetime64('now') - np.timedelta64(1, 'm')
    valid_data = [(t, temp) for t, temp in zip(times, temperatures) if t > start_time]
    if valid_data:
        new_times, new_temps = zip(*valid_data)
    else:
        new_times, new_temps = [], []

    ln.set_data(new_times, new_temps)
    ax.set_xlim(start_time, np.datetime64('now'))
    ax.figure.canvas.draw()
    return ln,

# グラフの初期設定
fig, ax = plt.subplots(figsize=(12, 6))
ln, = ax.plot([], [], 'ro')
ax.set_xlabel('時間')
ax.set_ylabel('温度 (°C)')
ax.set_title('リアルタイム温度センサーデータ')

times = []
temperatures = []

# アニメーションの作成と表示
ani = FuncAnimation(fig, update, frames=200, init_func=init, blit=True, interval=500)
plt.show()

このコードでは、matplotlib.animation.FuncAnimationを使用して、温度センサーからのデータをリアルタイムで散布図に表示しています。

実際のセンサーデータの代わりに、ダミーデータをランダムに生成しています。

実行すると、リアルタイムで更新される散布図が表示されます。

x軸が時間、y軸が温度を示し、新しいデータポイントが次々と追加されていく様子が見えます。

この散布図により、温度の変化をリアルタイムで視覚的に捉えることができます。

例えば、工場の生産ラインの温度モニタリングや、サーバールームの温度管理など、様々な場面で活用できます。

急激な温度変化や異常値の検出も、視覚的に素早く行うことができます。

まとめ

Pythonのplot関数を使った散布図の作成について、基礎から応用まで幅広く解説してきました。

実際のプロジェクトでは、データの特性や目的に応じて、今回のテクニックを組み合わせたり、さらに発展させたりする必要があるかもしれません。

常に新しい可視化手法にアンテナを張り、自身のスキルを磨き続けることが大切です。

技術的な正確さと美的センスのバランスを取ることで、より効果的なデータストーリーテリングが可能になります。

ぜひ、ここで学んだテクニックを基礎として、自身の創造性を発揮し、独自の魅力的な散布図を作成してみてください。