見出し画像

「入門はじめての多変量解析」をPythonで写経 Vol.6 ~ 2章「はじめての重回帰分析」⑤重回帰分析のケーススタディ

2章「はじめての重回帰分析」

書籍の著者 石村貞夫 先生、石村光資郎 先生


書籍「入門はじめての多変量解析」2章「はじめての重回帰分析」の Python写経活動記録 です。 

多変量解析の入門を Python と一緒に学ぶ写経シリーズです。

この記事は、重回帰分析のケーススタディ を取り扱います。
書籍のシナリオに沿って Python による重回帰分析を実践します。

ChatGPT 活用型学習で進めてまいります!
では書籍を開いて多変量解析の旅に出かけましょう🚀

手をつないだ世界の人々のイラスト:「いらすとや」さんより

はじめに


このブログシリーズは、書籍「入門はじめての多変量解析」(東京図書、「テキスト」と呼びます)の Python 写経を通じて得た「多変量解析の楽しさ」をご紹介します。

書籍の紹介と引用表記はリンク先の記事に掲載しています。

2章 はじめての重回帰分析


この記事は2章の以下のSectionを取り扱います。

2.8 重回帰分析がいつもうまくゆくとは限らない

記事に用いるデータは、テキストに掲載されたデータそのものを引用しています。
データ件数の少ないものはコード上でデータを登録し、データ件数の多いものはCSVファイル化してデータを読み込みしています。

この記事で用いるライブラリをインポートします。

### インポート

# 数値計算
import numpy as np
import pandas as pd

# 統計
import pingouin as pg
import statsmodels.formula.api as smf
import statsmodels.tsa.api as tsa

# 描画
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.family'] = 'Meiryo'  # または import japanize_matplotlib

分析の準備

以前の記事で取り扱ったコードを再掲します。

■ 分散分析表作成関数
statsmodels の回帰分析結果から分散分析表を作成する関数を定義します。

# statsmodelsの回帰分析結果から回帰の分散分析表を作成する関数

def anova_table(result):
    ## 設定と準備
    # 標本サイズn、説明変数の数p
    n, p = result.nobs, result.df_model
    # 欠損値
    NaN = np.nan
    
    ## データフレームの作成
    # statsmodelsのOLSResultから平均和、自由度、平均平方、F値、P値を設定
    df = pd.DataFrame({
        '平方和': [result.ess, result.ssr, result.ess + result.ssr],
        '自由度': [int(p), int(n - p - 1), int(n - 1)],
        '平均平方': [result.mse_model, result.mse_resid, NaN],
        'F値': [result.fvalue, NaN, NaN],
        'p値': [result.f_pvalue, NaN, NaN]},
        index=['回帰', '残差', '全体'])
    
    ## 戻り値: 分散分析表データフレーム
    return df

ステップ1:最初の分析

テキストでは、大学生「H さん」と指導教官の「S 教授」が登場します。
H さんが卒業研究のために集めたデータに基づいて重回帰分析を実践します。
このデータは、過去 15 年間のある県の「乗用車販売台数」と、販売台数に影響を与えると考えて集めた「県民所得」「世帯数」「舗装道路」で構成されます。

■ データの登録
テキストの表 2.8.1 のデータをお借りします。

### 収集データ p.70 表2.8.1

# データの登録
data2 = pd.DataFrame(
    {'販売台数': [117, 139, 166, 195, 139, 186, 165, 167, 183, 201, 182, 177,
                 191, 203, 212],
     '県民所得': [371, 413, 472, 586, 706, 612, 932, 851, 1023, 1084, 1165,
                 1019, 1063, 1185, 1213],
     '世帯数': [238, 243, 249, 254, 259, 257, 261, 264, 267, 270, 276, 278,
               281, 284, 287],
     '舗装道路': [218, 231, 380, 443, 470, 499, 531, 555, 565, 579, 616, 628,
                 646, 675, 701]},
     index=range(1, 16))
