サンプル・プログラムの実行例
本プログラムで信頼区間95%としたときの標本誤差を計算すると、51.4~57.2% となり、朝日新聞の標本誤差と重ならない。標本は母集団(有権者数)を代表しているものであるから、標本誤差の範囲は重ならなければいけない。
つまり、朝日新聞とJNNの世論調査のいずれか、または双方において、下記の事態が発生していると推測できる。
- 信頼区間外(5%の確率)で、たまたま違う調査結果となった。
- 標本が無作為抽出になっていない。
- 有効回答にバイアスがかかっている。
時間がある方は、両社の過去の内閣支持率の標本誤差を計算してみてほしい。ほぼ毎回のように重ならないだろう。
ここからは個人的観測になるが、1の可能性は棄却できるだろう。かりにも大手マスコミによる世論調査だから、2ということはあるまい。となると、3の可能性が残る――電話による世論調査で、「朝日新聞です」と名乗った場合と、「JNNです」と名乗った場合では、回答を拒否する層が異なるのではないだろうか。
サンプル・プログラムのダウンロード
SamplingError.php | サンプル・プログラム本体 |
全数調査と標本調査
ここで、調査の範囲を市町村、都道府県、全国と広げていった場合、どうなるだろう。健診の時期が異なっていたり、健診そのものが行われていなかったりと、全数調査を行うには莫大の費用と時間がかかるだろう。
そこで、母集団から一部の人を抽出して、その身長の平均値を計算する標本調査を行い、母集団の平均身長を推測する。
抽出された標本が母集団の性質を反映するためには、無作為抽出法が用いられる。無作為抽出法にはいくつかの手段があるが、詳しくは「標本の抽出方法」(統計WEB)をご覧いただきたい。
標本誤差
\[ \displaystyle ta(m,x) \quad \times \quad \sqrt{\frac{N-n}{N-1} \quad \times \quad \frac{p(1-p)}{n}} \]
ここで \( ta(m,x) \)‥‥t分布の確率密度関数.\( n \)‥‥自由度,\( x \)‥‥確率変数
\( N \)‥‥母集団の数
\(n \)‥‥標本の数
\( p \)‥‥調査結果
標本誤差によって、調査結果は範囲のある数字となる。これを区間推定と呼ぶ
信頼区間
標本誤差を求める際に用いたt分布の確率密度関数 \( ta(m,x) \) において、m:自由度は標本数を、x:確率変数は信頼区間をあらわす。
解説:t分布の確率密度
自由度と確率変数が合致しない場合、計算を簡単にするため、補間せず、次の確率密度を返すようにしている。実用上差し支えないだろう。
184: /**
185: * t分布の確率密度関数
186: * @param float $m 自由度
187: * @param float $x 確率変数
188: * @return float 確率密度/FALSE:引数が不正
189: */
190: function dens_t($m, $x) {
191: //t分布表
192: static $table_pa = array(0.25, 0.1, 0.05, 0.025, 0.01, 0.005);
193: //自由度/片側確率 0.25 0.1 0.05 0.025 0.01 0.005
194: static $table_ta = array(
195: 1 => array(1.000, 3.078, 6.314, 12.706, 31.821, 63.657),
196: 2 => array(0.816, 1.886, 2.920, 4.303, 6.965, 9.925),
197: 3 => array(0.765, 1.638, 2.353, 3.182, 4.541, 5.841),
198: 4 => array(0.741, 1.533, 2.132, 2.776, 3.747, 4.604),
199: 5 => array(0.727, 1.476, 2.015, 2.571, 3.365, 4.032),
200: 6 => array(0.718, 1.440, 1.943, 2.447, 3.143, 3.707),
201: 7 => array(0.711, 1.415, 1.895, 2.365, 2.998, 3.499),
202: 8 => array(0.706, 1.397, 1.860, 2.306, 2.896, 3.355),
203: 9 => array(0.703, 1.383, 1.833, 2.262, 2.821, 3.250),
204: 10 => array(0.700, 1.372, 1.812, 2.228, 2.764, 3.169),
205: 11 => array(0.697, 1.363, 1.796, 2.201, 2.718, 3.106),
206: 12 => array(0.695, 1.356, 1.782, 2.179, 2.681, 3.055),
207: 13 => array(0.694, 1.350, 1.771, 2.160, 2.650, 3.012),
208: 14 => array(0.692, 1.345, 1.761, 2.145, 2.624, 2.977),
209: 15 => array(0.691, 1.341, 1.753, 2.131, 2.602, 2.947),
210: 16 => array(0.690, 1.337, 1.746, 2.120, 2.583, 2.921),
211: 17 => array(0.689, 1.333, 1.740, 2.110, 2.567, 2.898),
212: 18 => array(0.688, 1.330, 1.734, 2.101, 2.552, 2.878),
213: 19 => array(0.688, 1.328, 1.729, 2.093, 2.539, 2.861),
214: 20 => array(0.687, 1.325, 1.725, 2.086, 2.528, 2.845),
215: 21 => array(0.686, 1.323, 1.721, 2.080, 2.518, 2.831),
216: 22 => array(0.686, 1.321, 1.717, 2.074, 2.508, 2.819),
217: 23 => array(0.685, 1.319, 1.714, 2.069, 2.500, 2.807),
218: 24 => array(0.685, 1.318, 1.711, 2.064, 2.492, 2.797),
219: 25 => array(0.684, 1.316, 1.708, 2.060, 2.485, 2.787),
220: 26 => array(0.684, 1.315, 1.706, 2.056, 2.479, 2.779),
221: 27 => array(0.684, 1.314, 1.703, 2.052, 2.473, 2.771),
222: 28 => array(0.683, 1.313, 1.701, 2.048, 2.467, 2.763),
223: 29 => array(0.683, 1.311, 1.699, 2.045, 2.462, 2.756),
224: 30 => array(0.683, 1.310, 1.697, 2.042, 2.457, 2.750),
225: 31 => array(0.682, 1.309, 1.696, 2.040, 2.453, 2.744),
226: 32 => array(0.682, 1.309, 1.694, 2.037, 2.449, 2.738),
227: 33 => array(0.682, 1.308, 1.692, 2.035, 2.445, 2.733),
228: 34 => array(0.682, 1.307, 1.691, 2.032, 2.441, 2.728),
229: 35 => array(0.682, 1.306, 1.690, 2.030, 2.438, 2.724),
230: 36 => array(0.681, 1.306, 1.688, 2.028, 2.434, 2.719),
231: 37 => array(0.681, 1.305, 1.687, 2.026, 2.431, 2.715),
232: 38 => array(0.681, 1.304, 1.686, 2.024, 2.429, 2.712),
233: 39 => array(0.681, 1.304, 1.685, 2.023, 2.426, 2.708),
234: 40 => array(0.681, 1.303, 1.684, 2.021, 2.423, 2.704),
235: 41 => array(0.681, 1.303, 1.683, 2.020, 2.421, 2.701),
236: 42 => array(0.680, 1.302, 1.682, 2.018, 2.418, 2.698),
237: 43 => array(0.680, 1.302, 1.681, 2.017, 2.416, 2.695),
238: 44 => array(0.680, 1.301, 1.680, 2.015, 2.414, 2.692),
239: 45 => array(0.680, 1.301, 1.679, 2.014, 2.412, 2.690),
240: 50 => array(0.679, 1.299, 1.676, 2.009, 2.403, 2.678),
241: 60 => array(0.679, 1.296, 1.671, 2.000, 2.390, 2.660),
242: 80 => array(0.678, 1.292, 1.664, 1.990, 2.374, 2.639),
243: 120 => array(0.677, 1.289, 1.658, 1.980, 2.358, 2.617),
244: 999 => array(0.674, 1.282, 1.645, 1.960, 2.326, 2.576) //m=∞
245: );
246:
247: //引数チェック
248: if ($m < 1) return FALSE;
249: if ($m > 999) $m = 999;
250: if ($x < 0) return FALSE;
251: if ($x > 0.5) return FALSE;
252: $x = $x / 2;
253: $res = FALSE;
254:
255: //t分布表の探索
256: foreach ($table_ta as $key=>$ta) {
257: $n = count($ta);
258: for ($i = 0; $i < $n; $i++) {
259: if ($x >= $table_pa[$i]) {
260: if ($m <= $key) return $ta[$i];
261: else break;
262: }
263: }
264: if ($m <= $key) return $ta[$i - 1];
265: }
266: return $res;
267: }
解説:標本誤差
269: /**
270: * 標本誤差
271: * @param int $n 母集団の数
272: * @param int $m 標本数
273: * @param float $p 調査結果(0.0≦$p≦1.0)
274: * @param float $x 確率変数
275: * @return float 標本誤差/FALSE:引数が不正
276: */
277: function sampling_error($n, $m, $p, $x) {
278: //エラーチェック
279: if ($n <= 0) return FALSE;
280: if ($m <= 0) return FALSE;
281: if (($p < 0) || ($p > 1)) return FALSE;
282:
283: $pt = dens_t($n, $x);
284: if ($pt == FALSE) return FALSE;
285:
286: return $pt * sqrt(($n - $m) / ($n - 1) * ($p * (1 - $p) / $m));
287: }
まず、引数が定義域内にあるかどうかチェックする。
つづいて、dens_t 関数でt分布の確率密度を求め、公式通りに標本誤差を計算する。
今回は、PHPを使って標本誤差を計算するプログラムを作ってみる。