Calcular el Rango Intercuartílico (IQR) en C

CBeginner
Practicar Ahora

Introducción

En este laboratorio, aprenderás a calcular el Rango Intercuartílico (IQR) en el lenguaje de programación C. El laboratorio cubre los pasos para leer y ordenar un array de números, encontrar las posiciones de los cuartiles primero y tercero (Q1 y Q3), y luego calcular el IQR como la diferencia entre Q3 y Q1. Al final de este laboratorio, tendrás una sólida comprensión de cómo realizar este análisis estadístico usando C.

Leer y Ordenar el Array

En este paso, aprenderás a leer un array de números y ordenarlo como preparación para calcular el Rango Intercuartílico (IQR). Usaremos programación en C para realizar esta tarea.

Primero, creemos un archivo fuente C para nuestro cálculo de IQR:

cd ~/project
nano iqr_calculation.c

Ahora, escribamos el código inicial para leer y ordenar un array:

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

#define MAX_SIZE 100

// Función para comparar enteros para qsort
int compare(const void *a, const void *b) {
    return (*(int*)a - *(int*)b);
}

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

    // Leer el número de elementos
    printf("Ingrese el número de elementos (máximo %d): ", MAX_SIZE);
    scanf("%d", &n);

    // Ingresar los elementos del array
    printf("Ingrese %d enteros:\n", n);
    for (i = 0; i < n; i++) {
        scanf("%d", &numbers[i]);
    }

    // Ordenar el array
    qsort(numbers, n, sizeof(int), compare);

    // Imprimir el array ordenado
    printf("Array ordenado: ");
    for (i = 0; i < n; i++) {
        printf("%d ", numbers[i]);
    }
    printf("\n");

    return 0;
}

Compila el programa:

gcc -o iqr_calculation iqr_calculation.c

Ejecuta el programa y proporciona una entrada de ejemplo:

./iqr_calculation

Salida de ejemplo:

Ingrese el número de elementos (máximo 100): 6
Ingrese 6 enteros:
45 22 14 65 97 72
Array ordenado: 14 22 45 65 72 97

Desglose del código:

  • Definimos un tamaño máximo de array de 100 elementos.
  • La función compare() es usada por qsort() para ordenar enteros.
  • Leemos el número de elementos de la entrada del usuario.
  • qsort() se utiliza para ordenar el array en orden ascendente.
  • Luego, se imprime el array ordenado.

Encontrar las Posiciones Q1 y Q3 y Calcular IQR = Q3 - Q1

En este paso, modificaremos el programa anterior para calcular el Rango Intercuartílico (IQR) encontrando las posiciones de Q1 y Q3.

Abre el archivo fuente anterior:

cd ~/project
nano iqr_calculation.c

Actualiza el código para calcular el IQR:

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

#define MAX_SIZE 100

// Función para comparar enteros para qsort
int compare(const void *a, const void *b) {
    return (*(int*)a - *(int*)b);
}

// Función para calcular Q1 y 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;

    // Leer el número de elementos
    printf("Ingrese el número de elementos (máximo %d): ", MAX_SIZE);
    scanf("%d", &n);

    // Ingresar los elementos del array
    printf("Ingrese %d enteros:\n", n);
    for (i = 0; i < n; i++) {
        scanf("%d", &numbers[i]);
    }

    // Ordenar el array
    qsort(numbers, n, sizeof(int), compare);

    // Calcular las posiciones de Q1 y Q3
    double q1_pos = 0.25 * (n + 1);
    double q3_pos = 0.75 * (n + 1);

    // Calcular Q1 y Q3
    q1 = calculateQuartile(numbers, n, q1_pos);
    q3 = calculateQuartile(numbers, n, q3_pos);

    // Calcular IQR
    iqr = q3 - q1;

    // Imprimir resultados
    printf("Array ordenado: ");
    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;
}

Compila el programa actualizado:

gcc -o iqr_calculation iqr_calculation.c -lm

Ejecuta el programa y proporciona una entrada de ejemplo:

./iqr_calculation

Salida de ejemplo:

Ingrese el número de elementos (máximo 100): 7
Ingrese 7 enteros:
12 15 18 22 25 30 35
Array ordenado: 12 15 18 22 25 30 35
Q1: 15.00
Q3: 30.00
IQR: 15.00

