いきなり答える備忘録

Google Workspace・Microsoft 365・LibreOfficeなどに関するメモ

(Gスプレッドシート)値の出現回数のランキングを作る

 Googleスプレッドシートで、データに含まれる値の出現回数のランキングを作る方法についてです。
 つまりはグループ化してカウント集計してカウント値の降順で並べ替えるわけですが、ここではいくつかの方法を試してみます。

  • 関数やピボットテーブルを利用して、値の出現回数のランキングを作成することができます。

手順

QUERY関数を使う方法

 集計の対象となるデータはB2:B16の範囲に記録されており、このうち先頭のB2セルは見出しとなっています(以下の例でも同じ)。

 ここではD2セルにQUERY関数を使った式を入力して、データ中の動物名の出現回数のランキングを作成しています。

 D2セル

=QUERY(B2:B16,"SELECT B,COUNT(B) GROUP BY B ORDER BY COUNT(B) DESC",1)

 QUERY関数はこの手の集計のためにあるような関数です。もともと初心者向けとは言えませんし、独自の見出しが出力されるなど機能にやや癖がありますが、非常に強力なので覚える価値は高いです。
 第1引数の「B2:B16」で見出しを含めて集計対象として指定しています。
 第2引数中の「SELECT B,COUNT(B)」はB列の値(「しか」「さる」などの値そのもの)とそのカウント値を出力することを表し、「GROUP BY B」はB列の値の種類(「しか」「さる」など)ごとに値を出力することを表しています。さらに「ORDER BY COUNT(B) DESC」はカウント値の降順(大きい順)で並べ替えるという意味です。
 第3引数の「1」はデータ(B2:B16)に含まれる見出しの行数を表しています。省略しても適宜判断してくれますが、指定しておいた方が確実です。


 ここでは同じQUERY関数を使い、C列の値が「A棟」であるデータについて同様の集計をしています。

 D2セル

=QUERY(B2:C16,"SELECT B,COUNT(B) WHERE C='A棟' GROUP BY B ORDER BY COUNT(B) DESC",1)

 上記の式に「WHERE C='A棟'」が加わっただけですが、これによりC列の値が「A棟」であるデータだけを集計対象として絞り込んでいます。
 他の関数を使うとネストが増えたりしてややこしいですが、QUERY関数ならこれだけでフィルタを実現できます。ただし句の順番にもルールがあるので、そこは覚える必要があります。

UNIQUE/COUNTIF関数を使う方法

 関数を使いつつ比較的手軽に実現する方法です。
 他の方法と異なり、見出しの存在を全く考慮しなくてよいのはちょっとしたメリットかもしれません。

 まずD3セルに

=UNIQUE(B3:B16)

 と入力して動物名の一覧を出力します。引数に見出し行(B2セル)は含めません。


 続いて隣のE3セルに次の式を入力して、それぞれの動物の出現回数を求めます。

 E3セル

=ARRAYFORMULA(COUNTIF(B3:B16,D3:D8))

 COUNTIF関数を使い集計範囲としてB3:B16を、条件としてD3:D8の6つのセルを指定します。
 さらにARRAYFORMULAで囲むことにより、D3:D8の6つの各条件に対する出力を一括して得ることができます。
 しかしこれでは出現回数順になっていないので……


 さらにG3セルに「=SORT(D3:E8,2,FALSE)」と記し、D3:E8の内容を出現回数の降順で並べ替えれば完成です。


 なお、上記の集計を1つの式にまとめると次のようになります。やや複雑ですが参考まで。

 D3セル

=SORT({UNIQUE(B3:B16),ARRAYFORMULA(COUNTIF(B3:B16,UNIQUE(B3:B16)))},2,FALSE)

 「UNIQUE(B3:B16)」により動物名の一覧を、「ARRAYFORMULA(COUNTIF(B3:B16,UNIQUE(B3:B16)))」によりそれぞれの出現数を求め、2つの結果をカッコでつないで横並びにし、最後にSORT関数を使って出現数の降順で出力しています。
 ここで細かい話になりますが、式の中に2つある「UNIQUE(B3:B16)」が同じ配列を返さない(同じ順番で動物名が並ばない)とこの式は成立しません。UNIQUE関数の出力順は値の初出順になるはずなので問題はないと思われますが、「ソート指定なしで順番の保証があるのか」というSQL的な不安を覚える場合は2か所のUNIQUE関数をそれぞれSORTで囲む必要があります。ただし長いので詳細は省略します。


ピボットテーブルを使う方法

 ここではピボットテーブルを使ってやってみます。
 ピボットテーブルはメニュー操作のみで作成でき、着色や罫線まで自動的に処理してくれます。
 手順は長くなりますが、ここでは逐一みてみます。

 まずウインドウ上部のメニューから「挿入」→「ピボットテーブル」と選択します。


 するとダイアログが出ます。
 「データ範囲」の欄を選択してから……


 見出しを含めてB2:B16の範囲を選択(ドラッグ)します。
 同時にダイアログの内容が変わってちょっと混乱しますが、OKをクリックすると元のダイアログに戻ります。


 元のダイアログに戻った様子です。
 ここで「挿入先」から「既存のシート」を選択します。
 どこに出力するかを記す欄が現れますので……


 適当なセル(テーブルの最も左上の位置となるセル)を選択します。
 ここではD2セルとしておき、OKをクリックします。


 元のダイアログに戻ったら「作成」をクリックします。


 シート内が一部着色され、さらにウインドウ右側に「ピボットテーブルエディタ」ペインが出現します。
 まずは「行」の横にある「追加」をクリックして「動物名」を選択します。


 テーブル内に(重複を除いた)動物名が表示されたのが分かります。
 そこでさらに「値」の横の「追加」をクリックして「動物名」を選択します。


 テーブル内にはそれぞれの動物のカウント値が表示されました。
 また、ペイン内の「集計」欄(画像右下)が自動的に「COUNTA」になっているのがわかります。
 この例では求めようとする内容が自動的に表示されましたのでこのままでOKです。
 ただし順番が出現回数順になっていないので……


 さっきの「行」のところに戻り、右側のプルダウン(「並べ替え」というプルダウンが2つありますが、右側のものがキーを表しています)から「動物名のCOUNTA」を選択します。

 並べ替えられましたが昇順(小さい順)となっています。
 そこで最後に左のプルダウン(昇順/降順指定)から「降順」を選択します。


 以上で完成です。画像中に見える「総計を表示」のチェックを外せば総計の行を消すことができます。
 詳細は省略しますが、フィルタにより抽出条件を付けるなど、より高度な集計も可能です。