1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

elmを使って統計ライブラリを作って実際にそれを利用するまで。-第四話 確率変数・確率分布-

Posted at

私はelmと統計学、そしてSVGの初心者でかつ初学者です。何か間違っているところがあったらコメントお願いします。

ソースコード:https://github.com/saburooo/simple-stat

成果物:https://mysimple-stat.web.app

確率変数とは

はじめての統計学によると確率変数とは

確率分布に従って起こる変数のことである。

と書いてあります。
確率分布とは何らかの事象が起きる確率の集まりを複数の数字あるいはグラフで表現したものと考えています。
この変数は大きく分けて2種類あるそうです。

  • 離散的確率変数
  • 連続的確率変数

離散的確率変数とは

  • 変数の値がで表せるもの
  • 変数の値が記号で表せるもの

の二種類が存在します。数で表せるものの典型はサイコロの目やトランプの組み合わせになるでしょう、それとは別に変数の値が記号で表せるものの典型は硬貨の表と裏が挙げられます。

そしてその変数になる確率は0と1の間に存在します。

これらがわかった上で確率分布とは何か、それは確率的には100%超えは無いけど一方で0%を下回ることもない。

直感的にしっくりきますね!!

確率密度と確率の違い

この2つは似てるようで違います。確率密度とはグラフで見た時の山の高さのことでそれをより集めた図形のことを確率密度関数と呼びます。

この2つは分布のタイプによって同じ値になったり違う値になったりします、具体的には

  • 離散型分布では確率密度と確率は同じである。
  • 連続型分布ではそれぞれ違う値である。
    • 確率密度 = 確率密度関数の1箇所の高さ
    • 確率 = 確率密度関数の下の一定の幅の面積

こんな感じになります。これらを説明してから本題に入ります。

二項分布

二項分布とは最も知られた離散型の確率分布であらゆる分布の中で一番応用範囲が広いと評判です。

これを作る前にまずは同じ条件のもとで何回も同じことを行うベルヌーイ試行というやり方を実行します。

何度も行ったらその時々に出した数字を計測してグラフにしてみます。

そうして出てくるグラフにはある特徴があります、それは

  1. nが0から始まるため、奇数のときはグラフの境が偶数に、偶数なら奇数になる。
  2. 確率が0.5なら左右対称に、それ以上なら右にグラフが歪み、それ以下なら左に歪む。

非常に単純にelmで表現すると以下の通り。

-- そのまんま直訳しちゃいました。
biDistributionProbability : Float -> Int -> Int -> Float
biDistributionProbability p n c =
    toFloat (combination n c) * (p ^ toFloat c) * ((1 - p) ^ toFloat (n - c))

回数を追ってみたい場合はこれを使ってリストを返す関数を作ります。

biDistribution : Float -> Int -> List Float
biDistribution p n =
    let
        lRange = List.range 0 n
    in
        List.map (\x -> biDistributionProbability p n x |> roundNum 4) lRange 

組み合わせの計算を使っているのですがその詳細はこちら

ポアソン分布

先程の二項分布と同じくらいには有名な離散型確率分布、ベルヌーイ試行の回数が非常に大きい時に便利な関数で二項分布でやろうとすると大変なものはこれを使って計算します。

poissonDistributionProbability : Float -> Int -> Int -> Float
poissonDistributionProbability p n x =
    let
        nn =
            toFloat n

        mu =
            p * nn

        el =
            Basics.e ^ -mu
    in
    ( el * (mu ^ toFloat x) ) / toFloat (factorial x)

これにもリストを返す関数を定義したいと思います。

poisson : Float -> Int -> List Float
poisson p n =
    let
        lRange = List.range 0 n
    in
        List.map (\x -> poissonDistributionProbability p n x |> roundNum 6) lRange

まだまだわかっていないところも多く、もう少し調べていきたいと思っています。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?