つてとのブログ

【統計学R】素朴な乱数を利用して、正規分布っぽいか判定しようと思ったら事故った話

 

イントロ

こんにちは、たちつてとです。

前回、メルセンヌツイスタっていう乱数発生方法を利用して

正規分布っぽい分布や(正規分布になるはずだけど、サンプル数が少なくために)

正規分布っぽくない分布を作りました。↓前回記事です。

 

 

tachitutetonosuke.hatenablog.com

 


tachitutetonosuke.hatenablog.com

 

このデータたちに対して、いつかお世話になった正規性の検定をかましていったら

Rの方で問題が起きちゃった話です。

 

前回の復習と予想(と結果)

前回やったことを3行で書くと

0 or 1を返す確率変数をM回足す。

それをN回試す。

をやって、M回足してできた数の確率分布を見てみた

って話になります。

 

前回作った確率分布が下図なのですが、誰だって(N, M) = (10000,100)の時

の分布については、p値が大きくなって帰無仮説を棄却できなくなるのでは?

と思うはずです。

f:id:tachitutetoNosuke:20210915200953p:plain

で、結論からのべると、Rくんの分布の取り方のせいで判断が保留になりました。

この結論出すのに、貴重な休日が費やされたので人のせいにしたくなるのも人情です。

 

悲しき結果

まず現象の理解(予想)

Kolmogorov-Smirnov検定をやってみました。初出はした記事。

 

tachitutetonosuke.hatenablog.com

 

下から3行目、p_valueをみてください。0.00000...22ってなっているでしょう...

前回も見たように、正規分布の関数形を仮定しフィッティングできているので、

p値がこんなに小さいのは、正直困ります。

ほんまたるい。

f:id:tachitutetoNosuke:20210918230300p:plain

一緒に、確率分布と正規分布をはいてくれるんですが。

f:id:tachitutetoNosuke:20210918230447p:plain

赤字のコメントは一旦おいといて、黒線とデータの分布がずれているのが

わかると思います。

  1. 全体的にずれている
  2. 検定処理でのずれが蓄積
  3. 正規分布である確率(=p値)が小さくなる

って感じなんですかね?あくまで予想ですがね...

 

ここが違う...

まず誰が悪いかというと、Rなんですが(事実)。

で、もっというと確率分布の取り方が悪いことがわかってるんです。

下図は僕が自分で作った確率分布です。長方形でなく丸い点がたくさんあるのは、

僕の怠慢なのであまり気にしないでください。

 

緑の線は、今回のデータから平均値と分散を

計算して、正規分布をプロットしたものになります。よくあっているのがわかります。

なので、僕の作った分布が正しい!です。この下図を基準にして話を続けます。

 

f:id:tachitutetoNosuke:20210918231542p:plain

黒字のコメントの通り、x=51のところに分布の頂点がきます。これは

47    0.066700
48    0.072700
49    0.076700
50    0.076300
51     0.079100  ←ここ
52    0.076500
53    0.070800

という感じのデータがあって間違いないことです。

(上図の左下が50.9585となってるのは、51ぴったりにカーソルを持ってこれなかった

だけです...)

それで、先ほど保留したRがはいた分布(上図の一つ上の図)の話になります。

x=51直上には、

分布の長方形の中心ではなく、かどがきている

のがわかると思います。どうなって欲しかったかというと、赤い枠線のすぐ横の

一番高い長方形が上図の赤線の位置に来て欲しかった

です。

 

どうしてそうなったか

以下では、めんどくさいので横軸の値をxとします。

Rくん的には、例えば、x=50.5の点と50\leq x \lt 51の範囲が対応しています。ここが悪い。今回の実験で、小数点なんて必要ないです。

 

少し長くなります。

大前提として、確率分布を有限の数データから作成するときは、空間(と

いうか横軸)を分割します。Rの作った確率分布は視覚的にわかりやすいですが、

線ではなく長方形からできているじゃないですか。つまり、確率分布を我々がデータ

から作るとき、連続的でなく離散的なものしか作れません

離散的というのは整数1,2,3...という具合です。小数をとばして数えているでしょう。

なので、確率分布を作るときは、横軸を適当に分割(して離散的に)するという作業が

必須になります。※データが増えると、分割の仕方を細かくできるので、連続的な分布に近くなります。

 

ここで話が戻ります。

分割した結果、例えば50\leq x \lt 51という部分ができます。

一方で、この範囲の代表点って何かというと、範囲の真ん中であるx=50.5

最も自然でしょう。で、この分割の仕方だとどうしても小数点が出てきてしまう。

 

本当は、整数(=50)プラスマイナス0.5が一番嬉しい。↑の例では、

x=50.0の代表点と49.5\leq x \lt 50.5だと自然ですよね?

このように対応させてくれると嬉しかった...

もしくは、整数プラスマイナス2.5とか。何しろ、範囲の端にしか値がないのは激しすぎる...

結局どういうこと

データから作成された確率分布の代表点x=50.5の値と

データの平均値と標準偏差を当てはめた正規分布x=50.5の時の値を比較して

検定をしているはず

→今、0 or 1の乱数を足してるだけなのに、50.5なんて値出てくるはずないやん...

要は、「空間の分割の仕方が悪い」

となります。

 

一般に、

xの値が50,50.1,50.8などと、xの値が50以外の値もあるときは問題ないです。

しかし今回、xは整数なので、50\leq x \lt 51の範囲にはx=50の値しかないです。したがって、50\leq x \lt 51x=50.5の代表点として、対応させるの

は嬉しくないです。

 

Rの設定かスクリプトかいじればいいんでしょうが...めんどくさい...

 

最後に

【鉄獣戦線 徒花のフェリジット】メルカリ相場の価格分布はやはり正規分布っぽくない話(確定編)【遊戯王】

この話を確認してみたところ、範囲が1000円単位とかだったので、今回ほどは激しくなかったですね。この1000円の範囲に、11333とか11666とかがいるはずなので。

多分、結果は覆らない...はず....