2019.09.05
数学関数(最頻値)
最頻値とは
最頻値とは、与えられた複数の値のうち最も出現回数(度数)が多い値のことです。
以下は、最頻値を求める例です。
個数が最も多い値が最頻値です。
このソースコード例では、最頻値が複数存在する場合は、最頻値の中で1番小さい値を結果として出力します。
Mode.java
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067
import java.util.Arrays; public class Mode { public static void main( String[] args ) { // 配列aを宣言 int[] a; // 要素数10を設定 a = new int[ 10 ]; // 値を代入 a[ 0 ] = 10; a[ 1 ] = 5; a[ 2 ] = 8; a[ 3 ] = 10; a[ 4 ] = 50; a[ 5 ] = 10; a[ 6 ] = 8; a[ 7 ] = 20; a[ 8 ] = 8; a[ 9 ] = 55; // 昇順ソート Arrays.sort( a ); // 最頻値 int pre_mode, num, max_num; int mode; // 初期値を代入 mode = a[ 0 ]; // 最頻値の初期値 max_num = 1; // 最大出現数の初期値 pre_mode = a[ 0 ]; // 出現する回数を数える値 num = 1; // 出現回数 for ( int i = 1; i < a.length; ++ i ) { if ( pre_mode == a[ i ] ) { // 同じ値の場合 // 出現回数に1を足す ++ num; } else { // 違う同じ値の場合 if ( num > max_num ) { mode = pre_mode; max_num = num; } // 出現する回数を数える値を変更 pre_mode = a[ i ]; num = 1; } } // 後処理 if ( num > max_num ) { mode = pre_mode; max_num = num; } // 結果表示 System.out.println( "最頻値 : " + mode ); System.out.println( "出現数 : " + max_num ); } }
コンパイル ソースコードが「ANSI」の場合
C:\talavax\javasample>javac -encoding sjis Mode.java
コンパイル ソースコードが「UTF-8」の場合
C:\talavax\javasample>javac Mode.java
実行
C:\talavax\javasample>java Mode
実行結果
最頻値 : 8 出現数 : 3
この例では、10の出現数も3ですが、8は10より小さい値なので8を結果として出力しています。
001
import java.util.Arrays;
Javaのクラスライブラリの中から「java.util.Arrays」というパッケージにあるクラスを、このプログラム内で使うために記述します。 この記述により、Arraysクラスが利用できるようになります。
003
public class Mode {
クラス名を、Modeとしています。
004
public static void main( String[] args ) {
このmainメソッドからプログラムを実行します。
005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021
// 配列aを宣言 int[] a; // 要素数10を設定 a = new int[ 10 ]; // 値を代入 a[ 0 ] = 10; a[ 1 ] = 5; a[ 2 ] = 8; a[ 3 ] = 10; a[ 4 ] = 50; a[ 5 ] = 10; a[ 6 ] = 8; a[ 7 ] = 20; a[ 8 ] = 8; a[ 9 ] = 55;
023 024
// 昇順ソート
Arrays.sort( a );
ソート Arrays.sortメソッド
public static int Arrays.sort( byte[] a )public static int Arrays.sort( char[] a )
public static int Arrays.sort( double[] a )
public static int Arrays.sort( float[] a )
public static int Arrays.sort( int[] a )
public static int Arrays.sort( short[] a )
・指定された配列を数値の昇順でソートします。 パラメータ a : 昇順ソートする配列
026 027 028
// 最頻値 int pre_mode, num, max_num; int mode;
最頻値を求めるために必要な変数を宣言しています。
030 031 032 033 034 035
// 初期値を代入 mode = a[ 0 ]; // 最頻値の初期値 max_num = 1; // 最大出現数の初期値 pre_mode = a[ 0 ]; // 出現する回数を数える値 num = 1; // 出現回数
変数に初期値を代入しています。
037
for ( int i = 1; i < a.length; ++ i ) {
038 039 040 041 042
if ( pre_mode == a[ i ] ) { // 同じ値の場合 // 出現回数に1を足す ++ num; }
出現回数を数える値pre_modeと配列の値a[i]が同じであれば出現回数numに1を足しています。
043 044 045 046 047 048 049 050 051 052 053
else { // 違う同じ値の場合 if ( num > max_num ) { mode = pre_mode; max_num = num; } // 出現する回数を数える値を変更 pre_mode = a[ i ]; num = 1; }
出現回数を数える値pre_modeと配列の値a[i]が違っていれば、pre_modeの出現回数numとmax_numを比較して、numがmax_numより大きければ最頻値modeにpre_mode、最大出現回数max_numにnumを代入します。
pre_modeにa[i]を代入して出現回数を数える値を変更します。出現数numも1にします。
056 057 058 059 060
// 後処理
if ( num > max_num ) {
mode = pre_mode;
max_num = num;
}
for文を抜けた後で、出現回数を数える値pre_modeの出現数numとmax_numを比較し、numが大きければ最頻値modeにpre_mode、最大出現回数max_numにnumを代入します。
063 064 065
// 結果表示 System.out.println( "最頻値 : " + mode ); System.out.println( "出現数 : " + max_num );
結果を表示しています。
以上です。