행렬(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
위 코드는 다음과 같은 차트를 생성합니다:

생성된 차트는 코드 파일과 같은 폴더에 HTML 파일로 저장됩니다.
Rails 애플리케이션에서 Daru를 사용하려면 daru-view 젬을 추가하거나, chartkick 같은 다른 시각화 젬을 사용하는 것이 좋습니다.
마무리
이번 글에서는 Ruby에서 행렬을 다루는 방법을 배웠습니다. 이제 2차원 데이터를 자유롭게 활용할 수 있습니다!
간단한 배열 기반 행렬부터 시작해, 수학 연산이 필요하면 Matrix 클래스를, 본격적인 데이터 분석과 시각화가 필요하면 Daru 젬을 활용해 보세요.
읽어주셔서 감사합니다. 많은 분들이 이 글을 볼 수 있도록 공유 부탁드립니다!