はじめに
Pythonを使ってデータの相関係数を計算する方法を何通りか示します。
使用データ
方法を示すだけなので適当なデータ
data.csv
sqrt2,pi
1,3
4,1
1,4
4,1
2,5
1,9
3,2
5,6
6,5
を使用します。
計算方法例
Pandas
一番簡単なやりかたですね
import pandas as pd
df = pd.read_csv('./data.csv')
print(df.corr())
↓
sqrt2 pi
sqrt2 1.000000 -0.205738
pi -0.205738 1.000000
NumPy
import numpy as np
import pandas as pd
df = pd.read_csv('./data.csv')
col1 = df['sqrt2'].tolist()
col2 = df['pi'].tolist()
print(np.corrcoef(col1, col2))
↓
[[ 1. -0.2057378]
[-0.2057378 1. ]]
NumPyその2
データの読み込みにpandasを使っているのでわざわざNumPyにする必要がない…という方のために
import csv
import numpy as np
with open('./data.csv') as f:
reader = csv.DictReader(f)
col1, col2 = [], []
for row in reader:
col1.append(float(row['sqrt2']))
col2.append(float(row['pi']))
print(np.corrcoef(col1, col2))
↓
[[ 1. -0.2057378]
[-0.2057378 1. ]]
(Pandasでいいじゃん…)
自前で頑張る
ライブラリなんて使いたくない人向けです
(だったら正直Pythonである必要がないと思いますが)
with open('./data.csv') as f:
lines = f.readlines()[1:]
col1, col2 = [], []
for line in lines:
data = list(map(float, line.split(',')))
col1.append(data[0])
col2.append(data[1])
def avg(l):
return sum(l) /len(l)
def s(l1, l2):
avg1, avg2 = avg(l1), avg(l2)
return sum((v1-avg1)*(v2-avg2) for v1, v2 in zip(l1, l2))
r = s(col1, col2) / (s(col1, col1) * s(col2, col2)) ** .5
print(r)
↓
-0.20573779994945587
さいごに
下に行くほどPythonである必要性を失っている気がしますが自分が何をしているのかが見えやすいという意味では勉強になるのではないでしょうか