Puntos clave del código:

  • calculateQuartile() maneja arrays de tamaño par e impar.
  • Q1 se calcula en el percentil 25.
  • Q3 se calcula en el percentil 75.
  • IQR se calcula como Q3 - Q1.
  • Usamos interpolación lineal para posiciones no enteras.

Imprimir el IQR

En este paso final, nos enfocaremos en la presentación del Rango Intercuartílico (IQR) de una manera clara e informativa.

Abre el archivo fuente anterior:

cd ~/project
nano iqr_calculation.c

Actualiza el código para mejorar la salida del IQR y agregar texto descriptivo:

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

#define MAX_SIZE 100

// Las funciones anteriores permanecen igual (compare y calculateQuartile)

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

    // Limpiar la pantalla para una mejor presentación
    printf("\033[2J\033[1;1H");

    // Introducción al IQR
    printf("Calculadora de Rango Intercuartílico (IQR)\n");
    printf("===========================================\n\n");

    // Leer el número de elementos
    printf("Ingrese el número de elementos (máximo %d): ", MAX_SIZE);
    scanf("%d", &n);

    // Ingresar los elementos del array
    printf("Ingrese %d enteros:\n", n);
    for (i = 0; i < n; i++) {
        scanf("%d", &numbers[i]);
    }

    // Ordenar el array
    qsort(numbers, n, sizeof(int), compare);

    // Calcular las posiciones de Q1 y Q3
    double q1_pos = 0.25 * (n + 1);
    double q3_pos = 0.75 * (n + 1);

    // Calcular Q1 y Q3
    q1 = calculateQuartile(numbers, n, q1_pos);
    q3 = calculateQuartile(numbers, n, q3_pos);

    // Calcular IQR
    iqr = q3 - q1;

    // Salida detallada
    printf("\nResultados del Análisis de Datos\n");
    printf("--------------------\n");
    printf("Conjunto de Datos Original: ");
    for (i = 0; i < n; i++) {
        printf("%d ", numbers[i]);
    }
    printf("\n\n");

    // Salida formateada del IQR
    printf("Análisis de Cuartiles:\n");
    printf("Primer Cuartil (Q1): %.2f\n", q1);
    printf("Tercer Cuartil (Q3): %.2f\n", q3);
    printf("Rango Intercuartílico (IQR): %.2f\n", iqr);

    // Interpretación del IQR
    printf("\nInterpretación:\n");
    printf("El IQR representa la dispersión del 50%% central de los datos.\n");
    printf("Un IQR más pequeño indica datos más consistentes,\n");
    printf("mientras que un IQR mayor sugiere más variabilidad.\n");

    return 0;
}

Compila el programa actualizado:

gcc -o iqr_calculation iqr_calculation.c -lm

Ejecuta el programa y proporciona una entrada de ejemplo:

./iqr_calculation

Salida de ejemplo:

Calculadora de Rango Intercuartílico (IQR)
===========================================

Ingrese el número de elementos (máximo 100): 7
Ingrese 7 enteros:
12 15 18 22 25 30 35

Resultados del Análisis de Datos
--------------------
Conjunto de Datos Original: 12 15 18 22 25 30 35

Análisis de Cuartiles:
Primer Cuartil (Q1): 15.00
Tercer Cuartil (Q3): 30.00
Rango Intercuartílico (IQR): 15.00

Interpretación:
El IQR representa la dispersión del 50% central de los datos.
Un IQR más pequeño indica datos más consistentes,
mientras que un IQR mayor sugiere más variabilidad.

Mejoras clave:

  • Se agregó un comando para limpiar la pantalla para una mejor presentación.
  • Se mejoró el formato de la salida.
  • Se incluyó una interpretación del IQR.
  • Se mantuvo la lógica de cálculo anterior.

Resumen

En este laboratorio, aprendiste primero cómo leer y ordenar un array de números en programación C. Creaste un archivo fuente en C, escribiste el código inicial para leer los elementos del array y ordenarlos utilizando la función qsort(). Luego, imprimiste el array ordenado para verificar el proceso de ordenación.

A continuación, modificarás el programa anterior para calcular el Rango Intercuartílico (IQR) encontrando las posiciones del primer cuartil (Q1) y el tercer cuartil (Q3), y luego calculando el IQR como Q3 - Q1. Finalmente, imprimirás el IQR calculado.