Computer >> 컴퓨터 >  >> 프로그래밍 >> Ruby

Ruby 행렬(Matrix) 완벽 가이드: 배열부터 Daru 젬까지

행렬(Matrix)은 스프레드시트와 같은 형태의 데이터를 저장하고 다룰 수 있는 2차원(2D) 배열입니다.

행렬은 다음과 같은 용도로 활용됩니다:

  • 체스, 체커 등 보드 게임의 게임판 표현
  • 통계 및 데이터 분석
  • 플롯(plot)과 그래프 생성

행렬은 매우 강력한 자료구조이기 때문에 사용법을 익혀두면 큰 도움이 됩니다.

Ruby에서 행렬 만들기

가장 간단한 방법은 배열을 중첩하여 행렬을 만드는 것입니다.

다음과 같이 작성합니다:

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

위 코드는 3×3 행렬을 생성하며, 게임판이나 좌표 집합처럼 2차원 데이터를 저장할 때 가장 좋은 선택입니다.

하지만 행렬끼리 덧셈, 뺄셈, 곱셈 등의 연산을 수행하고 싶다면 어떻게 해야 할까요?

이럴 때 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]

전치(Transpose) 연산

배열과 행렬 모두 전치(transpose)할 수 있습니다. 전치란 행을 열로, 열을 행으로 바꾸는 것을 의미합니다.

예시:

matrix.transpose

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

기억해야 할 점: Matrix 객체는 불변(immutable)이므로, 값을 변경하려면 새로운 행렬을 생성해야 합니다. 이 클래스는 주로 수학적 연산에 적합하며, 본격적인 데이터 분석과 통계 작업에는 더 강력한 도구가 필요합니다.

그 도구가 바로...

Daru 젬(Gem)

Daru는 행렬을 다루고, 통계를 추출하며, 깔끔하게 포맷된 테이블로 출력할 수 있게 해주는 Ruby 젬입니다. 또한 Ruby의 시각화 젬들과 연동되어 데이터로부터 플롯과 그래프를 생성할 수 있습니다.

예시를 살펴보겠습니다:

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

다양한 데이터 소스 지원

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 젬을 추가하거나, chartkick 같은 다른 시각화 젬을 사용하는 것이 좋습니다.

마무리

이번 글에서는 Ruby에서 행렬을 다루는 방법을 배웠습니다. 이제 2차원 데이터를 자유롭게 활용할 수 있습니다!

간단한 배열 기반 행렬부터 시작해, 수학 연산이 필요하면 Matrix 클래스를, 본격적인 데이터 분석과 시각화가 필요하면 Daru 젬을 활용해 보세요.

읽어주셔서 감사합니다. 많은 분들이 이 글을 볼 수 있도록 공유 부탁드립니다!