GIS奮闘記

元GISエンジニアの技術紹介ブログ。主にPythonを使用。

スポンサーリンク

Python で相関分析に使うデータを散布図で可視化してみる

さて、本日は相関分析に使うデータを散布図で可視化してみようと思います。前回エントリーでは相関係数の計算を行いました。今回は相関係数算出に使ったデータを散布図で可視化してみようと思います。

散布図とは

散布図は、横軸と縦軸にそれぞれ別の量をとり、データが当てはまるところに点を打って示す(「プロットする」といいます。)グラフです。2つの量に関係があるかどうかをみるのに非常に便利なグラフです。(出典:なるほど統計学園)

使用するデータ

前回エントリーと同じく、以下のエントリーで収集した SUUMO の中古物件情報を使います。

www.gis-py.com

相関関係を分析する属性

SUUMO の中古物件情報の以下の属性を使います。

  • 築年数
  • 販売価格
二つの属性に相関関係がある場合

築年数が高くなれば販売価格が高くなり、築年数が低くなれば販売価格が低くなります。

使用するライブラリ

Pythonでグラフを作るためのライブラリである seaborn を使います。

作成する散布図

以下二つの散布図を作成します。

  • 散布図
  • 散布図+回帰線

実行環境

macOS 12.3.1
Python 3.9.6

サンプルコード

散布図

中古一戸建てとマンションで色分けし、プロットしたポイントに対してラベリングを行なっています。

import seaborn as sns
import pandas as pd
from matplotlib import pyplot as plt
import numpy as np
import japanize_matplotlib

jitter_value = 2

def label_point(x, y, val, ax):
    a = pd.concat({"x": jitter(x, jitter_value), "y": jitter(y, jitter_value), "val": val}, axis=1)
    for i, point in a.iterrows():
        ax.text(point["x"]+.02, point["y"], str(point["val"]))

def jitter(values, j):
    return values + np.random.normal(j, 0.1, values.shape)

# データ読み込み(数が多いのでデータを間引いて読み込む)
df_top = pd.read_csv("property.csv")[0:20]
df_bottom = pd.read_csv("property.csv")[3400:3420]
df_correlation = df_top.append(df_bottom)

# グラフサイズ設定
plt.figure(figsize = (20, 10))

# 散布図作成(ポイントが重ならないようにジッター処理を実施)
ax = sns.scatterplot(data = df_correlation, 
                     x = jitter(df_correlation["販売価格"], jitter_value), 
                     y = jitter(df_correlation["築年数"], jitter_value),
                     hue = "カテゴリ")

# 散布図にタイトルを設定
ax.set_title("SUUMO中古物件相関分析", pad = 8, fontsize = 20, color = 'blue')

# プロットにラベリング
label_point(df_correlation["販売価格"], 
            df_correlation["築年数"], 
            df_correlation["所在地"], 
            ax)

# 散布図を画像として保存(おまけ)
plt.savefig("test.png")

# 散布図表示
plt.show()

このように散布図が作成されました。

散布図+回帰線

lmplot というメソッドを使うことで「回帰モデルの傾向線」を可視化することができます。

import seaborn as sns
import pandas as pd
from matplotlib import pyplot as plt
import numpy as np
import japanize_matplotlib

# データ読み込み(数が多いのでデータを間引いて読み込む)
df_top = pd.read_csv("property.csv")[0:20]
df_bottom = pd.read_csv("property.csv")[3400:3420]
df_correlation = df_top.append(df_bottom)

# グラフサイズ設定
plt.figure(figsize = (20, 10))

ax = sns.lmplot(x = "販売価格", 
                y = "築年数",
                hue = "カテゴリ",
                data = df_correlation,
                x_jitter = 2,
                y_jitter = 2,
                height = 10,
                aspect = 2,
                legend = False)

ax.set(title = "SUUMO中古物件相関分析")
plt.legend(loc = 'upper right')

# プロットにラベリング
for ax in ax.axes.ravel():
    for t, x, y in df_correlation[['所在地', '販売価格', '築年数']].values.tolist():
        ax.annotate(t, (x, y))

# 散布図を画像として保存(おまけ)
plt.savefig("test.png")

# 散布図表示
plt.show()

傾向線付きの散布図が作成されました(どうしてもタイトルが切れてしまいますが、とりあえず作成はできました)。中古一戸建てに関しては販売価格と築年数は負の相関関係にありますが、中古マンションに関しては正の相関関係にあることがわかります。

さいごに

このような感じで散布図を作ることができます。相関分析を実施する際は相関係数の算出だけではなく散布図や傾向線の作成は必須かと思いますので、興味のある方はぜひ試してみてください。本日は以上です。