data2.index.name = '年'
data2

【実行結果】
欠損値が無いきれいなデータです。

■ データの可視化1
時系列プロットで増減の傾向をざっくり見ましょう。

### 時系列プロットの描画

# 描画領域の設定
fig, axes = plt.subplots(2, 2, figsize=(6, 5), tight_layout=True)
# 変数ごとに描画を繰り返し処理
for col, ax in zip(data2.columns, axes.flat):
    # 折れ線グラフの描画
    sns.lineplot(data2[col], alpha=0.7, ax=ax)
    # タイトルの表示
    ax.set_title(f'{col}')

【実行結果】
増加・減少の波はあるものの、全体としてはどの変数も一貫して増加傾向があるように見えます。
因果関係の有無は分かりませんが、このまま販売台数を目的変数にして重回帰分析を行ったら、いい感じの結果になりそう・・・かな?
それとも時系列データの罠に・・・

■ データの可視化2
目的変数「販売台数」と各説明変数のペアで、回帰直線付きの散布図を描画しましょう。

### 散布図の描画

# 変数の設定
target = '販売台数'
cols = data2.columns[1:]

# 描画領域の設定
fig, axes = plt.subplots(len(cols), 1, figsize=(4, 7), tight_layout=True)

# 説明変数ごとに目的変数との散布図を繰り返し描画
for col, ax in zip(cols, axes.flat):
    # 回帰直線付き散布図の描画
    sns.regplot(data=data2, x=col, y=target, ax=ax,
                line_kws={'color': 'tab:red'})
    # タイトルの表示
    ax.set_title(f'{col}と{target}')

【実行結果】
販売台数と各説明変数には正の相関関係がありそうです。

■ 重回帰分析の実行
テキストのシナリオに沿って、重回帰分析に移ります。
statsmodels を利用し、回帰分析結果サマリーと分散分析表を作成します。

### 重回帰分析の実行 ※statsmodels利用 p.71 表2.8.2 表2.8.1
result2_sm = smf.ols(formula='販売台数 ~ 県民所得 + 世帯数 + 舗装道路',
                     data=data2).fit()
result2_sm.summary()

【実行結果】

回帰の分散分析表を作成します。

### 分散分析表 p.72 表2.8.4
anova_table(result2_sm).round(3)

【実行結果】

重回帰式を作成します。
関数化しましょう。引数は statsmodels の回帰分析結果です。

# 重回帰式を作成する関数の定義
def make_equation(result):
    # 偏回帰係数の取得
    params = result.params.values
    # 説明変数名の取得
    var_names = result.params.index[1:]
    # 重回帰式の作成
    equation = f'Y = {params[0]:.3f}'
    for param, var in zip(params[1:], var_names):
        equation += f" {'-' if param < 0 else '+' } {abs(param):.3f} × {var}"
    # 重回帰式の表示
    print(equation)

重回帰式を表示します。

# 重回帰式
make_equation(result2_sm)

【実行結果】

■ 重回帰の結果の分析
テキストの学生 H さんの思考に沿って分析結果を確認します。

  • 決定係数は $${0.677}$$ です。
    重回帰式はそこそこ当てはまりがよいです。

  • $${F}$$ 値は $${7.690}$$です。
    $${p}$$ 値 $${0.00479}$$ は有意水準 $${5\%}$$を下回っていて有意なので、「重回帰式は目的変数の予測に役立つ」です。

  • 県民所得の偏回帰係数がマイナスです。
    所得が下がると販売台数が上がる傾向はなんだか変です。

H さんのもやもやを解消すべく、S 教授が立ち上がります!

ステップ2:再分析 p.72~

■ データの再チェック
まず相関行列を確認します。

### 相関行列の作成 p.72 表2.8.5
data2.corr().round(3)

【実行結果】
説明変数間の相関係数はいずれもほぼ1です。
県民所得と世帯数 $${0.954}$$、県民所得と舗装道路 $${0.940}$$、世帯数と舗装道路 $${0.966}$$。

