データ分析 | あぱーブログ https://blog.apar.jp Linuxやクラウドなど、ITシステム関連のブログ Tue, 25 Feb 2025 22:40:02 +0000 ja hourly 1 https://wordpress.org/?v=6.7.2 https://blog.apar.jp/wp-content/uploads/2019/02/cropped-icon3-32x32.png データ分析 | あぱーブログ https://blog.apar.jp 32 32 5分で分かる!確率統計「nPr」順列の計算方法 https://blog.apar.jp/data-analysis/14671/ https://blog.apar.jp/data-analysis/14671/#comments Sat, 19 Sep 2020 22:52:10 +0000 https://blog.apar.jp/?p=14671 数学の確率の問題で出てくる nPr は、順列(Permutation)を表す記号です。高校の数学で学ぶはずなのですが、しっかり勉強していなかった私は、4P2 のような式が出てくると思わず参考書を閉じたくなってしまいます。しかし、統計学では当たり前のようにこの nPr 記号が出てきますので、とても困ります。そこで今回は、nPr の意味と計算方法をまとめてみました。

画像提供:PIXTA

nPr の意味

nPr の意味は、

異なる n 個のものから r 個を選ぶ場合の「並べ方」の数

です。

例えば、異なる種類の動物が4匹いたとして、この4匹(n)の動物の中から、2匹(r)を選んだ場合、並び方は12種類あるので、4P2 = 12 となります。

4匹(n)の動物の中から、2匹(r)を選んだ場合の並び方は12種類

nPr のポイントは「順列」の名の通り、「ねずみ・うし」の並べ方と「うし・ねずみ」の並べ方は、違う並べ方と考えることです。

「ねずみ・うし」の並べ方と「うし・ねずみ」の並べ方は、違う並べ方

これに対して、組み合わせの数(Combination)を表す nCr という記号では、上は同じ組み合わせと考えます。nPr と nCr は、とても似ているので混乱しないようにしましょう。

関連記事:5分で分かる!確率統計「nCr」の計算方法

nPr の計算方法

難しく見える nPr ですが、計算方法は簡単です。nPr は以下の計算で求められます。

nPrの計算方法

先ほどの動物の例 4P2 にあてはめて計算してみましょう。

4P2の計算

この計算方法を知っていれば、個数(n)が 100P3 のように多くなっても並べ方の数を求めることができます。

100P3の計算

5秒で出来る nPr の計算方法

エクセルの PERMUT関数 を使えば nPr の計算を一瞬ですることができます。答え合わせをするときに便利ですね。

エクセルのPERMUT関数

おわりに

統計学はもちろんですが、AI(人工知能)を支えている技術のディープラーニング(深層学習)の根底にあるのも数学です。最近ディープラーニングを学ぶ機会があったのですが、高校数学の教科書からやり直すはめになりました、、、学生時代にしっかり勉強しなかったことを痛烈に後悔しています。

]]>
https://blog.apar.jp/data-analysis/14671/feed/ 2
5分でわかる!「回帰係数」の求め方(回帰直線の傾き) https://blog.apar.jp/data-analysis/5967/ https://blog.apar.jp/data-analysis/5967/#comments Wed, 19 Oct 2016 20:55:22 +0000 https://blog.apar.jp/?p=5967 統計学の回帰分析を使うと、身長と体重のような2つのデータから、回帰直線「体重 = 身長 × 回帰係数 + 切片」(上のグラフの赤線のことです)を求め、身長から体重を予測することができます。例えば、気温からビールの売れ行きを予測したり、天気から来客数を予測したりと、仕事にも活用できそうですね。そこで今回は、回帰分析の一番のキモ「回帰係数」(「回帰直線の傾き」ともいいます)の求め方をわかりやすくまとめてみました。

例題

下の表は、あるメーカーの、商品A と 商品B の販売個数です。商品Aの販売個数によって、商品Bの売れ行きを予測したいと思います。予測のための回帰係数を求めてみましょう。

◎ 商品Aと商品Bの販売個数
商品Aと商品Bの販売個数

回帰係数を求める式

回帰係数は、以下の計算式で求められます。

回帰係数 = 相関係数 ×( 商品Bの標準偏差 ÷ 商品Aの標準偏差 )

回帰係数を求めるには、はじめに「相関係数」を求める必要があります。相関係数の求め方は「5分で分かる!相関係数の求め方」をご参照ください。(例題も同じです)相関係数を求める過程で、商品Aと商品Bの標準偏差も求めることができます。

回帰係数の計算

相関係数の計算おつかれさまでした!
求めた相関係数と、商品Aと商品Bの標準偏差は以下の値になっていると思います。

相関係数:0.87
商品A の 標準偏差: 21.56
商品B の 標準偏差: 26.42

あとは、回帰係数を求める式 相関係数 ×( 商品Bの標準偏差 ÷ 商品Aの標準偏差 ) に当てはめて、計算するだけです。

0.87 × ( 26.42 ÷ 21.56 ) = 回帰係数:1.06

切片の計算

せっかくなので、切片も計算してみましょう。切片は、以下の計算式で求められます。

切片 = 商品Bの平均 -( 回帰係数 × 商品Aの平均 )

回帰係数は先ほど求めた「1.06」、商品Aの平均は「40.8」、商品Bの平均は「59.6」になりますので、これを式に当てはめて計算します。

59.6 - ( 1.06 × 40.8 ) = 切片:16.3

商品Bの売れ行きの予測

回帰係数と切片が求められましたので、回帰直線は「商品B = 商品A × 1.06 + 16.3」となります。

例えば、商品Aを100個注文した取引先には、商品Bが「100 × 1.06 + 16.3 = 122」個くらい売れると予測することができます。

「R」3行で出来る!回帰係数の求め方

手計算で回帰係数を求めるのはかなり大変ですが、統計解析ソフトの「R」を使えば、わずか3行のコマンドを入力するだけで、回帰係数を求められます。

lm関数の「~」の左側に予測したい変数(商品B)、右側に予測に使われる変数(商品A)を設定して実行します。商品Aの下に表示されている値が回帰係数、(Intercept) の下の値が切片です。

> 商品A = c(12, 38, 28, 50, 76)
> 商品B = c(28, 35, 55, 87, 93)
> lm( 商品B ~ 商品A )

Call:
lm(formula = 商品B ~ 商品A)

Coefficients:
(Intercept)        商品A  
     16.329        1.061  
 

 
また、summary関数を合わせて使うことで、より詳しい結果を表示できます。

> summary(lm(商品B~商品A))

Call:
lm(formula = 商品B ~ 商品A)

Residuals:
      1       2       3       4       5 
 -1.056 -21.630   8.975  17.643  -3.932 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)  
(Intercept)  16.3290    16.3574   0.998    0.392  
商品A         1.0606     0.3545   2.992    0.058 .
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 17.09 on 3 degrees of freedom
Multiple R-squared:  0.749,	Adjusted R-squared:  0.6653 
F-statistic: 8.952 on 1 and 3 DF,  p-value: 0.05803

 
簡単に回帰直線を描くこともできます。

> plot(商品A,商品B)
> abline(lm(商品B~商品A))

終わりに

冒頭にも書きましたが、回帰分析は統計学を使った分析の中でも、特に仕事に活用しやすい分析手法だと思います。実際に回帰分析を行う手順は「Rによるやさしい統計学」がとても参考になりました。この書籍はRの使い方を覚えながら、統計学を基礎から学べる内容になっていますので、統計学をこれから学びたい方にもオススメです。

]]>
https://blog.apar.jp/data-analysis/5967/feed/ 4
3分でわかる!「自由度」の意味(なぜ n-1 なのか) https://blog.apar.jp/data-analysis/5952/ https://blog.apar.jp/data-analysis/5952/#comments Thu, 13 Oct 2016 20:51:20 +0000 https://blog.apar.jp/?p=5952 統計学の勉強をしていると、聞きなれない言葉がよく出てきます。その一つが「自由度」ではないでしょうか?不偏分散を計算したり分布表を参照する時など、自由度はよく登場するのですが、私はあまり意味を理解していません(^^;) そこで今回は「自由度」の意味と、自由度がなぜ n-1 なのかを、わかりやすくまとめてみました。

自由度の意味

自由度の意味は、「自由に決めることができる値の数」です。これだけの説明では「自由度」の謎がさらに深まると思いますので、次の例をご覧ください。

自由度がなぜ n-1 なのか?

3つの値(n = 3)の合計を計算するとします。合計は「6」と求められました。

1+2+3=6

さて今度は逆に、合計が「6」となるように、値を「自由」に決めてみてください。

例えば上の計算と同じように、ひとつめを「1」ふたつめを「2」と決めたところで、合計を「6」にするには、みっつめの値は「3」と決まってしまい「自由」に決めることはできません。

1+2+3=6の1と2が決まると3は自由に決められない

3つの値(n = 3)のうち「自由に決めることができる値の数」は2つ、すなわち「自由度は2」となります。これが、自由度が n-1 になる理由です。

簡単な足し算を例として上げましたが、n が 1000 の不偏分散を計算する時も理由は同じです。偏差が999個決まると残り1つの偏差は自由に決められないので、同様に n-1 自由度は999 となります。

終わりに

何冊かの統計学の書籍で自由度について調べてみましたが、あまり深く考えずに「自由度は n-1」と覚えておくだけでも問題ないようです。(そもそも「自由度」について、あまり詳しくは説明されていません)

ただ、自由度に限らずその概念や原理を理解するのは、統計学を勉強する上で必ず役に立ちます。この記事の自由度の説明はかなりざっくりしたものです。ちゃんと自由度について理解を深めたい方には「心理統計学の基礎―統合的理解のために (有斐閣アルマ)」をオススメします。他の統計学の書籍では、自由度の説明はさらっと流す程度ですが、こちらの書籍では数ページを使い自由度について詳しく説明されています。

]]>
https://blog.apar.jp/data-analysis/5952/feed/ 4
統計的仮説検定で HTTP/2 と HTTP/1.1 の表示速度を検証 https://blog.apar.jp/data-analysis/5022/ https://blog.apar.jp/data-analysis/5022/#comments Tue, 28 Jun 2016 21:21:40 +0000 https://blog.apar.jp/?p=5022 統計的仮説検定は、標本の統計量を元に、母集団に関する仮説を検証するための統計学の手法です。例えば、「日本人の平均身長は170cmである」という仮説を、無作為抽出した100名の身長から検証することができます。そこで今回は、仮説検定を使って、HTTP/2 と HTTP/1.1 の表示速度に、はたして違いはあるのか?を検証してみました。

 
この記事を書くのにあたって 『「HTTP vs HTTPS Test」(www.httpvshttps.com) の主張を検証する - Webサイトパフォーマンスについて』を参考にさせて頂きました。後半にとてもためになることが書かれています。

