Slide 1

Slide 1 text

『データ可視化学入門』を PythonからRに翻訳した話
 Iruma.R #1 (2024/02/10)
 @bob3bob3


Slide 2

Slide 2 text

『データ可視化学入門』 『指標・特徴量の設計から始めるデータ可視化学 入門 データを洞察につなげる技術』 
 ● 2023年12月発売
 ● 発売前から周囲での前評判が良かったので 買ってみた。
 ● 単なるハウツー本ではなくて、「分布をどう捉 えるか」「どう指標化するか。指標化で何が 失われるか」といった分析プロセスを踏まえ た視点で書かれているのが良い。 
 ● 加えて、ほとんどの可視化例について Pythonのコードが公開されているので、すぐ に試せる。


Slide 3

Slide 3 text

Pythonだと……?


Slide 4

Slide 4 text

可視化ならRだろ!!!1!1!

Slide 5

Slide 5 text

ということで。 コードを公開しているgithubを見に行ったら > 本サンプルコードをRやMATLABで書き直したものを公開しても良いか > 大歓迎です。ご連絡いただければこちらからリンクを張らせていただきます。 と書かれていたので、これ幸いとPythonからRへの翻訳を開始。 なかなか大変でしたが、一応完成。 本家からもリンクを張ってもらえました。

Slide 6

Slide 6 text

ここで公開されてます ● 本家(Python) ○ https://github.com/tkEzaki/data_visualization ● R版 ○ https://morimotoosamu.github.io/data_visualization/ ● MATLAB版 ○ https://github.com/minoue-xx/MATLAB-example-for-An-Introduction-to-Data-Visualization

Slide 7

Slide 7 text

どうやって翻訳したか ● 文明の利器 ChatGPT を使わない手はない。
 ● 実際には Copilot (旧Bing Chat)を使いました。
 ● PythonのコードをCopilotに与えて「R言語で書き直してください」とお願いするだけ。
 ● ただし、そのまま使えるコードが出てくることは多くない。
 ● それでもかなりの工数を削減できた。


Slide 8

Slide 8 text

ChatGPTによる翻訳例(1) import matplotlib.pyplot as plt # matplotlibのpyplotをpltとしてインポート import pandas as pd # pandasをpdとしてインポート import seaborn as sns # seabornをsnsとしてインポート import japanize_matplotlib # matplotlibで日本語を表示可能にする # データを辞書形式で提供 data = { 'year': list(range(1990, 2023)), # 年(1990年から2022年まで) 'population': [1.23611, 1.24101, 1.24567, 1.24938, 1.25265, 1.2557, 1.25859, 1.26157, 1.26472, 1.26667, 1.26926, 1.27316, 1.27486, 1.27694, 1.27787, 1.27768, 1.27901, 1.28033, 1.28084, 1.28032, 1.28057, 1.27834, 1.27593, 1.27414, 1.27237, 1.27095, 1.27042, 1.26919, 1.26749, 1.26555, 1.26146, 1.25502, 1.24947] # 人口(億人単位) } df = pd.DataFrame(data) # pandasデータフレームにデータを変換 plt.figure(figsize=(5, 3)) # グラフのサイズを指定 sns.lineplot(x='year', y='population', data=df, marker='o', linestyle='-') # 折れ線グラフの描画 plt.xlabel("西暦") # x軸のラベル plt.ylabel("日本の総人口 [億人]") # y軸のラベル plt.grid(True) # グリッドを表示 plt.tight_layout() # レイアウトの調整 plt.savefig("1_1_3_population_line_plot.png", dpi=300) # グラフをファイルに保存 plt.show() # グラフの表示 Pythonの原文

Slide 9

Slide 9 text

ChatGPTによる翻訳例(1) # 必要なパッケージのインポート library(ggplot2) library(gridExtra) # データの作成 year <- seq(1990, 2022) # 年(1990年から2022年まで) population <- c(1.23611, 1.24101, 1.24567, 1.24938, 1.25265, 1.2557, 1.25859, 1.26157, 1.26472, 1.26667, 1.26926, 1.27316, 1.27486, 1.27694, 1.27787, 1.27768, 1.27901, 1.28033, 1.28084, 1.28032, 1.28057, 1.27834, 1.27593, 1.27414, 1.27237, 1.27095, 1.27042, 1.26919, 1.26749, 1.26555, 1.26146, 1.25502, 1.24947) # 人口(億人単位) # データフレームに変換 df <- data.frame(year, population) # グラフの作成 p <- ggplot(df, aes(x=year, y=population)) + geom_line() + geom_point() + labs(x="西暦", y="日本の総人口 [億人]") + theme_bw() + theme(panel.grid.major = element_line(colour = "grey80")) # グラフの表示 print(p) 不要なgridExtraパッケージをなぜ か呼び出してる。

Slide 10

Slide 10 text

