複数の波形データ系列が、どの程度類似しているか?を定量的に検証してみたいときがあります。
統計学的には、”相関係数”を算出することで、定量性を得ることが出来ます。
多分、Excelや、Libreofficeなどでそういった機能があると思いますが、いちいちあのクソ重いアプリを起動する
というのもめんどくさいハナシなので、pythonでスクリプト化しました。
といっても、難しいハナシではなく、pythonのnumpyパッケージで、既にcorrcoefとして提供されているんですよね。
numpy.corrcoefの機能
与えられた波形データ系列の類似度を、相関係数を保持する相関行列として返します。
二つのデータ系列が与えられた場合、
2行2列の行列が返されます。 このとき、相関係数は、行列要素[0, 1]に配置されています。(もしくは[1,0])
また、一般に、0.7以上の相関係数であれば、相関が強いとされます。
以下、Repl表示
>>> import numpy >>> x = [1,2,3,4,5] >>> y = [1,2,3,4,6] >>> z = [1,1,10,11,16] # xとyの相関係数 >>> numpy.corrcoef(x,y) array([[ 1. , 0.98639392], [ 0.98639392, 1. ]]) # yとzの相関係数 >>> numpy.corrcoef(y,z) array([[ 1. , 0.94764454], [ 0.94764454, 1. ]]) # xとyとzの相関係数 >>> numpy.corrcoef([x,y,z]) array([[ 1. , 0.98639392, 0.95672975], [ 0.98639392, 1. , 0.94764454], [ 0.95672975, 0.94764454, 1. ]])
スクリプトの機能
1系列のデータを保持するファイルを読み取り、データ系列どうしの相関行列を算出します。
ファイルは、1行、1データの形式です。
与えることのできるファイル数、データ量はシステム依存です。
スクリプト(cal_corre.py)
python 2.7系でのスクリプトです。(python 3系では、文法が異なってきます。)
import sys import numpy argvs = sys.argv arg_num = len(argvs) # check heading tail if arg_num < 3: sys.exit("Usage : you need file path at least 2...") file_list = [] # append file-list for f in argvs[1:]: file_list.append(f) arry_list = [] # correct data for fl in file_list: f = open(fl) line = f.readline() arry = [] while line: # strip return code line = line.rstrip() # cast into float line = float(line) # append arry.append(line) line = f.readline() f.close # adding array list arry_list.append(arry) # correlation corr = numpy.corrcoef(arry_list) # result of correlation print corr
利用方法
ファイル:inputdata1
ファイル:inputdata3
ファイル:inputdata2
1.0
2.0
3.5
4.0
5.0
1.0
2.0
3.0
4.0
6.0
1.0
1.0
10.0
11.0
16.0
データ系列どうしの相関行列を下記のようにして得ることが出来ます。
$ python cal_corre.py ./inputdata1 ./inputdata2 ./inputdata3
[[ 1. 0.96853656 0.97335446]
[ 0.96853656 1. 0.94764454]
[ 0.97335446 0.94764454 1. ]]