結論

記事が長くなりましたので先に結論です。

今回計測した環境の、計測値と仮説検定の結果を見る限りでは「HTTP/2 と HTTP/1.1 の表示速度には違いがあり、HTTP/2の方が速い」が結論です。ただし、サーバとクライアントのネットワークが極端に近い場合は、表示速度に違いはほとんどありません。

計測値のサマリー

test-http2-http11-02-b

仮説検定の準備

検定方法

「HTTP/2の表示速度の母平均と、HTTP/1.1の表示速度の母平均に違いはあるか」を仮説検定します。それぞれの分散の推定値が一致するとは考えづらく、対応のない2つの平均値の差の検定ですので「Welch(ウェルチ)の検定」を使うことにします。

帰無仮説と対立仮説

帰無仮説(H0):「HTTP/2 と HTTP/1.1 の表示速度の母平均には差が無い
対立仮説(H1):「HTTP/2 と HTTP/1.1 の表示速度の母平均には差がある

両側検定です。

検定統計量

HTTP/2 と HTTP/1.1 の表示速度をそれぞれ 30 回計測し、平均を計算します。

サンプルサイズはもっと大きくしたかったのですが、バーチャルマシンを借りる費用と、手作業で計測する私の集中力(^^;)を考慮すると、このくらいが限界です。

有意水準

5%(α=0.05)

 
以上の条件で、仮説検定を行います。

計測環境

サーバ

マシン:さくらのクラウド(石狩)1コア メモリ1GB + CentOS7.2
WEBサーバ:Apache2.4.20 + mod_http2

インストール手順
httpd.conf
httpd-ssl.conf

画像ファイル100枚(容量合計:1MB)を /usr/local/apache2/htdocs/ に配置して、各クライアントから表示速度を計測します。(計測に使ったコンテンツ

クライアントのロケーション

  • さくらのクラウド(石狩)
  • フレッツ光(千葉)
  • LTE(千葉)
  • AWS(東京)
  • AWS(バージニア北部)

計測方法

Chrome バージョン51 表示>開発/管理>デベロッパーツール の「Network」を選択して「Load」の値を計測(「Disable cache」をチェック)

test-http2-http11-01

計測の注意点

計測前に、Chromeを再起動すること。

Chromeの「シークレットモード」を使用すること。

「Disable cache」がチェックされていることを確認すること。

DNSルックアップなどの、オーバーヘッドを除去するため、計測前に HTTP/2 と HTTP/1.1 のページをそれぞれ3回読み込むこと。

「(1回目)HTTP/2 → HTTP/1.1 →(2回目)HTTP/2 → HTTP/1.1 → ...」のように、偏りが出ないように交互に計測すること。

さくらのクラウド(石狩)

サーバのロケーションと同じ、さくらのクラウド(石狩)から計測した結果です。おそらく同一データセンタ内に配置されています。

計測日時:2016-06-27 4:45 - 2016-06-27 4:56
マシン:1コア メモリ1GB + Windows Server 2012 R2

計測データ

sakura-ishikari-data.csv さくらのクラウド(石狩)単位:ms

散布図

scatterplot-sakura-no-cloud-ishikari

箱ひげ図

boxplot-sakura-no-cloud-ishikari

仮説検定の結果

「p-value = 0.2381」> α=0.05 により、有意水準5%で、帰無仮説(H0):「HTTP/2 と HTTP/1.1 の表示速度の母平均には差が無い」が採択されました。
 

x = read.csv('sakura-ishikari-data.csv', header=T)
t.test(x$HTTP.2, x$HTTP.1.1, var.equal=F)

	Welch Two Sample t-test

data:  x$HTTP.2 and x$HTTP.1.1
t = -1.193, df = 53.577, p-value = 0.2381
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -48.43435  12.30101
sample estimates:
mean of x mean of y 
 431.8000  449.8667

フレッツ光(千葉)

自宅(千葉)のフレッツ光回線で計測した結果です。

計測日時:2016-06-26 7:05 - 2016-06-26 7:23
マシン:MacBook Air + OS X 10.11

計測データ

flets-chiba-data.csv フレッツ光(千葉) 単位:ms

散布図

scatterplot-flets-chiba

箱ひげ図

boxplot-flets-chiba

仮説検定の結果

「p-value = 9.583e-09」< α=0.05 により、有意水準5%で、帰無仮説(H0)は棄却され、対立仮説(H1):「HTTP/2 と HTTP/1.1 の表示速度の母平均には差がある」が採択されました。
 

x = read.csv('flets-chiba-data.csv', header=T)
t.test(x$HTTP.2, x$HTTP.1.1, var.equal=F)

	Welch Two Sample t-test

data:  x$HTTP.2 and x$HTTP.1.1
t = -6.884, df = 49.477, p-value = 9.583e-09
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -242.6525 -133.0142
sample estimates:
mean of x mean of y 
 612.0000  799.8333

LTE(千葉)

LTE(iPhoneのテザリングを使用)回線で計測した結果です。

計測日時:2016-06-26 7:31 - 2016-06-26 7:40
マシン:Mac Book Air + OS X 10.11

計測データ

LTE-chiba.csv LTE(千葉) 単位:ms

散布図

scatterplot-LTE-chiba

箱ひげ図

boxplot-LTE-chiba

仮説検定の結果

「p-value = 4.831e-11」< α=0.05 により、有意水準5%で、帰無仮説(H0)は棄却され、対立仮説(H1):「HTTP/2 と HTTP/1.1 の表示速度の母平均には差がある」が採択されました。
 

x = read.csv('LTE-chiba.csv', header=T)
t.test(x$HTTP.2, x$HTTP.1.1, var.equal=F)

	Welch Two Sample t-test

data:  x$HTTP.2 and x$HTTP.1.1
t = -9.1424, df = 37.124, p-value = 4.831e-11
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -609.3755 -388.2912
sample estimates:
mean of x mean of y 
 1277.500  1776.333 

AWS(東京)

Amazon Web Services の東京リージョンから計測した結果です。

計測日時:2016-06-26 14:00 - 2016-06-26 14:26
マシン:t2.micro + Windows Server 2012 R2

計測データ

aws-tokyo-data.csv AWS(東京) 単位:ms

散布図

scatterplot-aws-tokyo

箱ひげ図

boxplot-aws-tokyo

仮説検定の結果

「p-value < 2.2e-16」< α=0.05 により、有意水準5%で、帰無仮説(H0)は棄却され、対立仮説(H1):「HTTP/2 と HTTP/1.1 の表示速度の母平均には差がある」が採択されました。
 

x = read.csv('aws-tokyo-data.csv', header=T)
t.test(x$HTTP.2, x$HTTP.1.1, var.equal=F)

	Welch Two Sample t-test

data:  x$HTTP.2 and x$HTTP.1.1
t = -14.342, df = 54.973, p-value < 2.2e-16
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -220.0062 -166.0604
sample estimates:
mean of x mean of y 
 383.3333  576.3667 

AWS(バージニア北部)

Amazon Web Services のバージニア北部リージョンから計測した結果です。

計測日時:2016-06-27 4:00 - 2016-06-27 4:16
マシン:t2.micro + Windows Server 2012 R2

計測データ

aws-us-east-1-data.csv AWS(バージニア北部) 単位:ms

散布図

scatterplot-us-east

箱ひげ図

boxplot-us-east

仮説検定の結果

「p-value < 2.2e-16」< α=0.05 により、有意水準5%で、帰無仮説(H0)は棄却され、対立仮説(H1):「HTTP/2 と HTTP/1.1 の表示速度の母平均に差がある」が採択されました。
 

x = read.csv('aws-tokyo-data.csv', header=T)
t.test(x$HTTP.2, x$HTTP.1.1, var.equal=F)

	Welch Two Sample t-test

data:  x$HTTP.2 and x$HTTP.1.1
t = -43.149, df = 49.083, p-value < 2.2e-16
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -1641.373 -1495.294
sample estimates:
mean of x mean of y 
 2253.000  3821.333  

終わりに

ネットワーク的に遠くなるほど HTTP/2 の効果がよく分かりますね。

]]>
https://blog.apar.jp/data-analysis/5022/feed/ 2
5分でわかる!区間推定「母比率」の信頼区間の求め方 https://blog.apar.jp/data-analysis/4985/ https://blog.apar.jp/data-analysis/4985/#comments Tue, 21 Jun 2016 16:58:16 +0000 https://blog.apar.jp/?p=4985 選挙速報で開票率が低いのに、当選確実が出ている事を不思議に感じたことはないでしょうか?各報道機関がどういった仕組みで当選確実を出しているのかは、明らかにされていませんが、母比率の区間推定が使われていると言われています。また、母比率の区間推定は、日本全体のTVの視聴率や、内閣支持率なども推定できるので、統計学の中でも実用性が高い手法です。そこで今回は、母比率の信頼区間の求め方をまとめてみました。

例題

有効投票数10万票の選挙で、開票率1%(1,000票開票)時点の、A候補者の得票率は60%でした。このとき、信頼係数95%で、母比率の信頼区間を求めてみましょう。

母比率の信頼区間を求める式

母比率の信頼区間は、以下の計算式で求められます。

標本比率 ± z × √ { 標本比率 × ( 1 - 標本比率 ) ÷ 標本の数 }

母平均母分散の区間推定と比べると、計算が簡単に思えますね。今回は標本の数が1,000票と十分に大きいので、「z」の値は正規分布表から導き出せます。

