一番使用されている文字は?
文字列中で一番多く使用されている文字について調べます。
まず、1文字ずつ入力されているセルのリストから、一番多く使用されている文字(セル)の個数を調べます。
以降、順に汎用的な式に改良していき、最後は、都道府県名で多く使われている文字を、多い順にリスト化します。
1.最頻文字を調べる − COUNTIF関数
下図のような文字が入力されているセルで、
一番多く出現する文字を調べます。
手順としては簡単。
1.出現個数
それぞれの文字に対して、範囲内での文字個数を
COUNTIF関数で調べてリストを作成(図D列)
計算式:
{=COUNTIF(C7:C26,C7:C26)}
ここでは、のとのち一つの式にまとめるため、
配列数式としています。
=COUNTIF(C7,$C$7:$C$26) としてオートフィルでコピーしても同じ値が得られますが、これでは式内に組み込めません。
2.最大個数
最大値は、
=LARGE(D7:D26,1) で求められます。
=MAX(D7:D26) でも求められますが、これは最大値のみ。
2番目、3番目・・の値も求めたい場合があるので、汎用的な
LARGE関数を使用します。
3.最大値の位置(範囲内での相対位置)
MATCH関数で検索できます。2番目のパラメータを0とすると、最初に完全一致した値の位置が求まります。
4.文字を取出し
最大値の位置の文字を
INDEX関数で取り出します。
以上で、
最頻文字が得られました。
5.式をまとめる
順に式をまとめていきます。
=INDEX(C7:C26,H8) のH8を、H8に入力した式、MATCH(H7,D7:D26,0) で置き換えると、
=INDEX(C7:C26,MATCH(H7,D7:D26,0))
この式のH7を、H7に入力した式、LARGE(D7:D26,1) で置き換えると、
=INDEX(C7:C26,MATCH(LARGE(D7:D26,1),D7:D26,0)) − 式をまとめる1
最後に、D7:D26 の部分を COUNTIF(C7:C26,C7:C26) で置き換えて、
{=INDEX(C7:C26,MATCH(LARGE(COUNTIF(C7:C26,C7:C26),1),COUNTIF(C7:C26,C7:C26),0))} − 式をまとめる2
D7:D26 の部分は配列数式として作成するので、SHIFT+CTRL+ENTERで式を閉じます。
以上で完成。
2.最頻文字を調べる − MODE関数
データ列の中での出現頻度を調べるMODE関数を使用しても求められます。
MODE関数を使用した方が式は簡素にできます−ただし、汎用性に乏しい
手順
1.出現位置
それぞれの文字が最初に出現する位置(範囲内相対)を調べます。
{=IFERROR(MATCH(C7:C26,C7:C26,0),"")}
MATCH(C7:C26,C7:C26,0) でそれぞれの文字を範囲内で検索し、最初に見つかった位置を配列として返します。
IFERROR は、見つからなかった場合(ここでは空白セル)にエラーが発生するのを防止するため。
2.最頻位置
出現位置のリストに中で最も多く出現する値を
MODE関数で調べます。
=MODE(D7:D26,0)
3.文字
最頻位置の文字を取り出します。
=INDEX(C7:C26,H7)
4.式をまとめる
一つの式にまとめて完成
{=INDEX(C7:C26,MODE(IFERROR(MATCH(C7:C26,C7:C26,0),""),0))}
3.文字別カウント - 逐次消去
それぞれの文字の出現数は、
1で使用した方法を利用できます。
手順
まず、
最頻文字とその
個数を調べます。
次に、元の文字配列から上記で求めた文字を
空白に置き換えます。
その中から最頻文字を調べると、これは
2番目に多い文字となります。
これを順に文字が無くなるまで調べると、出現頻度順の文字リストが完成。
ここでは、文字列を分解してセルに格納しています。
文字列中の最頻文字を調べるため。
C3の式:
=IF(C6=0,"",INDEX(C7:C26,MATCH(LARGE(IF(C7:C26="","",COUNTIF(C7:C26,C7:C26)),1),IF(C7:C26="","",COUNTIF(C7:C26,C7:C26)),)))
C4の式:
=IF(C6=0,"",COUNTIF(C7:C26,C3))
C6の式:
=COUNTIF(C7:C26,"?*")
C7の式:
=MID($B$2,B7,1))
COUNTIF(C7:C26,"?*") は、
空白でないセルの個数。詳しい説明は、
数式が設定された空白でないセルの個数を数えたい を参照
4.文字別カウント - 昇順並べ替え
3.の方法では、同一個数の場合の文字は
先に見つかった順となってしまいます。
手動でならえかえれば済むことですが、できれば自動的に、
個数−読み昇順としたいものです。
ここでは、文字コード(
ANSI)を利用して、同一個数の場合は文字コードを
重み付けして、若い順とします。
すなわち、文字個数+文字コード重み付け の一覧から、
LARGE関数を使用して順位付します。
文字コードは2バイトなので、65,536以下。
個数は整数なので、コードの重み付けは
1より小さくなるように、
1−CODE(C7)/100000 のようにします。
CODE関数は、ANSI文字コードを返す関数。
5.都道府県名で使われている漢字は?
都道府県名で使われている漢字を多い順に重複を排除してリストを作成してみます。
式は
前項4.で使用したものと同一。
「山」が一番多いとは意外でした!
なお、末尾の「都、府、県」は外して都府県名のみとしています。
北海道は扱いに悩むところですが、北海だけだと違和感があるので、「北海道」そのままにしています。
6.MODE関数について
2.のようにMODE関数を使った方が式を短くできそうですが、なかなかうまくいきません。
MODE関数は統計処理用ですのでサンプル数は
2個以上必要となります。
よって、1文字しか使われていない漢字の場合は下図のようにエラーが発生してしまいます。
IF関数やIFERROR関数で判定処理すれば可能でしょうが、式はCOUNTIF関数を使うより長くなってしまいそうです。
7.関数化 - VBA使用
文字数カウントのような処理は、VBAで作成した方が使い勝手が良い場合があります。
また、使い回しが簡単にできます。(テンプレートに自分用の関数群として登録しておくとさらに便利)
以下、文字頻度という名前で関数化してみました。
大量のデータを扱う場合は、処理速度考慮した工夫が必要になるかもしれません。
使用例
ソースコード
使用例2
英語で一番使用される文字は「e」と思っていたら、意外や「 」スペースでした。
当然といえば・・
、
リンクリスト