Skip to content

Commit 1a84ea2

Browse files
authored
Merge pull request #3 from tikkss/code-party-rubykaigi-2025
Add Code Party RubyKaigi 2025 Red Data Tools
2 parents 23c1fa8 + c134086 commit 1a84ea2

File tree

1 file changed

+201
-0
lines changed

1 file changed

+201
-0
lines changed
Lines changed: 201 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,201 @@
1+
---
2+
title: Code Party RubyKaigi 2025 Red Data Tools
3+
author: Tsutomu Katsube (@tikkss)
4+
format:
5+
pdf:
6+
toc: true
7+
toc-title: Contents
8+
number-sections: true
9+
colorlinks: true
10+
pdf-engine: lualatex
11+
documentclass: ltjsarticle
12+
highlight-style: github
13+
jupyter: ruby
14+
---
15+
16+
Red Data Tools プロダクトによるデータ解析
17+
===
18+
19+
Ruby でもたのしくデータ処理しよう!
20+
---
21+
22+
Red Data Tools のプロジェクトページはこちら:
23+
24+
* English: https://red-data-tools.github.io/
25+
* 日本語: https://red-data-tools.github.io/ja/
26+
27+
前準備
28+
---
29+
30+
このノートブックでは、次の Red Data Tools プロダクトを利用したデータ解析を実演します。
31+
32+
* Red Datasets: よく利用されるオープンなデータセット集を共通の API で利用できる
33+
* RedAmber: Apache Arrow ベースの高速なデータフレーム
34+
* Charty: データの可視化をおこなうライブラリー
35+
36+
これらのライブラリがインストールされた環境がそろうリポジトリを用意しています。次のコマンドを実行してリポジトリをローカルにクローンします。
37+
38+
```console
39+
$ git clone https://github.com/tikkss/100knocks-preprocess-ruby.git
40+
```
41+
42+
ローカルにクローンしたリポジトリーを、次のコマンドを実行して VS Code で開きます。
43+
44+
```console
45+
$ code 100knocks-preprocess-ruby
46+
```
47+
48+
コンテナーで開きます。
49+
50+
左下隅のステータスバーのリモートホスト表示(今はローカルなので「><」の後ろに何もついていない)をクリックします。
51+
52+
するとリモートウィンドウを開くオプションが表示されるので、「Reopen in Container」をクリックします。
53+
54+
コンテナーの構築が開始されます
55+
56+
最初の構築には、数分かかります。
57+
構築が完了すると、左下隅のステータスバーのリモートホスト表示にコンテナー名が表示されます。
58+
59+
ターミナルを新しく開き、次のコマンドを実行して予め用意してあるノートブックを作成し、 Jupyter Lab を起動します。
60+
61+
```console
62+
$ rake jupyter
63+
```
64+
65+
右下隅に表示される Open in Browser をクリックして、ブラウザーから Jupyter Lab を開きます。
66+
左側に表示されているノートブック一覧から `code-party-rubykaigi-2025-red-data-tools.ipynb` をダブルクリックして開きます。
67+
68+
実演
69+
---
70+
71+
このノートブックでは Red Datasets で提供されている Penguins データセットを利用します。まずは Red Datasets をロードします。
72+
73+
```{ruby}
74+
require "datasets"
75+
```
76+
77+
データセットをリモートから取得します。結果のデータセットは変数 `penguins` に入れます。
78+
Penguins データセットは、南極のパーマー諸島の3つの島から収集された3種類のペンギンのデータをまとめたものです。
79+
80+
```{ruby}
81+
penguins = Datasets::Penguins.new
82+
```
83+
84+
`#each` でデータを取得できます。 1 件だけデータを取得します。
85+
86+
```{ruby}
87+
penguins.each.first
88+
```
89+
90+
データ分析するときはデータフレームが便利です。 RedAmber をロードします。
91+
92+
```{ruby}
93+
require "red_amber"
94+
```
95+
96+
RedAmber のバックエンドは Apache Arrow 形式なので、
97+
Apache Arrow 形式に対応した Red Datasets Arrow もロードします。
98+
99+
```{ruby}
100+
require "datasets-arrow"
101+
```
102+
103+
データセットからデータフレームを作成します。結果のデータフレームは変数 `df` に入れます。
104+
105+
```{ruby}
106+
df = RedAmber::DataFrame.new(penguins)
107+
```
108+
109+
データの全体像をつかむには `#tdr` が便利です。
110+
111+
```{ruby}
112+
df.tdr
113+
```
114+
115+
データフレーム全体で 344 行あり、8列(Vectors)あることがわかります。
116+
それぞれのカラムは次のような構成になっています。
117+
118+
カラム|型|意味
119+
-----|-----|-----
120+
species|文字列|ペンギンの種類
121+
island|文字列|島
122+
bill_length_mm|倍精度浮動小数点数|くちばしの長さ(mm)
123+
bill_depth_mm|倍精度浮動小数点数|くちばしの深さ(mm)
124+
flipper_length_mm|整数|フリッパーの長さ(mm)
125+
body_mass_g|整数|体重(g)
126+
sex|文字列|性別
127+
year|整数|年
128+
129+
全体像がつかめたので、次はデータフレームの先頭 10 行の内容を確認します。
130+
131+
```{ruby}
132+
df.head(10)
133+
```
134+
135+
データの統計サマリーをつかむには `#summary` メソッドが便利です。
136+
137+
```{ruby}
138+
df.summary
139+
```
140+
141+
body_mass_g カラムはペンギンの体重です。ペンギンの平均体重は約 4,200g で、一番軽いペンギンは 2,700g です。一番重いペンギンは 6,300 g です。
142+
143+
ペンギンの種類ごとの平均体重を図で表します。
144+
まず、図を描くために Charty をロードします。
145+
146+
```{ruby}
147+
require "charty"
148+
```
149+
150+
Charty のバックエンドは Pyplot を使用します。
151+
Jupyter Notebook で図示できるように IRuby との統合機能を有効化しておきます。
152+
153+
```{ruby}
154+
Charty::Backends.use(:pyplot)
155+
Charty::Backends::Pyplot.activate_iruby_integration
156+
```
157+
158+
これで図を描くための準備が整いました。
159+
ペンギンの種類毎の平均体重を縦棒グラフで描いてみましょう。
160+
Charty は RedAmber に対応していませんが、 Apache Arrow 形式には対応しています。
161+
そのため、RedAmber のメソッド `to_arrow` を呼び出して Apache Arrow 形式に変換したものを Charty に渡します。
162+
163+
```{ruby}
164+
Charty.bar_plot(data: df.to_arrow, x: :species, y: :body_mass_g)
165+
```
166+
167+
Gentoo ペンギンが一番重たいことがひと目でわかります。
168+
オスだけだとどうなんでしょう?同じグラフでオスについて描いてみます。
169+
170+
```{ruby}
171+
df_male = df.slice {sex == "male"}
172+
Charty.bar_plot(data: df_male.to_arrow, x: :species, y: :body_mass_g)
173+
```
174+
175+
さらにメスについても描いてみます。
176+
177+
```{ruby}
178+
df_female = df.slice {sex == "female"}
179+
Charty.bar_plot(data: df_female.to_arrow, x: :species, y: :body_mass_g)
180+
```
181+
182+
オスとメスの違いをわかりやすく可視化するために、それぞれ色を変えて同時に可視化してみます。
183+
キーワード引数 `color` に、性別カラムを指定してみましょう。
184+
185+
```{ruby}
186+
Charty.bar_plot(data: df.to_arrow, x: :species, y: :body_mass_g, color: :sex)
187+
```
188+
189+
オスの方が体重が重たいことがひと目でわかります。
190+
191+
まとめ
192+
---
193+
194+
このノートブックでは、Penguins データを取得して、データフレームで分析し、可視化までを実践しました。
195+
Red Data Tools プロダクトを使うと、 Ruby でたのしくデータ処理できます!
196+
197+
私も Ruby 用のデータ処理ツールを開発してみたい!という人は Red Data Tools のチャットに来てください。
198+
一緒に開発していきましょう!
199+
200+
* English: https://app.element.io/#/room/#red-data-tools-en:matrix.org
201+
* 日本語: https://app.element.io/#/room/#red-data-tools-ja:matrix.org

0 commit comments

Comments
 (0)