z の値

下の正規分布表から、信頼係数95%の z の値を求めます。

z(信頼係数95%)= 1.96

正規分布表

信頼係数:90%信頼係数:95%信頼係数:99%
z の値1.641.962.58

母比率の信頼区間の計算

母比率の信頼区間の計算に必要な値を整理しておきます。

標本比率:0.6(60%)
z:1.96
標本の数:1000

あとは、母比率の信頼区間を求める式「標本比率 ± z × √{標本比率 × ( 1 - 標本比率 ) ÷ 標本の数}」に当てはめて、計算するだけです。

0.6 - 1.96 × √{0.6 × ( 1 - 0.6 ) ÷ 1000} = 0.569 = 56.9%
0.6 + 1.96 × √{0.6 × ( 1 - 0.6 ) ÷ 1000} = 0.630 = 63.0%

以上で、母集団10万票すべてを開票した時のA候補者の得票率は、信頼係数95%で「 56.9% 〜 63.0% 」 と求められました。

この結果よりA候補者の得票率は、最低でも56.9%と過半数を超えているので、当選確実であると推測できます。

「R」1行で出来る!母比率の信頼区間の求め方

統計解析ソフトの「R」を使って、母比率の信頼区間を求めるには、二項検定の「binom.test」関数を使います。今回の例題の場合は「binom.test(<得票数>, <標本の数>)」の形式で指定します。
 

> binom.test(600, 1000)

	Exact binomial test

data:  600 and 1000
number of successes = 600, number of trials = 1000, p-value = 2.728e-10
alternative hypothesis: true probability of success is not equal to 0.5
95 percent confidence interval:
 0.5688784 0.6305310
sample estimates:
probability of success 
                   0.6

「95 percent confidence interval」の下に表示されているのが、信頼係数95%の母比率の信頼区間です。

終わりに

次回は、回帰係数の区間推定についまとめてみたいと思います。

]]>
https://blog.apar.jp/data-analysis/4985/feed/ 2
5分でわかる!区間推定「母分散」の信頼区間の求め方 https://blog.apar.jp/data-analysis/4869/ https://blog.apar.jp/data-analysis/4869/#respond Tue, 07 Jun 2016 20:57:08 +0000 https://blog.apar.jp/?p=4869 母分散の区間推定を使うと、例えば母集団が100万本のネジだとして、そのネジの長さのバラツキ(分散)を、数本のネジを調べるだけで、推定することができます。そこで今回は、母分散の信頼区間の求め方を、出来るだけ分かりやすくまとめてみました。

例題

母集団100万本のネジから、標本として取り出した、5本のネジの長さは以下の通りです。このとき、信頼係数95%で、母分散の信頼区間を求めてみましょう。

5本のネジの長さの表

母分散の信頼区間を求める式

母分散の信頼区間は、以下の計算式で求められます。

母分散の信頼区間を求める式

見慣れない言葉や記号が出てくるので、すごく難解な式に思えますね(^^;)

でも安心してください。「不偏分散」は、標本として取り出した、5本のネジの長さの分散を計算するだけ、「χ2」は、カイ二乗分布表から簡単に導き出せます。

不偏分散

不偏分散は、以下の手順で求められます。不偏分散は、偏差の二乗の合計を(標本数 - 1)で割るところがポイントです。

不偏分散の計算手順

標本平均

まず、標本として取り出した、5本のネジの長さの平均を計算します。これを「標本平均」と呼びます。

( 31 + 29 + 28 + 35 + 30 ) ÷ 5= 30.6(標本平均)

偏差

続いて、ネジ1本ごとの長さから、標本平均を引いて「偏差」を求めます。

31 - 30.6 =  0.4
29 - 30.6 =  -1.6
28 - 30.6 =  -2.6
35 - 30.6 =  4.4
30 - 30.6 =  -0.6

不偏分散の計算

最後に、偏差の二乗の合計を(標本数 - 1)で割れば、不偏分散が求められます。

0.4 ² = 0.16
-1.6 ² = 2.56
-2.6 ² = 6.76
4.4 ² = 19.36
-0.6 ² = 0.36
合計 29.2

 
29.2 ÷ ( 5 - 1 ) = 7.3(不偏分散)

χ2(カイ2乗)の値

カイ二乗分布表から、χ2 の上側と下側の値を求めます。χ2 の値は、標本(ネジ5本)の「自由度」と「信頼係数」によって、変わってきます。

自由度

また聞きなれない「自由度」という言葉が出てきましたが、「標本数 - 1」 ( n - 1 ) のことを「自由度」と言います。不偏分散の計算でも登場しましたね。今回の標本はネジ5本なので、自由度は「4」になります。

信頼係数95%の上側と下側パーセント点

信頼係数は、これから求める「信頼区間の当たる確率」です。信頼係数95%の、上側と下側のパーセント点は、以下の式で計算します。

上側パーセント点 = ( 1 - 0.95 ) ÷ 2 = 0.025
下側パーセント点 = 1 - ( 1 - 0.95 ) ÷ 2 = 0.975

χ2 の値

下のカイ二乗分布表から、自由度「4」、パーセント点「0.025」の χ2上側の値と、パーセント点「0.975」の χ2下側の値を求めます。

χ2上側 = 11.1433
χ2下側 = 0.4844

カイ二乗分布表

自由度0.9950.9750.0250.005
13.92704E-050.00105.02397.8794
20.01000.05067.377810.5966
30.07170.21589.348412.8382
40.20700.484411.143314.8603
50.41170.831212.832516.7496
60.67571.237314.449418.5476
70.98931.689916.012820.2777
81.34442.179717.534521.9550
91.73492.700419.022823.5894
102.15593.247020.483225.1882
112.60323.815721.920026.7568
123.07384.403823.336728.2995
133.56505.008824.735629.8195
144.07475.628726.118931.3193
154.60096.262127.488432.8013
165.14226.907728.845434.2672
175.69727.564230.191035.7185
186.26488.230731.526437.1565
196.84408.906532.852338.5823
207.43389.590834.169639.9968
218.033710.282935.478941.4011
228.642710.982336.780742.7957
239.260411.688638.075644.1813
249.886212.401239.364145.5585
2510.519713.119740.646546.9279
2611.160213.843941.923248.2899
2711.807614.573443.194549.6449
2812.461315.307944.460850.9934
2913.121116.047145.722352.3356
3013.786716.790846.979253.6720
4020.706524.433059.341766.7660
6035.534540.481783.297791.9517
12083.851691.5726152.2114163.6482
240187.3243198.9839284.8025300.1822

母分散の信頼区間の計算

母分散の信頼区間の計算に必要な値が揃いましたので、少し整理しておきます。

標本数:5
不偏分散:7.3
χ2上側:11.1433
χ2下側 :0.4844

あとは、母分散の信頼区間を求める式「(標本数-1) × 不偏分散 ÷ χ2」に当てはめて、計算するだけです。

( 5 - 1 ) × 7.3 ÷ 11.1433 = 2.62
( 5 - 1 ) × 7.3 ÷ 0.4844 = 60.28

以上で、母集団100万本のネジの長さの分散は、信頼係数(当たる確率)95%で「 2.62 〜 60.28 」 と求められました。

「R」5行で出来る!母分散の信頼区間の求め方

統計解析ソフトの「R」を使えば、簡単に母分散の信頼区間を求められます。答え合わせをするのに便利ですよ(^^)
 

> ネジ = c(31, 29, 28, 35, 30)
> 不偏分散 = var(ネジ)
> 自由度 = length(ネジ) - 1

> (自由度 * 不偏分散) / qchisq(0.975, 自由度)
[1] 2.620412
> (自由度 * 不偏分散) / qchisq(0.025, 自由度)
[1] 60.27845

終わりに

次回は、母比率の区間推定についまとめてみたいと思います。

]]>
https://blog.apar.jp/data-analysis/4869/feed/ 0
標本 n が「十分に大きい」の大きさは?(正規分布・t分布) https://blog.apar.jp/data-analysis/4722/ https://blog.apar.jp/data-analysis/4722/#respond Tue, 17 May 2016 20:52:06 +0000 https://blog.apar.jp/?p=4722 統計学の教科書で「標本 n が十分に大きい場合は、t分布ではなく標準正規分布にしたがう」といった記述を見かけたことがありませんか? 数学の応用の統計学にしては「十分」とは、ずいぶん抽象的な表現に感じます。できれば具体的に、「標本数が○○以上の場合は〜」として欲しいところですね。そこで今回は、この「十分に大きい」の大きさは、数値にするといくつなのかを調べてみました。

統計学の書籍を調べてみた

手元に何冊かある、統計学の書籍で、標本数や自由度(標本数-1のことです)と、t分布/標準正規分布の関係について書いてある部分を、調べてみました。

統計学入門(基礎統計学)東京大学教養学部統計学教室 P202より引用

k が大きい場合(たとえば 30 以上の場合)は、標準正規分布とほとんど変わらない

k は自由度のことを指しています。統計学のバイブル的な書籍だけあって、この「30」を基準としている、ネット上の記事をよく見かけます。

完全独習 統計学入門 P191より引用

自由度が 120 になると、限界値が1.98となって1.96に近づいてくる。これは自由度が大きくなるとt分布は正規分布に近くことを意味する

心理統計学の基礎 P141より引用

自由度が のt分布は標準正規分布と同じになります

日本統計学会公式認定 統計検定2級対応 統計学基礎 P108より引用

自由度が十分に大きいと考えられる 99 の場合は、標準正規分布とほとんど区別できない、この場合も「十分に大きい」ということを明確に定義することはできないが、このことより、データの大きさが十分大きい場合は、Tがt分布ではなく、標準正規分布にしたがうとして、計算してもよい

私の手元の書籍では「十分に大きい」大きさを、具体的に数値(30、120、99)として例を上げられていましたが「○○以上の場合は標準正規分布を使う」という記載は見つかりませんでした。また、統計検定2級の参考書では「十分に大きいということを明確に定義することはできない」とも書いてあります。

標準正規分布と t分布をグラフで比較

見た目でどれくらいの違いがあるのか、自由度(30、99、120)の t分布と、標準正規分布をグラフで比較してみました。

