Confidence interval for a proportion を計算するゾ !

 「Confidence interval for a proportion」としましたが、「母比率の信頼区間推定」のことです。タイトルだけは大袈裟。

標本調査の結果、

  •   標本全数 n = 800
  •   その内の、ある性質を具備する要素数 r = 550

が得られたとして、

  全数に占める、ある性質を具備する要素の割合が、どの程度なのか ?

を推測するのが、母比率の信頼区間推定であります。
信頼区間推計 App には、いくつか機能が用意されております。

標本調査では、標本比率 p = r/n = 0.687500 が得られますが、これは標本調査の結果でありますから、全数検査の結果としての「母比率」が、同じ値になるとは限りませんで、母比率と標本比率の間には、ある程度の範囲でブレがあるだろうと。
このブレを推測するのが、信頼区間推計の目的でありました。

背景には、高度な計算の理屈があるそうですが、信頼区間推計 App では、計算作業を簡単に行える様になっており、

  •   標本全体数 n = 800
  •   ある性質を具備する要素数 r = 550
  •   信頼区間レベル  c

の入力で、計算してくれます。
なお、信頼区間レベル  c の値は、この範囲に収まっているだろうという「確率」を指定する事になっており、
よく使われる値としては、c = 0.95 (95%) や 0.99 (99%) があるそうです。

c = 0.95 として、fx-CG50 などで計算すると、

0.65538081 〜 0.71961918

という結果が得られます。
これは、確度 0.95 で、母比率が 0.65538081 〜 0.71961918 の間にある、という具合です。

この計算式については、マニュアルに掲載されている場合があります。

Numworksのconfidence intervalに関連して

余計なことなれど、最近のNumworks 電卓では、confidence interval の計算機能がAppsの形で利用できるとの事。

ref. User manual
https://www.numworks.com/manual/

8.1.2  Intervals

This section is used to construct confidence intervals. The following types of intervals
are available:
(この項では、信頼区間推定について述べる。以下の形式について利用可能)

• z-interval for a proportion or the difference of two proportions
  (Z 検定による、比率、乃至2比率の差の信頼区間推定)
• t-interval or z-interval for a mean or the difference of two means
  (t,Z 検定による、平均値、乃至2平均値の差の信頼区間推定)
• t-interval for a slope
  (t 検定による、勾配の信頼区間推定)

という感じらしい。Appsになって高機能になった様ですが、以前のNumworks OS には、ここまで高度な機能はなく、次の様な計算APIが用意されているに過ぎませんでした。

  • - confidence(f,n)

  95% confidence interval. confidence(f,n) returns [ f − 1/√n ; f + 1/√n ] .
  (95% の信頼区間による母比率。 confidence(f,n) は [ f − 1/√n ; f + 1/√n ] を計算する)

95%の信頼区間とは言っているものの、実にオソマツなAPIです。こんなんでいいのか ? と思いましたが、計算式自体は、つぎの裏付けがあると。

ref. When does one use 1/√n and when does one use 1.96 √(p(1−p)/n) ?
https://stats.stackexchange.com/questions/264779/when-does-one-use-frac1-sqrtn-and-when-does-one-use-1-96-sqrt-fracp

母比率 (< 1.0)の95%信頼区間推定では、どちらの式を使っても大きく逸脱することはないから、というのが理由らしい。

昔のNumworks OSでは、こんな具合でしたが、今日では、(N0110, N0120) などの大容量製品が登場した事もあり、OS を大きく更新、信頼区間推定もAppにして、高機能化するに至った様であります。

斯様に、Appsによって信頼区間推計などの機能を提供するのが、学習用途電卓では当たり前となっている。
昔の電卓、TI-83+ とかでは、BASIC APIも実装されていたので、計算機能をBASIC プログラムで利用する事が出来ましたネ。
ほぼ同様の機能があるfx-CG50 では、残念ながら BASIC APIとしては実装されておりませんでした。
しかし、信頼区間推定はないものの、分布や検定の計算APIは用意されております。
推測統計Appsにて、入力したデータをリスト形式にて保持し、それをプログラムにて処理するという目的があったので、
BASICプログラムAPIとして、これらの機能が充実して行ったのだと思います。

