Rubyのgroup_byとtallyでデータ集計!カテゴリ別分類と件数カウントを初心者向けに解説
生徒
「Rubyで、バラバラにあるデータを種類ごとにまとめたり、それぞれ何個あるか数えたりする方法はありますか?」
先生
「それには、group_by(グループバイ)とtally(タリー)という便利な命令を使うのが一番ですよ。データの整理が驚くほど簡単になります。」
生徒
「種類ごとに分けるのがgroup_byで、個数を数えるのがtally、という感じでしょうか?」
先生
「その通りです!まさに学校のクラス分けや、アンケートの結果集計のような作業ですね。具体的なやり方を見ていきましょう!」
1. データの整理整頓とは?集計の基本を学ぼう
プログラミングを始めると、大量のデータを扱う場面がたくさん出てきます。例えば、100個のリンゴやミカンが箱に入っているとき、どれがどれだか分からない状態では困りますよね。そこで必要になるのが集計(しゅうけい)という作業です。
Rubyには、この集計作業を助けてくれる強力な味方がいます。一つは、仲間ごとにグループを作るgroup_by。もう一つは、正の字を書いて数を数えるように個数を出してくれるtallyです。これらを使うと、人間が手作業で行うと数時間かかるような作業も、コンピュータなら一瞬で終わらせることができます。パソコンを触ったことがない方でも、この二つの違いさえ押さえれば、データの達人になれますよ。
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で一発解決!個数を数える魔法の命令
「中身をまとめる必要はないから、とにかく何個あるかだけ知りたい!」というときに最強の武器になるのがtally(タリー)です。タリーとは、海外で数を数えるときに書く記号のことです。日本でいう「正」の字を書く集計作業を、この命令一つで代行してくれます。
先ほどの果物のリストにtallyを使ってみると、どれだけ簡単か分かります。
fruits = ["リンゴ", "バナナ", "リンゴ", "ミカン", "バナナ", "リンゴ"]
# 種類ごとの個数を数える
counts = fruits.tally
puts counts
実行結果は以下のようになります。
{"リンゴ"=>3, "バナナ"=>2, "ミカン"=>1}
どうでしょうか?group_byよりもスッキリとした結果になりました。リンゴが3個、バナナが2個という風に、一目で数が分かりますね。このtallyは比較的新しいRubyの機能ですが、非常に便利なので、現在のプログラミング現場では頻繁に使われています。アンケート結果の集計や、商品の在庫数確認などに最適です。
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. 複雑なデータの集計に挑戦!成績表の分類
現実のプログラムでは、単なる文字のリストではなく、名前や点数がセットになった複雑なデータを扱うことが多いです。例えば、テストを受けた生徒たちのデータを「合格」と「不合格」に分けて集計してみましょう。
ここでは、点数が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. ハッシュという仕組みを詳しく知ろう
ここまで何度も出てきた{ "キー" => 値 }という形をハッシュと呼びます。プログラミング未経験の方には、「見出し」と「中身」がセットになった辞書のようなものだと考えてください。
group_byやtallyを使ったとき、コンピュータはこのハッシュの形で結果を返してくれます。なぜこの形なのかというと、後から「リンゴの数は?」「合格者のリストは?」と尋ねたときに、コンピュータが一番速く答えを見つけ出せる形だからです。このハッシュを使いこなせるようになると、Rubyでのデータ操作が一気に楽しくなりますよ。
7. tallyとgroup_byの使い分けのポイント
最後に、どちらを使えばいいか迷ったときの判断基準を整理しましょう。プログラミングにおいて、適切な道具を選ぶことは、料理で包丁とピーラーを使い分けるのと同じくらい大切です。
- 「中身を丸ごと」種類別に分けて保存しておきたいときは、
group_by。 - 「何個あるか」という数だけを効率よく知りたいときは、
tally。
以前はgroup_byを使ってから数を数えるという手間が必要でしたが、tallyが登場したことで、数えるだけの作業はとても楽になりました。まずは「数えたいのか、分けたいのか」を自分に問いかけてみてください。
8. エラーを出さないための入力のコツ
パソコンを初めて触る方は、プログラムを書くときに「全角」と「半角」の違いに気をつけてください。Rubyの命令はすべて半角で書く必要があります。例えば、group_byの間に全角のスペースが入ってしまうと、コンピュータは機嫌を損ねて動いてくれません。
また、doとendの間に書く処理もしっかり確認しましょう。自分がコンピュータになったつもりで、一行ずつ「今はこのデータを仕分けしているんだな」とイメージしながら書くのがコツです。最初は間違えても大丈夫。エラーのメッセージも、コンピュータがあなたに「ここが分からないよ!」と伝えているお手紙だと思って、優しく見守ってあげてください。
9. 実生活に活かせるデータ集計の考え方
今回学んだgroup_byやtallyの考え方は、プログラミング以外でも役に立ちます。散らかった部屋を整理するときに、まず「衣類」「本」「ゴミ」とグループに分けるのはまさにgroup_byですし、冷蔵庫の中に卵が何個あるか数えるのはtallyです。こうした論理的な考え方が身につくと、パソコン操作も次第にスムーズになっていきます。
Rubyは、こうした人間の日常的な考え方をそのままプログラムにしやすい言語です。今日学んだことをきっかけに、身の回りのものを「これはどうやってグループ化できるかな?」と考えてみると、プログラミングの上達がもっと速くなりますよ。一歩ずつ、楽しみながら進んでいきましょう!