自由度30のt分布(緑)と標準正規分布(青)

頂点と裾の部分に、多少の違いがありますが、ほぼ同じです。

自由度99のt分布(橙)と標準正規分布(青)

私の目では違いが分かりません。

自由度120のt分布(赤)と標準正規分布(青)

一致しすぎて、標準正規分布の青線が隠れてしまっています。

信頼区間の計算で比較

続いて信頼区間を求める式「標本平均 ± t × 標本標準偏差 ÷ √標本の数」の「t × 標本標準偏差 ÷ √標本の数」部分を、t分布と正規分布を使って計算し、違いを比較してみます。

どの自由度でも、標本標準偏差が「10」の場合は、ほとんど差異がありません。

ただし、標本標準偏差が大きくなると、差異も大きくなります。この辺りが「標本(n)が、十分に大きいということを明確に定義することはできない」と言われる理由なのかもしれません。

結論

残念ながら、標本 n が「十分に大きい」の大きさは、具体的な数値として分かりませんでしたが、私なりの結論です。

標本 n の大きさは気にせずに、t分布を使う

下の表のように、自由度(標本数-1)が大きくなれば tの値が、自然に正規分布に近づくので、母分散が分からない場合は、とりあえず t分布を使っておけば、間違いが無いかと思います。(母分散が分かっている場合は、正規分布を使います)

]]>
https://blog.apar.jp/data-analysis/4722/feed/ 0
5分で分かる!区間推定「信頼区間」の求め方 https://blog.apar.jp/data-analysis/4632/ https://blog.apar.jp/data-analysis/4632/#comments Tue, 10 May 2016 20:51:37 +0000 https://blog.apar.jp/?p=4632 区間推定は、標本の統計量を元に、母集団の平均などを、幅(区間)を持たせて推定する統計学の手法です。この推定した幅を「信頼区間」と言います。例えば、100万本のネジの長さの平均のように、母集団が大きい場合でも、区間推定を使えば、すべてのネジの長さを測らなくても、平均を推定することが出来ます。そこで今回は、母平均(母集団の平均)の信頼区間の求め方を、出来るだけ分かりやすくまとめてみました。

例題

とあるネジ工場で働くワン太郎は、上司から「型番Aのネジの長さの平均を調べておいて、急ぎだから今日中ね!」と頼まれました。しかし、型番Aのネジは100万本以上あり、しかも遠方の倉庫に保管されているため、ワン太郎の手元には、型番Aのネジが「10本」しかありません。(以下、型番Aのネジを単純に「ネジ」と表記します)

またいつもの無茶振りだよ、、困ったなあと、ワン太郎は思いながら、とりあえずネジ10本の長さを測って、平均を計算しました。

ネジ10本の長さの表

ただ、この平均を、100万本以上あるネジすべての長さの平均(これを「母平均」と呼びます)として報告するのは、いくらなんでも無理があります。そこで、先輩のニャン子さんに相談してみると「母平均の「信頼区間」を求めて報告するのがいいわよ」と教えてもらいました。

ワン太郎が先輩のニャン子さんに相談

イラストby:ワン太郎とニャン子さん「イラスト工房」、ネジ「素材ライブラリー.com

信頼区間を求める式

母平均の「信頼区間」は、以下の計算式で求められます。

標本平均 ± t × 標本標準偏差 ÷ √標本の大きさ

区間推定では、母集団と標本を区別して考える必要があるため、標本平均、標本標準偏差と表記していますが、ワン太郎の手元にあるネジ10本(標本)の平均や標準偏差のことを、そう呼んでいるだけです。

そして「標本の大きさ」は、ワン太郎の手元にあるネジの本数、すなわち「10」になります。これをよく「n=10」と書くことがあります。

ただ、なかなか理解しづらいところなので、今回の母集団と標本について、少し整理しておきます。

母集団と標本について整理した表

さらによく分からないのが「t」ですが、この t の値は「t分布表」という便利な表から、簡単に導き出せます。

それではまず、少し計算が大変な、標本標準偏差を求めてみましょう。

標本標準偏差

標本標準偏差は、以下の手順で求めます。分散ではなく、不偏分散の平方根(ルート)を、標本標準偏差とするのが特徴です。

標本標準偏差を求める手順

標本平均

すでにワン太郎も計算していますが、ワン太郎の手元にある、ネジ10本(標本)の長さの平均を計算し、これを「標本平均」と呼びます。

( 31 + 29 + 28 + 35 + 30 + 30 + 32 + 27 + 33 + 29 ) ÷ 10 = 30.4(標本平均)

偏差

続いて、ネジ1本ごとの長さから、標本平均を引いて「偏差」を求めます。

31 - 30.4 =  0.6
29 - 30.4 =  -1.4
28 - 30.4 =  -2.4
35 - 30.4 =  4.6
30 - 30.4 =  -0.4
30 - 30.4 =  -0.4
32 - 30.4 =  1.6
27 - 30.4 =  -3.4
33 - 30.4 =  2.6
29 - 30.4 =  -1.4

不偏分散

「不偏」と言われると、なにか難しそうですが、普通の分散は、偏差の二乗の合計を「標本の大きさ」で割るのに対して、不偏分散は、「標本の大きさ - 1」で割るだけのことです。統計学の教科書ではこれをよく ( n - 1 ) と表記していますね。

0.6 ² = 0.36
-1.4 ² = 1.96
-2.4 ² = 5.76
4.6 ² = 21.16
-0.4 ² = 0.16
-0.4 ² = 0.16
1.6 ² = 2.56
-3.4 ² = 11.56
2.6 ² = 6.76
-1.4 ² = 1.96
合計 52.4

 
52.4 ÷ ( 10 - 1 ) = 5.822(不偏分散)

標本標準偏差

最後に不偏分散の平方根(ルート)を計算して、これを標本標準偏差とします。

√5.822 = 2.413(標本標準偏差)

t の値

続いて、t分布表から t の値を求めます。t の値は、標本の「自由度」と、信頼区間の「信頼係数」によって、変わってきます。

自由度

また聞きなれない「自由度」という言葉が出てきましたが、「標本の大きさ - 1」 ( n - 1 ) のことを「自由度」と言います。不偏分散の計算にも登場しましたね。今回の標本の大きさは n=10 (ネジ10本)なので 10 - 1 = 9 自由度は「9」になります。

信頼係数

信頼係数は、これから求める「信頼区間の当たる確率」です。信頼係数は「95%」を使うことにします。

t の値

下の t分布表から、自由度「9」、信頼係数は「95%」に対応する t の値を求めます。

t(信頼係数95%)= 2.262

長くなりましたが、以上で信頼区間の計算の下準備完了です。

t分布表

自由度信頼係数:95%信頼係数:99%
112.70663.657
24.3039.925
33.1825.841
42.7764.604
52.5714.032
62.4473.707
72.3653.499
82.3063.355
92.2623.250
102.2283.169
112.2013.106
122.1793.055
132.1603.012
142.1452.977
152.1312.947
162.1202.921
172.1102.898
182.1012.878
192.0932.861
202.0862.845
212.0802.831
222.0742.819
232.0692.807
242.0642.797
252.0602.787
262.0562.779
272.0522.771
282.0482.763
292.0452.756
302.0422.750
402.0212.704
602.0002.660
1201.9802.617
2401.9702.596
正規分布1.9602.576

余談ですが、自由度(標本の大きさ-1)が大きくなると、t の値が、正規分布の値とほとんど変わらなくなります。これが「自由度が十分に大きい場合は、正規分布を使ってよい」と言われている理由です。

信頼区間の計算

ここまでで、信頼区間の計算に必要な値が揃いましたので、少し整理しておきます。

標本平均:30.4
t(信頼係数95%):2.262
標本標準偏差:2.413
標本の大きさ:10

あとは、信頼区間を求める式「標本平均 ± t × 標本標準偏差 ÷ √標本の大きさ」に当てはめて、計算するだけです。

30.4 - 2.262 × 2.413 ÷ √10 = 28.674
30.4 + 2.262 × 2.413 ÷ √10 = 32.126

自由度(標本の大きさ-1)がよく出てくるので、信頼区間の計算でも「標本の大きさ-1」としそうになりますが、(私だけでしょうか)信頼区間の計算ではそのまま「標本の大きさ」、すなわちワン太郎の手元にあるネジの本数「10」を使います。

以上で、母平均「100万本以上あるネジすべての長さの平均」の信頼区間は、
信頼係数(当たる確率)95%で「 28.674mm 〜 32.126mm 」 と求められました。
 

「R」2行で出来る!「信頼区間」の求め方

統計解析ソフトの「R」を使えば、わずか2行のコマンドを入力するだけで、信頼区間を求められます。「95 percent confidence interval」の下に表示されているのが、信頼係数95%の信頼区間です。
 

> ネジ = c(31, 29, 28, 35, 30, 30, 32, 27, 33, 29)
> t.test(ネジ)

	One Sample t-test

data:  ネジ
t = 39.841, df = 9, p-value = 1.967e-11
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
 28.6739 32.1261
sample estimates:
mean of x 
     30.4 

終わりに

この記事の信頼区間の説明は、かなりざっくりしたものです(^^;) 詳しくは統計学の書籍などをご参照ください。私が読んだ書籍の中では「まずはこの一冊から 意味がわかる統計学 (BERET SCIENCE)」がオススメです。書籍名通り、区間推定や信頼区間の意味が、とても分かりやすく書かれています。初学者向けの本ですが、不偏分散や自由度のことがしっかり解説されているのも特徴かと思います。

]]>
https://blog.apar.jp/data-analysis/4632/feed/ 10
5分で分かる!「母集団」と「標本」の意味 https://blog.apar.jp/data-analysis/4607/ https://blog.apar.jp/data-analysis/4607/#respond Tue, 03 May 2016 20:24:09 +0000 https://blog.apar.jp/?p=4607 「母集団」と「標本」は、推測統計の推定や検定を行うのにあたって、とても重要な考え方です。母集団は調べたいデータ全体、標本はそこからランダムに取り出したものというだけの意味なのですが、これをしっかり理解しておく必要があります。また、推測統計では母集団の平均と、標本の平均などを区別しなければならないのが、ややこしいところです。そこで今回は、母集団と標本についてまとめてみました。

