ゆるゆるプログラミング

・最頻値

最頻値とは、与えられた複数の値のうち最も出現回数(度数)が多い値のことです。

以下は、最頻値を求める例です。

最頻値の例

個数が最も多い値が最頻値です。

以下が、最頻値を求めるJavaのソースコードです。

このソースコード例では、最頻値が複数存在する場合は、最頻値の中で1番小さい値を結果として出力します。

Mode.java ← クリックしてダウンロードページに移動
001:    import java.util.Arrays;
002:    
003:    public class Mode {
004:    	public static void main( String[] args ) {
005:    		// 配列aを宣言
006:    		int[] a;
007:    
008:    		// 要素数10を設定
009:    		a = new int[ 10 ];
010:    
011:    		// 値を代入
012:    		a[ 0 ] = 10;
013:    		a[ 1 ] =  5;
014:    		a[ 2 ] =  8;
015:    		a[ 3 ] = 10;
016:    		a[ 4 ] = 50;
017:    		a[ 5 ] = 10;
018:    		a[ 6 ] =  8;
019:    		a[ 7 ] = 20;
020:    		a[ 8 ] =  8;
021:    		a[ 9 ] = 55;
022:    
023:    		// 昇順ソート
024:    		Arrays.sort( a );
025:    
026:    		// 最頻値
027:    		int pre_mode, num, max_num;
028:    		int mode;
029:    
030:    		// 初期値を代入
031:    		mode = a[ 0 ];	// 最頻値の初期値	
032:    		max_num = 1;	// 最大出現数の初期値
033:    
034:    		pre_mode = a[ 0 ];	// 出現する回数を数える値
035:    		num = 1;		// 出現回数
036:    
037:    		for ( int i = 1; i < a.length; ++ i ) {
038:    			if ( pre_mode == a[ i ] ) {
039:    				// 同じ値の場合
040:    				// 出現回数に1を足す
041:    				++ num;
042:    			}
043:    			else {
044:    				// 違う同じ値の場合
045:    				if ( num > max_num ) {
046:    					mode = pre_mode;
047:    					max_num = num;
048:    				}
049:    
050:    				// 出現する回数を数える値を変更
051:    				pre_mode = a[ i ];
052:    				num = 1;
053:    			}
054:    		}
055:    
056:    		// 後処理
057:    		if ( num > max_num ) {
058:    			mode = pre_mode;
059:    			max_num = num;
060:    		}
061:    
062:    
063:    		// 結果表示
064:    		System.out.println( "最頻値 : " + mode );
065:    		System.out.println( "出現数 : " + max_num );
066:    	}
067:    }

Mode.javaの出力結果

最頻値 : 8
出現数 : 3

この例では、10の出現数も3ですが、8は10より小さい値なので8を結果として出力しています。

それでは、ここから最頻値を求めるJavaソースコードについて解説します。

001:    import java.util.Arrays;

Javaのクラスライブラリの中から「java.util.Arrays」というパッケージにあるクラスを、このプログラム内で使うために記述します。 この記述により、Arraysクラスが利用できるようになります。

003:    public class Mode {

クラス名を、Modeとしています。

004:    	public static void main( String[] args ) {

このmainメソッドからプログラムを実行します。

005:    		// 配列aを宣言
006:    		int[] a;
007:    
008:    		// 要素数10を設定
009:    		a = new int[ 10 ];
010:    
011:    		// 値を代入
012:    		a[ 0 ] = 10;
013:    		a[ 1 ] =  5;
014:    		a[ 2 ] =  8;
015:    		a[ 3 ] = 10;
016:    		a[ 4 ] = 50;
017:    		a[ 5 ] = 10;
018:    		a[ 6 ] =  8;
019:    		a[ 7 ] = 20;
020:    		a[ 8 ] =  8;
021:    		a[ 9 ] = 55;

int型配列aの要素数を10個で初期化し、任意の値を代入しています。

023:    		// 昇順ソート
024:    		Arrays.sort( a );

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:    		int pre_mode, num, max_num;
028:    		int mode;

最頻値を求めるために必要な変数を宣言しています。

030:    		// 初期値を代入
031:    		mode = a[ 0 ];	// 最頻値の初期値	
032:    		max_num = 1;	// 最大出現数の初期値
033:    
034:    		pre_mode = a[ 0 ];	// 出現する回数を数える値
035:    		num = 1;		// 出現回数

変数に初期値を代入しています。

int型変数modeは、最頻値の最終結果を格納するもので初期値としてa[0]を代入します。最頻値の出現回数を格納する変数max_numには1を代入しておきます。

int型変数pre_modeは、出現回数を数える値の初期値を代入しています。変数numはpre_modeと同じ値の出現回数で、初期値に1を代入しています。

037:    		for ( int i = 1; i < a.length; ++ i ) {

for文配列の2番目の値から配列の個数分のループです。

038:    			if ( pre_mode == a[ i ] ) {
039:    				// 同じ値の場合
040:    				// 出現回数に1を足す
041:    				++ num;
042:    			}

出現回数を数える値pre_modeと配列の値a[i]が同じであれば出現回数numに1を足しています。

043:    			else {
044:    				// 違う同じ値の場合
045:    				if ( num > max_num ) {
046:    					mode = pre_mode;
047:    					max_num = num;
048:    				}
049:    
050:    				// 出現する回数を数える値を変更
051:    				pre_mode = a[ i ];
052:    				num = 1;
053:    			}

出現回数を数える値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:    		if ( num > max_num ) {
058:    			mode = pre_mode;
059:    			max_num = num;
060:    		}

for文を抜けた後で、出現回数を数える値pre_modeの出現数numとmax_numを比較し、numが大きければ最頻値modeにpre_mode、最大出現回数max_numにnumを代入します。

063:    		// 結果表示
064:    		System.out.println( "最頻値 : " + mode );
065:    		System.out.println( "出現数 : " + max_num );

結果を表示しています。

■関連コンテンツ

配列 同じ型の変数をまとめた配列について解説
配列のソート 配列を昇順・降順に並び替える方法を解説
for文 繰り返し処理に使用するfor文について解説
if文 条件による処理の分岐に使用するif文について解説

■新着情報

2020.05.07 サイコロの出目確率 サイコロの目のでる確率は?
2020.04.22 現在日時をミリ秒で取得 現在日時をミリ秒数で取得
2020.04.22 日時 日時の操作について
2020.04.22 時間の単位変換 1日、1時間は何ミリ秒?

■広告

法人向けのETC専用カード

~約8,000名の受講生と80社以上の導入実績~ 企業向けプログラミング研修ならCodeCamp

日本最大級ショッピングサイト!お買い物なら楽天市場

 

 

 

 

 

 

 

 

 

Topへ