見出し画像

【擬似言語④裏】加重平均 | 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は全て無料提供を続けます▼ もしご覧になったNoteが有益だったり、私の志に共感されたりしましたら、サポート頂けますと励みになります▼ もちろんコメントでも結構です(・ω・▼)ノシ

この記事が参加している募集