「母集団」と「標本」の意味

冒頭にも書きましたが、母集団は調べたいデータ全体、標本はそこからランダムに取り出したものです。母集団は自分が調べたいデータなので、「1箱のリンゴの重さの平均」のように小さいものでも、「世界中の蝶の大きさの平均」のように大きく全ての数が分からないものでも、自由に定義して構いません。

母集団と標本

ただ、母集団が小さい場合は全件調査ができるため、推測統計の出番がなく、そもそも母集団を定義する必要がありません。一般的に母集団は、非常に大きいものを定義します。以下は、よく目にする母集団と標本の例です。

母集団標本
選挙全有効票数出口調査で調べた票数
視聴率全世帯の視聴率調査世帯の視聴率
アンケート全小学生の好きな食べ物アンケートを受けた小学生の好きな食べ物

母集団と標本を区別する

普段の生活で、「蝶の大きさの平均」と言われれば、平均は当然1つと考えますが、推測統計を使って「世界中の蝶の大きさの平均」を推測する立場になると、「世界中の蝶の大きさの平均(母集団)」を「母平均」、「捕まえた蝶の大きさの平均(標本)」を「標本平均」のように区別する必要があります。

これから推測統計を学びたいという方は、母集団と標本での用語や数学記号の違いを、しっかり理解しておくことをオススメします。

母集団と標本それぞれの用語と数学記号をまとめた表

終わりに

標本から母集団を推測する推測統計(推定・検定)は、統計理論の中心であり頂点であるとも言われています。次回は、推測統計の第一歩、区間推定についてまとめてみたいと思います。

]]>
https://blog.apar.jp/data-analysis/4607/feed/ 0
5分でわかる!対数「log」記号の意味 https://blog.apar.jp/data-analysis/4547/ https://blog.apar.jp/data-analysis/4547/#comments Tue, 19 Apr 2016 20:28:57 +0000 https://blog.apar.jp/?p=4547 対数を表す「log」記号が苦手な方は多いのではないでしょうか? 私も情報処理の問題でこの「log」記号を見かけてはいましたが、あまり意味が理解できず、捨て問題にしていました(^^;) そこで今回は、この対数「log」記号の意味をまとめてみました。

対数「log」記号の意味

どこか難しく見える「log」記号ですが、意味は指数(例えば 32 の2の部分)の表現方法を少し変えただけです。

対数「log」記号の意味

ドラえもんのバイバインというひみつ道具を覚えていますでしょうか、食べ物にこのバイバインの液体をふりかけると、5分ごとにその食べ物が2倍に増え、食べ物を食べればこの増殖の効果がなくなります。のび太は、栗まんじゅうにバイバインをふりかけたものの食べきれず、最後には大量に増殖した栗まんじゅうを宇宙に送るハメになりました。

少し話がそれましたが log 記号で、栗まんじゅうが、1億個になる時間を表してみると以下のようになります。

log2100,000,000 × 5分

対数「log」の計算方法

数が大きくなると、手作業での計算は大変ですので、エクセルのLOG関数が便利です。先ほどの、栗まんじゅうが1億個になる時間も簡単に計算できます。

エクセルのLOG関数で栗まんじゅうが1億個になる時間を計算

132分=2時間12分、ドラえもんが漫画の中で「2時間で1677万それからわずか15分で1億個をこすんだよ」と言っていますので、ほぼ一致しますね。

終わりに

log と見ると、サーバなどのログを思い起こしてしまいますが、まったく無関係です。数学での log は、対数を英訳した「logarithm」の頭3文字からきているそうです。

]]>
https://blog.apar.jp/data-analysis/4547/feed/ 4
5分で分かる!総和記号「Σ(シグマ)」の計算方法 https://blog.apar.jp/data-analysis/4407/ https://blog.apar.jp/data-analysis/4407/#comments Tue, 29 Mar 2016 21:09:16 +0000 https://blog.apar.jp/?p=4407 総和記号の「Σ(シグマ)」は、「1+2+3(中略)+100」のように、繰り返し足し算をする式を、簡単に書くための記号です。便利な記号なのですが、馴染みのない方にとっては、すごく難解な計算をしているように見えるのではないでしょうか? そこで今回は、総和記号の「Σ(シグマ)」の意味と計算方法をまとめてみました。

総和記号「Σ」の意味

総和(合計)を英訳すると Summation といいます。この頭文字の「S」は、ギリシャ文字の「Σ」にあたり「与えられた条件を元に合計しなさいという」意味を表しています。見た目が難しそうな「Σ」ですが意味は合計、すなわち「繰り返し足し算する」だけの意味しかありません。

与えられる条件は、変数(添字とも呼ばれます)の「i」、足し算を終わりにする数の「n」、計算式の「x」の3つです。条件を表す文字はなんでもOKです。高校数学の教科書では「i」は「k」とよく表記されていますね。

Σ記号に与えられる条件

繰り返し足し算する「xi」の部分は、計算式や変数「i」を使わなくても構いません。(例えば決まった数「3」とかでもOKです)

総和記号「Σ」の計算方法

「Σ」の計算方法は、変数「i」を1ずつ増やしながら、計算式の「x」に当てはめて、変数「i」が「n」になるまで足し算するだけです。

下の例は計算式は無く、単純に1〜5の合計を表しています。

iを1ずつ増やしながらiが5になるまで足し算

こちらは計算式がある例、1〜9の奇数の合計です。

iを1ずつ増やしながら計算式にあてはめてiが5になるまで足し算

上にも書きましたが、計算式の部分は決まった数のみでも構いません。

iを1ずつ増やしながらiが5になるまで3を繰り返し足し算

注意「n」は繰り返しの回数ならず

総和記号の「Σ(シグマ)」の計算で注意しておきたいのは、「n」は繰り返し回数ではない ということです。

変数「i」が 1 から始まることが多いので、ついつい「n」を繰り返し回数と誤解してしまうのではないでしょうか? 次の計算は間違えの例です。

計算間違えの例、i=3なのにiを1ずつ増やしながら5回足し算

正しくは、以下のように計算します。

正しい計算、iを1ずつ増やしながらiが5になるまで足し算

「Σ」記号は for ループと同じ

プログラミングの経験のある方でしたら、ピンときていると思いますが「Σ」記号は for ループをイメージすると理解が早いかと思います。

Σ記号はプログラミングのforループと同じ

終わりに

同じギリシア文字のシグマでも、小文字の「σ(シグマ)」は、統計学では標準偏差を表します。ちょとややこしいですね(^^;)

]]>
https://blog.apar.jp/data-analysis/4407/feed/ 27
5分で分かる!確率統計「nCr」の計算方法 https://blog.apar.jp/data-analysis/3927/ https://blog.apar.jp/data-analysis/3927/#comments Sat, 23 Jan 2016 21:00:56 +0000 https://blog.apar.jp/?p=3927 数学の確率の問題で出てくる nCr は、組み合わせの数(Combination)を表す記号です。高校の数学で学ぶはずなのですが、学生時代あまり勉強熱心ではなかった私には、例えば 4C2 = 6 となるのがよく理解できませんでした。統計学では当たり前のようにこの nCr 記号が出てきますので、とても困ります。そこで今回は、nCr の意味と計算方法をまとめてみました。

nCr の意味

まず nCr の意味について、確認しておきたいと思います。nCr とは、

異なる n 個のものから r 個を選ぶ場合の、組み合わせの数

例えば、にぎり寿司が4個あるとして、この4個(n)の中から、2個(r)を選ぶ組み合わせは、6種類あるので、4C2 = 6 となります。

4個あるにぎり寿司から2個を選ぶ組み合わせは6種類

イラスト by さしえの森

また、nCr では「まぐろ・エビ」の順で並んでいる組み合わせと「エビ・まぐろ」の順で並んでいる組み合わは同じ種類の組み合わせと考えます。

nCrでは同じ種類の組み合わせ

これに対して、順列という並べ方の数(Permutation)を表す nPr という記号もあるのですが、そちらは上は違う並べ方と考えます。nCr と nPr は、とても似ているので混乱しないようにしましょう。

関連記事:5分で分かる!確率統計「nPr」順列の計算方法

nCr の計算方法

詳細な公式や証明は、高校数学の教科書にゆずりますが、nCrは以下の計算で求められます。

nCrの計算式

上のにぎり寿司の例 4C2 をあてはめてみると、、

4C2の組み合わせを計算

個数(n)が少なければ、図に書いたりして組み合わせの数を求められそうですが、100C3 のように個数(n)が多くなってくると、この計算式がとても役に立ちます。

100C3の組み合わせを計算

5秒で出来る nCr の計算方法

エクセルの COMBIN関数 を使えば、一瞬で nCr の計算ができます。こんな関数もあるんですね。

エクセルのCOMBIN関数を使って100C3を計算

終わりに

統計検定の勉強をしているのですが、高校数学の基礎が出来ていないので、大変苦労しています。学生時代に親から「大人になると頭が固くなるから、今のうちに勉強しておきな!」と言われたことを思い出します。本当に固くなりますよ(^^;)

]]>
https://blog.apar.jp/data-analysis/3927/feed/ 11
dimple.js 積上げ棒グラフの作り方 https://blog.apar.jp/data-analysis/3439/ https://blog.apar.jp/data-analysis/3439/#respond Wed, 07 Oct 2015 20:38:05 +0000 https://blog.apar.jp/?p=3439 dimple(ディンプル)は、さまざまなグラフを簡単に作成できる JavaScript ライブラリです。データ可視化ライブラリの定番 D3.js と合わせて使います。D3.js は柔軟性が高く、複雑なデータを可視化することが得意ですが、グラフの描画処理を自分で作成する必要があります。描画処理のコードを書くのは、なかなか大変ですが、この dimple ライブラリを使えば、複雑なグラフを、わずか数行のコードで作成することができます。

