メインコンテンツへスキップ
見出し画像

【擬似言語④裏】加重平均 | 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の平均って下式で計算しますよね。

    10+40+403\frac{10+40+40}{3}

    分母が「個数」って解釈は、実用上は問題ないけど、ちょっと違います。

    平均のほんとうの解釈

    10+40+403=1×10+1×40+1×401+1+1\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。 学生時代にITパスポート試験・基本情報技術者試験・応用情報技術者試験を独学で高得点合格。情報処理安全確保支援士試験(セキスペ)・データベーススペシャリスト試験・ネットワークスペシャリスト試験・G検定なども取得。 2027年にPD-S受験予定。