C 言語でデータセットの最頻値を求める方法

CBeginner
オンラインで実践に進む

はじめに

この実験では、C 言語でデータセットの最頻値を求める方法を学びます。この実験は、以下のステップで構成されています。

数値の配列の読み込み:データセットの最頻値を求める最初の重要なステップである、C 言語で数値の配列を読み込む方法を学びます。このプログラムは、一連の数値を入力を受け付け、度数分析の準備を行います。

度数を求めて最も出現頻度の高い値を見つける:前のプログラムを修正して、配列内の各数値の度数を数え、最も出現頻度の高い値(最頻値)を特定します。

最頻値を出力する:最後に、データセットで最も頻繁に出現する値である最頻値を出力します。

数値の配列の読み込み

このステップでは、データセットの最頻値を求める最初の重要なステップである、C 言語で数値の配列を読み込む方法を学びます。一連の数値を入力を受け付け、度数分析の準備を行う C プログラムを作成します。

まず、最頻値計算プログラム用の新しい C ファイルを作成しましょう。

cd ~/project
nano mode_calculation.c

次に、ファイルに以下のコードを追加します。

#include <stdio.h>

#define MAX_SIZE 100

int main() {
    int numbers[MAX_SIZE];
    int n, i;

    // 要素数を入力
    printf("要素数を入力してください (最大 %d): ", MAX_SIZE);
    scanf("%d", &n);

    // 配列要素を入力
    printf("%d個の整数を入力してください:\n", n);
    for (i = 0; i < n; i++) {
        scanf("%d", &numbers[i]);
    }

    // 入力された配列を出力して、入力が正しく取得されたことを確認
    printf("入力された配列:");
    for (i = 0; i < n; i++) {
        printf("%d ", numbers[i]);
    }
    printf("\n");

    return 0;
}

プログラムをコンパイルして実行します。

gcc mode_calculation.c -o mode_calculation
./mode_calculation

出力例:

要素数を入力してください (最大 100): 5
5個の整数を入力してください:
3 4 2 4 1
入力された配列: 3 4 2 4 1

このコードの重要な部分を分解してみましょう。

  1. #define MAX_SIZE 100 は、オーバーフローを防ぐために配列の最大サイズを制限します。
  2. scanf() は、要素数と配列の値を入力するために使用されます。
  3. 入力された配列を出力して、入力が正しく取得されたことを確認しています。

このコードは、C 言語における基本的な配列入力を実証しています。これは、最頻値計算プロセスにとって不可欠です。次のステップでは、度数を数え、最頻値を決定するために、このコードを拡張していきます。

度数を求めて最も出現頻度の高い値を見つける

このステップでは、前のプログラムを修正して、配列内の各数値の度数を数え、最も出現頻度の高い値(最頻値)を特定します。

既存のファイルを開いてコードを更新します。

cd ~/project
nano mode_calculation.c

前のコードを以下の実装に置き換えます。

#include <stdio.h>

#define MAX_SIZE 100

int main() {
    int numbers[MAX_SIZE];
    int frequencies[MAX_SIZE] = {0};
    int n, i, j, mode = 0, max_frequency = 0;

    // 要素数を入力
    printf("要素数を入力してください (最大 %d): ", MAX_SIZE);
    scanf("%d", &n);

    // 配列要素を入力
    printf("%d個の整数を入力してください:\n", n);
    for (i = 0; i < n; i++) {
        scanf("%d", &numbers[i]);
    }

    // 各数値の度数をカウント
    for (i = 0; i < n; i++) {
        int count = 1;
        for (j = 0; j < n; j++) {
            if (i != j && numbers[i] == numbers[j]) {
                count++;
            }
        }
        frequencies[i] = count;

        // 最頻値を追跡
        if (count > max_frequency) {
            max_frequency = count;
            mode = numbers[i];
        }
    }

    // 度数を出力
    printf("\n度数:\n");
    for (i = 0; i < n; i++) {
        printf("数値 %d は %d 回出現\n", numbers[i], frequencies[i]);
    }

    // 最頻値を出力
    printf("\n最頻値:%d (出現回数 %d 回)\n", mode, max_frequency);

    return 0;
}

プログラムをコンパイルして実行します。

gcc mode_calculation.c -o mode_calculation
./mode_calculation

出力例:

要素数を入力してください (最大 100): 6
6個の整数を入力してください:
2 3 4 2 2 5

度数:
数値 2 は 3 回出現
数値 3 は 1 回出現
数値 4 は 1 回出現
数値 2 は 3 回出現
数値 2 は 3 回出現
数値 5 は 1 回出現

最頻値: 2 (出現回数 3 回)

この実装における重要な点:

  1. 各数値の出現回数を格納するためのfrequencies配列を作成します。
  2. ネストされたループで、各数値の出現回数をカウントします。
  3. 最大出現回数を追跡することで、最頻値を追跡します。
  4. プログラムは、最頻値が 1 つだけのケースも処理します。

最頻値を出力する

この最終ステップでは、複数の最頻値を処理し、より包括的な統計情報を提供するように、最頻値計算プログラムを拡張します。

既存のファイルを開いてコードを更新します。

cd ~/project
nano mode_calculation.c

前のコードを以下の実装に置き換えます。

#include <stdio.h>

#define MAX_SIZE 100

int main() {
    int numbers[MAX_SIZE];
    int frequencies[MAX_SIZE] = {0};
    int unique_numbers[MAX_SIZE];
    int n, i, j, unique_count = 0, max_frequency = 0;

    // 要素数を入力
    printf("要素数を入力してください (最大 %d): ", MAX_SIZE);
    scanf("%d", &n);

    // 配列要素を入力
    printf("%d個の整数を入力してください:\n", n);
    for (i = 0; i < n; i++) {
        scanf("%d", &numbers[i]);
    }

    // 唯一の数字とその度数を発見する
    for (i = 0; i < n; i++) {
        int is_unique = 1;
        for (j = 0; j < unique_count; j++) {
            if (numbers[i] == unique_numbers[j]) {
                is_unique = 0;
                break;
            }
        }

        if (is_unique) {
            unique_numbers[unique_count] = numbers[i];

            // このユニークな数字の度数をカウント
            int count = 0;
            for (j = 0; j < n; j++) {
                if (numbers[i] == numbers[j]) {
                    count++;
                }
            }
            frequencies[unique_count] = count;

            // 最大度数を更新
            if (count > max_frequency) {
                max_frequency = count;
            }

            unique_count++;
        }
    }

    // 詳細な最頻値情報を表示
    printf("\n統計分析:\n");
    printf("合計数値:%d\n", n);
    printf("ユニークな数値:%d\n", unique_count);

    printf("\n度数分布:\n");
    for (i = 0; i < unique_count; i++) {
        printf("数値 %d: %d 回出現\n",
               unique_numbers[i], frequencies[i]);
    }

    // 最頻値を表示
    printf("\n最頻値:\n");
    for (i = 0; i < unique_count; i++) {
        if (frequencies[i] == max_frequency) {
            printf("- %d (出現回数 %d 回)\n",
                   unique_numbers[i], frequencies[i]);
        }
    }

    return 0;
}

プログラムをコンパイルして実行します。

gcc mode_calculation.c -o mode_calculation
./mode_calculation

出力例:

要素数を入力してください (最大 100): 7
7個の整数を入力してください:
2 3 4 2 2 5 5

統計分析:
合計数値: 7
ユニークな数値: 4

度数分布:
数値 2: 3 回出現
数値 3: 1 回出現
数値 4: 1 回出現
数値 5: 2 回出現

最頻値:
- 2 (出現回数 3 回)

このバージョンの主な改善点:

  1. 複数の最頻値が存在する場合も処理します。
  2. 包括的な統計概要を提供します。
  3. データセット内のユニークな数値を特定します。
  4. 度数分布を表示します。

まとめ

この実験では、C 言語で数値の配列を読み込み、各数値の出現頻度を数えて、データセットの中で最も出現頻度の高い値である最頻値を決定する方法を学びます。最初に、一連の数値を入力を受け付け、頻度分析の準備をする C プログラムを作成します。次に、各数値の出現頻度を数え、最頻値を特定するようにプログラムを修正します。最後に、最頻値をコンソールに出力します。

完了したステップから得られる主な学習点は次のとおりです。

  1. scanf() 関数を使用して C 言語で数値の配列を読み込む方法。
  2. 入力内容を確認するために、入力された配列を出力する方法。
  3. 配列内の各数値の出現頻度を数えて、最も出現頻度の高い値(最頻値)を見つける方法。