クラフ描画ライブラリを色々調べてみましたが、少し込み入ったグラフを作成するには、この dimple が、一番自由度が高く使いやすいと思います(しかもBSDライセンスなので商用利用も可能)そこで今回は、複雑なグラフの一例として dimple を使った積上げ棒グラフの作り方をご紹介したいと思います。

※ dimple は、IE8 もしくは、それ以前の IE には対応していませんので、ご注意ください。

The dimple api is tested against Firefox, Chrome, Safari and IE9. It's browser support is largely inherited from d3 so using it on IE8 and earlier will be difficult/impossible.

dimple 公式ドキュメント より引用

dimple.js と D3.js の導入

dimple の公式サイトから、ライブラリをダウンロードします。
dimple-01

ZIPファイルを解凍し、以下のフォルダに入っている「dimple.js」と「d3.js」を取り出します。(バージョンは 2015年10月8日時点のものです)
dimple-02

dimple-03

取り出した「dimple.js」と「d3.js」を、HTMLファイルにインクルードします。

<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
        <title>dimple.js で作った積上げ棒グラフ</title>
        <script src="d3.v3.4.8.min.js"></script>
        <script src="dimple.v2.1.6.min.js"></script>
    </head>
</html>

以上で下準備は完了です。

積上げ棒グラフ用のデータの準備

店舗ごとの、ミカン、リンゴ、メロンの売上高の、積上げ棒グラフを作ってみたいと思います。
dimple-04

上のデータを1行づつ「"<属性名(カラム名)>" : "<値>"」の形式で、JavaScriptの配列データ(data)を作ります。(日本語も問題なく使えます)

   <body>
        <script>
            var data = [
                {"店名":"A店", "商品":"ミカン", "売上高":8000},
                {"店名":"A店", "商品":"リンゴ", "売上高":12000},
                {"店名":"A店", "商品":"メロン", "売上高":15000},
                {"店名":"B店", "商品":"ミカン", "売上高":30000},
                {"店名":"B店", "商品":"リンゴ", "売上高":20000},
                {"店名":"B店", "商品":"メロン", "売上高":10000},
                {"店名":"C店", "商品":"ミカン", "売上高":18000},
                {"店名":"C店", "商品":"リンゴ", "売上高":5000},
                {"店名":"C店", "商品":"メロン", "売上高":30000}
            ];
        </script>
    </body>

データの準備も完了です。次はいよいよグラフの表示です。

積上げ棒グラフの表示

SVG要素(グラフの表示エリア)を作成します。オプションの意味は ("<セレクタ名>", <幅>, <高さ>) です。

var svg = dimple.newSvg("body", 800, 600);

SVG要素(svg)と、グラフ用データ(data)から、グラフオブジェクトを生成します。このオブジェクト(chart)に対して、グラフの表示設定を行い、最後にグラフを描画します。

var chart = new dimple.chart(svg, data);

グラフの大きさを設定します。dimple.newSvg で指定した、エリアサイズより小さくなるように指定します。オプションの意味は (左の余白, 上の余白, グラフ幅, グラフの高さ) です。

chart.setBounds(100, 10, 700, 500);

グラフの縦軸と横軸の設定です。今回は「店舗ごとの売上高」のグラフを作りたいので、横軸(x)に店名、縦軸(y)に売上高を指定します。xAxis や yAxis は、それぞれ軸ごとの詳細設定に使います。

var xAxis = chart.addCategoryAxis("x", "店名");
var yAxis = chart.addMeasureAxis("y", "売上高");

グラフの種類の設定です。棒グラフを作りたい場合は2つめのオプションに「dimple.plot.bar」を指定します。また「商品ごとの積上げ棒グラフ」を作りたいので、1つめのオプションには「商品」を指定します。(普通の棒グラフの場合は null を指定)

var barAxis = chart.addSeries("商品", dimple.plot.bar);

以上でグラフの基本的な設定は出来ました。最後に draw メソッドでグラフを表示します。オプションの値は、表示アニメーションの間隔です。(単位はミリ秒)

chart.draw(2000);

動作サンプル
dimple-05

売上高の値によって、商品ごとの色や店名の並び順を、dimple がいい感じに調整してくれますが、グラフのこのような部分なども制御することが可能です。続けてグラフの詳細な設定方法を見ていきましょう。

グラフの詳細設定

商品ごとの色の設定

chart.assignColor("ミカン", "#ffbf7f");
chart.assignColor("リンゴ", "#ff7f7f");
chart.assignColor("メロン", "#7fff7f");

積上げ棒グラフの並び順(下から)

barAxis.addOrderRule(["ミカン", "リンゴ", "メロン"]);

横軸(x)店名の並び順(左から)

xAxis.addOrderRule(["A店", "B店", "C店"]);

横軸(x)のタイトル

xAxis.title = "店名(関東)";

横軸(x)のフォントサイズ

xAxis.fontSize = "15px";

縦軸(y)のタイトル

yAxis.title = "売上高(10月分)"

縦軸(y)のォントサイズ

yAxis.fontSize = "13px";

縦軸(y)の丸めの設定、null を指定するとON、空欄を指定するとOFF になります。(これはバッドノウハウぽいです)

yAxis.tickFormat = "";

以上の設定を行うと、下のようなグラフになります。

動作サンプル
dimple-06

これらの設定の他にも、dimple には沢山のメソッドが用意されています。詳細は、dimple の公式ドキュメントをご参照ください。

サンンプルコード

もろもろまとめると、以下のようなコードになります。

<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
        <title>dimple.js で作った積上げ棒グラフ</title>
        <script src="d3.v3.4.8.min.js"></script>
        <script src="dimple.v2.1.6.min.js"></script>
    </head>
    <body>
        <script>
            
            var data = [
                {"店名":"A店", "商品":"ミカン", "売上高":8000},
                {"店名":"A店", "商品":"リンゴ", "売上高":12000},
                {"店名":"A店", "商品":"メロン", "売上高":15000},
                {"店名":"B店", "商品":"ミカン", "売上高":30000},
                {"店名":"B店", "商品":"リンゴ", "売上高":20000},
                {"店名":"B店", "商品":"メロン", "売上高":10000},
                {"店名":"C店", "商品":"ミカン", "売上高":18000},
                {"店名":"C店", "商品":"リンゴ", "売上高":5000},
                {"店名":"C店", "商品":"メロン", "売上高":30000}
            ];
            
            var svg     = dimple.newSvg("body", 800, 600);
            var chart   = new dimple.chart(svg, data);
            chart.setBounds(100, 10, 700, 500);
            
            var xAxis   = chart.addCategoryAxis("x", "店名");
            var yAxis   = chart.addMeasureAxis("y", "売上高");
            var barAxis = chart.addSeries("商品", dimple.plot.bar);
            
            chart.assignColor("ミカン", "#7fbfff");
            chart.assignColor("リンゴ", "#ffff7f");
            chart.assignColor("メロン", "#7fff7f");
            barAxis.addOrderRule(["ミカン", "リンゴ", "メロン"]);
            
            xAxis.addOrderRule(["A店", "B店", "C店"]);  
            xAxis.title     = "店名(関東)";
            xAxis.fontSize  = "15px";
            
            yAxis.title     = "売上高(10月分)";
            yAxis.fontSize  = "13px";
            yAxis.tickFormat = "";
            
            chart.draw(2000);
            
        </script>
    </body>
</html>

おわりに

dimpleのサンプルを眺めてみると、積上げ棒グラフ以外にも、かなり複雑で面白いグラフも作成できそうです。開発コストも少なくて済みそうなので、これまで諦めていたグラフ表示機能に使ってみてはいかがでしょうか

]]>
https://blog.apar.jp/data-analysis/3439/feed/ 0
5分で分かる!「標準偏差」の使い方 https://blog.apar.jp/data-analysis/3390/ https://blog.apar.jp/data-analysis/3390/#comments Tue, 29 Sep 2015 20:44:49 +0000 https://blog.apar.jp/?p=3390 標準偏差は、データの「ばらつき」を表す値です。データ分析をする上で、とても重要な値なのですが、私のように統計学に馴染みがない人にとって、この標準偏差は、大変とっつきにくい存在ではないでしょうか? そこで今回は、標準偏差の意味や使い所を、できるだけ分かりやすくまとめてみました。

標準偏差の意味

冒頭にも書きましたが、標準偏差とはデータの「ばらつき」を表す値です。もっと正確に言うと、、、

「データが平均値の周辺にどのくらいの広がりや散らばりを持っているか」ということを表す統計量です。

完全独習 統計学入門 より引用

標準偏差は、平均値と合わせて見ることによって、データを正しく把握することができます。でも、なぜ「平均値」だけでは、正しく把握できないのでしょうか? そこで1つ例をあげて、その理由と、「標準偏差」の使い所を確認してみたいと思います。

標準偏差の使い方

ミカンを仕入れるにあたって、「平均値のみ」でデータ分析をしたネコ吉と、「平均値と標準偏差を使って」データ分析をしたワン太郎のお話です。

平均値のみでデータ分析

果物屋を経営しているネコ吉は、ミカンを10個仕入れるため、仕入れ先から、ミカンに関するデータを貰いました。中くらいの大きさ(120グラムくらい)のミカンがよく売れるので、ミカン10個の重さの「平均値」を調べてみました。
ミカン10個の重さの平均値

どちらのミカンも「平均の重さは120グラム」です。「どちらも中くらいの大きさのミカンだろう」と考え、ネコ吉は単価の安い、Bミカンを仕入れることにしました。

平均値と標準偏差でデータ分析

同じく青果店を経営しているワン太郎も、ミカンを10個仕入れるため、仕入れ先から、ミカンに関するデータを貰いました。やはり売れ筋は、中くらいの大きさ(120グラムくらい)のミカンなので、ミカン10個の重さの「平均値」に加えて「標準偏差」も調べてみました。
ミカン10個の重さの平均値と標準偏差

どちらのミカンも「平均の重さは120グラム」ですが、Aミカンの標準偏差は「6」、Bミカンの標準偏差は「58」と大きく違います。そこでワン太郎は、この標準偏差を使って、ミカンの重さにどのくらいの「ばらつき」があるか、計算してみました。

