カテゴリ: Ruby 更新日: 2026/02/28

Rubyのgroup_byとtallyでデータ集計!カテゴリ別分類と件数カウントを初心者向けに解説

group_by と tally で集計:カテゴリ別件数・頻度表の作り方
group_by と tally で集計:カテゴリ別件数・頻度表の作り方

先生と生徒の会話形式で理解しよう

生徒

「Rubyで、バラバラにあるデータを種類ごとにまとめたり、それぞれ何個あるか数えたりする方法はありますか?」

先生

「それには、group_by(グループバイ)とtally(タリー)という便利な命令を使うのが一番ですよ。データの整理が驚くほど簡単になります。」

生徒

「種類ごとに分けるのがgroup_byで、個数を数えるのがtally、という感じでしょうか?」

先生

「その通りです!まさに学校のクラス分けや、アンケートの結果集計のような作業ですね。具体的なやり方を見ていきましょう!」

1. データの整理整頓とは?集計の基本を学ぼう

1. データの整理整頓とは?集計の基本を学ぼう
1. データの整理整頓とは?集計の基本を学ぼう

プログラミングを始めると、大量のデータを扱う場面がたくさん出てきます。例えば、100個のリンゴやミカンが箱に入っているとき、どれがどれだか分からない状態では困りますよね。そこで必要になるのが集計(しゅうけい)という作業です。

Rubyには、この集計作業を助けてくれる強力な味方がいます。一つは、仲間ごとにグループを作るgroup_by。もう一つは、正の字を書いて数を数えるように個数を出してくれるtallyです。これらを使うと、人間が手作業で行うと数時間かかるような作業も、コンピュータなら一瞬で終わらせることができます。パソコンを触ったことがない方でも、この二つの違いさえ押さえれば、データの達人になれますよ。

2. group_byで仲間分け!データをグループ化する方法

2. group_byで仲間分け!データをグループ化する方法
2. group_byで仲間分け!データをグループ化する方法

group_by(グループ・バイ)は、その名の通り「~によって(by)グループ(group)にする」という意味です。例えば、果物の名前が並んだリストを、種類ごとに仕分けたいときに使います。学校の先生が、生徒を住んでいる地域ごとに分けるようなイメージですね。

実際にプログラムを書いてみましょう。ここでは、果物のリストを名前ごとにグループ分けしてみます。


fruits = ["リンゴ", "バナナ", "リンゴ", "ミカン", "バナナ", "リンゴ"]

# 名前ごとにグループを作る
grouped_fruits = fruits.group_by do |fruit|
  fruit
end

puts grouped_fruits

実行結果は以下のようになります。


{"リンゴ"=>["リンゴ", "リンゴ", "リンゴ"], "バナナ"=>["バナナ", "バナナ"], "ミカン"=>["ミカン"]}

結果を見ると、{}の中に種類ごとの名前と、その中身がリストになって並んでいます。これをRubyではハッシュと呼び、特定のキーワード(キー)に対して、データ(値)が紐付いている状態を指します。種類ごとに「実物」をまとめておきたいときは、このgroup_byを使いましょう。

3. tallyで一発解決!個数を数える魔法の命令

3. tallyで一発解決!個数を数える魔法の命令
3. tallyで一発解決!個数を数える魔法の命令

「中身をまとめる必要はないから、とにかく何個あるかだけ知りたい!」というときに最強の武器になるのがtally(タリー)です。タリーとは、海外で数を数えるときに書く記号のことです。日本でいう「正」の字を書く集計作業を、この命令一つで代行してくれます。

先ほどの果物のリストにtallyを使ってみると、どれだけ簡単か分かります。


fruits = ["リンゴ", "バナナ", "リンゴ", "ミカン", "バナナ", "リンゴ"]

# 種類ごとの個数を数える
counts = fruits.tally

puts counts

実行結果は以下のようになります。


{"リンゴ"=>3, "バナナ"=>2, "ミカン"=>1}