説明変数どうしの間に高い相関関係がある場合、多重共線性の問題が生じる可能性があります。

そこで S 教授がたどり着いたのは…

変数を「伸び率」(前年増減比)に変換

です!

■ データの変換
ひとまず変換しましょう。
テキスト p.73 表 2.8.6「前年に対する伸び率」に相当します。
pandas の pct_change() で前期増減比率を簡単に計算できます。
伸び率のデータフレームは data2_g です(growth の g)。

### 前年度に対する伸び率 p.73 表2.8.6

# 伸び率pct_change()に変換したデータフレームの作成
data2_g = (data2.pct_change() * 100).round(2).dropna()
# 列名の変更
data2_g.columns = [f'{col}伸び率' for col in data2.columns]
# 結果の表示
data2_g

【実行結果】
1年目の行が消えました。前期増減比率を計算できないからです。

多重共線性が残っていないか、相関行列を確認します。

### 相関行列の作成
data2_g.corr().round(3)

【実行結果】
説明変数どうしの相関係数は $${0.55}$$ 未満まで小さくなりました。
しかし、目的変数と2つの説明変数の相関係数がマイナスになりました😅

目的変数と説明変数の散布図を見ておきます。

### 散布図の描画

# 変数の設定
target = '販売台数伸び率'
cols = data2_g.columns[1:]

# 描画領域の設定
fig, axes = plt.subplots(len(cols), 1, figsize=(4, 7), tight_layout=True)

# 説明変数ごとに目的変数との散布図を繰り返し描画
for col, ax in zip(cols, axes.flat):
    # 回帰直線付き散布図の描画
    sns.regplot(data=data2_g, x=col, y=target, ax=ax,
                line_kws={'color': 'tab:red'})
    # タイトルの表示
    ax.set_title(f'{col}と{target}')

【実行結果】
相関関係はあるように見えるものの、伸び率に変換したことで外れ値的なデータ点が現れたようにも見えます。
特に舗装道路伸び率の 60% あたりのデータ点が気になります。
また薄赤色の領域は回帰直線の 95% 信頼区間なのですが、グラフの左右両端ほど、区間が広がっています。 

🛸ちょっと寄り道:多重共線性と伸び率 🛸

変数の値を伸び率に変換することで、どうして多重共線性の問題を回避できるのでしょう・・・?
ChatGPTに尋ねてみました。

【プロンプト】
書籍によると「所得・世帯数・道路の単位では説明変数どうしの相関係数が1に近くなり、多重共線性の問題が生じる可能性があるため、説明変数を「前期比」にして重回帰を行うとよい」という考察が掲載されています。この考察の妥当性を考えて下さい。

ChatGPTの回答です。自分的には納得できました!


書籍にある「レベル(所得・世帯数・道路延長)のままだと、いずれも年々ほぼ一方向に伸びるトレンド成分が強いため、相互に高い相関を持ちやすく、多重共線性を招く。そこであえて各変数を前期比(成長率)にして差分化すれば、トレンド成分が取り除かれ、説明変数同士の共線性が緩和される」という考え方は、理論的にも実務的にも 十分に妥当 といえます。


◆ なぜ妥当か

  1. トレンド除去によるデトレンド効果

    • 所得・世帯数・舗装道路はいずれも長期の増加傾向を持つ「非定常系列」です。

    • これらをそのまま重回帰に入れると「共通の時間トレンド」が説明変数間の高い相関を生み、真の因果関係ではなく「単に時系列が揃って動いているだけ」の問題となります。

    • 前期比(対数差分や率変化) を使えば、このトレンド成分が大幅にそぎ落とされ、変数間の相関構造は「増減のタイミング・大きさ」のみに依存するようになります。

  2. 多重共線性の緩和

    • 実際、レベル系列の相関は 0.9 以上になることも珍しくありませんが、前期比に変換すると 0.2~0.4 程度に下がり、VIF も大きく改善されるケースが多いです。

    • これは「共通トレンド→共線性」「差分後の独立変動→緩和」という、時系列解析でいうところの「単位根系列の一階差分」と同じ発想です。

