計測工学基礎
2019.04.17
リンク先の資料を参考にしてください.
今日の演習作業が見えるのは,誤差に関する説明をして,その後すぐ!
値や個数は何でもいいので,適当にいくつかのセル(縦か横に1列に並んでいるものが良い)に数値を入れます.次に,それらのセルの最後のセルの次の位置に平均値を求める関数average()を入力して,先ほどの数の平均値を求めましょう.average()は単純な算術平均を求めるものです.
先ほどの数値のバラつき具合を見ます.バラつきの度合いは分散という量で示すことができます.関数ウイザードを見ると,分散にはいくつかの関数が用意されています.
データの中身が数値でなかった場合など細かいところもありますが,基本的には「不偏分散」か「分散」かの違いです.var()とvar.p()がどう違うのか,実際に値を求めてみて,授業資料にある定義(式(5)や式(7)を使うと実際に求められます)と絡めて考えてみましょう.
分散は次元が実際のデータの2乗となってしまうので,直接値を見ても感覚的にわかりづらいものがあります.そこで,分散の平方根を取って標準偏差とすることで値を考えやすくなります.ここでも,関数ウィザードで見るといくつかのタイプがありますが,分散と同じように考えることができます.stdev()とstdev.p()で何が違うのか,実際に値を求めてみて考えてみましょう.
先週行った作業で,乱数により0から9までの整数を100回,1000回,そして10000回発生させました.でた回数は当然トータルの回数が少ないほどばらついていました.そのバラつきについて,標準偏差を求めて比較して考えてみましょう.
データのばらつきは経験則として,真の値に近いほど標本の数が多いということが知られています.真の値から大きく外れるようなばらつきは個数としては少ないということです.また,真の値よりも大きな標本と小さな標本の個数もだいたい等しくなることが知られています.
そこで,二項分布によって,その傾向を確認しましょう.2項分布とは2つの状態のどちらかがランダムに出てくる場合に従う分布で (a + b)nの係数で表されます.
例えば,コイン10枚を投げた場合,表と裏が何枚かずつ出ます.5枚表になる場合が一番頻度が高くて,枚数が偏るほど頻度が少なくなりますが,無限回数投げると綺麗な左右対称系に分布してくるようになります.それを体験してみましょう.
今回はコイン10枚を100回投げる場合,1000回投げる場合,10000回,さらに10万回投げる場合の4通りをシミュレートしてみましょう.さすがにCalcの機能で行うのは大変なので,C言語のプログラムを使いましょう.
以下のソースを使うと,10回コインを投げて表が出た回数について0枚から10枚まで何回あったかを出してくれます.これを使って元データを作りましょう.
プログラムをコンパイルして実行すると,結果が画面に表示されるだけです.これをデータとして保存するために,コマンドラインでリダイレクトという機能を使います.作業は簡単です.
$ ./a.out > data.csv
とすると,data.csvという名前のCSV(comma separated value)ファイルができていますので,Calcでそれを開くと値を読みだすことができます.
バラつき具合をグラフで確認しましょう.グラフの形式は任意です.
次回も引き続き.「分散」や「標準偏差」などの統計量について学習します.今回の資料を参考に予習してください.
関数名 内容
VAR 不偏分散
VAR.P 分散
VAR.S 不偏分散
VARA 不偏分散
VARAP 分散
VARAPA 分散
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
int coin[11][5];
int times[4] = {100, 1000, 10000, 100000};
int i, j, k, count;
for(i=0; i<=10; i++)
{
coin[i][0] = i;
for(j=1; j<=4; j++)
{
coin[i][j] = 0;
}
}
for(i=0; i<=3; i++)
{
for(j=1; j<=times[i]; j++)
{
count = 0;
for(k=1; k<=10; k++)
{
count += rand() % 2;
}
coin[count][i+1]++;
}
}
printf("表の数, 100回, 1000回, 10000回, 100000回,\n");
for(i=0; i<=10; i++)
{
for(j=0; j<=4; j++)
{
printf("%d,", coin[i][j]);
}
printf("\n");
}
return 0;
}
S18の学生さんはまだ習っていない配列が出ているので,とりあえずは使うだけで構いません.
ところで, if 文が無いことにも注意してくださいね.
Back