どうでしょうか?group_byよりもスッキリとした結果になりました。リンゴが3個、バナナが2個という風に、一目で数が分かりますね。このtallyは比較的新しいRubyの機能ですが、非常に便利なので、現在のプログラミング現場では頻繁に使われています。アンケート結果の集計や、商品の在庫数確認などに最適です。

4. 条件でグループ分け!文字数や奇数・偶数での分類

4. 条件でグループ分け!文字数や奇数・偶数での分類
4. 条件でグループ分け!文字数や奇数・偶数での分類

group_byのすごいところは、ただ名前で分けるだけでなく、自分で決めた「条件」でグループを作れる点です。例えば、数字のリストを「偶数」と「奇数」に分けたり、言葉を「文字の長さ」で分けたりすることができます。

ここでは、単語の長さに注目して、3文字の言葉と4文字の言葉にグループ分けしてみましょう。


words = ["ペン", "ノート", "消しゴム", "机", "カバン"]

# 文字の長さでグループ分け
grouped_words = words.group_by do |word|
  word.length
end

puts grouped_words

実行結果は以下のようになります。


{2=>["ペン", "カバン"], 3=>["ノート"], 4=>["消しゴム"], 1=>["机"]}

word.lengthは、文字の長さを測る命令です。これにより、「2文字のグループにはこれ」「3文字のグループにはこれ」という風に、コンピュータが自動で仕分けをしてくれました。整理整頓が得意な秘書が横にいてくれるような感覚ですね。

5. 複雑なデータの集計に挑戦!成績表の分類

5. 複雑なデータの集計に挑戦!成績表の分類
5. 複雑なデータの集計に挑戦!成績表の分類

現実のプログラムでは、単なる文字のリストではなく、名前や点数がセットになった複雑なデータを扱うことが多いです。例えば、テストを受けた生徒たちのデータを「合格」と「不合格」に分けて集計してみましょう。

ここでは、点数が80点以上なら「合格」、そうでなければ「不合格」という条件でグループを作ります。


students = [
  { name: "田中", score: 90 },
  { name: "佐藤", score: 75 },
  { name: "鈴木", score: 85 },
  { name: "高橋", score: 60 }
]

# 合格か不合格かでグループ分け
exam_results = students.group_by do |student|
  if student[:score] >= 80
    "合格"
  else
    "不合格"
  end
end

puts "合格者: #{exam_results["合格"]}"
puts "不合格者: #{exam_results["不合格"]}"

実行結果は以下のようになります。


合格者: [{:name=>"田中", :score=>90}, {:name=>"鈴木", :score=>85}]
不合格者: [{:name=>"佐藤", :score=>75}, {:name=>"高橋", :score=>60}]

このように、複雑な中身を維持したまま、特定の条件で仕分けができるのがgroup_byの強みです。もしここで人数だけが知りたければ、この後にさらに数を数える命令を組み合わせることも可能です。

6. ハッシュという仕組みを詳しく知ろう

6. ハッシュという仕組みを詳しく知ろう
6. ハッシュという仕組みを詳しく知ろう

ここまで何度も出てきた{ "キー" => 値 }という形をハッシュと呼びます。プログラミング未経験の方には、「見出し」と「中身」がセットになった辞書のようなものだと考えてください。

group_bytallyを使ったとき、コンピュータはこのハッシュの形で結果を返してくれます。なぜこの形なのかというと、後から「リンゴの数は?」「合格者のリストは?」と尋ねたときに、コンピュータが一番速く答えを見つけ出せる形だからです。このハッシュを使いこなせるようになると、Rubyでのデータ操作が一気に楽しくなりますよ。

7. tallyとgroup_byの使い分けのポイント

7. tallyとgroup_byの使い分けのポイント
7. tallyとgroup_byの使い分けのポイント

