・差分からの分散                     moonlight 氏

 例えば、{5, 6, 9, 9, 11, 14} というデータの平均は、9 で、分散も 9 で、標準偏差は 3 です。

 このデータを全て 7 ずらした場合(引くことにします)、平均は 2 と変わりますが分散や標
準偏差は変わりません。

 つまり、分散や標準偏差は、このデータ {5, 6, 9, 9, 11, 14} の差分である {1,3,0,2,3} に依る
ということです。

 そこで、質問です。

 このデータの差分 {1,3,0,2,3} から分散を計算する術はあるのでしょう。

 どういう手管があるかご存知であれば教えて下さい。また、知らんかったけど考えた場合は
それでももちろん結構です。

 当然ですが、差分のデータは例に出したものには限らないですし、判り良いように負の数は
含まないよう元のデータも昇順にしていますが、そのような条件も不要かと考えるのですが、
その点もご教授願えればと思います。(いつも訊いてばかりで申し訳ない)


 らすかるさんからのコメントです。(令和2年5月15日付け)

 差分データが a[k] (1≦k≦n-1) のとき、分散は、

  (1/n^2)Σ[i,j=1〜n-1](n・min(i,j)-i・j)a[i]a[j]

で計算できるようです。昇順とかは関係ないはず。


 moonlight さんからのコメントです。(令和2年5月15日付け)

 らすかるさん、早速ありがとうございます。これは、「その筋の人(どの筋かは判らないけど)」
には当然の知見なのでしょうか?それとも何かで調べたものでしょうか?それとも、らすかる
さんがご自身で導出?されたものでしょうか。
(何かに書いてあるようなら少しその線で調べて見たいことが...)

 上でも書いたことですが、例えば、{5,6,9,9,11,14} というデータも {9,6,14,5,11,9} も要素?を書
いた順番を変えただけで同じデータですが、その差分は、{1,3,0,2,3} と {-3,8,-9,6,-2} と全く異
なりますが... まぁ当然のように分散は同じなわけで、らすかるさんの提示された計算で同じ分
散の値が計算できることがちょっと不思議です。
(当然ですが、私自身でも計算などして?確認はしているのですが)

 どうすれば、この不思議だと思ってしまう感覚が解消できるでしょうか。
(ちょっと謎な質問で申し訳ない)

 まぁ、つまるところ色々な証明の手順や知見はあると思うのだけど、要領の良いもの(手
続き的?計算的?にというのではなく)はないだろうかという事です。


 らすかるさんからのコメントです。(令和2年5月15日付け)

 知らなかったですし、探してもありそうな気がしませんので、自分で導出しました。

 差分が a[1],〜,a[n-1] のときに、元データは、

  a0、a0+a[1]、a0+a[1]+a[2]、…、a0+a[1]+a[2]+…+a[n-1]

となり、このデータを分散の式に当てはめて整理したものが例の式ですから、結局

{5,6,9,9,11,14} や {9,6,14,5,11,9} の分散を求めているだけであり、計算できて当然ですね。


(コメント) データの差分 {1,3,0,2,3} から、 a[1]= 1、a[2]= 3、a[3]= 0、a[4]= 2、a[5]= 3 

これらを、らすかるさんの式に代入して計算しようとして、挫折しました...。

 もっと簡単な場合に限定して追認したいと思います。

元のデータの初項 x に対して、差分を {a,b} とすると、元のデータは、

   x,x+a,x+a+b

となります。この平均をmとおくと、 m=(3x+2a+b)/3

 このとき、分散=(2乗の平均)−(平均の2乗) なので、

 (2乗の平均)=(x2+(x+a)2+(x+a+b)2)/3=(3x2+(4a+2b)x+2a2+2ab+b2)/3

より、

 分散=(3x2+(4a+2b)x+2a2+2ab+b2)/3−(3x+2a+b)2/9=2(a2+ab+b2)/9

 因みに、らすかるさんの式に代入してみると、

(1/9)Σ[i,j=1〜2](3・min(i,j)-i・j)a[i]a[j]

