C 언어로 사분위수 범위 (IQR) 계산하기

CBeginner
지금 연습하기

소개

이 실습에서는 C 프로그래밍에서 사분위수 범위 (IQR) 를 계산하는 방법을 배웁니다. 이 실습에서는 숫자 배열을 읽고 정렬하는 단계, 첫 번째 사분위수 (Q1) 와 세 번째 사분위수 (Q3) 의 위치를 찾는 단계, 그리고 Q3 와 Q1 의 차이로서 IQR 을 계산하는 단계를 다룹니다. 이 실습을 마치면 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 해석 포함
  • 이전 계산 논리 유지

요약

이 실험에서는 먼저 C 프로그래밍에서 숫자 배열을 읽고 정렬하는 방법을 배웠습니다. C 소스 파일을 만들고 qsort() 함수를 사용하여 배열 요소를 읽고 정렬하는 초기 코드를 작성했습니다. 그런 다음 정렬된 배열을 출력하여 정렬 과정을 확인했습니다.

다음으로, 이전 프로그램을 수정하여 첫 번째 사분위수 (Q1) 와 세 번째 사분위수 (Q3) 의 위치를 찾고 IQR 을 Q3 - Q1 로 계산하여 사분위수 범위 (IQR) 를 계산합니다. 마지막으로 계산된 IQR 을 출력합니다.