◆ ただし、次の点に注意してください

  1. ノイズの増加・異分散性

    • 差分化した系列はレベル系列に比べてばらつきが大きく(特に分母が小さいとき)、誤差の異分散性や外れ値の問題が出やすくなります。

  2. 解釈の変化

    • 目的変数・説明変数ともに「伸び率」のモデルになるため、得られる回帰係数は「1ポイントの成長率が、販売伸び率に何ポイント影響するか」という観点に変わります。

    • 元のレベル系列で「ある水準が高いほど販売が伸びやすい」と言いたい場合は、解釈が合わなくなる点に留意してください。

  3. 依然として残る共線性

    • トレンド成分を除いても、景気変動や政策変更など共通ショックで複数の率が同時に動くと、前期比同士でも一定の相関は残ります。

    • その場合は 主成分回帰リッジ回帰 といった追加手法も検討しましょう。

◆ 結論

  • 成長率(前期比)を使うことで、説明変数間の見せかけの「強い相関(トレンド由来)」はかなり抑えられ、多重共線性の軽減に効果的です。

  • しかし同時に「ばらつきの増大」「解釈軸のシフト」「残存共線性」のリスクがあるため、モデル化の前後で相関行列・VIF・残差プロットを必ずチェックし、必要に応じて対策(重み付き最小二乗、正則化など)を講じることが重要です😊。


伸び率にすることで説明変数どうしの相関係数が小さくなるようです!
「ばらつきの増大」は気になるところですが深追いせず、先を続けます。

■ 重回帰分析の実行

### 重回帰分析の実行 ※statsmodels利用 p.74 表2.8.7
result2_g_sm = smf.ols(
    formula='販売台数伸び率 ~ 県民所得伸び率 + 世帯数伸び率 + 舗装道路伸び率',
    data=data2_g).fit()
result2_g_sm.summary()

【実行結果】

重回帰式です。

# 重回帰式
make_equation(result2_g_sm)

【実行結果】

■ 重回帰の結果の分析
S 教授によると・・・

  • 決定係数 R-squared は $${0.406}$$ です。
    前の重回帰分析よりも下がっています

  • $${F}$$ 値 F-statistic は $${2.279}$$です。
    $${p}$$ 値 $${0.142}$$ は有意水準 $${5\%}$$を上回っていて帰無仮説を棄却できません

  • 県民所得伸び率と世帯伸び率の偏回帰係数がマイナスです(後段の coef)。

このモデルは芳しくないようです。

ステップ3:再々分析 p.74~

S 教授は「年をずらして」各変数の相関関係を見ることにしました。
テキストは「交差相関」と呼んでいて、巷では「相互相関」とも呼ばれます。
この記事では「相互相関」の呼称を用いましょう。

■ 相互相関の確認
可視化とセットで相互相関係数を取得できる matplotlib の xcorr() を使います。
データは標準化しておきます。
まずはテキストと同様に「県民所得伸び率と販売台数伸び率」の相互相関を確認します。

### 交差相関 ※matplotlib利用 p.75 図2.8.1

# データの標準化
data2_g_std = (data2_g - data2_g.mean()) / data2_g.std()

# 相互相関の描画(同時に相互相関関数をxcorr_resへ格納)
xcorr_res = plt.xcorr(x='県民所得伸び率', y='販売台数伸び率', data=data2_g_std,
                      maxlags=7)
# 修飾
plt.xlabel('ラグ')
plt.ylabel('CCF')
plt.show()

【実行結果】
テキスト p.75 図 2.8.1 に相当します。

