Upgrade to Pro — share decks privately, control downloads, hide ads and more …

『データ可視化学入門』を PythonからRに翻訳した話


bob3bob3
February 09, 2024

『データ可視化学入門』を PythonからRに翻訳した話


『指標・特徴量の設計から始めるデータ可視化学入門』を PythonからRに翻訳した話
です。

bob3bob3

February 09, 2024
Tweet

More Decks by bob3bob3

Other Decks in Science

Transcript

  1. 『データ可視化学入門』を
    PythonからRに翻訳した話

    Iruma.R #1 (2024/02/10)

    @bob3bob3


    View full-size slide

  2. 『データ可視化学入門』
    『指標・特徴量の設計から始めるデータ可視化学
    入門 データを洞察につなげる技術』 

    ● 2023年12月発売

    ● 発売前から周囲での前評判が良かったので
    買ってみた。

    ● 単なるハウツー本ではなくて、「分布をどう捉
    えるか」「どう指標化するか。指標化で何が
    失われるか」といった分析プロセスを踏まえ
    た視点で書かれているのが良い。 

    ● 加えて、ほとんどの可視化例について
    Pythonのコードが公開されているので、すぐ
    に試せる。


    View full-size slide

  3. Pythonだと……?


    View full-size slide

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

    View full-size slide

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

    View full-size slide

  6. ここで公開されてます
    ● 本家(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

    View full-size slide

  7. どうやって翻訳したか
    ● 文明の利器 ChatGPT を使わない手はない。

    ● 実際には Copilot (旧Bing Chat)を使いました。

    ● PythonのコードをCopilotに与えて「R言語で書き直してください」とお願いするだけ。

    ● ただし、そのまま使えるコードが出てくることは多くない。

    ● それでもかなりの工数を削減できた。


    View full-size slide

  8. 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の原文

    View full-size slide

  9. 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パッケージをなぜ
    か呼び出してる。

    View full-size slide

  10. 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)

    View full-size slide

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

    View full-size slide

  12. 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の原文。

    View full-size slide

  13. 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であって欲しい

    View full-size slide

  14. 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()
    }
    }

    View full-size slide

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

    View full-size slide

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

    View full-size slide