Geminiによる翻訳例 # ライブラリの読み込み library(ggplot2) library(tidyverse) # データの準備 year <- seq(1990, 2022) population <- c(1.23611, 1.24101, 1.24567, 1.24938, 1.25265, 1.2557, 1.25859, 1.26157, 1.26472, 1.26667, 1.26926, 1.27316, 1.27486, 1.27694, 1.27787, 1.27768, 1.27901, 1.28033, 1.28084, 1.28032, 1.28057, 1.27834, 1.27593, 1.27414, 1.27237, 1.27095, 1.27042, 1.26919, 1.26749, 1.26555, 1.26146, 1.25502, 1.24947) data <- data.frame(year = year, population = population) # 折れ線グラフの描画 ggplot(data, aes_string(x = "year", y = "population")) + geom_line(colour = "black", size = 1.2) + geom_point(colour = "red", size = 3) + labs(x = "西暦", y = "日本の総人口 [億人]") + theme_minimal() + theme(legend.position = "none") + scale_x_continuous(breaks = seq(1990, 2022, 5)) + scale_y_continuous(breaks = seq(1.24, 1.28, 0.02)) + grid(alpha = 0.5) # グラフの保存 ggsave("1_1_3_population_line_plot.png", width = 5, height = 3, dpi = 300)

Slide 11

Slide 11 text

ChatGPTによる翻訳例(1) Python版 R版(ChatGPT翻訳の一例) R版(Gemini翻訳の一例)

Slide 12

Slide 12 text

ChatGPTによる翻訳例(2) import seaborn as sns # グラフ作成のための Seaborn import matplotlib.pyplot as plt # グラフ描画のための Matplotlib import japanize_matplotlib # Matplotlibで日本語を使用可能にする from scipy import stats # 統計解析のためSciPyを読み込み plt.rcParams["font.size"] = 16 # フォントサイズの設定 penguins = sns.load_dataset("penguins") # データセットの読み込み lm = sns.lmplot(x='bill_length_mm', y='body_mass_g', hue='species', data=penguins, scatter_kws={'alpha': 0.3}, legend=False) # 回帰直線を描画 # 種ごとに回帰直線を描画 for species in penguins.species.unique(): if species is not None: # Exclude NaN species_data = penguins[penguins.species == species].dropna() # NaNを除外 slope, intercept, r_value, p_value, std_err = stats.linregress( species_data['bill_length_mm'], species_data['body_mass_g'] ) # 線形回帰分析 # 相関係数とp値の出力 print(f"For {species}:\n r value is: {r_value}\n p_value is: {p_value}") plt.xlabel('くちばしの長さ [mm]') # x軸ラベル plt.ylabel('体重 [g]') # y軸ラベル plt.show() # グラフの表示 Pythonの原文。

Slide 13

Slide 13 text

ChatGPTによる翻訳例(2) library(ggplot2) library(palmerpenguins) # データセットの読み込み data("penguins") # 種ごとに回帰直線を描画 species_list <- unique(penguins$species) for (species in species_list) { if (!is.na(species)) { # Exclude NA species_data <- subset(penguins, species == species) # NAを除外 fit <- lm(body_mass_g ~ bill_length_mm, data = species_data) # 線形回帰分析 print(summary(fit)) # 相関係数とp値の出力 } } # 回帰直線を描画 ggplot(penguins, aes(x = bill_length_mm, y = body_mass_g, color = species)) + geom_point(alpha = 0.3) + geom_smooth(method = "lm", se = FALSE) + labs(x = "くちばしの長さ [mm]", y = "体重 [g]") + theme(legend.position = "none") # 凡例を削除 信頼区間はTRUEであって欲しい

Slide 14

Slide 14 text

Gemini翻訳の一例(2) # ライブラリの読み込み library(ggplot2) library(tidyverse) library(lmtest) # データセットの読み込み penguins <- penguins # 回帰直線と散布図を描画 ggplot(penguins, aes_string(x = "bill_length_mm", y = "body_mass_g", color = "species")) + geom_point(alpha = 0.3) + geom_smooth(method = "lm", se = FALSE) + labs(x = "くちばしの長さ [mm]", y = "体重 [g]") + theme_minimal() # 種ごとに回帰直線と相関係数、 p値を出力 for (species in unique(penguins$species)) { if (!is.na(species)) { # NaNを除外 species_data <- penguins[penguins$species == species, !is.na(penguins[[species]])] # 線形回帰分析 lm_result <- lm(body_mass_g ~ bill_length_mm, data = species_data) # 結果の出力 print(paste0("**", species, "**")) print(paste0("相関係数:", summary(lm_result)$r.squared)) print(paste0("p値:", summary(lm_result)$coefficients[["bill_length_mm", "Pr(>|t|)"])) print() } }

Slide 15

Slide 15 text

ChatGPTによる翻訳例(2) Python版 R版(ChatGPT翻訳の一例) R版(Gemini翻訳の一例)

Slide 16

Slide 16 text

まとめ ● 他言語からRへ翻訳するのにChatGPTはなかなか役に立つ。 ○ そのままは使えないが下訳として使うことでだいぶ工数を減らせる。 ○ ヒドイ翻訳例もあったがメリットの方が大きくて忘れた …… ○ 使いたいパッケージや関数を明示すると意図したように書いてくれることが多い。 ■ 例えば、原文のfor文に対して「purrrパッケージのmap関数を使ってください」などと指示す る。 ○ Copilot(旧BingChat)で十分。 ■ ただし、Edgeは💩なのでご注意を。ポータルが最悪。 ○ Geminiも悪くなさそう。 ● Enjoy!