=(1/9)((3・min(1,1)-1)a[1]a[1]+(3・min(2,1)-2)a[2]a[1])
                      +(1/9)((3・min(1,2)-2)a[1]a[2]+(3・min(2,2)-4)a[2]a[2])

=(1/9)((3-1)a2+(3-2)ab)+(1/9)((3-2)ab+(6-4)b2=(1/9)(2a2+2ab+2b2)

となり、先の結果と一致して安心しました!

#分散が元のデータの差分で求まるというのは本当に不思議ですね!


 GAIさんからのコメントです。(令和2年5月15日付け)

 らすかるさんの式 (1/n^2)Σ[i,j=1〜n-1](n・min(i,j)-i・j)a[i]a[j] が面白かったので調べて
みると、一足早くらすかるさんが説明されているが、次の様に観察してみました。

 [a1,a2,a3,a4]に対する差分列を[b1,b2,b3]とすると、

 b1=a2-a1、b2=a3-a2、b3=a4-a3

<=> a2=a1+b1、a3=a1+b1+b2、a4=a1+b1+b2+b3

 これで元の母集団での分散計算をしてみると、1/4^2で通分して、

gp > 4*(a1^2+(a1+b1)^2+(a1+b1+b2)^2+(a1+b1+b2+b3)^2)-(4*a1+3*b1+2*b2+b3)^2
%209 = 3*b1^2 + (4*b2 + 2*b3)*b1 + (4*b2^2 + 4*b3*b2 + 3*b3^2)

と、a1の値が消える。つまり元の配列は無関係に差分の配列のみで決定できる。

 この式を生み出せる式として、次の書式が適合する。
(4*min(i,j)-i*jの構造を作り出すのが流石です。)

gp > {S=[b1,b2,b3];}sum(i=1,3,sum(j=1,3,(4*min(i,j)-i*j)*S[i]*S[j]))
%208 = 3*b1^2 + (4*b2 + 2*b3)*b1 + (4*b2^2 + 4*b3*b2 + 3*b3^2)

つまり、この式で全く元の母集団での分散計算と同等な結論に至れる。


 差分と分散を並べてみると美しい。

 [a1,a2]に対する差分列を[b1]とすると、分散は、V=b1^2/4

 [a1,a2,a3]に対する差分列を[b1,b2]とすると、分散は、V=(2*b1^2+2*b2^2+2*b1*b2)/9

 [a1,a2,a3,a4]に対する差分列を[b1,b2,b3]とすると、

  分散は、V=(3*b1^2+4*b2^2+3*b3^2+2*(2*b1*b2+b1*b3+2*b2*b3))/16

 [a1,a2,a3,a4,a5]に対する差分列を[b1,b2,b3,b4]とすると、

  分散は、V=(4*b1^2+6*b2^2+6*b3^2+4*b4^2+2*(3*b1*b2
                     +2*b1*b3+b1*b4+2*(2*b2*b3+b3*b4)+3*b3*b4))/25

 [a1,a2,a3,a4,a5,a6]に対する差分列を[b1,b2,b3,b4,b5]とすると、

  分散は、V=(5*b1^2+8*b2^2+9*b3^2+8*b4^2+5*b5^2+2*(4*b1*b2+3*b1*b3
         +2*b1*b3+B1*b4+2*(3*b2*b3+2*b2*b4+b2*b5)+3*(2*b3*b4+b4*b5)+4*b4*b5))/36

 [a1,a2,a3,a4,a5,a6,a7]に対する差分列を[b1,b2,b3,b4,b5,b6]とすると、

  分散は、V=(6*b1^2+10*b2^2+12*b3^2+12*b4^2+10*b5^2+6*b6^2+2*(5*b1*b2
         +4*b1*b3+3*b1*b4+2*b1*b5+b1*b6+2*(4*b2*b3+3*b2*b4+2*b2*b5+b2*b6)
         +3*(3*b3*b4+2*b3*b5+b3*b6)+4*(2*b4*b5+b4*b6)+5*b5*b6))/49

 [a1,a2,a3,a4,a5,a6,a7,a8]に対する差分列を[b1,b2,b3,b4,b5,b6,b7]とすると、

  分散は、V=(7*b1^2+12*b2^2+15*b3^2+16*b4^2+15*b5^2+12*b6^2+7*b7^2+2*(6*b1*b2
         +5*b1*b3+4*b1*b4+3*b1*b5+2*b1*b6+b1*b7+2*(5*b2*b3+4*b2*b4+3*b2*b5
         +2*b2*b6+b2*b7)+3*(4*b3*b4+3*b3*b5+2*b3*b6+b3*b7)+4*(3*b4*b5+2*b4*b6
         +b4*b7)+5*(2*b5*b6+b5*b7)+6*b6*b7))/64

    ・・・・・・・・・・・・・

 なお、分散式の第一行に示した各成分bi^2にかかる係数

[1]
[2,2]
[3,4,3]
[4,6,6,4]
[5,8,9,8,5]
[6,10,12,12,10,6]
[7,12,15,16,15,12,7]
・・・・・・・・・・・・・・・

は、 T(n,m)=(n-m+1)*m とすることで、上からn行目、左からm列目の数を与えられる。


 moonlight さんからのコメントです。(令和2年5月16日付け)

 らすかるさん、色々とありがとうございます。少しスッキリした気はします。
(ここの趣旨とは少しずれる気はするのですが,

 今思ってること。

 同じデータを与える差分は何通りもあるわけです。負の数を含む差分データを、同じデータ
を与えるが全て正の数である差分に変えるアルゴリズムで要領の良いものは?

...と思って、そんなの考えずとも誰か作ってるのでは?と思うのですが、あるでしょうか。


 らすかるさんからのコメントです。(令和2年5月16日付け)

 基本的にソートですから、初期値は適当に決めて差分データから元データを作り、クイック
ソートなどの速いアルゴリズムを使って昇順にソートしてから、差分データを作り直すのが最
も速いと思います。

 もし、元データを作らずにやるとしたら、例えば、

(1) 先頭の二つを入れ替えると、先頭二つの差分データが a,b → -a,a+b

(2) 末尾の二つを入れ替えると、末尾二つの差分データが a,b → a+b,-b

(3) 途中の二つを入れ替えると、途中三つの差分データが a,b,c → a+b,-b,b+c

となることを考えて、最も小さい数(=負で絶対値が最大)から順に消していけばよいと思い
ます。(ただし、先頭は後回しにした方が良さそうな気がします)

例 元の差分データが {-3,8,-9,6,-2} ならば、

 -9を消すために、8,-9,6 に(3)を適用 → {-3,-1,9,-3,-2}

 4番目の-3を消すために、9,-3,-2に(3)を適用 → {-3,-1,6,3,-5}

 -5を消すために、3,-5に(2)を適用 → {-3,-1,6,-2,5}

 -2を消すために、6,-2,5に(3)を適用 → {-3,-1,4,2,3}

 -1を消すために、-3,-1,4に(3)を適用 → {-4,1,3,2,3}

 -4を消すために、-4,1に(1)を適用 → {4,-3,3,2,3}

 -3を消すために、4,-3,3に(3)を適用 → {1,3,0,2,3}

 これで最初の昇順の差分になりました。
(このステップ数で終わったのはたまたまかも知れません。また、いいかげんなアルゴリズ
ムなので終わらないことがあるかも知れません。)

 誰か作ってるのでは?

 長年いろいろなプログラムを作ってきましたが、その必要性を感じたことがありませんの
で、それに関する有名なアルゴリズムは、なさそうな気がします。もちろん、どこかで同じこ
とを考えて作った人はいるかも知れませんが...。


(コメント) らすかるさんの最初に示された方法で十分だと思いました。

 元の差分データが {-3,8,-9,6,-2} とすると、元のデータは、例えば、初期値を14として、

 {14,11,19,10,16,14}

 これを昇順に並べ替えて、 {10,11,14,14,16,19} となるので、求める差分データは、

 {1,3,0,2,3}

となる。(らすかるさんの第2の方法で得られた結果と一致)



                         投稿一覧に戻る