【擬似言語④裏】加重平均 | 2つの配列で計算(基本情報技術者, 科目B, アルゴリズム)
このNoteでは、>前回の平均値Note を流用して加重平均の計算をテーマにします。
FE科目Bでは、数式を提示した擬似言語化、配列を組み合わせた計算が出るので、良い題材かなと。
加重平均は科目Aにも出てますからね。
>【FEA】表は×て+すNote
>【AP計算㉛】加重平均のNote
数学的には確率と期待値にも繋がる考えなんですよ。
テキストの基礎を生かして、プログラム的な考察/工夫を学んでいきます。基礎と実用にギャップを感じる方のために作りました。
>【FEB】擬似言語の教科書Note
ぜひ一緒に学習を進めていきましょう!
このNoteは、私がIT専門学校で授業したことを基に作成しています。IT専門学校でFEは第一目標として、カリキュラムが構築されています。何も知らずに入学しても、1年生10月にはFE合格していきますよ。実績ある教育ノウハウを詰め込んだので、少しでも信頼して頂けたら嬉しいです。
>全Noteへのリンク(FE節)
※科目Aのテーマ別/科目B/旧FE午後など沢山作りました!
平均 = 合計 ÷ 個数 は微妙に違う
>【AP計算㉛】加重平均のNote の講座部分を抜粋します。
10, 40, 40の平均って下式で計算しますよね。
$$
\frac{10+40+40}{3}
$$
分母が「個数」って解釈は、実用上は問題ないけど、ちょっと違います。
平均のほんとうの解釈
$$
\frac{10+40+40}{3}\\
=\frac{1×10+1×40+1×40}{1+1+1}
$$
分子の「1×」が「重み」。分母は個数ではなく「重みの合計」。これが「加重平均」。
私たちが普段使っていた「平均」は「全データの重みを1にした加重平均」と解釈できます。
平均の関数 → 加重平均の関数
>前回の平均値Note の擬似言語をおさらい。
データは、引数の配列dataで受け取るとします。
〇calcAveArray(整数型の配列: data)
整数型: sum ← 0
整数型: i
実数型: average
for (i を 1 から dataの要素数 まで 1 ずつ増やす)
sum ← sum + data[i]
endfor
average ← sum / data0要素数
average を表示する$$
平均 = データの合計 / データの個数
$$
「合計」や「データの個数」を、変更するのが今回のテーマ。
$$
加重平均 = "各データの重み×各データ"の合計 / ”各データの重み”の合計
$$
各データの重みを、引数の配列weightsで受けます。data[1]への重みはweights[1]、data[2]へはweights[2]を掛け算します。
○calcWeightedAveArray(整数型の配列: data, 実数型の配列: weights)
実数型: weightedSum ← 0 // 「重み×データ」の合計
実数型: weightTotal ← 0 // 「重み」の合計
整数型: i
実数型: weightedAverage
/ data と weights の要素数は同じである前提 */
for (i を 1 から dataの要素数 まで 1 ずつ増やす)
/ 「重み × データ」の合計 */
weightedSum ← weightedSum + (weights[i] × data[i])
/ 「重み」の合計 */
weightTotal ← weightTotal + weights[i]
endfor
/ 「重み×データ の合計」を「重み の合計」で割る */
weightedAverage ← weightedSum / weightTotal
weightedAverage を表示する分子は”data[]×weight[]”の合計してweightedSumへ。分母は"weight[]"の合計してweightTotalへ。最後に分子÷分母でガッチャンコします。
合計の手順は同じ。0で初期化して、for文で自己更新(x ← x+1)。分子はdata×weightを配列でやってるのがチョイムズなだけ。>【擬似言語③】合計 | 自己更新式と初期値のNote
ちょいちょい小話
weightedAverageは、最後にしか使わないので、weightedSumを上書きして良いなら使っても構いません。でも最近のPCはメモリ一杯あるし、コードが分かりにくくなるなら、ケチらなくても良いかな。
weightedSum ← weightedSum / weightTotal
weightedSum を表示する表示やreturnに直接数式を書いても構いません。計算されてから表示/returnされるので。
(weightedSum / weightTotal) を表示する引数チェックもしますか。>【擬似言語②】ジャンケンのNote(引数)
割り算があるので、もし分母=0になったら計算エラー「0除算」が出ます。分母=0を検知して「ダメだよ」と弾きます。
配列data[], weight[]の要素数が0はダメ。
配列data[], weight[]の要素数が違うとダメ。
weight[]の合計が0じゃダメ。
0, 負の値を弾いた方が良いかも。
以上を検査するモジュールを関数最初に組み込むと良いでしょう。
weight[]の合計は、最後の分子分母ガッチャンコ手前ですが。weightの0や負値を弾くのは関数最初にチェックできます。0や負値でなければ、合計が0になり得ないのでOK。
まとめ
お疲れ様でした!
学習、数学もプログラムも「割り切り」が大事な場面もあります。原理原則を追うのも大事ですが(私は大好きです)。深追いすると返って「何もできない」状態になることも。
加重平均、分散/標準偏差/偏差値って慣れないですよね。日常生活でパッと体感しにくい。「数学/統計って数値的なもの」と割り切って頂ければと思います。
少なくともFEの「擬似言語を組む」に、数学/統計的な理解は試されません。試されてるのは「与えられた数式を、正しく擬似言語(プログラム)に翻訳できるか」ってスキルです。
「まずは手計算通りの結果が出せるプログラムが組めれば100点!」と割り切って挑戦してみて下さい。でもそのうち「統計ってこういうことか!」という面白さに気づいてもらえたら、教える側としては最高に嬉しいです。
少しずつ自分のペースで頑張っていきましょう。応援しています!
課題。分散を計算する関数「〇実数型: calcVarianceArray(整数型の配列: data)」を作って下さい。平均を計算する関数「〇実数型: calcAveArray(整数型の配列: data) 」を使って構いません。分散の数式は調べてください(wikipedia)。>答えのNote(準備中*)
こんな感じで、基礎を生かして実例で擬似言語を作って、さらにプログラム的な考察や工夫を深めていきたくて、理解シリーズを作ってます。>【FEB】擬似言語の教科書Note
最後に私のお薦めの演習順番。
❶学習前の”分からせ”
>【FEB】サンプル問題2のNote
❷テキスト
>【FEB】擬似言語の教科書Note
>【FEB】擬似言語の理解演習Note ←いまこの辺
↓※必要なら
うかる! 基本情報技術者 [科目B・セキュリティ編](amazon)
うかる! 基本情報技術者 [科目B・アルゴリズム編](amazon)
❸各年度の公開問題
>【FEB】令和07年科目BのNote
>【FEB】令和06年科目BのNote
>【FEB】令和05年科目BのNote
➍解法の総復習(➋や➌と併用可)
>【FEB】擬似言語の11の解法Note
➎模擬試験
>【FEB】サンプル問題1のNote(擬似言語)
>【FEB】サンプル問題1のNote(セキュリティ)
いいなと思ったら応援しよう!
学習方法・問題特集のNoteは全て無料提供を続けます▼
もしご覧になったNoteが有益だったり、私の志に共感されたりしましたら、サポート頂けますと励みになります▼
もちろんコメントでも結構です(・ω・▼)ノシ