こうしたグラフ電卓の状況に、颯爽と登場したのが、uPython使用のNumworksでした。
試みとしては素晴らしいものではありましたが、uPython と グラフAppsが乖離してしまうという結果になってしまった。
そこは、グラフApps, 統計計算Appsと、uPython が行き来できると、機能的にはかなりのものが期待できるのですが、それをやってしまうと、計算演習とuPythonプログラム演習という部分で、学習のための制限を掛けるのが難しくなるからなのでしょうか ?

今般、おフランスで発売が予告されている CASIO GRAPH Math+ は、UIの大幅な更新と、uPython が機能強化されているのですが、Trade-Offで BASIC-like programming 機能が削除されるらしい。
この事で、Numworksと同じ轍 (=計算Appsとプログラミング機能相互流通の廃止) を踏んだりしないのか ? というのが、目下の興味ではあります。

母比率の信頼区間推定を、どうする ?

Numworks では、推測統計Appsが高機能化しているので、大抵は、これらを利用すれば用は足りるのではありますが、「統計計算を(upython)プログラムで実行できないか ?」という単純に興味から、少し考えてみました。
但し、ここで取り上げるのは「母比率の信頼区間推定」だけであります。

計算式をみると判りますが、母比率の信頼区間推定を行うには、正規分布の累積度数関数の逆関数 (invert of cummulative normal distribution function ) があればよい様です。
fx-CG50 では、InvNormCD() がBASIC APIとして用意されているので、ので、BASICでプログラムを作成することができます。
所が、uPythonには、正規分布の累積度数関数の逆関数(以降、長ったらしいので、inv_normcdf() としておきます)が用意されていないという重大な問題点がありますネ。こうした利用頻度の少ないカンスーは、python でも SciPy module を使用する必要があります。
uPython に、SciPy moduleのsubset があればいいのですが、ここまで機能を拡充するのは、教育市場向け、EXAMモード必須の電卓製品で期待できるのか ? という疑問があります。

inv_normcdf() を用意できればいいので、normCDF()と newton solverで、書き出す事にしました。
本来ならば、normCDF() は、normPDF() を積分する必要があるのですが、意外や意外、math.erf() が、normcdf() の代替として使えるのですネ。

最終的に、こんなコードを用意しました。


import math
#from scipy.stats import norm

#  inv_normcdf() with newton-raphson solvre
def  inv_normcdf(y) :
  iter = 20
  eps = 0.000001
  cnt = 0
  x0 = 0.01
  while abs((math.erf(x0)-y)) > abs(eps) and cnt < iter:
    diff = math.erf(x0+eps) - math.erf(x0)
    if diff == 0 :
       print('cannot solve')
       exit(1)
    x0 = x0 - eps*(math.erf(x0)-y)/diff
    cnt += 1
  if cnt >= iter:
    print('abandoned in loop limit')
    return 0
  return  x0*math.sqrt(2)


def one_pred_z_int(c, r, n) :
  p = r/n
#  d = norm.ppf(c/2+0.5)*math.sqrt((p*(1-p))/n)
  d = inv_normcdf(c)*math.sqrt((p*(1-p))/n)
  return [ p-d, p+d ]

使い方としては、
one_pred_z_int(c, r, n)
の様に入力するのですが、ここで、
  • 信頼区間レベル  c
  • ある性質を具備する要素数 r
  • 標本全体数 n
の順にパラメタを書いておきます。
先程の例、
  •  標本全体数 n = 800
  •  ある性質を具備する要素数 r = 550
  •  信頼区間レベル  c = 0.95
を計算すると、
>>> one_pred_z_int(0.95, 550, 800)
[0.6553808192372789, 0.7196191807627211]
という結果が得られます。途中で計算を打ち切っているので、余り正確な値にはなりませんが、実用にはなると思います。

しかし、「こうした機能をプログラムで使うのか ? 」という疑問はあります。
実際、Numworksでは、推計App (Intervals) で、計算の機能は提供できております。
その辺りは、これからのグラフ電卓ユーザーが考える事、としておきましょう。

因みに、CASIO fx-CG50 の uPython には、 math.erf() が用意されていないので、上記のコードは動かないのでありました。ショボーン ... 。


コメント

このブログの人気の投稿

マニング公式の計算

名称、アドレス変更