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() が用意されていないので、上記のコードは動かないのでありました。ショボーン ... 。
コメント
コメントを投稿