排反事象の確率の和と一般の事象の確率の和の関係
[mathjax] 確率の基本を最初からじっくり読み進めてみる。 そもそもロクにわかってないことがわかる。 確率の加法について今更\"おっ?\"と思ったのでまとめてみる。 排反事象の確率の和と一般の事象の確率の和の関係 事象(A)と事象(B)が排反であるとき以下が成り立つ。 begin{eqnarray} P(Acup B)=P(A)+P(B) end{eqnarray} これは、事象(A)と事象(B)の排反でない場合の確率(P(Acup B))について 事象(A)と事象(B)が排反である、という特殊な条件を付けたものになっている。 (P(Acup B))は3つの排反事象の確率(P(Acap B^c),P(A^c cap B),P(Acap B))の和に分解できる。 begin{eqnarray} P(Acup B) = P(Acap B^c) + P(A^c cap B) + P(Acap B) end{eqnarray} 事象(A)を以下のように分解する。 begin{eqnarray} A &=& (Acap B^c)cup (Acap B)\\ B &=& (Acap B)cup (A^C cup B) end{eqnarray} ((Acap B^c))と((Acap B) )は排反、((Acap B))と((A^C cup B))も排反。 なので、 begin{eqnarray} P(A) &=& P(Acap B^c) + P(Acap B) \\ P(B) &=& P(Acap B) + P(A^C cup B) end{eqnarray} 2つ足すと、 begin{eqnarray} P(A)+P(B) &=& 2 P(Acap B) + P(Acap B^c) + P(A^C cup B) end{eqnarray} これ、以下のように変形できてしまう。 begin{eqnarray} P(Acap B) &=& P(A) + P(B) - P(Acup B) end{eqnarray} ここまで来てようやく... (A)が起きる確率と(B)が起きる確率の和は、それぞれを足したものから重複部分の確率を引いたもの。 (A)と(B)が排反事象の場合に限って(P(Acup B)=phi)だから、(P(A)+P(B))となる。
時系列データ-自己相関係数
[mathjax] 時系列データと自己相関係数、コレログラムについてまとめてみる。 自己相関係数 時間の経過と共に得られた(n)個のデータ(x_1,x_2,cdots,x_n)(時系列データ)があるとする。 (x)から(h)だけずらしたデータ(y=x_{1+h},x_{2+h},cdots,x_{n+h})との相関係数を遅れhの自己相関係数という。 (n)個のデータの平均(bar{x})は、 begin{eqnarray} bar{x}=frac{(x_1+cdots+x_n)}{n} end{eqnarray} 相関係数を以下のように定義す模様。 begin{eqnarray} r_h = frac{frac{1}{n-h}(x_i-bar{x})(x_{i+h}-bar{x})}{frac{1}{n}sum_{i=1}^n (x_i-bar{x})^2} end{eqnarray} (x_i)に周期性があれば、周期が一致する(h)のところで、 例えば日を跨いだ同じ時間に当たる(h)に差しあたるところで、 相関係数が大きくなるはず。 (r_h>0)ということは、各時点の傾向は(h)時点先に持続するということ。 (r_h<0)ということは、各時点の傾向は(h)時点先に反転するということ。 コレログラム (h)を0から大きくしていくことで(r_h)が上下するが、 その推移を見ることで、時系列データの周期の見当をつけることができる。
symbol、参照、破壊的メソッド
[arst_toc tag=\"h3\"] シンボル 文字列そのものに意味はなく、単純にラベルとして文字列を扱いたいというときシンボルを使う。 シンボルのポイントは、文字の並びが同じであれば(同値であれば)同一であること。 hoge1 = :hoge1 p hoge1 # 524328 hoge2 = :hoge1 p hoge2 # 524328 hoge3 = :hoge3 p hoge3 # 324648 文字列からシンボルに変換できる。 hogeA = \"hoge1\".to_sym p hogeA.object_id # 524328 値の同値性と同一性 演算子==は、例えば2つの文字列の値が等しいかどうか(同値であるか)を比較する。 一方で、2つの変数のobject_idが等しいかどうか(同一であるか)を比較するために、 equal?メソッドを利用する。 hoge_x = \"hoge1\" hoge_y = \"hoge1\" p hoge_x == hoge_y # true p hoge_x.equal? hoge_y # false オブジェクトと参照 変数を宣言すると(つまりリテラルを指定すると)オブジェクトへの参照が与えられる。 以下の場合、\"hoge\"という一つのオブジェクトをhoge1、hoge2が参照する形になる。 hoge1 = \"hoge\" hoge2 = hoge1 hoge1.equal? hoge2 # true 片方の変数について値を変更した場合、その変更に対応するオブジェクトが新たに作られ、 新しいオブジェクトへの参照が作られる。 hoge1 = \"hoge\" hoge2 = hoge1 hoge2 = hoge2 + \"fuga\" p hoge1 # hoge p hoge2 # hogefuga hoge1.equal? hoge2 # false 実引数と仮引数の参照 関数に実引数として渡した変数と関数内で利用できる仮引数の参照は同じ。 ただし関数内で仮引数に対して処理すると、別の値が確保され、仮引数はその値への参照となる。 x = 100 x.object_id # 435123 def func x p x.object_id # 435123 x = 200 p x.object_id # 249821 end 破壊的メソッドと参照 変数の値を変更したときに参照を変えずに値を変更するメソッドを破壊的メソッドという。 慣例的に破壊的メソッドの末尾には「!」をつける。 破壊的メソッドと、代入時に別変数を確保して参照を変更するメソッドはしばしば同名で、 「!」により区別することがある。 残念ながら徹底されておらず、破壊的メソッドなのに「!」がなかったり逆もある。 w = \"hogehoge\" w.chop # \"hogehog\" w # \"hogehoge\" w.chop! # \"hogehog\" w # \"hogehog\"
文字列、%記法
[arst_toc tag=\"h3\"] 文字列の式展開 PHPと同様にダブルクォート、シングルクォートにより文字列を表現する。 前者は変数展開あり、後者は変数展開なし。 実際には文字列内の\"式展開\"で、式のto_sメソッドの評価結果が文字列に展開される。 to_sメソッドを備えていれば独自クラスでも展開できる。 hoge = 10 p \"hoge is #{hoge}\" # hoge is 10 p \'hoge is #{hoge}\' # hoge is #{a} ただ文字列の中に変数を書いただけではダメで、変数展開用の識別子がいるんだな。 パーセント記法による式展開 シングルクォート、ダブルクォート以外を使って文字列を作ることもできる。 文字列の中でエスケープ無しでシングルクォート、ダブルクォートを使えて便利。 hoge = %*THIS IS TEST STRING \"HOGEHOGE\".*% もともとシングルクォート、ダブルクォートの区別により式展開するしないが決まっていたが、 当然パーセント記法を使うと式展開をそのままでは選べない。 パーセントの後にq、またはQを付与することで式展開をするしないを選ぶことができる。 なお、デフォルトは式展開をする。つまり%Qと同じ。 fuga = 100 %q*#{fuga + 100}* # \"#{fuga + 100}\" %Q*#{fuga + 100}* # \"200\" Rubyが複雑に見えるのはコイツのせいじゃないだろうか。 文字列の型変換 文字列から整数、浮動小数点、複素数、有理数などへ変換できる。 それぞれ、to_i、to_f、to_c、to_rというメソッドが用意されている。 厄介そうなことに、型変換ができない場合、変換できるところまで変換する。 そもそも先頭の文字が変換できないなら0。 \"100\".to_i # 100 \"10ab\".to_i # 10 \"1.1.1\".to_f # 1 \"hoge\".to_i # 0 デバッグ出力と関数 文字列をデバッグ用途に出力するときはpを使う。変数内の式は展開されない。 他に、print、putsで出力できる。こちらは変数内の式が展開される。 hoge = \"100 n\" p hoge # \"100 n\" puts 100 # 100 ヒアドキュメント 変数展開なしのヒアドキュメントは以下の通り。ヒアドキュメントの開始をシングルクォートにする。 ヒアドキュメントの終了は識別子も前にスペース禁止。 hoge = 100 str = <<'DOC' #{hoge} HOGE DOC 変数展開ありのヒアドキュメントは以下の通り。開始をダブルクォートにする。 hoge = 100 str = <<"DOC" #{hoge} HOGE DOC 文字列演算 文字列は+、*に対応している。 hoge = \"HOGE\" + \"FUGA\" # \"HOGEFUGA\" fuga = \"HOGE\" * 3 # \"HOGEHOGEHOGE\" <<により文字列連結。 hoge = \"HOGE\" hoge << "FUGA" # "HOGEFUGA" 比較演算 文字列の辞書順で比較する。 \"X\" \"Y\" # false \"XXX\" < "XXY" # true "XYZ" == "XYZ" # true 文字列長 .lengthメソッドにより文字列長を返す。バイト数ではなく文字数。 \"HOGEHOGE\".length # 8 sprintfと% %演算子にはsprintf相当の機能も備わっていて混乱する。 知らないと訳がわからない。 sprintf(\"THIS IS TEST INTEGER %02d\",1) # \"THIS IS TEST INTEGER 01\" p \"THIS IS TEST INTEGER %02d\" % 1 # THIS IS TEST INTEGER 01\"
論理値、論理演算子、自己代入
真/偽 TrueClassのインスタンスがtrue、 FalseClassのインスタンスがfalse。 NilClassのインスタンスがnil。 true.class # TrueClass false.class # FalseClass falseとnilのみ偽として評価される。 falseとnil以外は全て真として評価。 この動きにより、変数に値が入っているかどうかは、 nilと比較する必要はなく変数を評価するだけで良い。 PHPのように変数に値が入っていることをチェックする必要はない。 if文 オーソドックスなif文。 compare = true if compare then \"OK\" end if文は式なのでif文を評価すると値が返る。 評価値はif式内で最後に評価された値となる。 a = if true 1 end p a # 1 後置ifという構文。簡単にコードが短くなって便利そう。だが...、 後置ifがfalseの場合でも、変数自体は確保される。が値が入らない。 意図せず変数がnilになるコードを書く可能性がある。 未定義の変数と、確保済みだが値なしの変数は明確に異なる。 a = 1 if true p a # 1 b = 1 if false p b # nil もし偽だったら、を書きたい場合はunless構文を使う。 unless false p 1 # 1 end 単項演算子?は使える。 n = (a==10) ? true : false 論理演算子 論理演算子は最後に評価したオペランドの値を返す。 評価結果(true,false)を返さない。 x = nil && 4 # nil y = 1 || 2 # 1 自己代入 変数が真でない場合に限りその変数に値を代入する自己代入。 これは、論理演算の際どい評価順序を利用していて、何故そうなるかは深い深い海の底にある。 z = z || 1 # 1 z ||= 1 # 1 zが真でない場合、つまりzがfalseかnilの場合に、 論理和演算子の右側のオペランドである1の評価結果(=1)がzに代入される。 未確保・未定義の変数の評価結果はnilなので、 未定義・未確保の場合に限り初期値を入れることができる。 z = 10 z = z || 1 # 10 &&とand、||とor、!とnot &&とand、||とor、!とnotという風に、同じ意味の論理演算子が対で用意されている。 それぞれ評価時の優先順位が異なる。(以下のようになる) p x && z # = p (x && z) p x and z # = (p x) and z
整数リテラルとメソッド
[arst_toc tag=\"h3\"] 命名規則1.ローカル変数 変数名により用途が決まるので理解が必要。 資格系なら\"不適切な変数名\"を見抜けるかが大事。 ローカル変数は、代入が行われたブロックまたはメソッドの中だけで有効なスコープの変数。 ローカル変数は以下から構成される。ただし数字は先に来ない。 アンダースコア「_」 英数字 以下は変数名としてN.G. # アンダースコア以外の記号「-」が使われている variable-1 # これも safe? # 先頭が数値 100_or_1000 # 定数 VARIABLE 予約後を変数として再定義することはできない。 関数内ならスコープ外のローカル変数を参照すると例外。 kuma=20 def hoge(x,y) kuma end スコープ内で定義されているが評価されていない変数を参照するとnil。 def hoge(x,y) kuma = x + y if x > 10 kuma end > hoge 20,30 => 50 > hoge 5,10 => nil 命名規則2.グローバル変数 スコープに関係なくどこからでも参照できる変数。 構成する文字はローカル変数と同じ。ただし先頭は「$」。 アンダースコア「_」 英数字 $global = 100 def fuga(a,b) $global end > fuga 10,20 => 100 リテラルの種類 Rubyのリテラルは以下。 数値 論理値 文字列 シンボル 配列 ハッシュ 範囲 正規表現 ハッシュ 数値リテラル 整数と浮動小数点を使える。符号、指数表記、基数指定が可能。 基数指定でありえない値を指定すると例外。 +100 -200 2e2 # 2 に10の2乗を掛ける => 20 5e-e # 5 に10の-3乗を掛ける => 0.05 0b10 # 2進数の10 => 2 0o10 # 8進数の10 => 8 0d10 # 10進数の10 => 10 0x10 # 16進数の10 => 16 0xfg # 16進数でgはNG 数値リテラル内で桁表現ができる。(ロケールが違うときはどうなるのだろうか?) 100_000 => 100000 有理数(Rational)、複素数(Complex)もリテラル。 有理数は既約になる。浮動小数点にしないで保持できる。 また、小数を既約分数に変換できる!(すごい過剰な感じがする...) 25/45r # (5/9) 3.14r # (157/50) 複素数は実数、虚数の指定を整数、小数を使って表現できる。 12i # (0+12i) 5.6i # (5+6i) 有理数、虚数をミックスすることもできる。 3.14ri # (0+(157/50)i) 数値クラス 数値クラスのインスタンスである。 一言に数値クラスといっても継承関係によって詳細化されている。 a = 100 a.class # Fixnum a.class.superclass # Integer a.class.superclass.superclass # Numeric 数値クラスに実装された演算子により、数値演算、比較演算を実行できるようになっている。 数値演算 代表的な2項演算子は一通り使える。 1+1 # 2 1-2 # -1 3*3 # 9 4/2 # 2 4%3 # 1 代表的な比較演算子も一通り使える。 1==1 # true 1!=5 # true 1=1 # true 怪しい演算子が用意されている。UFO演算子。 演算子の左が大きければ1、等しければ0、右が大きければ-1。 500 10 # 1 500 500 # 0 10 500 # -1 と書いてあるけど、オペランドがNumericの時の話であって、 一般には「正」「0」「負」の振り分けと考えた方が良さそう。 オペランドが比較不能な場合はnilだそうだ。 if文を使って3方分岐するときに使える。 compare = (hoge fuga) if compare == 0 # hogeとfugaが比較可能で等しいとき elseif compare > 0 # hogeとfugaが比較可能でhogeが大きいとき else # 上記以外 (比較可能でfugaが大きいときを含む) end Rubyにはインクリメント演算子、デクリメント演算子は存在しない。 ので代わりに自己代入演算子を使う。 a = 100 a += 20 # 120 a -= 30 # 90 a *= 2 # 180 数値クラスの演算子であることを意識した書き方をすると、 数値の加算を以下のように書ける。 a = 100 a .+(50) # 150 メソッド 最後に評価された値が返る。returnで返すとそこで評価が終了する。 returnを書かないと関数内を最後まで読んで何が最終評価か理解しないといけないから 明示的returnを推奨する人もいるが、無いコードも多数ある。資格系はreturn無しの様子。 def add(x,y) x+y end > add 10,20 30=> nil def predict(hoge) if (hoge) then \"OK\" else \"NG\" end end > predict false => \"NG\" 仮引数のデフォルト値を指定できる。指定した引数の数が足りない場合は例外。 def add(x,y=200) x+y end add 10 => 210 キーワード引数 仮引数に名前をつけることができる。 これによりメソッド実行時に引数としてハッシュオブジェクトを渡せるようになる。 def add(x:,y:) x+y end add (x:100,y:200) => 300 キーワード引数にない引数名を指定すると例外。 def add(x:,y:) x+y end add (x:100,z:200) # 例外 ただし、キーワード引数を定義したメソッドに任意の引数を渡すことができる。 def add(x:,y:,**z) p z x+y end add (x:100,y:200,z:300) # {z=>300} => 300
vagrant(ubuntu/xenial64 vbox) ubuntu16にrbenv rubyをインストールするplaybook (ほぼ失敗作)
作ってみたがrbenv installにとても時間がかかるので現実的ではないと思う。 vagrantのように壊して作るのが前提ならrbenvでバージョンを切り替えられる必要はないから、 わざわざ毎回コンパイルすることはない気がする。 いずれapt-get installで直接インストールする方法を試してみる。 commonロール 実験の結果、ubuntu/xenial64 vboxに必要だったパッケージたちを入れるロール。 become: yes, become_method: sudo で実行。 --- - name: install packages apt: name=\"{{item}}\" state=present with_items: - gcc - make - libssl-dev - zlib1g-dev rbenv,rubyインストールロール ansible実行ユーザ(ubuntu)のホームディレクトリ以下にrbenvとrubyを入れるロール。 .profileに追加した内容を反映して次に進まないとエラーになる...->要改良 --- - name: retrieve the latest rbenv to ~/.rbenv git: repo=https://github.com/sstephenson/rbenv.git dest=/home/{{user}}/.rbenv accept_hostkey=yes force=yes - name: retrieve the latest ruby-build plugin to ~/.rbenv/plugins/ruby-build git: repo=git://github.com/sstephenson/ruby-build.git dest=/home/{{user}}/.rbenv/plugins/ruby-build accept_hostkey=yes force=yes - name: add path to ~/.rbenv/bin lineinfile: dest=/home/{{user}}/.profile line=\'PATH=\"$HOME/.rbenv/bin:$PATH\"\' state=present create=yes - name: add path to ~/.rbenv/plugins/ruby-build/bin lineinfile: dest=/home/{{user}}/.profile line=\'PATH=\"$HOME/.rbenv/plugins/ruby-build/bin:$PATH\"\' state=present create=yes - name: add initial evaluation of rbenv init lineinfile: dest=/home/{{user}}/.profile line=\'eval \"$(rbenv init -)\"\' state=present create=yes - name: add gem lineinfile: dest=/home/{{user}}/.gemrc line=\"gem{{COLON}} --no-ri --no-rdoc\" state=present create=yes - name: rbenv install 2.4.1 shell: bash -lc \"rbenv install 2.4.1\" - name: rbenv global 2.4.1 shell: bash -lc \"rbenv global 2.4.1\" - name: gem install bundler shell: bash -lc \"gem install bundler\"
嘘を見抜く方法-見かけ上の相関と偏相関係数
[mathjax] みかけ上の相関 データセット((x_i,y_i))について高い相関係数が得られた場合に、 必ずしも(x_i)と(y_i)の間に相関があると言えない。 例えば、「金持ちの人ほど朝方である」というやつ。 所得(x_i)と起床時間(y_i)が揃ったデータセットなんてどこで取るのか知らないけど。 ((x_i,y_i))を散布図にプロットしていくと、綺麗に正の相関が現れるらしい。 相関係数(r_{xy})は1に近づき、相関係数だけ見ると相関がありそうに見えてしまう。 これには年齢(z_i)というデータが隠れていて、 年齢が高いほど高所得である場合が多く、早起きだという事実がある。 つまり(r_{zx})、(r_{zy})は1に近い値になる。 偏相関係数 本来背後にある考慮あれていない因子(ここで言う年齢)のことを交錯因子と言うらしい。 交錯因子の影響を取り除いたあとの補正済みの相関係数(偏相関係数)を計算できてしまう。 以下の(r_{xy cdot z})は、(z_i)の影響を除いた後の(x_i)と(y_i)の相関係数。 begin{eqnarray} r_{xy cdot z} = frac{r_{xy}-r_{xz}r_{yz}}{sqrt{1-r_{13}^2}sqrt{1-r_{23}^2}} end{eqnarray}
相関係数
[mathjax] ちょっと良くわかってなかったので改めて読み直してみた。 ものすごく分かりやすかったのでまとめてみる。 共分散(C_{xy}),標準偏差(S_x,S_y)と相関係数(r_{xy})の関係 2次元のデータ((x_1,y_1),(x_2,y_2),cdots,(x_n,y_n))が与えられた場合、 変数(x)と(y)の相関係数(r_{xy})は、それぞれの標準偏差(S_x,S_y)と、共分散(C_{xy})を使って以下となる。 begin{eqnarray} r_{xy} &=& frac{C_{xy}}{S_x S_y} \\ &=& frac{sum_{i=1}^n(x_i-bar{x})(y_i-bar{y})/n}{sqrt{sum_{i=1}^n{(x_i-bar{x})^2}/n} sqrt{sum_{i=1}^n{(y_i-bar{y})^2}/n}} \\ &=& frac{sum_{i=1}^n(x_i-bar{x})(y_i-bar{y})}{sqrt{sum_{i=1}^n{(x_i-bar{x})^2}} sqrt{sum_{i=1}^n{(y_i-bar{y})^2}}} \\ end{eqnarray} 幾何学的な意味 共分散の分母は常に正なので、符号は分子による。 つまり、(x_i-bar{x} ge 0)かつ(y_i-bar{y} ge 0)の場合か (x_i-bar{x} le 0)かつ(y_i-bar{y} le 0)の場合に(r_{xy} ge 0) (x_i-bar{x} ge 0)かつ(y_i-bar{y} le 0)の場合か (x_i-bar{x} le 0)かつ(y_i-bar{y} ge 0)の場合に(r_{xy} le 0) (r_{xy} ge 0)であるデータが(r_{xy} le 0)であるデータよりも多ければ(r_{xy})は正の方向に大きくなる。 逆に(r_{xy} ge 0)であるデータが(r_{xy} le 0)であるデータよりも少なければ(r_{xy})は負の方向に大きくなる。 (r_{xy} ge 0)であるデータと(r_{xy} le 0)であるデータが拮抗すると(r_{xy})は0に近づく。 (y_i = frac{S_y}{S_x}(x_i-bar{x})+bar{y})のとき、 すなわち(y_i = frac{S_y}{S_x}x_i + bar{y}-bar{x}frac{S_y}{S_x})という直線に全てのデータが乗っているとき、 (r_{xy}=+ 1)となる。(x_i)が増加すれば(y_i)が増加するデータ。正の完全相関。 逆に(y_i = -frac{S_y}{S_x}(x_i-bar{x})+bar{y})のとき、 すなわち(y_i = -frac{S_y}{S_x}x_i-bar{y}+bar{x}frac{S_y}{S_x} )という直線に全てのデータが乗っているとき、 (r_{xy}=- 1)となる。(x_i)が増加すれば(y_i)が減少するデータ。負の完全相関。 相関係数(r_{xy})が(-1 le r_{xy} le 1)を満たすことの証明 一般正規分布を標準正規分布にする際の変換で出てきたように、 平均が0、標準偏差が1の分布に変換する。 変換後の分布(z_i,w_i)はそれぞれを下記の通り。 begin{eqnarray} z_i = frac{x_i-bar{x}}{S_x} \\ w_i = frac{y_y-bar{y}}{S_y} end{eqnarray} これらの分布を使って相関係数(r_{xy})を書き直すと以下のようになって、 (z_i)、(w_i)の共分散と等しいことがわかる。 begin{eqnarray} r_{xy} &=& frac{1}{n}sum_{i=1}^n z_i w_i \\ &=& frac{1}{n}sum_{i=1}^n (z_i-bar{z}) (w_i-bar{w}) \\ &=& C_{zw} end{eqnarray} 相関係数(r_{xy})が(-1 le r_{xy} le 1)を満たすことの証明は以下のようにやる様子。 begin{eqnarray} frac{1}{n} sum_{i=1}^n (z_i pm w_i)^2 &=& frac{1}{n} sum_{i=1}^n (z_i^2 pm 2z_i w_i + w_i^2) \\ &=& frac{1}{n} sum_{i=1}^n z_i^2 pm frac{2}{n} sum_{i=1}^n z_iw_i + frac{1}{n} sum_{i=1}^nw_i^2 end{eqnarray} 標準化された分布(z_i)、(w_i)について以下が成り立つ。 begin{eqnarray} frac{1}{n}sum_{i=1}^n z_i^2 &=& 1 \\ frac{1}{n}sum_{i=1}^n w_i^2 &=& 1 end{eqnarray} なので、 begin{eqnarray} frac{1}{n} sum_{i=1}^n (z_i pm w_i)^2 &=& 1 pm 2r_{xy} + 1 \\ &=& 2(1 pm r_{xy}) end{eqnarray} 左辺は常に正なので、( 1 pm r_{xy} ge 0 )が言える。 つまり、(-1 le r_{xy} le 1 ) が言える。
Excelでカイ二乗分布曲線を描く
[mathjax] Excelは統計関数が充実している 一緒にPythonとRを習得した方が良いのだろうけど、Excelでも結構やれるらしいので、 Excelでカイ二乗分布曲線を描いてみる。 やり方 カイ二乗分布の確率密度関数は以下の通り。 begin{eqnarray} f_n(x) = frac{1}{2^{frac{n}{2}}Gamma({frac{n}{2}})}x^{frac{n}{2}-1}e^{-frac{x}{2}} end{eqnarray} Excelには確率密度関数と累積分布関数を取得する関数が標準で備わっている。 CHISQ.DIST((x),(n),関数形式) 関数形式がTRUEの場合は累積分布関数、 FALSEの場合は確率密度関数。 (x)と(n)の2変数関数なので、行,列をそれぞれに割り当ててクロスするところが値。 自由度=1のとき(x=0)で無限大に発散するのに注意が必要。 (0 lt x lt 1)の区間で形が変わるのでそれも注意が必要。 確率密度関数のグラフをプロットすると以下のようになる。 累積分布関数のグラフは以下。 確率密度関数の積分グラフですかね。 自由度=3のときの確率密度関数のグラフと累積分布関数のグラフを並べてみる。 (x=7.5)くらいに確率密度関数の値が(0.025)くらいになる。 (x lt 7.5)の面積が(0.975)くらい、または(x gt 7.5)の面積が(0.025)くらい。 つまり、(int_{0}^{7.5}f_3(x) = 0.975)くらいで、(int_{7.5}^{infty}f_3(x) = 0.025)という意味。 (x=7.5)くらいのとき累積分布関数の値が(0.975)くらいになる。 標準正規分布に従う3個の変数の二乗和の97.5%は7.5より小さい。