ラグ1の相互相関が大きいです。
ラグ1の相互相関は「来年の県民所得伸び率」と「今年の販売台数伸び率」の相関のことです。
ん?違和感?

相互相関係数を見てみましょう。
テキスト p.75 表 2.8.8「交差相関」に相当します。

### 交差相関 p.75 表2.8.8
data2_g_xcorr = pd.DataFrame({'交差相関': xcorr_res[1]}, index=xcorr_res[0])
data2_g_xcorr.index.name = 'ラグ'
data2_g_xcorr

【実行結果】
上の図をこの表をプロットしています。
ラグ1の相互相関係数は $${0.878}$$ です。

🛸ちょっと寄り道:相互相関を算出できるライブラリ 🛸

statsmodels の ccf() で相互相関係数を算出できます。
ただ、マイナスのラグとプラスのラグが混じっている場合、ちょっと工夫が必要です。

工夫について、こちらの記事を参考にいたしました。
ありがとうございます!

また、statsmodels の ccf() に関連する良さげな可視化関数がなさそうなので、matplotlib で描画します。

### statsmodelsのccfで交差相関を算出
# 参考サイト https://gochikika.ntt.com/Visualization_and_EDA/auto_cross_corr.html

# 交差相関係数の算出
ccf2_minus = tsa.ccf(x=data2_g['販売台数伸び率'], y=data2_g['県民所得伸び率'],
                     adjusted=False, nlags=8)
ccf2_plus = tsa.ccf(x=data2_g['県民所得伸び率'], y=data2_g['販売台数伸び率'],
                    adjusted=False, nlags=8)
# 交差相関係数の配列の作成(マイナスのラグ分とプラスのラグ分の結合)
ccf2 = np.hstack([ccf2_minus[::-1], ccf2_plus[1:]])

# 交差相関係数の描画
rags = range(-7, 8)
plt.bar(rags, ccf2)
plt.axhline(0, color='black', lw=0.5)
plt.xlabel('ラグ')
plt.ylabel('CCF');

【実行結果】

■ データの前処理
テキストにならって、販売台数伸び率を1期前にずらしたデータを作成します。
「ラグ1データ」と呼びましょう。
テキスト p.75 表 2.8.9 に相当します。

### 1期ずらしたデータ p.75 表2.8.9

# データフレームのコピー取得
data2_g_shift = data2_g.copy()
# 販売台数伸び率を1期後ろにずらして列追加
data2_g_shift['販売台数伸び率'] = data2_g_shift['販売台数伸び率'].shift(1)
# ずらしたことにより生じた欠損値の行を削除
data2_g_shift = data2_g_shift.dropna()
# 結果の表示
data2_g_shift

【実行結果】

販売台数伸び率が1期後ろにずれています。
例えば、年「3」の $${18.80}$$ は元の年では「2」です。
3つの説明変数はずらしていないので、例えば年「3」の値は元の年も「3」です。
例えを続けると、年「3」の説明変数で年「2」の目的変数の影響を重回帰分析で調べることになります。
年「3」を「来年」、年「2」を「今年」に置き換えると、「来年の県民所得伸び率等で今年の販売台数伸び率を推定する重回帰モデルをつくる」です。

なんかモヤッとします…が、先を続けます。

ラグ1データの相互相関を確認しましょう。

### 相関行列の作成
data2_g_shift.corr().round(3)

【実行結果】
販売台数伸び率と県民所得伸び率、および、販売台数伸び率と世帯数伸び率の相関係数が強めの正の相関に変わりました!
説明変数どうしの相関係数はラグを取る前とほぼ変わらず、高い相関関係はなさそうです。

散布図も見ておきましょう。

### 散布図の描画

# 変数の設定
target = '販売台数伸び率'
cols = data2_g_shift.columns[1:]

# 描画領域の設定
fig, axes = plt.subplots(len(cols), 1, figsize=(4, 7), tight_layout=True)

