C 言語で四分位範囲 (IQR) を計算する方法

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

はじめに

この実験では、C プログラミングで四分位範囲 (IQR) を計算する方法を学びます。この実験では、数値の配列を読み込み、ソートし、第 1 四分位数 (Q1) と第 3 四分位数 (Q3) の位置を見つけ、IQR を Q3 と Q1 の差として計算する手順をカバーします。この実験の終わりまでに、C を使用してこの統計分析を実行する方法をしっかりと理解しているでしょう。

配列の読み込みとソート

このステップでは、四分位範囲 (IQR) の計算の準備として、数値の配列を読み込み、それをソートする方法を学びます。このタスクは、C プログラミングを使用して実行します。

まず、IQR 計算のための C ソースファイルを作成しましょう。

cd ~/project
nano iqr_calculation.c

次に、配列を読み込み、ソートするための初期コードを書いてみましょう。

#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 100

// 整数を比較するための qsort 関数
int compare(const void *a, const void *b) {
    return (*(int*)a - *(int*)b);
}

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]);
    }

    // 配列をソート
    qsort(numbers, n, sizeof(int), compare);

    // ソート済み配列を出力
    printf("ソート済み配列:");
    for (i = 0; i < n; i++) {
        printf("%d ", numbers[i]);
    }
    printf("\n");

    return 0;
}

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

gcc -o iqr_calculation iqr_calculation.c

プログラムを実行し、例として入力してみましょう。

./iqr_calculation

出力例:

要素数を入力してください (最大 100): 6
6 個の整数を入力してください:
45 22 14 65 97 72
ソート済み配列: 14 22 45 65 72 97

コードを分解してみましょう。

  • 最大 100 個の要素を持つ配列サイズを定義しています。
  • compare() 関数は、qsort() によって整数値をソートするために使用されます。
  • ユーザー入力から要素数を読み込んでいます。
  • qsort() を使用して、配列を昇順にソートしています。
  • ソート済みの配列を出力しています。

Q1、Q3 の位置を求めて IQR = Q3 - Q1 を計算する

このステップでは、Q1 と Q3 の位置を求めることで四分位範囲 (IQR) を計算するプログラムを前のプログラムから修正します。

前のソースファイルを開きます。

cd ~/project
nano iqr_calculation.c

IQR を計算するようにコードを更新します。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define MAX_SIZE 100

// 整数を比較するための qsort 関数
int compare(const void *a, const void *b) {
    return (*(int*)a - *(int*)b);
}

// Q1 と Q3 を計算する関数
double calculateQuartile(int *arr, int n, double position) {
    int index = floor(position);
    double fraction = position - index;

    if (fraction == 0) {
        return arr[index - 1];
    } else {
        return arr[index - 1] * (1 - fraction) + arr[index] * fraction;
    }
}

int main() {
    int numbers[MAX_SIZE];
    int n, i;
    double q1, q3, iqr;

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

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

    // 配列をソート
    qsort(numbers, n, sizeof(int), compare);

    // Q1 と Q3 の位置を計算
    double q1_pos = 0.25 * (n + 1);
    double q3_pos = 0.75 * (n + 1);

    // Q1 と Q3 を計算
    q1 = calculateQuartile(numbers, n, q1_pos);
    q3 = calculateQuartile(numbers, n, q3_pos);

    // IQR を計算
    iqr = q3 - q1;

    // 結果を出力
    printf("ソート済み配列:");
    for (i = 0; i < n; i++) {
        printf("%d ", numbers[i]);
    }
    printf("\n");

    printf("Q1: %.2f\n", q1);
    printf("Q3: %.2f\n", q3);
    printf("IQR: %.2f\n", iqr);

    return 0;
}

更新されたプログラムをコンパイルします。

gcc -o iqr_calculation iqr_calculation.c -lm

プログラムを実行し、例として入力してみましょう。

./iqr_calculation

出力例:

要素数を入力してください (最大 100): 7
7 個の整数を入力してください:
12 15 18 22 25 30 35
ソート済み配列: 12 15 18 22 25 30 35
Q1: 15.00
Q3: 30.00
IQR: 15.00

コードのポイント:

  • calculateQuartile() 関数は、偶数と奇数のサイズの配列の両方で処理します。
  • Q1 は 25 パーセンタイルで計算されます。
  • Q3 は 75 パーセンタイルで計算されます。
  • IQR は Q3 - Q1 として計算されます。
  • 整数でない位置については線形補間を使用しています。

IQR の出力

この最終ステップでは、四分位範囲 (IQR) の結果を明確で分かりやすい方法で表示することに焦点を当てます。

前のソースファイルを開きます。

cd ~/project
nano iqr_calculation.c

IQR の出力を改善し、説明的なテキストを追加するようにコードを更新します。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define MAX_SIZE 100

// 前の関数は同じままです (compare と calculateQuartile)

int main() {
    int numbers[MAX_SIZE];
    int n, i;
    double q1, q3, iqr;

    // より良いプレゼンテーションのために画面をクリア
    printf("\033[2J\033[1;1H");

    // IQR の紹介
    printf("四分位範囲 (IQR) 計算機\n");
    printf("=====================================\n\n");

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

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

    // 配列をソート
    qsort(numbers, n, sizeof(int), compare);

    // Q1 と Q3 の位置を計算
    double q1_pos = 0.25 * (n + 1);
    double q3_pos = 0.75 * (n + 1);

    // Q1 と Q3 を計算
    q1 = calculateQuartile(numbers, n, q1_pos);
    q3 = calculateQuartile(numbers, n, q3_pos);

    // IQR を計算
    iqr = q3 - q1;

    // 詳細な出力
    printf("\nデータ分析結果\n");
    printf("--------------------\n");
    printf("元のデータセット:");
    for (i = 0; i < n; i++) {
        printf("%d ", numbers[i]);
    }
    printf("\n\n");

    // フォーマットされた IQR 出力
    printf("四分位分析:\n");
    printf("第 1 四分位数 (Q1): %.2f\n", q1);
    printf("第 3 四分位数 (Q3): %.2f\n", q3);
    printf("四分位範囲 (IQR): %.2f\n", iqr);

    // IQR の解釈
    printf("\n解釈:\n");
    printf("IQR はデータの中央 50%% の散らばりを表します。\n");
    printf("IQR が小さいほどデータは一貫性があり、\n");
    printf("IQR が大きいほどデータのばらつきが大きいことを示します。\n");

    return 0;
}

更新されたプログラムをコンパイルします。

gcc -o iqr_calculation iqr_calculation.c -lm

プログラムを実行し、例として入力してみましょう。

./iqr_calculation

出力例:

四分位範囲 (IQR) 計算機
=====================================

要素数を入力してください (最大 100): 7
7 個の整数を入力してください:
12 15 18 22 25 30 35

データ分析結果
--------------------
元のデータセット: 12 15 18 22 25 30 35

四分位分析:
第1四分位数 (Q1): 15.00
第3四分位数 (Q3): 30.00
四分位範囲 (IQR): 15.00

解釈:
IQR はデータの中央 50% の散らばりを表します。
IQR が小さいほどデータは一貫性があり、
IQR が大きいほどデータのばらつきが大きいことを示します。

主な改善点:

  • より良いプレゼンテーションのために画面をクリアするコマンドを追加しました。
  • 出力フォーマットを改善しました。
  • IQR の解釈を含めました。
  • 前の計算ロジックを維持しました。

Summary

In this lab, you first learned how to read and sort an array of numbers in C programming. You created a C source file, wrote the initial code to read the array elements and sort them using the qsort() function. You then printed the sorted array to verify the sorting process.

Next, you will modify the previous program to calculate the Interquartile Range (IQR) by finding the positions of the first quartile (Q1) and the third quartile (Q3), and then computing the IQR as Q3 - Q1. Finally, you will print the calculated IQR.