Help us understand the problem. What is going on with this article?

PHPで数学しよう‼️ 相関係数の巻

More than 1 year has passed since last update.

はじめに

新たな現場に入って数ヶ月、ようやく慣れてきてPHP使って面白いことしたいなあ・・・と思った時たまたま高校数学の「データの分析」で習った相関係数をPHPで求めてJSとかでグラフに出したら楽しそうだなあと思いそそくさと実装した次第です:relaxed:
PHPじゃなくても実装できると思うので興味を持っていただけたなら試してみていただけると・・・笑

そもそも相関係数って??

「相関係数」なんてワードはなかなか日常生活で耳にしないと思うので簡単にご紹介します。
数学ガチ勢ではないので、やんわりと。。悪しからず:sweat_smile:

ざっくり言うと、2つの変数を用意して、その変数同士の関係性を示すパラメータです。
例をあげると、
「ご飯をいっぱい食べる人は体重が多い傾向がある」とか
「暖房器具の販売数が多い地域は月別平均気温が低い傾向がある」とかでしょうか。
あくまで「傾向」なのでそれがすべてではありませんが、その「傾向」ってどれくらいの量なの?という疑問を数値として表してくれるのが相関係数です。

-1から1の間で値を取り-1に近いほど「負の相関」、1に近いほど「正の相関」があると言えます。
2018-11-23-23-58-31.png

分析に使う配列を作ろう

計算を始める前にまず分析に使いたいデータセットを用意する必要があります。
データセットといっても分析したい値を格納した配列を2つ用意すればOKです!

作る方法は単純に値を手打ちで入れてもいいですし、
私はWebスクレイピングで値を自動格納するコードを書きました。
スクレイピングの方法は今回割愛しますが、PHPでも十分スクレイピングできるのでおすすめです。
2018-11-24-00-25-58.png
図にも入れたのですが都道府県系のデータは47で基本固定なのでWebスクレイピングを使って配列を作る場合は非常におすすめです!
意外性もあったり、割と受けます:stuck_out_tongue_winking_eye:

数式からコードへ

お待たせしました。。こちらでは実際に数式をコードへ落とし込んで行きます。
まずは相関係数の公式を確認してみましょう‼️
2018-11-24-00-37-10.png
....よくわからないですね笑
学生時代見るだけで吐き気を催したΣの文字があったりするし :angel_tone2:

大丈夫です!ちょっといかつい感じですけどバラして実装すればそんな難しくないのです:punch_tone4:

ここから公式をPHPで書いていくわけですが大きく3ステップに分けて解説していきます。
①標準偏差の計算
②共分散の計算
③相関係数の計算
です!
今回使用する配列は47都道府県のデータを用いている(それぞれの配列内には47つの値が格納さえている)という前提の元で実装してきますので47都道府県以外のデータを用いる場合ご注意ください!

①標準偏差の計算

まず標準偏差を求めて行きます!その前に標準偏差とはなんぞやですよね:sob:
標準偏差はデータのばらつきの度合いを表しています。
x,yそれぞれ求める必要があります。
2018-11-24-01-02-03.png
2018-11-24-01-10-28.png
数学の知識が吹っ飛んでる方も多いと思うので簡単な図を用意しました。(字が汚いとは言わないで・・・)
Σも悪いやつではないことはご理解いただけたと思います。for文で実装できそうですね:v_tone4:

標準偏差の計算もいくつかのフェーズに分けます
1.平均計算
2.√内計算
3.√付与
です。

1.平均計算

まずは平均を求めます。下図の赤で書いた部分です。
2018-11-24-01-17-22.png
平均は極めて簡単に求められます。

ex.)
$arrayX = [47都道府県のデータ①が格納];
$arrayY = [47都道府県のデータ②が格納];

//値の合計値を求める。
$totalArrayX = array_sum($arrayX);
$totalArrayY = array_sum($arrayY);

//配列数nで割って平均を求める。今回の場合n=47
$aveX = $totalArrayX / 47; 
$aveY = $totalArrayY / 47; 

2.√内計算

続いて√の中身を計算します。

ex.)
//sd = standard deviation(標準偏差)
$sdX = 0; 
$sdY = 0; 
//Σはfor文で実装
for($i = 0; $i < 47; $i++) 
{ 
  $sdX = $sdX + pow($arrayX[$i] - $aveX, 2); 
  $sdY = $sdY + pow($arrayY[$i] - $aveY, 2);
} 

3.√付与

最後に√を付与します。平方根計算にはsqrt()関数を使えます。

ex.)
$sdX = sqrt($sdX / 47);
$sdY = sqrt($sdY / 47);
//のちのちXとYはかけることになるので今のうちに計算しておきましょう。 
$sd = $sdX * $sdY; 

これでx,yの標準偏差が求まり、最後ちゃっかりかけるとこまで終わりました!
意外と大変な計算はなかったですね。。

②共分散の計算

続いて共分散を求めて行きましょう!!

ex.)
//convariance(共分散)
$covariance = 0; 

for($i = 0; $i < 47; $i++) 
{ 
  $varianceX = $arrayX[$i] - $aveX; 
  $varianceY = $arrayY[$i] - $aveY; 
  $varianceXY = $varianceX * $varianceY; 
  $covariance =  $covariance + $varianceXY; 
}  

$covariance = $covariance / 47;

こちらも意外と簡単な内容でした。(共分散の計算が軽薄であるといっているわけではなくハードルは割と低いよ!ということです。深く探求すれば奥が深いでしょうが...笑)
最後はいよいよ相関係数を求めましょう!

③相関係数の計算

ここで行うことは単に割り算するだけです:relaxed:

ex.)
//cc = correlation coefficient(相関係数)
$cc = $covariance / $sd; 
//round()関数で小数点以下をある程度切った方が見栄えが良いでしょう
$cc = round($cc, 2); 

これで相関係数が求められたと思います!!
値は-1から 1の間で表示されているでしょうか??-1から1の間で推移する値なので飛び越えてしまった場合、コードに問題があると思うので、コードを見直してみましょう:thinking:

フロントでの表示

せっかく値が求められたので、フロントで表示させてあげるとイケてると思います。
私はChart.jsを使ってグラフを表示できるようにしました!
相関具合が図でわかるとより具体性が上昇すると思うのでぜひ試してみてください!
js側で使う場合は配列をjsonにして渡してあげると良いでしょう:heart_eyes_cat:
一応自分の実装した結果表示画面のキャプチャを載せておきます:kissing_cat:
スクリーンショット 2018-11-24 2.37.21.png

最後に

いかがだったでしょうか?今回は高校一年生で習う公式をPHPで処理できるようにしました。使っている技術はどれも単純なものです。(php基礎文法✖️高一でならう公式)
ただそれぞれの「点」は基本的、単純なものでも、点と点を結び線にすることで新たな価値が生まれると言うことを確認できたと思います。

プログラミングは他の分野と掛け合わせがしやすい分野です。ぜひご自身が過去に学んだ分野をプログラミングと掛け合わせ、新たな価値を生み出しQiitaで共有していただけるとより業界も活性化するのではと思います:muscle_tone3:

Qiitaでご指摘いただけることも自分の能力向上につながるので何か「むむ。。。」ということがあれば言っていただけると嬉しいです:relaxed:

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away