最後に、どちらを使えばいいか迷ったときの判断基準を整理しましょう。プログラミングにおいて、適切な道具を選ぶことは、料理で包丁とピーラーを使い分けるのと同じくらい大切です。

  • 「中身を丸ごと」種類別に分けて保存しておきたいときは、group_by
  • 「何個あるか」という数だけを効率よく知りたいときは、tally

以前はgroup_byを使ってから数を数えるという手間が必要でしたが、tallyが登場したことで、数えるだけの作業はとても楽になりました。まずは「数えたいのか、分けたいのか」を自分に問いかけてみてください。

8. エラーを出さないための入力のコツ

8. エラーを出さないための入力のコツ
8. エラーを出さないための入力のコツ

パソコンを初めて触る方は、プログラムを書くときに「全角」と「半角」の違いに気をつけてください。Rubyの命令はすべて半角で書く必要があります。例えば、group_byの間に全角のスペースが入ってしまうと、コンピュータは機嫌を損ねて動いてくれません。

また、doendの間に書く処理もしっかり確認しましょう。自分がコンピュータになったつもりで、一行ずつ「今はこのデータを仕分けしているんだな」とイメージしながら書くのがコツです。最初は間違えても大丈夫。エラーのメッセージも、コンピュータがあなたに「ここが分からないよ!」と伝えているお手紙だと思って、優しく見守ってあげてください。

9. 実生活に活かせるデータ集計の考え方

9. 実生活に活かせるデータ集計の考え方
9. 実生活に活かせるデータ集計の考え方

今回学んだgroup_bytallyの考え方は、プログラミング以外でも役に立ちます。散らかった部屋を整理するときに、まず「衣類」「本」「ゴミ」とグループに分けるのはまさにgroup_byですし、冷蔵庫の中に卵が何個あるか数えるのはtallyです。こうした論理的な考え方が身につくと、パソコン操作も次第にスムーズになっていきます。

Rubyは、こうした人間の日常的な考え方をそのままプログラムにしやすい言語です。今日学んだことをきっかけに、身の回りのものを「これはどうやってグループ化できるかな?」と考えてみると、プログラミングの上達がもっと速くなりますよ。一歩ずつ、楽しみながら進んでいきましょう!

カテゴリの一覧へ
新着記事
New1
Rails
Rails GoodJob入門!PostgreSQLベースのバックグラウンド処理を初心者向けに完全解説
New2
Ruby
Rubyで学ぶビット演算入門:&・|・^・~・<<・>>の基礎と実例
New3
Rails
RESTとRailsの関係を徹底解説!resources設計と7つの標準アクションを初心者向けにわかりやすく解説
New4
データベース
MySQLアーキテクチャ入門!初心者向けに基本構造と仕組みを徹底解説
人気記事
No.1
Java&Spring記事人気No1
Ruby
Rubyのreduceとinject入門!合計計算や集計を初心者向けに分かりやすく解説
No.2
Java&Spring記事人気No2
Ruby
Rubyの始め方ガイド:インストールから最初のHello Worldまで(Windows/Mac/Linux)
No.3
Java&Spring記事人気No3
Ruby
Rubyの文字列エンコーディング完全ガイド!Encoding・force_encoding・encodeを初心者向け解説
No.4
Java&Spring記事人気No4
データベース
PostgreSQLのWHERE句を徹底解説!初心者でもわかるSQLデータ抽出の基本
No.5
Java&Spring記事人気No5
Ruby
Rubyのfind/detect/find_indexを徹底解説!目的のデータを素早く探す方法
No.6
Java&Spring記事人気No6
Ruby
Rubyのselect/reject/filterの使い方を完全解説!初心者向けの条件抽出レシピ
No.7
Java&Spring記事人気No7
Ruby
Rubyで比較演算子を完全解説!==・===・<=>・eql? の使い分け
No.8
Java&Spring記事人気No8
データベース
PostgreSQLで順位付け!ROW_NUMBER関数の使い方を初心者向けに徹底解説