ばらつきの範囲は「(平均値 - 標準偏差)〜(平均値 + 標準偏差)」です。この範囲に、およそ7割のデータが含まれると言われています。

Aミカン ( 120 - 6 ) 〜 ( 120 + 6 ) = 114 〜 126
Bミカン ( 120 - 58 ) 〜 ( 120 + 58 ) = 62 〜 178

Aミカンのばらつきは「114 〜 126」グラム、Bミカンのばらつきは「62 〜 178」グラムだと分かりました。ワン太郎は「Bミカンには、小さいミカンや、大きいミカンが含まれているかもしれない」と考え、少し単価が高いですが、Aミカンを仕入れることにしました。

それぞれの分析の成果は、、

ネコ吉の青果店に、注文した Bミカン10個が届いたので、重さを量ってみました。
Bミカン10個それぞれの重さ

なんと、小さいミカンと、大きいミカンばかりで、ネコ吉が仕入れたかった、よく売れる中くらいのミカンがありません、、、
小さいミカンと大きいミカンばかりで、ネコ吉困る

しぶしぶ Bミカンを店頭に並べてみましたが、案の定、売れ残ってしまいました。しかたがないので、売れ残ったミカンは、ネコ吉の子供たちと一緒に食べました。子供たちは美味しいミカンがたくさん食べられて喜んでいましたが、ネコ吉は少し残念そうでした。

ワン太郎の青果店にも、注文した Aミカン10個が届いたので、重さを量ってみました。
Aミカン10個それぞれの重さ

ばらつきの範囲の計算で予想した通り、全て売れ筋の中くらいのミカンです。
全て売れ筋の中くらいのミカンでワン太郎が喜ぶ

店頭に並べると、Aミカンは飛ぶように売れました。ワン太郎は、標準偏差のありがたみを感じつつ、Aミカンを再注文したのでした。

(おしまい)

記事中のイラストは、下記サイトの素材を使用しています。
ミカン「無料イラスト かわいいフリー素材集 | いらすとや
ネコ吉とワン太郎「イラスト工房

まとめ

少し強引な例でしたが(^^;)「平均値」だけでデータを見てしまうと、ネコ吉のような痛い目にあうかもしれませんね。

ただ、誤解しないで頂きたいのは、「平均値」でデータを見るのが「悪い」ということではありません。分かりやすく最も普及している「平均値」は、最重要の統計量だと、私は思います。

この「平均値」と合わせて「標準偏差」を見ることによって、より正確にデータを把握することができるのです。

5秒で出来る!標準偏差の求め方

標準偏差は、エクセルの STDEVP関数 使えば、一瞬で計算できます。データ分析時に AVERAGE関数 で平均を計算する時に、合わせて標準偏差も計算することをオススメします。

※厳密には、n-1法の STDEV関数 を使う場合もありますが、私は気にしないことにしています。

標準偏差は、少し大変ですが手作業でも計算できます。もし計算方法に興味のある方は こちらの記事 をご参照ください。

終わりに

この記事の標準偏差の説明は、かなりざっくりしたものです。標準偏差について、ちゃんと知りたい方には、記事の中でも引用させて頂いた、書籍「完全独習 統計学入門」がオススメです。著者の方が「標準偏差にこれほどのページ数をさいている教科書はほかにない」と自負されるだけあって、標準偏差について詳細かつ分かりやすく説明されています。

]]>
https://blog.apar.jp/data-analysis/3390/feed/ 10
TWKEY について https://blog.apar.jp/data-analysis/2922/ https://blog.apar.jp/data-analysis/2922/#respond Sat, 11 Jul 2015 20:28:47 +0000 https://blog.apar.jp/?p=2922 TWKEY(ツイッキー)は、ある検索ワードで Twitter ツイートを検索して、ツイートに含まれる単語の出現回数をランキング表示する、簡易的なテキストマイニングツールです。もしかしたら、この TWKEY を使って「ビールとおむつ」のような、関連するキーワードを見つけられるかもしれませんよ。

▽ TWKEY - ツイートマイニングツール
https://twkey.apar.jp/

TWKEY の使い方

フォームに、Twitterの検索ワードを入力して「見つける」ボタンをクリックするのみです。
twkey-01

ボタンをクリックすると、検索ワードが含まれるツイートを 約1000件取得します。(これには少し時間がかかります)
twkey-02

ツイートの取得が終わると、ツイートに含まれる単語の出現回数を、ランキングで表示します。
twkey-03

それぞれの単語をクリックすると、その単語が含まれるツイートを見ることが出来ます。
twkey-04


黄色マーカー がクリックした単語、緑マーカー が検索ワードです。
twkey-05

また、ランキング結果を、CSVファイルでダウンロードすることも出来ます。
twkey-06

CSVファイルには、ランキングで表示されている TF(単語頻度)の他に、DF(文書頻度)IDF、TFxIDF(重要度)が集計されています。

お問い合わせ

TWKEY について、ご質問や不具合等がございましたら @TWKEY2015 までご連絡ください。

]]>
https://blog.apar.jp/data-analysis/2922/feed/ 0
PHP 政府統計 API の使い方メモ(e-Stat) https://blog.apar.jp/php/2881/ https://blog.apar.jp/php/2881/#comments Wed, 01 Jul 2015 20:04:53 +0000 https://blog.apar.jp/?p=2881 政府統計の総合窓口(e-Stat)の API 機能 では、各府省が公表する統計データを、APIを使って簡単に取得することができます。以前は各府省ごとに、統計データを公開していましたが、近年この、政府統計の総合窓口サイトの1つにまとめられ、昨年からは API 機能の提供も開始されました。

政府統計 API の使い方はいたって簡単なのですが、統計データの種類、量ともに膨大なため、データ取得までの流れが、他のWEBサービス系のAPIとは少し異なります。そこで今回は、政府統計 API の使い方をご紹介します。

政府統計 API でデータ取得するまでの流れ

もくじの2〜5の流れで、統計データを取得します。

政府統計 API にリクエストするパラメータなど、詳細な仕様は公式マニュアルをご参照ください。

▽ 政府統計の総合窓口(e-Stat)API仕様
https://www.e-stat.go.jp/api/api-spec

今回は、地域別の「うなぎのかば焼き」の年間支出金額の統計データを取得してみたいと思います。

アプリケーションID の取得

政府統計 API は、誰でも無料で利用登録ができます。クレジット表示をすれば、取得した統計データを元に作成した、アプリやWEBサービスを公開することもできます。

▽ ユーザ登録 | 政府統計の総合窓口(e-Stat)−API機能
https://www.e-stat.go.jp/mypage/user/preregister

利用登録が終わったら、管理ページにログインして、アプリケーションIDを取得します。

「アプリケーションIDの取得」を選択し、名称とURLを入力して「発行」ボタンを押します。そうすると appId欄にアプリケーションIDが表示されますので、こちらをメモしておきます。
e-stat-api-01

統計表IDの取得

まずはじめに、データを取得したい統計表のIDを APIで取得します。WEBサービス系のAPIでは、取得したいデータIDの一覧ページがあったりしますが、統計表は数が多いためか、統計表IDを検索するところからAPIを使います。

APIへのリクエストパラメータは「appId=<アプリケーションID>」が必須になります。パラメータ値には URLエンコードが必要です。

検索キーワードパラメータ searchWord に「うなぎのかば焼き」を指定して、統計表情報を取得します。API名は getStatsList です。

<?php
// パラメータ
$params = array(
    'appId'         => '<アプリケーションID>',
    'searchWord'    => 'うなぎのかば焼き',
);

// URLエンコード
$query = http_build_query($params, '', '&', PHP_QUERY_RFC3986);

// 統計表情報を取得(Json形式)
$url = 'http://api.e-stat.go.jp/rest/2.0/app/json/getStatsList?' . $query;
$json = file_get_contents($url);

// Json形式を配列に変換
$arr = json_decode($json, true);

// 取得したデータの表示
var_dump($arr);

