📊

データ分析 python 基本のグラフ -散布図-

2024/09/12に公開

データ分析で使用するグラフを簡単にまとめていきます
python + google colaboratory で 実行しています

散布図とは

散布図とは、2つの数値データの関係を視覚的に表すためのグラフです。

  • 右肩上がり:正の相関(xが増えるとyも増える)
  • 右下下がり:負の相関(xが増えるとyは減る)
  • ばらばら:無相関(xとyに関係がない)

散布図を表示

matplotlib の scatter メソッド で表示します

基本的な散布図の表示

# 基本的な散布図
import matplotlib.pyplot as plt

# サンプルデータ
x = [1, 2, 3, 4, 5]
y = [10, 11, 9, 12, 8]

# 散布図を描画
plt.scatter(x, y)

seabornで見やすくする

seabornを使用するとグラフが見やすくなります

# seabornで
import matplotlib.pyplot as plt
import seaborn as sns

plt.style.use('seaborn') #他にもいろいろなスタイルがある

# サンプルデータ
x = [1, 2, 3, 4, 5]
y = [10, 11, 9, 12, 8]

# 散布図を描画
plt.scatter(x, y)

ラベルやタイトルを付ける

ラベルに日本語を使用しないのであれば、以下のコードのようにラベル、グラフタイトルを付けます。
ラベルを日本語で付ける場合は、このままでは文字化けします。

import matplotlib.pyplot as plt
import seaborn as sns

plt.style.use('seaborn')

# サンプルデータ
x = [1, 2, 3, 4, 5]
y = [10, 11, 9, 12, 8]

# ラベルを表示
plt.xlabel('X軸ラベル')
plt.ylabel('Y軸ラベル')

# グラフタイトルを表示
plt.title('グラフタイトル')

# 散布図を描画
plt.scatter(x, y)


日本語ラベルを付けるには japanize_matplotlib をインストールし、rcParams で日本語フォントを指定します。

!pip install -q japanize_matplotlib # 日本語対応

import matplotlib.pyplot as plt
import seaborn as sns
import japanize_matplotlib  # 日本語対応

plt.style.use('seaborn')
plt.rcParams['font.family'] = 'IPAexGothic'  # 日本語フォント

# サンプルデータ
x = [1, 2, 3, 4, 5]
y = [10, 11, 9, 12, 8]

# ラベルを表示
plt.xlabel('X軸ラベル')
plt.ylabel('Y軸ラベル')

# グラフタイトルを表示
plt.title('グラフタイトル')

# 散布図を描画
plt.scatter(x, y)

各データポイントにラベルを付ける

散布図の点にテキストラベル(アノテーション)を付けることができます。

!pip install -q japanize-matplotlib

import matplotlib.pyplot as plt
import seaborn as sns
import japanize_matplotlib

plt.style.use('seaborn')
plt.rcParams['font.family'] = 'IPAexGothic'

# サンプルデータ
x = [1, 2, 3, 4, 5]
y = [10, 11, 9, 12, 8]
no = ['A', 'B', 'C', 'D', 'E']

# ラベルを表示
plt.xlabel('X軸ラベル')
plt.ylabel('Y軸ラベル')

# グラフタイトルを表示
plt.title('グラフタイトル')

# テキストを描画
for _x, _y, label in zip(x, y, no):
  plt.text(_x, _y, label)

# 散布図を描画
plt.scatter(x, y, alpha=0.6)

データポイントの色を変える

scatterメソッドの cパラメータを指定することで、各データポイントの色を変えることができます

!pip install -q japanize-matplotlib

import matplotlib.pyplot as plt
import seaborn as sns
import japanize_matplotlib
import numpy as np

plt.style.use('seaborn')
plt.rcParams['font.family'] = 'IPAexGothic'

# サンプルデータ
x = np.arange(1, 2001)
y = np.random.normal(loc=915, scale=5, size=2000)  

# ラベルを表示
plt.xlabel('X軸ラベル')
plt.ylabel('Y軸ラベル')

# グラフタイトルを表示
plt.title('グラフタイトル')

# 散布図を描画
plt.scatter(x, y, alpha=0.8, c='red')

データポイントに合わせてカラーで表示

scatterメソッドのcmapパラメータを指定することで散布図を色付きで表示できます。
plasma以外にもいろいろあります。
cパラメータに色付けのための基準を指定します。
c=list(range(len(x))) を指定することで、X軸のインデックスに基づいて各点に色を付けています。

!pip install -q japanize-matplotlib

import matplotlib.pyplot as plt
import seaborn as sns
import japanize_matplotlib
import numpy as np

plt.style.use('seaborn')
plt.rcParams['font.family'] = 'IPAexGothic'

# サンプルデータ
x = np.arange(1, 2001)
y = np.random.normal(loc=915, scale=5, size=2000)  

# ラベルを表示
plt.xlabel('X軸ラベル')
plt.ylabel('Y軸ラベル')

# グラフタイトルを表示
plt.title('グラフタイトル')

# 散布図を描画
plt.scatter(x, y, alpha=0.8, c=list(range(len(x))), cmap='plasma')

3Dで散布図を表示

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

# サンプルデータを作成
np.random.seed(0)
x = np.random.rand(100) * 100  # X軸データ
y = np.random.rand(100) * 100  # Y軸データ
z = np.random.rand(100) * 100  # Z軸データ
colors = np.random.rand(100)   # 各点の色をランダムに設定
sizes = 100 * np.random.rand(100)  # 各点のサイズをランダムに設定

# Figureと3Dプロットを作成
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, projection='3d')  # 3Dプロットを指定

# 3D散布図を描画
sc = ax.scatter(x, y, z, c=colors, s=sizes, cmap='viridis', alpha=0.8)

# カラーバーを表示
fig.colorbar(sc)

# 軸ラベルの設定
ax.set_xlabel('X軸')
ax.set_ylabel('Y軸')
ax.set_zlabel('Z軸')

# タイトルを設定
plt.title('3D 散布図のサンプル')

# ラベルが見切れるので余白を自動調整
plt.tight_layout()

# プロットを表示
plt.show()

データフレームをグラフ化する

データフレームをグラフ化します

!pip install -q japanize-matplotlib

import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib

plt.style.use('seaborn')
plt.rcParams['font.family'] = 'IPAexGothic'

df = pd.read_csv('/content/drive/MyDrive/correlation_analysis_testdata.csv')
df.head(3)

plt.scatter(df['運動時間'], df['支出'])
plt.xlabel('運動時間')
plt.ylabel('支出')

データフレーム全体をまとめてグラフ化する

seabornのpairplotを使用するとデータフレーム全体を散布図で表示してくれます

!pip install -q japanize-matplotlib

import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib
import seaborn as sns

plt.style.use('seaboran') #グラフのスタイル 他にも bmh, ggplot, などいろいろある 
plt.rcParams['font.family'] = 'IPAexGothic' #日本語フォント

df = pd.read_csv('/content/drive/MyDrive/correlation_analysis_testdata.csv')
df.head(3)

sns.pairplot(df)

Discussion