# 説明変数ごとに目的変数との散布図を繰り返し描画
for col, ax in zip(cols, axes.flat):
    # 回帰直線付き散布図の描画
    sns.regplot(data=data2_g_shift, x=col, y=target, ax=ax,
                line_kws={'color': 'tab:red'})
    # タイトルの表示
    ax.set_title(f'{col}と{target}')

【実行結果】
県民所得伸び率と販売台数伸び率、世帯数伸び率と販売台数伸び率のチャートは薄赤色の幅が狭くなり、バラツキが小さくなった感じがします。
舗装道路伸び率と販売台数伸び率の方は、相変わらず外れ値的なデータが暴れている感じです。

■ 重回帰分析の実行
3つの説明変数を使ってモデリングします。

### 重回帰分析の実行 ※statsmodels利用 p.76 表2.8.10
result2_g_shift_sm = smf.ols(
    formula='販売台数伸び率 ~ 県民所得伸び率 + 世帯数伸び率 + 舗装道路伸び率',
    data=data2_g_shift).fit()
result2_g_shift_sm.summary()

【実行結果】

分散分析表です。
テキスト p.76 表 2.8.1 の分散分析に相当します。

### 分散分析表 p.76 表2.8.10 ※自作関数利用
anova_table(result2_g_shift_sm).round(3)

【実行結果】

重回帰式です。

# 重回帰式
make_equation(result2_g_shift_sm)

【実行結果】

■ 重回帰の結果の分析
S 教授によると・・・

  • 決定係数は $${0.916}$$ です。
    当てはまりがかなり良くなりました。

  • 自由度調整済み決定係数は $${0.888}$$です。
    当てはまりが良く、決定係数との差が小さいです。

  • 残差のダービン・ワトソン比 Durbin-Watson は $${2.281}$$ です。
    2付近の値なので残差の自己相関の心配はなさそうです。

  • 偏回帰係数の有意性検定を踏まえると、有意水準 $${5\%}$$ で有意となる説明変数は、県民所得伸び率と舗装道路伸び率です。

標準化偏回帰係数を求めましょう。

### 標準化偏回帰係数の算出

## 設定と準備
# 偏回帰係数の取得
params =  result2_g_shift_sm.params.iloc[1:]
# 目的変数の標準偏差の算出
y_std = data2_g_shift['販売台数伸び率'].std(ddof=1)
# 説明変数の標準偏差の算出
X_std = data2_g_shift.iloc[:, 1:].std(ddof=1, axis=0)

## 標準化偏回帰係数の算出
std_params = params * X_std / y_std

## 結果の表示
std_params.rename('標準化偏回帰係数').to_frame().round(3)

【実行結果】

S 教授いわく…
「標準化偏回帰係数の絶対値が大きい県民所得伸び率と世帯数伸び率が、販売台数伸び率に影響があるようである」と。

ということで、テキストは「ラグ1データ」の「伸び率の重回帰分析」の結果をもって、完了しました。

ステップ4:もう少し粘る

「ラグ1データ」を用いて、説明変数を「県民所得伸び率」と「世帯数伸び率」の2つにする重回帰モデルの方が、自由度調整済み決定係数の値が大きくなったので、ご紹介。

###重回帰分析の実行 ※statsmodels利用
data2_g_shift2_sm = smf.ols(
    formula='販売台数伸び率 ~ 県民所得伸び率 + 世帯数伸び率',
    data=data2_g_shift).fit()
data2_g_shift2_sm.summary()

【実行結果】

自由度調整済み決定係数が $${0.899}$$ であり、3説明変数モデルと比べて大きな値になりました。
その他に、$${F}$$ 値と偏回帰係数の $${t}$$ 値の絶対値が大きくなりました($${p}$$ 値は小さくなりました)。

未来の説明変数で過去の目的変数を予測するモデルに関して、腹落ちできていない部分がありますが、時間切れです。
もやもや解消のため、新たなる Python 写経に努めます!