上のプログラムを実行すると「うなぎのかば焼き」に関する統計表情報が表示されますので、統計表名を参考に、取得したいデータがありそうな統計表を探します。以下の統計表が該当しそうです。この統計表ID(@id)「0003021328」をメモしておきます。

        [5]=>
        array(13) {
          ["@id"]=>
          string(10) "0003021328" ← 統計表ID
          ["STAT_NAME"]=>
          array(2) {
            ["@code"]=>
            string(8) "00200561"
            ["$"]=>
            string(12) "家計調査"
          }
          ["GOV_ORG"]=>
          array(2) {
            ["@code"]=>
            string(5) "00200"
            ["$"]=>
            string(9) "総務省"
          }
          ["STATISTICS_NAME"]=>
          string(50) "家計調査 家計収支編 二人以上の世帯" ← 統計表名
          ["TITLE"]=>
          array(2) {
            ["@no"]=>
            string(3) "010"
            ["$"]=>
            string(69) "品目分類 品目分類(平成22年改定)(総数:金額)"
          }
          ["CYCLE"]=>
          string(6) "年次"    ← 集計期間
          ["SURVEY_DATE"]=>
          int(0)

統計表のメタ情報を取得

続いて、取得した統計表IDを元に、統計表のメタ情報を取得します。メタ情報には、分類コードや時間コードなど、統計データを取得する際に指定する、パラメータの値が含まれています。

先ほど取得した統計表IDを、パラメータ statsDataId に、指定します。API名は getMetaInfo です。

<?php
// パラメータ
$params = array(
    'appId'         => '<アプリケーションID >',
    'statsDataId'   => '0003021328',
);

// URLエンコード
$query = http_build_query($params, '', '&', PHP_QUERY_RFC3986);

// 統計表のメタ情報を取得(Json形式)
$url = 'http://api.e-stat.go.jp/rest/2.0/app/json/getMetaInfo?' . $query;
$json = file_get_contents($url);

// Json形式を配列に変換
$arr = json_decode($json, true);

// 取得したデータの表示
var_dump($arr);

かなり大量のメタ情報が表示されます(^^;) 分類が688種類もあるようです。探してみると「うなぎのかば焼き」は分類事項01(cat01) の、分類コード「010920010」と分かりました。

          [1]=>
          array(3) {
            ["@id"]=>
            string(5) "cat01"  ← 分類事項01を示す
            ["@name"]=>
            string(29) "品目分類(22年改定)"
            ["CLASS"]=>
            array(688) {
			(略)
              [210]=>
              array(5) {
                ["@code"]=>
                string(9) "010920010" ←分類コード
                ["@name"]=>
                string(24) "うなぎのかば焼き"
                ["@level"]=>
                string(1) "4"
                ["@unit"]=>
                string(3) "円"
                ["@parentCode"]=>
                string(9) "010920000"
              }

同様に、一番最近の時間軸コードも探します。2014年の時間軸コードは「2014000000」になります。

          array(3) {
            ["@id"]=>
            string(4) "time"
            ["@name"]=>
            string(21) "時間軸(年次)"
            ["CLASS"]=>
            array(30) {
              [0]=>
              array(3) {
                ["@code"]=>
                string(10) "2014000000" ←時間軸コード
                ["@name"]=>
                string(7) "2014年"
                ["@level"]=>
                string(1) "1"
              }

統計データの取得

いよいよ統計データの取得です。パラメータには統計表IDに加えて、先ほど調べた、分類コードをパラメータ cdCat01 に、時間軸コードを cdTime に指定します。API名は getStatsData です。

<?php
// パラメータ
$params = array(
    'appId'             => '<アプリケーションID >',
    'statsDataId'       => '0003021328',
    'cdCat01'           => '010920010',
    'cdTime'            => '2014000000',
);

// URLエンコード
$query = http_build_query($params, '', '&', PHP_QUERY_RFC3986);

// 統計データを取得
$url = 'http://api.e-stat.go.jp/rest/2.0/app/json/getStatsData?' . $query;
$json = file_get_contents($url);


/**
 * 統計データの取得は以上で完了です。以下は表示処理です。
 */
$arr = json_decode($json, true);
foreach ($arr['GET_STATS_DATA']['STATISTICAL_DATA']['CLASS_INF']['CLASS_OBJ'][3]['CLASS'] as $row) {
    $areas_list[$row['@code']] = $row['@name'];
}

$stat = $arr['GET_STATS_DATA']['STATISTICAL_DATA']['DATA_INF']['VALUE'];
foreach ($stat as $key => $row) {
    $yens[$key] = $row['$'];
}
array_multisort($yens, SORT_DESC, SORT_NUMERIC, $stat);

$year   = substr($arr['GET_STATS_DATA']['PARAMETER']['NARROWING_COND']['CODE_TIME_SELECT'], 0, 4);
$name   = $arr['GET_STATS_DATA']['STATISTICAL_DATA']['CLASS_INF']['CLASS_OBJ'][1]['CLASS']['@name'];
echo "{$year}年「{$name}」の地域別の年間支出金額\n\n";
foreach ($stat as $row) {
    if ($row['@cat02'] === '03') {
        echo $areas_list[$row['@area']] . "\t" . number_format($row['$']) . $row['@unit'] . "\n";
    }
}

取得した統計データには、コードと数値のみの統計データと、地域名などメタ情報が含まれています。上のプログラムは、それらを組み合わせて表示しています。配列の階層が深いのでちょっと大変ですね。

プログラムを実行してみます。やはり浜松市がダントツです(^^)

2014年「うなぎのかば焼き」の地域別の年間支出金額

22130 浜松市	6,209円
26100 京都市	3,831円
23100 名古屋市	3,135円
13100 東京都区部	3,130円
25201 大津市	3,123円
08201 水戸市	3,087円
17201 金沢市	3,071円
27100 大阪市	3,068円
27140 堺市	3,064円
22100 静岡市	2,910円
(略)

分類コード cdCat01 の値を変えれば、パーソナルコンピュータ「090100050」や、世帯主こづかい「100200010」などの地域別の年間支出金額を表示することができます。

終わりに

行政機関には、強い縦割り行政のイメージを持っていましたが、政府統計の総合窓口(e-Stat)は、各府省等の参画のもと、総務省統計局が中心となり開発を行ったそうです。縦割りをやめ、各府省が協力してくれると、私たちにはこのような形で恩恵が受けられます。統計分野以外でも、各府省の本当の協力が広がってほしいものです。

]]>
https://blog.apar.jp/php/2881/feed/ 1
5分で分かる!相関係数の求め方 https://blog.apar.jp/data-analysis/2822/ https://blog.apar.jp/data-analysis/2822/#comments Wed, 24 Jun 2015 20:22:22 +0000 https://blog.apar.jp/?p=2822 相関係数は、体重と身長など、2つの値の関係の強さを示す数値です。相関係数を使えば「Aの商品を買っている人は、Bの商品を買うことが多い」のような傾向を、見つける事が出来るかもしれません。統計学を使ったデータ分析で、まず初めに使ってみたくなるのが、この「相関係数」ではないでしょうか? そこで今回は、相関係数の求め方を、出来るだけ分かりやすくまとめてみました。

例題

例として、ある商品メーカーの、商品A と 商品B の相関係数を求めてみます。商品A と 商品B の販売個数は以下の通りです。

◎ 商品Aと商品Bの販売個数
商品Aと商品Bの販売個数の表

5秒で出来る!相関係数の求め方

どうしても今すぐに、相関係数を計算したい場合は、エクセルの CORREL関数 を使えば、一瞬で相関係数を計算できます。お急ぎの方はぜひご活用ください。

相関係数を求める式

相関係数は、以下の計算式で求められます。

相関係数 = 共分散 ÷( 商品Aの標準偏差 × 商品Bの標準偏差 )

「共分散」や「標準偏差」など、統計学では聞き慣れない言葉が、たくさん出てくるので戸惑いますね(^^;) ただ、それらを求める計算式は、ごくごくシンプルです。普通の計算機があれば簡単に求められます。

まずは、商品A の「標準偏差」を求めてみましょう。

標準偏差は、データ分析をする上で、とても重要な値です。もし興味がありましたら「5分で分かる!「標準偏差」の使い方」も合わせてご参照ください。

商品A の「標準偏差」

「標準偏差」は以下の手順で求めます。ここでも聞き慣れない言葉「偏差」や「分散」が出てきますが、順を追っていけば計算はいたって簡単です。
標準偏差を求める手順をまとめた表

平均

初めに、商品A の販売個数の合計を、取引先の数で割って「平均」を求めます。

( 12 + 38 + 28 + 50 + 76 ) ÷ 5 = 40.8

偏差

続いて、取引先ごとの「偏差」を求めます。偏差と聞くと、なにやらややこしそうですが、各販売個数から平均を引くだけです。

12 - 40.8 =  -28.8
38 - 40.8 =  -2.8
28 - 40.8 =  -12.8
50 - 40.8 =  9.2
76 - 40.8 =  35.2

分散

「分散」はその名の通り、データの「ばらつき」を表す値です。偏差の平均を計算すれば、ばらつき度合いを表せそうですが、偏差は合計すると必ず 0 になり、当然ですが平均も 0 になります。そのため、偏差を二乗した平均を計算し、これを「分散」とします。

-28.8 ² = 829.44
-2.8 ² = 7.84
-12.8 ² = 163.84
9.2 ² = 84.64
35.2 ² = 1239.04
平均 分散:464.96

標準偏差

「標準偏差」の計算は、分散の平方根(ルート)を計算するのみです。 分散は偏差を二乗しているため、値が大きくなります。こうなると、販売個数と単位が異なるため、解釈がしづらくなります。そこで、分散の平方根を求め、二乗された値を元に戻します。

√464.96 = 標準偏差:21.56

同様の流れで 商品B の「標準偏差」を計算すると 26.42 が求められます。

続いて、商品A と 商品B の「共分散」を求めます。

共分散

「共分散」は、取引先ごとの 商品A と 商品B の偏差(販売個数 - 平均)を掛け合わせたものの平均です。相関係数の計算で一番大変なところです。計算機で計算しているとエクセルのありがたみが身にしみます。

商品A 偏差 商品B 偏差
( 12 - 40.8 ) × ( 28 - 59.6 ) = 910.08
( 38 - 40.8 ) × ( 35 - 59.6 ) = 68.88
( 28 - 40.8 ) × ( 55 - 59.6 ) = 58.88
( 50 - 40.8 ) × ( 87 - 59.6 ) = 252.08
( 76 - 40.8 ) × ( 93 - 59.6 ) = 1175.68
平均 共分散:493.12

相関係数

ここまでで、相関係数の計算に必要な、商品A と 商品B の「標準偏差」と「共分散」が準備できました。少し整理しておきます。

商品A の 標準偏差: 21.56
商品B の 標準偏差: 26.42
共分散: 493.12

あとは、相関係数を求める式 共分散 ÷ ( 商品Aの標準偏差 × 商品Bの標準偏差 )  に当てはめて、計算するだけです。

493.12 ÷ ( 21.56 × 26.42 ) = 相関係数:0.87

相関係数は -1 から 1 の値になります。一般的に相関係数が 0.7 以上は、強い関係があるとされていますので、相関係数 0.87 の 商品A と 商品B には何か関連がありそうですね。

この相関係数を元に、営業部門なら、商品Aだけ売れている取引先があれば、商品Bを提案してみる。製造部門なら、商品Aと商品Bの部材を共通化して、コストダウンを図るなどの活用が考えられます。

また、この計算結果を利用して、商品Aの販売個数から商品Bの売れ行きを予測することもできます。詳しくは『5分でわかる!「回帰係数」の求め方』をご参照ください。

散布図を描こう!

相関係数の計算と合わせて「散布図」を描くことが重要です。散布図はエクセルを使えば簡単に描くことができます。
商品Aと商品Bの販売個数の散布図

はずれ値もなく、右上がりに点が並んでいるので、散布図で見ても、商品A と 商品B には強い関係があると言えますね。

終わりに

相関係数の求め方を簡単にご紹介致しましたが、かなりの部分の説明をはしょっています(^^;) 相関係数などの統計学を、しっかり理解したい方は(自分も含め)専門の書籍などをご参考にしてください。

]]>
https://blog.apar.jp/data-analysis/2822/feed/ 4