📖

散布図と相関係数

2023/06/03に公開

散布図と相関係数

こんにちは!わいわわです!
前回の投稿では記述統計に関して、1つのデータのみに着目して基本統計量を求めてきました。
https://zenn.dev/waiwawaiwai/articles/884763e513ee37
前回は30日間のあるサイトのアクセス数の基本統計量でしたので、
「アクセス数」にのみ着目すればよかったんですね!

今回は2つのデータに着目し(2変数)、視覚化や関係性を読み解く方法を学習します。

散布図と相関関係

「ネット広告を行うと売上が増える」
「今年の夏は暑いので飲料水の売上が伸びる」など、
相互に関係性のあるデータが多く存在しています。
このようなデータ間に何らかの法則がある関係のことを相関関係といいます!
また、相関関係散布図を用いることで視覚的に表すことができます!

今回もデータを用意しています。ファイル名は[sales.csv]とします。
ある店舗において、8月各日の最高気温及びその日に売れた飲料水の売上数を記録した表です。

最高気温,清涼飲料売上数
26,84
25,61
26,85
24,63
25,71
24,81
26,98
26,101
25,93
27,118
...

カンマ区切りのデータが30個(30日分)あります!

まず、散布図を作成する際は
・原因となる項目を横軸
・結果となる項目を縦軸
にそれぞれ設定することです。
原因につられて、結果のデータが変化する度合いが分かりやすくなるためです。

まず、pandasライブラリでデータフレームに読み込みます。

import pandas as pd
df = pd.read_csv(
    'sales.csv')
df.head()

!出力結果!

とりあえずdf.head()で5つ取り出しています

続いてデータフレームを元に散布図を作成します。
原因となる横軸に「最高気温」を設定し、結果となる縦軸に「飲料水売り上げ数」を設定。

import matplotlib.pyplot as plt

df.plot(
    x=df.columns[0],
    y=df.columns[1],
    kind='scatter',
    grid=True,
    xlabel='Highest temperature',
    ylabel='Salse')

plt.show()

!出力結果!

x=df.columns[0]で横軸に最高気温を設定(列インデックス:0)
y=df.columns[1]で縦軸に売り上げ数を設定(列インデックス:1)
scatterで散布図を指定しています!

作成された散布図ではその日の最高気温(x軸)と、飲料水の売上数(y軸)が交差する部分に○がプロットされています。
右肩上がりにプロットされた場合は「一方の値が増えると、もう一方の値も増える」正の相関、
逆に右肩下がりにプロットされた場合は「一方の値が増えると、もう一方の値が減る」負の相関があることになります。
また、バラバラにプロットされた場合は2つのデータには目立った関係がないことになるので、無相関だと判断できます。

共分散

「2つのデータの間での平均からの偏差の積の平均値」のことを共分散といいます。
共分散は2組のデータの偏差の積の平均値で、2組の変数の相関を表しています。
「x、yの散らばり(分散)が大きいと、共分散も大きくなる」傾向があります。

清涼飲料水の売上数と最高気温の共分散を求める

共分散は以下で求めることができます。

x = df['最高気温'].values
y = df['清涼飲料売上数'].values

mean_x = x.sum() / len(x)
mean_y = y.sum() / len(y)

sxy = ((x - mean_x)*(y - mean_y)).sum() / len(x)
sxy

出力結果→365.9377777777778
 
そしてこの共分散はcov()関数でも求めることができます。

import numpy as np

sxy = np.cov(x, y, bias=True)
np.set_printoptions(suppress=True)

sxy

!出力結果!

array([[   10.84555556,   365.93777778],
       [  365.93777778, 13115.86222222]])

結果は行列として出力され、1行1列がxの分散、
1行2列が共分散、2行1列も同じく共分散、
2行2列がyの分散となります。
また、set_printopitions(suppress=True)を実行し少数で出力されるようにしています。

相関係数

分散が大きいと、共分散も大きくなる傾向があります。
ただし、散らばりの大きさは各変数の値の範囲や単位の取り方によって大きく変わってしまいます。
そのため、純粋に相関だけを見たい時は相関係数を用います。
相関係数は、-1から1までの値をとり、1に近ければ近いほど正の相関があるといい、
-1に近ければ近いほど負の相関があるといます。
0に近い場合は無相関であるといいます。

相関係数を求める

# xの標準偏差
sx = np.sqrt(((x - mean_x)**2).sum() / len(x))
# yの標準偏差
sy = np.sqrt(((y - mean_y)**2).sum() / len(y))
# x、yの共分散
sxy = ((x - mean_x)*(y - mean_y)).sum() / len(x)
# x、yの相関係数を求める
sxy / (sx * sy)

出力結果→0.9702483699900755

相関係数は約0.97、正の相関があるといえます!
また、相関係数はcorrcoef()関数でも求めることができます。
引数にデータxとyを指定するだけです。

np.corrcoef(x, y)

!出力結果!

array([[1.        , 0.97024837],
       [0.97024837, 1.        ]])

出力は行列の形式となり、
[xとxの相関係数,xとyの相関係数],
[yとxの相関係数,yとyの相関係数]
のようになります。
このような形式になるのは多変数にも対応するためです。
corrcoef()関数では変数の数をさらに増やして、すべての変数間の相関係数を求めることもできます。

所感

今回は2つ以上のデータの視覚化と相互のデータの関係性を読み解く方法を確認しました。
少し難しかったですが、理解できたのでさらに数学の知識をこの期間は学習していきます!
明日は線形単回帰分析です!

Discussion