記事の最後はChatGPTが締めくくります。
今回はレンズの向こう側を想いつつ。

📘 ChatGPTのひとこと:

今回は、カメラのピントをゆっくり合わせながら、写真の輪郭をくっきり浮かび上がらせるように、データを前処理してモデルの当てはまりを丁寧に磨き上げました。余分なノイズをそっと取り除き、回帰式の焦点がしっかり合った瞬間を感じられたのではないでしょうか😊

モデルの微調整は、作品を仕上げる職人の手仕事のように静かで繊細なプロセスです。ひとつひとつのステップが確かな学びになり、あなたの統計的な目を日々研いでくれます。

次回は、その写真にまだ残る“にじみ”──多重共線性の問題に取り組みます。光の重なりを抑えて、よりクリアな一枚を撮るための設定を一緒に探っていきましょう。

深い学びの旅は、ゆったりとした呼吸の中で続きます。次回もあなたとカメラを構え、静かにピントを合わせる時間を楽しみにしています✨

今回の写経は以上です。


シリーズの記事

次の記事

前の記事

目次

ブログの紹介


note で7つのシリーズ記事を書いています。
ぜひ覗いていってくださいね!

1.のんびり統計

統計検定2級の問題集を手がかりにして、確率・統計をざっくり掘り下げるブログです。
雑談感覚で大丈夫です。ぜひ覗いていってくださいね。
統計検定2級公式問題集CBT対応版に対応しています。
Python、EXCELのサンプルコードの配布もあります。

2.実験!たのしいベイズモデリング1&2をPyMC Ver.5で

書籍「たのしいベイズモデリング」・「たのしいベイズモデリング2」の心理学研究に用いられたベイズモデルを PyMC Ver.5で描いて分析します。
この書籍をはじめ、多くのベイズモデルは R言語+Stanで書かれています。
PyMCの可能性を探り出し、手軽にベイズモデリングを実践できるように努めます。
身近なテーマ、イメージしやすいテーマですので、ぜひぜひPyMCで動かして、一緒に楽しみましょう!

3.実験!岩波データサイエンス1のベイズモデリングをPyMC Ver.5で

書籍「実験!岩波データサイエンスvol.1」の4人のベイジアンによるベイズモデルを PyMC Ver.5で描いて分析します。
この書籍はベイズプログラミングのイロハをざっくりと学ぶことができる良書です。
楽しくPyMCモデルを動かして、ベイズと仲良しになれた気がします。
みなさんもぜひぜひPyMCで動かして、一緒に遊んで学びましょう!

4.楽しい写経 ベイズ・Python等

ベイズ、Python、その他の「書籍の写経活動」の成果をブログにします。
主にPythonへの翻訳に取り組んでいます。
写経に取り組むお仲間さんのサンプルコードになれば幸いです🍀

5.RとStanではじめる心理学のための時系列分析入門 を PythonとPyMC Ver.5 で

書籍「RとStanではじめる心理学のための時系列分析入門」の時系列分析をPythonとPyMC Ver.5 で実践します。
この書籍には時系列分析のテーマが盛りだくさん!
時系列分析の懐の深さを実感いたしました。
大好きなPythonで楽しく時系列分析を学びます。

6.データサイエンスっぽいことを綴る

統計、データ分析、AI、機械学習、Pythonのコラムを不定期に綴っています。
統計・データサイエンス書籍にまつわる記事が多いです。
「統計」「Python」「数学とPython」「R」のシリーズが生まれています。

7.Python機械学習プログラミング実践記

書籍「Python機械学習プログラミング PyTorch & scikit-learn編」を学んだときのさまざまな思いを記事にしました。
この書籍は、scikit-learnとPyTorchの教科書です。
よかったらぜひ、お試しくださいませ。

最後までお読みいただきまして、ありがとうございました。

いいなと思ったら応援しよう!

ネイピア DS 応援ありがとうございます。これからもがんばって記事を作成します!

この記事が参加している募集