C言語例文集


 メジアン(中央値)、範囲(レンジ)、ヒストグラムを求める


 メジアンは平均と同じくデータの中心位置を推測するための統計量です。メジアンは、「データを大きさの順に並べて、データが奇数個なら中央に位置するデータの値、データが偶数個なら中央に位置する2つのデータの平均」 となります。例えばデータが 3, 4, 6ならばメジアンは4であり、データが3, 5, 4, 6ならば4と5の平均である4.5となります。

 範囲はデータの広がり具合を推測するための統計量で
           (範囲)
で求めることができます。

 ヒストグラムは統計量ではありませんが、統計においてよく用いられるデータの把握方法です。本来は縦方向の棒グラフのように示すのですが、ここでは横棒でデータの度数を * の数で示します。

<サンプルプログラム>

/****************************************************************************/
#include <stdio.h>
#include <string.h>
#define DATA_NUM 30  // データ数
#define MAX_DATA 10  // データの最大値

int main()
{
    // 変数定義
    int data[DATA_NUM] = {6,3,5,9,8,1,2,10,4,3,
                          7,4,3,7,6,5,3,4,5,8,
                          1,4,9,2,4,5,3,7,6,5};
    int i, j, tmp;
    double med;  // メジアン
    double renge;  // レンジ
    int histogram[MAX_DATA + 1];  // ヒストグラム

    // 変数の初期化
    i = 0;
    j = 0;
    tmp = 0;
    med = 0;
    renge = 0;
    memset(histogram, '\0', sizeof(histogram));  // 配列の中身を初期化する

    //データを大きさの順に並べ替え
    for(i = 1; i < DATA_NUM; i++)
    {
        for(j = 0; j < DATA_NUM - i; j++)
        {
            if(data[j] > data[j + 1])
            {
                tmp = data[j];
                data[j] = data[j + 1];
                data[j + 1] = tmp;
            }
        }
    }

    // メジアンを求める
    if(DATA_NUM % 2 == 1)  // データ数が奇数個の場合
    {
        med = data[(DATA_NUM - 1) / 2];  // メジアン
    }
    else  // データ数が偶数の場合
    {
        med = (data[(DATA_NUM / 2) - 1] + data[DATA_NUM / 2]) / 2.0;  // メジアン
    }

    // レンジを求める
    renge = data[DATA_NUM - 1] - data[0] + 0.0;  // 範囲

    printf("メジアンは %0.2f\n", med);
    printf("範囲    は %0.2f\n", renge);

    // histogram[]はヒストグラムで使用する配列
    for(i = 0; i <= MAX_DATA; i++)
    {
        histogram[i] = 0;
    }

    //0≦x≦10であるdata[i]のデータxの個数を
    //histogram[x]の数値と対応させる
    for(i = 0; i < DATA_NUM; i++)
    {
        histogram[data[i]]++;
    }

    printf("\nヒストグラム\n");
    for(i = 0; i <= MAX_DATA; i++)
    {
        printf("%2.0d|", i);  // 座標軸表示
        for(j = 0; j < histogram[i]; j++)
        {
            printf("*");  // データの個数分"*"を表示
        }
        printf("\n");
    }

    return 0;
}
/****************************************************************************/

<実行結果>




<Topページ>

Copyright(c) 2010 , cgengor
このWebページの内容を無断で複製または転載することを禁じます。
このWebページの情報を利用することにより発生したいかなる損害について著作権保有者はいっさいの責任を負いません。