Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Rubyのマトリックス(行列)とは?配列・Matrixクラス・Daruを使いこなす完全ガイド

マトリックス(行列)とは、表計算ソフトのようなデータを格納・操作するための2次元(2D)配列のことです。

マトリックスが活躍する場面

  • チェスやオセロなど、テーブルゲームの盤面を表現する
  • 統計処理やデータ分析を行う
  • グラフやプロットを生成する

マトリックスは非常に強力なデータ構造なので、その使い方をマスターしておくと開発の幅が大きく広がります。この記事では、Rubyでマトリックスを扱う3つの方法——配列、Matrixクラス、そしてDaru gem——を順番に解説していきます。

Rubyでマトリックスを作成する方法

最もシンプルな方法は、配列の入れ子(ネスト)を使ってマトリックスを作ることです。

以下のように記述します

matrix = [
  [1,2,3],
  [4,5,6],
  [7,8,9]
]

これで3×3のマトリックスが完成します。ゲームの盤面や座標の集合のように、2次元データを手軽に保存したい場合には、この配列方式がベストな選択肢です。

しかし、マトリックス同士を足し算・引き算・掛け算で組み合わせたい場合はどうすればよいのでしょうか?

そんなときに便利なのが、Ruby標準ライブラリの Matrix クラスです。

使い方はこちら

require 'matrix'

a = Matrix[[1,2,3], [4,5,6], [7,8,9]]
b = Matrix[[1,2,3], [4,5,6], [7,8,9]]

これで足し算ができます

a + b
# Matrix[[2, 4, 6], [8, 10, 12], [14, 16, 18]]

要素へのアクセス方法の違いに注意

Matrix クラスでは、個々の値に次のようにアクセスします:

a[0, 1]

これは配列版とは書き方が異なります。配列の場合は、次のような構文になります:

matrix[0][1]

Matrix はカンマ区切りで行と列を指定するのに対し、ネストした配列ではブラケットを連続して指定する点に注意しましょう。

転置(トランスポーズ)

配列でもマトリックスでも、転置(transpose)を行えます。転置とは、行を列に、列を行に入れ替える操作のことです。

matrix.transpose

# [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

覚えておきたい重要なポイント

Matrix オブジェクトはイミュータブル(不変)です。つまり、新しいマトリックスを作成しない限り、既存の値を変更することはできません。また、この Matrix クラスは主に数学的な演算向けに設計されています。本格的なデータ分析や統計処理を行いたい場合は、さらに強力なツールが必要になります。

そこで登場するのが……

Daru gemによるデータ分析

Daru は、マトリックスの操作、統計値の取得、整形されたテーブル形式での出力を可能にするgemです。さらに、Rubyのグラフ描画系gemとも連携できるため、データからグラフやチャートを生成することもできます。

具体例を見てみましょう

require 'daru'

df = Daru::DataFrame.new(
    {
      "A" => [1,2,3],
      "B" => [4,5,6],
      "C" => [7,8,9]
    },
     index: ["A", "B", "C"]
   )

このコードを実行すると、次のようなテーブルが出力されます

    A   B   C
A   1   4   7
B   2   5   8
C   3   6   9

列へのアクセス

特定の列には、列名を指定してアクセスできます:

df['A']

数値インデックスでのアクセスも可能です:

df[0]

統計情報の取得

統計サマリーは次のようにして取得できます

df['B'].describe

#         statistics
# count            3
# mean           5.0
# std            1.0
# min              4
# max              6

件数(count)、平均(mean)、標準偏差(std)、最小値(min)、最大値(max)といった基本統計量が一目でわかります。

CSVやExcelからのデータ読み込み

Daruの最大の魅力は何でしょうか?

それは、CSVファイルやActiveRecord、さらにはExcelファイルから直接データを読み込めることです。

df = Daru::DataFrame.from_csv('healthy_food.csv')

where句によるデータ抽出

where 式を使えば、条件に合致するデータだけを絞り込むこともできます。

たとえば……

「carbs(炭水化物)」という列がある場合、値が25未満の行をすべて抽出できます。

次のように記述します

df.where(df['carbs'].lt(25))

グループ化と集計

さらに、データフレームに対して sort(ソート)、group_by(グループ化)、aggregate(集計)を行うことも可能です。

df = Daru::DataFrame.new(
    {  str: %w(a b c d a),
       num: [52,12,7,17,1] }
    )

df.group_by(:str).aggregate(num: :sum)

#    num
# a   53
# b   12
# c    7
# d   17

文字列ごとにグループ化し、数値の合計を一瞬で集計できました。

Daruでグラフを描画する

Daruを使えば、データを視覚的に表現し、HTMLファイルとしてエクスポートできます。

以下はその例です

df = Daru::DataFrame.new(
  {'Cat Names' => %w(Kitty Leo Felix),
    'Weight'   => [2,3,5]}
  )

df.plot(type: :bar, x: 'Cat Names', y: 'Weight') do |plot, _|
  plot.x_label 'Cat Name'
  plot.y_label 'Weight'

  plot.yrange [0, 5]
end
.export_html

このコードを実行すると、次のような棒グラフが生成されます:

Rubyのマトリックス(行列)とは?配列・Matrixクラス・Daruを使いこなす完全ガイド

生成されたチャートは、コードと同じフォルダ内にHTMLファイルとして保存されます。

RailsアプリケーションでDaruを使いたい場合は、daru-view gemを追加するか、chartkickなど別のグラフ描画gemを利用するとよいでしょう。

まとめ

この記事では、Rubyで2次元データを扱うためのマトリックスについて学びました。ポイントをおさらいしましょう:

  • ネストした配列:盤面などの単純な2次元データに最適
  • Matrixクラス:イミュータブルで、数学的な演算に強い
  • Daru gem:統計分析、CSV読み込み、フィルタリング、グラフ描画までこなせる本格派

用途に応じてこれらを使い分けることで、Rubyでのデータ処理がぐっと快適になります。ぜひ実際のコードで試してみてください!

この記事が役に立ったら、ぜひ周りの方にもシェアしてください。最後までお読みいただき、ありがとうございました。

  1. iPhoneの「ガイド付きアクセス」とは?設定方法と使い方を徹底解説

    ガイド付きアクセスとは? スマートフォンを人に渡すと、つい画面を覗き見されてしまう——こんな経験はありませんか?友達に面白い写真を見せるつもりでiPhoneを渡したのに、気づけば勝手にスクロールされ、個人的なデータまで見られていた…。こうした事態を防ぐために、Appleは「ガイド付きアクセス(Guided Access)」という機能を用意しています。 画像出典: Imore.com ガイド付きアクセスは、iPhoneやiPadでひとつの作業に集中できるよう設計されたアクセシビリティ機能です。デバイスの使用を単一のアプリに制限するだけでなく、そのアプリ内で使える機能まで細かくコントロールできま

  2. RSSフィードとは?基本の仕組みとパソコンでの使い方を徹底解説

    読書は、豊富な知識を得られるだけでなく、対人スキルの向上にも役立つ健康的な習慣です。インターネットの普及により、紙を節約してエコに読書を楽しめるようになりましたが、その一方で「読む価値のあるコンテンツを見つけにくい」という新たな悩みも生まれています。膨大な情報の中から良質な記事を選び出すのは、ネット読書における大きな課題の一つです。 そんな問題を解決するために開発されたのがRSSフィードです。RSSを活用すれば、読みたい・観たいコンテンツを探す手間が大幅に省けます。購読しているサイトや著者の最新情報が、RSSアグリゲーター(専用ソフト)に自動的に届くため、わざわざウェブサイトを訪問する必要があ