- 技術 💻
回帰分析とは|単回帰・重回帰・ロジスティック回帰の違いをp値・VIFで実演
結論
回帰分析とは、結果の数値(目的変数)が、原因と考える数値(説明変数)によってどれだけ変わるかを式で表し、予測や要因の比較に使う統計の手法です。説明変数が1つなら単回帰、2つ以上なら重回帰、結果が「合格/不合格」のような2択ならロジスティック回帰を使います。
この記事でわかること
- 単回帰・重回帰・ロジスティック回帰の違いと、どれを使うかの判断表
- statsmodels の係数表(係数・標準誤差・p値・信頼区間・決定係数)の読み方
- 多重共線性(VIF 59.2)・外れ値・過学習(テストの決定係数 -30.6)の実測
回帰分析は、どの手法を使うかを目的変数の種類と説明変数の数で決めます。選び方を先に図で示します。
flowchart TD
A{目的変数の種類} -->|2択| L[ロジスティック回帰<br>オッズ比で読む]
A -->|数値| C{説明変数の数}
C -->|1つ| S[単回帰分析]
C -->|2つ以上| M[重回帰分析<br>VIFも見る]
よく調べられることの答えを先にまとめます。
| 知りたいこと | 答え | 詳しい節 |
|---|---|---|
| 回帰分析とは | 結果の数値を、原因と考える数値の式で表す手法 | 回帰分析とは |
| 回帰とは(言葉の意味) | ゴルトンの「平均への回帰」から付いた名前 | 回帰分析とは |
| 単回帰と重回帰の違い | 説明変数が1つか、2つ以上か | 3種類の違い |
| ロジスティック回帰とは | 2択の結果が起きる確率を求める回帰。オッズ比で読む | ロジスティック回帰 |
| 線形回帰の式 | y = 切片 + 係数 × x。係数は x が1増えたときの y の増え方 |
係数・切片・決定係数 |
| 決定係数(R2)の目安 | 分野で違う。0.9でも予測が外れることも、0.3でも役立つこともある | 係数・切片・決定係数 |
| p値の読み方 | 「係数が0」と仮定したときに、この結果以上が出る確率 | p値・信頼区間 |
| 多重共線性・VIF | 説明変数どうしが似すぎると係数が不安定。VIF 5〜10超で疑う | 多重共線性とVIF |
| Pythonでのやり方 | 予測は scikit-learn、係数表は statsmodels | 単回帰をPythonで |
確認環境:Ubuntu 24.04.5 LTS の上で、作業場所に作った venv(Python 3.13.18)に scikit-learn 1.9.1・statsmodels 0.15.0・NumPy 2.5.4・pandas 3.1.0・SciPy 1.18.1 を pip で入れて実行しました。データは、乱数で作った「広告費と売上」「学習時間と合否」などの表と、scikit-learn に付属する糖尿病データ(load_diabetes、442人・10項目)だけを使い、外部からデータは取得していません。乱数は numpy.random.default_rng に種(seed)を固定して作っているため、同じ版なら同じ数値が出ます。scikit-learn の LogisticRegression の既定値と非推奨の引数、糖尿病データの項目の意味、statsmodels の VIF の目安は、それぞれの公式ドキュメント(1.9.1・0.15.0)で確かめました。Excel の分析ツールは扱いません。図は mermaid-cli 11.16.0 で描画を確かめています(確認日 2026年10月29日)。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「回帰分析とは|単回帰・重回帰・ロジスティック回帰の違いをp値・VIFで実演」
回帰分析とは(意味と「回帰」という言葉の由来)
この節では、回帰分析が何をする手法なのかと、「回帰」という名前の由来が分かります。
回帰分析とは、ある数値(目的変数)を、ほかの数値(説明変数)を使った式で表す統計の手法です。 式ができると、2つのことに使えます。
予測に使う
広告費を60万円にしたら売上はいくらか
体格と検査値から1年後の数値を見込む
見るのは予測の当たり具合(誤差)
要因を比べる
売上に効いているのは広告費か、店舗か
どの検査値が結果と強く結びつくか
見るのは係数・p値・信頼区間
用語:目的変数と説明変数
- 目的変数(被説明変数・従属変数・y):知りたい結果。売上、合否、1年後の検査値など。
- 説明変数(独立変数・特徴量・x):結果に関係しそうな数値。広告費、学習時間、BMI など。機械学習では「特徴量」と呼ぶことが多いです。
- 回帰係数:説明変数が1増えたとき、目的変数がどれだけ変わるか。
- 切片(定数項):説明変数がすべて0のときの目的変数の値。
- 残差:実際の値と、式で求めた値(予測値)の差。
「回帰」の由来は「平均への回帰」
イギリスのフランシス・ゴルトンは、親子の身長を調べ、背の高い親の子は親ほどは高くない(平均の方へ戻る)傾向を見つけ、この関係を表す直線を回帰直線と呼びました(コトバンク・世界大百科事典)。「回帰(regression)」は「戻る」という意味で、今の回帰分析は、親子の身長に限らず「数値を数値で説明する式」全般を指します。
相関分析との違い
相関分析は「2つの数値がどれだけ一緒に動くか」を1つの数(相関係数 -1〜1)で表し、回帰分析は「x が1増えると y がいくつ変わるか」を式で表します。 相関はどちらが原因かを区別しませんが、回帰は目的変数と説明変数を分けます。後の節の単回帰では、相関係数 0.9709 を2乗した 0.9426 が、決定係数とぴったり一致しました(単回帰に限った関係です)。
単回帰・重回帰・ロジスティック回帰の違い(どれを使うかの判断表)
この節では、よく出てくる回帰の種類の違いと、データに合わせた選び方が分かります。
選び方は、目的変数の種類と、説明変数の数で決まります。
| 手法 | 目的変数 | 説明変数 | 式の形 | 主に読むもの |
|---|---|---|---|---|
| 単回帰分析 | 数値 | 1つ | y = a + b x |
傾き b・決定係数 |
| 重回帰分析 | 数値 | 2つ以上 | y = a + b1 x1 + b2 x2 + … |
偏回帰係数・p値・VIF・自由度調整済み決定係数 |
| ロジスティック回帰 | 2択(0か1) | 1つ以上 | log(p/(1-p)) = a + b x |
オッズ比・確率 |
| 多項式回帰 | 数値(曲線の関係) | x・x の2乗… | y = a + b x + c x^2 |
過学習に注意 |
| Ridge・Lasso | 数値 | 多い・似ている | 係数に罰則を足す | 予測の誤差 |
「線形回帰」は、係数について一次式(足し算と定数倍)になっている回帰の総称で、単回帰・重回帰・多項式回帰はどれも線形回帰です。多項式回帰は x の2乗を「別の説明変数」として足しているだけで、係数については一次式のままです。
売上・価格・時間を当てたい
目的変数が数値。説明変数1つなら単回帰、複数なら重回帰。
LinearRegression・OLS
する/しないを当てたい
合格・解約・購入など2択。ロジスティック回帰で確率を出す。
LogisticRegression・Logit
3つ以上の区分
A・B・C の選択は多項ロジスティック回帰。順序があるなら順序ロジスティック回帰。
MNLogit・OrderedModel
件数を当てたい
来店人数・不良数など0以上の整数はポアソン回帰も候補。
GLM(Poisson)
単回帰分析をPythonで実行(scikit-learnとstatsmodels)
この節では、同じデータを scikit-learn と statsmodels の両方で分析し、何が同じで何が違うのかが分かります。
予測を作るだけなら scikit-learn、係数のp値や信頼区間まで見るなら statsmodels を使います。 係数そのものは、どちらでも同じ値になりました。
データ:広告費と売上(乱数で30か月分)
「売上 = 50 + 2 × 広告費 + ばらつき」という関係で30件を作りました。本当の傾きは 2.0、切片は 50 です。分析では、この正解を知らないものとして式を推定します。
import numpy as np, pandas as pd, statsmodels.api as sm
from sklearn.linear_model import LinearRegression
rng = np.random.default_rng(0)
n = 30
ad = rng.uniform(10, 100, n).round(1) # 広告費(万円)
sales = (50 + 2.0 * ad + rng.normal(0, 15, n)).round(1) # 売上(万円)
df = pd.DataFrame({"ad": ad, "sales": sales})
# scikit-learn:X は2次元(表)で渡す
lr = LinearRegression().fit(df[["ad"]], df["sales"])
print(lr.coef_, lr.intercept_, lr.score(df[["ad"]], df["sales"]))
# statsmodels:切片の列を add_constant で自分で足す
res = sm.OLS(df["sales"], sm.add_constant(df[["ad"]])).fit()
print(res.summary())
sklearn coef [1.99584823] intercept 54.38116229141379 R2 0.9426435265282244
predict ad=60 -> [174.13205629]
「売上 = 54.38 + 1.996 × 広告費」という式になりました。広告費60万円のときの予測売上は 174.1万円です。手で公式(x と y の共分散 ÷ x の分散)を計算しても、傾き 1.99585・切片 54.3812 で同じ値でした。最小二乗法の公式と手計算は、関連記事「最小二乗法とは|公式・手計算の例とPythonでの求め方を実例で解説」で扱っています。この記事は、求めた式を「どう読むか」を中心にします。
散布図と回帰直線を表で見る
広告費を5つの区間に分け、区間ごとの平均の売上と、回帰直線の予測を並べました。点の並びと直線がどれだけ重なっているかが、数値で分かります。
| 広告費の区間(万円) | 件数 | 広告費の平均 | 実際の売上の平均 | 回帰直線の予測 |
|---|---|---|---|---|
| 10〜30 | 7 | 15.4 | 84.1 | 85.1 |
| 30〜50 | 4 | 41.0 | 144.3 | 136.1 |
| 50〜70 | 7 | 64.5 | 178.6 | 183.1 |
| 70〜90 | 8 | 79.4 | 210.1 | 212.8 |
| 90〜100 | 4 | 96.1 | 253.3 | 246.1 |
残差(実際 − 予測)はプラスとマイナスに散らばり、全30件の合計は -5.8×10の-13乗(計算の誤差の範囲で0)でした。切片のある最小二乗法では、残差の合計は必ず0になります。最も大きな残差は、広告費58.7万円の月の +25.3万円でした。
scikit-learn と statsmodels の違い
| 項目 | scikit-learn(LinearRegression) | statsmodels(OLS) |
|---|---|---|
| 切片 | 既定で自動的に入る | sm.add_constant で列を足す(式の書き方なら自動) |
| 係数 | coef_・intercept_ | params |
| p値・信頼区間 | 出ない | summary()・pvalues・conf_int() |
| 決定係数 | score() | rsquared・rsquared_adj |
| 向いている用途 | 予測・交差検証・前処理と組み合わせる | 係数の解釈・検定・残差の診断 |
回帰係数・切片・決定係数の読み方
この節では、回帰式の数字が何を意味しているかと、決定係数(R2)をどう受け止めるかが分かります。
- 回帰係数 1.996:広告費が1万円増えると、売上が平均して約2万円増える、という関係です。「広告費を増やせば必ず2万円増える」という因果の保証ではありません(後の節で交絡の例を示します)。
- 切片 54.4:広告費が0のときの売上の推定です。データの広告費は10.2〜99.7万円なので、0は範囲の外です。データの範囲の外(外挿)では、式が当たる保証はありません。
- 決定係数 R2 = 0.943:売上のばらつき(平均からのずれの2乗の合計)のうち、94.3%を広告費の式で説明できた、という意味です。0〜1の値で、1に近いほど点が直線の近くに集まっています。
決定係数の目安はいくつか
「0.7以上なら良い」のような共通の基準はありません。 物理の測定のように誤差が小さい分野では0.99でも物足りないことがあり、人の行動や病気の進み方のように、測っていない要因が多いものでは0.3〜0.5でも意味のある式になります。後の節の糖尿病データでは、10項目すべてを使っても R2 は 0.518 でした。
決定係数は、説明変数を増やすと(意味が無い変数でも)下がることがありません。重回帰では、変数の数で割り引いた自由度調整済み決定係数(Adj. R-squared)を並べて見ます。単回帰の例では 0.943 と 0.941 でほぼ同じでした。
誤差の大きさは RMSE・MAE で見る
決定係数は割合なので、「予測が何万円ずれるか」は RMSE(二乗平均平方根誤差)や MAE(平均絶対誤差)で見ます。単回帰の例の残差の標準偏差は 14.53万円で、データを作ったときのばらつき(標準偏差15)とほぼ同じでした。
p値・標準誤差・信頼区間の読み方(statsmodelsの係数表)
この節では、statsmodels の summary() に出る表を、上から順に読めるようになります。
係数表で見るのは、係数(coef)、そのぶれの大きさ(std err)、p値(P>|t|)、95%信頼区間([0.025 0.975])の4つです。 単回帰の実行結果です。
OLS Regression Results
==============================================================================
Dep. Variable: sales R-squared: 0.943
Model: OLS Adj. R-squared: 0.941
Method: Least Squares F-statistic: 460.2
Date: Thu, 29 Oct 2026 Prob (F-statistic): 6.41e-19
Time: 23:28:04 Log-Likelihood: -121.83
No. Observations: 30 AIC: 247.7
Df Residuals: 28 BIC: 250.5
Df Model: 1
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 54.3812 6.021 9.033 0.000 42.049 66.714
ad 1.9958 0.093 21.452 0.000 1.805 2.186
==============================================================================
Omnibus: 1.757 Durbin-Watson: 1.503
Prob(Omnibus): 0.415 Jarque-Bera (JB): 1.078
Skew: -0.065 Prob(JB): 0.583
Kurtosis: 2.081 Cond. No. 147.
==============================================================================
| 表示 | 意味 | この例の値と読み方 |
|---|---|---|
| coef | 回帰係数(const は切片) | ad 1.9958:広告費1万円で売上が約2万円増える |
| std err | 係数の標準誤差。データを取り直したら係数がどれだけぶれるか | 0.093:ぶれは小さい |
| t | 係数 ÷ 標準誤差 | 1.9958 ÷ 0.093 ≒ 21.45 |
| P>|t| | p値。「本当の係数は0」と仮定したとき、これ以上の t が出る確率 | 0.000(表示の桁より小さい) |
| [0.025 0.975] | 95%信頼区間 | 1.805〜2.186。本当の値 2.0 を含んでいる |
| F-statistic・Prob | 「説明変数の係数がすべて0」の検定 | 6.41e-19:式全体として意味がある |
| AIC・BIC | モデルどうしを比べる指標。小さいほど良い | 同じデータの別モデルと比べるときに使う |
| Durbin-Watson | 残差の並び順による関係(自己相関)。2に近いほど無い | 1.503:やや低いが大きな問題ではない |
| Prob(JB) | 残差が正規分布と言えるかの検定のp値 | 0.583:正規分布と矛盾しない |
| Cond. No. | 条件数。大きいと多重共線性や数値計算の問題を疑う | 147:問題なし(重回帰の例では 7.20e+03 で注記が出た) |
p値が小さいときに言えること・言えないこと
p値 0.000 の読み方
p値は「効果の大きさ」でも「原因である証明」でもない
データの件数が多いと、実務では無視できるほど小さい係数でもp値は小さくなります。判断は、p値だけでなく「信頼区間の幅」と「係数の大きさが業務で意味のある大きさか」を合わせて行います。 p値そのものの意味と誤解の例は、関連記事「p値とは|意味・有意水準・よくある誤解をPythonで実演」で扱っています。
信頼区間と予測区間の違い
広告費60万円のときの予測を、statsmodels の get_prediction で出しました。
mean mean_se mean_ci_lower mean_ci_upper obs_ci_lower obs_ci_upper
0 174.1 2.7 168.7 179.6 143.9 204.4
- 信頼区間(mean_ci)168.7〜179.6:広告費60万円の月を何回も繰り返したときの「平均の売上」がありそうな範囲。
- 予測区間(obs_ci)143.9〜204.4:広告費60万円の「ある1か月」の売上がありそうな範囲。1件ごとのばらつきが加わるので、ずっと広くなります。
来月の売上を見込むなら、使うのは予測区間です。信頼区間を「来月の売上の範囲」として伝えると、幅を5倍以上狭く見せることになります。
重回帰分析とは(糖尿病データで係数表を読む)
この節では、説明変数が複数あるときの係数の読み方と、標準化した係数で影響の大きさを比べる方法が分かります。
重回帰分析の係数(偏回帰係数)は、「ほかの説明変数を同じ値に固定したまま、その変数だけを1増やしたときの変化」です。 単回帰の係数とは意味が変わります。
データ:scikit-learn 付属の糖尿病データ
load_diabetes(as_frame=True, scaled=False) で、442人分の10項目と、1年後の病気の進み具合(数値)を読み込みました。scaled=False にすると、標準化される前の元の単位(歳・BMI など)で読めます。sex は 1 と 2 の値だったので、2 を 1、それ以外を 0 に置き換えています。
| 列 | 意味(公式の説明) | 列 | 意味(公式の説明) |
|---|---|---|---|
| age | 年齢 | s2 | LDL |
| sex | 性別 | s3 | HDL |
| bmi | BMI | s4 | 総コレステロール ÷ HDL |
| bp | 平均血圧 | s5 | 血清トリグリセリドの対数(とみられる値) |
| s1 | 血清総コレステロール | s6 | 血糖値 |
OLS Regression Results
==============================================================================
Dep. Variable: target R-squared: 0.518
Model: OLS Adj. R-squared: 0.507
No. Observations: 442 AIC: 4794.
Df Residuals: 431 BIC: 4839.
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const -357.4268 67.058 -5.330 0.000 -489.228 -225.625
age -0.0364 0.217 -0.168 0.867 -0.463 0.390
sex -22.8596 5.836 -3.917 0.000 -34.330 -11.389
bmi 5.6030 0.717 7.813 0.000 4.194 7.012
bp 1.1168 0.225 4.958 0.000 0.674 1.560
s1 -1.0900 0.573 -1.901 0.058 -2.217 0.037
s2 0.7465 0.531 1.406 0.160 -0.297 1.790
s3 0.3720 0.782 0.475 0.635 -1.166 1.910
s4 6.5338 5.959 1.097 0.273 -5.178 18.245
s5 68.4831 15.670 4.370 0.000 37.685 99.282
s6 0.2801 0.273 1.025 0.306 -0.257 0.817
==============================================================================
Notes:
[2] The condition number is large, 7.2e+03. This might indicate that there are
strong multicollinearity or other numerical problems.
- bmi 5.603:年齢・血圧・検査値などを同じに固定したまま、BMI が1増えると、1年後の値が平均して約5.6増える。
- bmi だけの単回帰では係数 10.233・R2 0.344でした。BMI と一緒に動くほかの項目の分まで BMI が背負っていたため、重回帰では約半分になりました。
- age のp値 0.867:ほかの項目を固定すると、年齢の係数が0でないとは言えない。「年齢は関係ない」と言い切るのではなく、「このデータとこの式では区別できない」と読みます。
- 注記 [2] の「条件数が大きい(7.2e+03)」は、多重共線性の警告です。次の節で VIF を使って確かめます。
どの項目の影響が大きいか:標準化した係数
係数の大きさは単位に左右されます。s5(対数の値で範囲が狭い)の係数 68.5 と、bmi の 5.6 を、そのまま比べることはできません。全部の列を平均0・標準偏差1にそろえてから回帰すると、比べられる係数(標準化偏回帰係数)になります。
| 項目 | 元の係数 | 標準化した係数 | p値 |
|---|---|---|---|
| s1 | -1.090 | -0.489 | 0.058 |
| s5 | 68.483 | 0.464 | 0.000 |
| bmi | 5.603 | 0.321 | 0.000 |
| s2 | 0.747 | 0.294 | 0.160 |
| bp | 1.117 | 0.200 | 0.000 |
| sex | -22.860 | -0.148 | 0.000 |
| age | -0.036 | -0.006 | 0.867 |
s1 の標準化係数(-0.489)が最も大きく見えますが、p値は 0.058 で、s2 とは逆の符号になっています。s1(総コレステロール)と s2(LDL)は相関 0.90 で、ほぼ同じ情報を持っているため、片方が大きくプラス、片方が大きくマイナスに振れて打ち消し合っています。 この状態の係数を「s1 が最も影響する」と読むのは誤りです。これが多重共線性です。
予測の当たり具合は、学習に使っていないデータで測る
442人を学習用75%・テスト用25%に分け(train_test_split(random_state=0))、学習用だけで式を作りました。
| データ | 決定係数 R2 | MAE | RMSE |
|---|---|---|---|
| 学習用(331人) | 0.555 | 42.9 | 52.7 |
| テスト用(111人) | 0.359 | 45.1 | 56.4 |
学習に使ったデータでの決定係数は、テストより高く出ます。予測に使うなら、テスト用データか交差検証の値を報告します。
多重共線性とVIF(係数の符号が変わる実例)
この節では、多重共線性で何が起きるかと、VIF での見つけ方・直し方が分かります。
多重共線性とは、説明変数どうしの相関が強すぎて、それぞれの係数を切り分けられなくなる状態です。 予測値そのものはあまり変わらないのに、係数の大きさや符号が大きくぶれ、標準誤差が大きくなります。
乱数で再現:ほぼ同じ2つの変数
本当の式は y = 3 + 1.0 × x1 + 1.0 × x2 です。x2 を「x1 + ばらつき」で作り、ばらつきが大きい(相関 0.63)場合と小さい(相関 0.994)場合で、種を変えて5回ずつ回帰しました(各50件)。
| 種 | 相関0.63:b1・b2 | 相関0.994:b1・b2 | 相関0.994:b1 の標準誤差・p値 | b1+b2(両方とも) |
|---|---|---|---|---|
| 0 | 0.90・1.12 | -0.20・2.23 | 1.36・0.882 | 2.02 |
| 1 | 0.82・1.02 | 0.66・1.17 | 1.63・0.688 | 1.83 |
| 2 | 1.21・1.02 | 1.04・1.19 | 1.52・0.494 | 2.23 |
| 3 | 0.96・1.12 | -0.07・2.15 | 1.51・0.961 | 2.08 |
| 4 | 1.15・1.08 | 0.48・1.75 | 1.37・0.730 | 2.23 |
1符号が逆になる
本当は +1.0 の x1 の係数が、-0.20・-0.07 になった。「x1 を増やすと y が減る」と読むと誤る。
2標準誤差が約7倍
相関0.63では0.19〜0.22、相関0.994では1.36〜1.63。p値は0.49〜0.96で「有意でない」になった。
3合計と予測は安定
b1+b2 はどちらの場合も同じ値で、決定係数も0.76〜0.86。予測には使えるが、係数の解釈には使えない。
VIF(分散拡大係数)で見つける
VIF は、ある説明変数をほかの説明変数で回帰したときの決定係数を R2 として、1 ÷ (1 − R2) で求めます。 ほかの変数で説明できる割合が高いほど大きくなります。statsmodels 0.15.0 の公式ドキュメントは「VIF が5より大きいと、その説明変数は高い共線性を持つ」としています。10を目安にする本もあり、5〜10を超えたら疑う、と覚えておくとよいです。
from statsmodels.stats.outliers_influence import variance_inflation_factor
X = sm.add_constant(df_x) # 切片の列を含めた表
vif = {col: variance_inflation_factor(X.values, i)
for i, col in enumerate(X.columns) if col != "const"}
| データ | VIF | 判断 |
|---|---|---|
| 乱数・相関0.63の x1・x2 | 1.6・1.6 | 問題なし |
| 乱数・相関0.994の x1・x2 | 81.7・81.7 | 強い多重共線性 |
| 糖尿病データ age・sex・bmi・bp・s6 | 1.22・1.28・1.51・1.46・1.48 | 問題なし |
| 糖尿病データ s1・s2・s3 | 59.20・39.19・15.40 | 強い多重共線性 |
| 糖尿病データ s4・s5 | 8.89・10.08 | やや強い |
直し方:似た変数を外す・まとめる
糖尿病データから s1・s2 を外して重回帰をやり直すと、残った項目の VIF はすべて 3.15 以下になりました。
| 比べたもの | 10項目すべて | s1・s2 を外した8項目 |
|---|---|---|
| 決定係数 | 0.518 | 0.511 |
| 自由度調整済み決定係数 | 0.507 | 0.502 |
| s3 の係数(p値) | +0.372(0.635) | -1.275(0.0001) |
| s4 の係数(p値) | +6.534(0.273) | -4.075(0.254) |
| VIF の最大 | 59.20(s1) | 3.15(s4) |
決定係数はほとんど下がらず、s3(HDL)の係数は符号がプラスからマイナスに変わり、p値も 0.0001 になりました。多重共線性があるときの係数の符号やp値は、変数の組み合わせしだいで入れ替わります。 直し方は次の3つです。
- 似た変数のうち、目的や測りやすさで1つを残す(今回の s1・s2)。
- 似た変数を1つにまとめる(平均・比率・主成分分析)。主成分分析の手順は関連記事「主成分分析(PCA)とは|手順・寄与率・負荷量の読み方をPythonで実演」で扱っています。
- 予測だけが目的なら、Ridge 回帰(係数に罰則を付ける)で係数のぶれを抑える。
外れ値の影響(1点で回帰直線が変わる)
この節では、外れ値が回帰の結果をどれだけ動かすかと、影響の大きい点の見つけ方が分かります。
最小二乗法は残差を2乗して足すため、大きく外れた1点が全体を引っ張ります。 本当の式が y = 2 + 1.5x の20件(x は 0〜10)に、外れ値を1点だけ足して比べました。
| データ | 切片 | 傾き | 決定係数 | 傾きのp値 |
|---|---|---|---|---|
| 元の20件 | 1.783 | 1.558 | 0.929 | 0.0000 |
| +(x=25, y=5):範囲の外の1点 | 7.558 | 0.223 | 0.076 | 0.2264 |
| +(x=5, y=40):範囲の中の1点 | 2.831 | 1.644 | 0.271 | 0.0156 |
x が範囲の外にある1点(x=25)を足すと、傾きが 1.558 から 0.223 に下がり、「x と y は関係がない」ように見える結果になりました。範囲の中で y だけ外れた点(x=5, y=40)は、傾きはあまり変えず、決定係数を大きく下げました。
影響の大きい点の見つけ方(てこ比・スチューデント化残差・Cook の距離)
from statsmodels.stats.outliers_influence import OLSInfluence
inf = OLSInfluence(res)
cooks = inf.cooks_distance[0] # Cook の距離
stud = inf.resid_studentized_external # スチューデント化残差
lev = inf.hat_matrix_diag # てこ比(レバレッジ)
| 足した点 | てこ比 | スチューデント化残差 | Cook の距離 |
|---|---|---|---|
| x=25, y=5 | 0.772 | -15.12 | 29.9 |
| x=5, y=40 | 0.049 | 26.33 | 0.47 |
| (参考)元の20件の最大 | - | - | 0.149 |
- てこ比は「x がほかの点からどれだけ離れているか」。x=25 の点は 0.772 と非常に大きい。
- スチューデント化残差は「y が式からどれだけ外れているか」。絶対値が2〜3を超える点を確かめます。
- Cook の距離は両方を合わせた「その1点を抜くと係数がどれだけ変わるか」。目安として 1 や
4 ÷ 件数(ここでは0.19)が使われます。
外れ値は、まず入力の誤り(桁違い・単位違い)でないかを確かめます。誤りなら直し、正しい値なら、消す前に「外れ値を含めた結果」と「除いた結果」を両方示します。外れ値に強い方法として、statsmodels の RLM(Huber の重み)では、x=25 の点を含めたままでも傾き 1.172(最小二乗法では 0.223)でした。
過学習(説明変数や次数を増やすとテストで外れる)
この節では、回帰で起きる過学習の実物と、学習用の決定係数だけを見て判断してはいけない理由が分かります。
過学習とは、学習に使ったデータには非常によく当てはまるのに、新しいデータには当たらない状態です。 回帰では、説明変数を増やしすぎたときと、多項式の次数を上げすぎたときに起きます。
多項式の次数を上げる(学習15件・テスト500件)
本当の関係は直線(y = 2 + 0.8x+ばらつき)です。15件だけで学習し、新しい500件で確かめました。
| 次数 | 学習の R2 | テストの R2 | 学習の RMSE | テストの RMSE |
|---|---|---|---|---|
| 1(直線) | 0.721 | 0.579 | 1.364 | 1.746 |
| 2 | 0.744 | 0.545 | 1.305 | 1.816 |
| 3 | 0.888 | 0.238 | 0.865 | 2.349 |
| 6 | 0.903 | 0.112 | 0.803 | 2.536 |
| 10 | 0.909 | -3.402 | 0.780 | 5.648 |
| 14 | 0.909 | -30.558 | 0.776 | 15.121 |
次数を上げると、学習の決定係数は 0.721 から 0.909 に上がり続けました。テストの決定係数は直線が最も高く、次数14では -30.6 です。決定係数がマイナスになるのは、「全部の平均を答える」よりも外れているという意味です。 学習データの x の範囲(0.05〜8.97)の外にある x=9.8 では、直線の予測 8.86 に対し、次数14の予測は 83.87(本当は 9.84)でした。
意味の無い説明変数を増やす(40件)
目的変数も説明変数も、互いに関係の無い乱数にして、説明変数の数 p を増やしました。
| 説明変数の数 | 学習の R2 | 自由度調整済み R2 | テストの R2 | p値 0.05 未満の数 |
|---|---|---|---|---|
| 1 | 0.014 | -0.012 | -0.025 | 0 |
| 10 | 0.314 | 0.078 | -0.352 | 1 |
| 20 | 0.541 | 0.057 | -1.187 | 1 |
| 30 | 0.622 | -0.640 | -1.650 | 0 |
| 39 | 1.000 | 計算できない | -91393.9 | - |
関係が何も無いのに、説明変数を39個(件数40−1)にすると、学習の決定係数は 1.000 になりました。式の数と未知数の数が同じになり、全部の点をちょうど通る式が作れてしまうためです。自由度調整済み決定係数は上がらず、テストの決定係数はマイナスでした。また、10個・20個のときは、意味の無い変数のうち1つが「p値 0.05 未満」になっています。変数をたくさん試して、p値の小さいものだけを選ぶと、偶然の当たりを拾います。
防ぎ方
- 1テスト用データを先に分けておく学習に使っていないデータで、決定係数・RMSE を測る
- 2交差検証で比べるcross_val_score でデータの分け方を変えて平均をとる
- 3件数に対して変数を増やしすぎない自由度調整済み決定係数・AIC で比べる
- 4正則化(Ridge・Lasso)を使う次数14でも Ridge(alpha=10)でテストの R2 は 0.396 まで戻った
- 5データの範囲の外を予測しない外挿では、どの式も当たる保証が無い
回帰分析の前提と残差の確かめ方(相関と因果の違いも)
この節では、線形回帰の係数表を信じてよいかを確かめる手順と、回帰の結果から「原因」と言えない場合が分かります。
係数の推定値は前提が多少崩れても使えますが、標準誤差・p値・信頼区間は前提が崩れると信用できなくなります。
| 前提 | 崩れるとどうなるか | 確かめ方(statsmodels) | 手元の結果 |
|---|---|---|---|
| 関係が直線(線形) | 係数が平均的な傾きになり、予測がずれる | 残差と予測値の表を見る・2乗の項を足して比べる | 多項式の節を参照 |
| 残差のばらつきが一定(等分散) | 標準誤差・p値がずれる | Breusch-Pagan 検定 het_breuschpagan | 一定のデータ p=0.846、x に比例して広がるデータ p=1.4e-06 |
| 残差どうしが独立 | p値が小さく出すぎる | Durbin-Watson(2付近なら良い) | 前の値を引きずる時系列データで 0.69 |
| 残差が正規分布 | 件数が少ないとき検定がずれる | Jarque-Bera(Prob(JB)) | 単回帰の例 0.583 |
| 説明変数どうしが似すぎない | 係数が不安定 | VIF | 前の節を参照 |
ばらつきが一定でないとき(不均一分散)は、頑健な標準誤差を使う方法があります。fit(cov_type="HC3") または get_robustcov_results("HC3") で、手元のデータでは切片の標準誤差が 0.8412 から 0.5644 に変わりました。係数そのものは変わりません。
相関と因果:回帰の係数は「原因の大きさ」とは限らない
気温が上がると、アイスの売上も水の事故も増える、という乱数のデータ(1000日分)を作りました。アイスの売上は水の事故の原因ではありません。
| 式 | アイスの係数 | アイスのp値 | 気温の係数 |
|---|---|---|---|
| 事故 = a + b × アイス | 0.111 | 0.0000 | (入れていない) |
| 事故 = a + b × アイス + c × 気温 | 0.004 | 0.7078 | 0.277(p=0.0000) |
アイスだけの式では、p値が非常に小さく「アイスが売れると事故が増える」ように見えます。両方に影響する気温(交絡因子)を説明変数に入れると、アイスの係数は 0.004 に下がり、p値は 0.7078 になりました。回帰分析で原因を語るには、交絡因子を入れる・実験(ABテスト)で確かめる、といった設計が要ります。 入れていない交絡因子は、データのどこにも現れません。
ロジスティック回帰とは(確率とオッズ比の読み方)
この節では、2択の結果を予測するロジスティック回帰の考え方と、係数をオッズ比に直して読む方法が分かります。
ロジスティック回帰は、「1になる確率」を0〜1の範囲で求める回帰です。 名前は回帰ですが、合格/不合格・解約する/しないなどの分類によく使われます。
なぜ普通の線形回帰ではいけないのか
合否(0か1)を、そのまま線形回帰(最小二乗法)で予測すると、確率としてありえない値が出ます。次の500件のデータで試すと、予測値は -0.386〜1.207 で、0未満が25件、1超が18件でした。ロジスティック回帰は、式の値 z をシグモイド関数 p = 1 ÷ (1 + e^(-z)) に通して、必ず0〜1に収めます。
データ:学習時間・模試の点と合否(乱数で500人)
res = sm.Logit(df["passed"], sm.add_constant(df[["hours", "mock"]])).fit()
print(res.summary())
odds = np.exp(res.params) # 係数を e の何乗かにするとオッズ比
ci = np.exp(res.conf_int()) # オッズ比の95%信頼区間
Optimization terminated successfully.
Current function value: 0.475274
Iterations 6
Logit Regression Results
==============================================================================
Dep. Variable: passed No. Observations: 500
Model: Logit Df Residuals: 497
Method: MLE Df Model: 2
Pseudo R-squ.: 0.3138
Log-Likelihood: -237.64
converged: True LL-Null: -346.32
Covariance Type: nonrobust LLR p-value: 6.318e-48
==============================================================================
coef std err z P>|z| [0.025 0.975]
------------------------------------------------------------------------------
const -8.8493 0.942 -9.399 0.000 -10.695 -7.004
hours 0.5264 0.050 10.494 0.000 0.428 0.625
mock 0.1033 0.013 7.729 0.000 0.077 0.130
==============================================================================
係数をオッズ比に直す
ロジスティック回帰の係数は、確率ではなく対数オッズ(ログオッズ)の増え方です。オッズは「起きる確率 ÷ 起きない確率」で、確率0.8ならオッズは4です。係数を exp(係数) にすると、オッズ比(説明変数が1増えたとき、オッズが何倍になるか)になります。
| 説明変数 | 係数 | オッズ比 | オッズ比の95%信頼区間 | 読み方 |
|---|---|---|---|---|
| hours(学習時間1時間) | 0.5264 | 1.693 | 1.534〜1.868 | 合格のオッズが約1.69倍 |
| mock(模試1点) | 0.1033 | 1.109 | 1.080〜1.138 | 合格のオッズが約1.11倍 |
- オッズ比が1なら関係なし、1より大きければ起きやすく、1より小さければ起きにくくなります。信頼区間が1をまたいでいなければ、p値 0.05 未満と同じ判断になります。
- オッズ比1.69は「確率が1.69倍」ではありません。 模試60点の人で予測確率を出すと、学習時間2時間で 0.168、5時間で 0.495、8時間で 0.826 でした。確率の増え方は、確率が0.5付近のとき大きく、0や1に近いと小さくなります。
- 模試10点分のオッズ比は
exp(0.1033 × 10)≒ 2.81倍です。単位を変えるときは係数を何倍かしてから exp にします。
ロジスティック回帰の当てはまりと評価
- Pseudo R-squ.(疑似決定係数)0.3138:McFadden の疑似決定係数。線形回帰の決定係数と同じ物差しではなく、0.2〜0.4でもよく当てはまっていることがあります。
- LLR p-value 6.318e-48:説明変数を入れない式と比べた尤度比検定のp値。
- 予測の良さは、テスト用データの正解率・AUC で見ます。350人で学習して150人で確かめると、正解率 0.78・AUC 0.886 でした。正解率・適合率・再現率の使い分けは、記事「Precision(適合率)・再現率・正解率・F1の違い|陽性1%で実測」で扱う予定です。
scikit-learn の LogisticRegression は既定で正則化される
scikit-learn の LogisticRegression は、何も指定しないと L2 正則化(C=1.0)が掛かり、statsmodels と係数が少し変わります。 公式ドキュメント(1.9.1)にも「regularization is applied by default」と書かれています。
| 書き方 | 切片 | hours の係数 | mock の係数 |
|---|---|---|---|
| statsmodels の Logit | -8.8493 | 0.5264 | 0.1033 |
LogisticRegression()(既定 C=1.0) | -8.8322 | 0.5250 | 0.1031 |
LogisticRegression(C=np.inf) | -8.8492 | 0.5264 | 0.1033 |
正則化を外す書き方は、以前の版の penalty=None から変わりました。scikit-learn 1.9.1 で penalty=None を渡すと、次の警告が出ました(結果は C=np.inf と同じ)。
FutureWarning: 'penalty' was deprecated in version 1.8 and will be removed in 1.10. To avoid this warning, leave 'penalty' set to its default value and use 'l1_ratio' or 'C' instead. Use l1_ratio=0 instead of penalty='l2', l1_ratio=1 instead of penalty='l1', l1_ratio set to a float between 0 and 1 instead of penalty='elasticnet', and C=np.inf instead of penalty=None.
係数を解釈・報告するときは、statsmodels の Logit か、C=np.inf を使います。
回帰分析の進め方と判断表
この節では、回帰分析を始めてから結論を書くまでの順番と、迷ったときの判断表が分かります。
目的を決める(予測か、要因の比較か)
予測ならテストの誤差、要因なら係数と信頼区間を主に見る。目的変数の種類で手法を選ぶ。
データを確かめる
欠損値(NaN)・桁違い・単位違い・件数。カテゴリはダミー変数にする。pandas の操作は関連記事「pandasの使い方 逆引き81選|pandas 3.0の実行結果つき」で扱っています。
学習用とテスト用に分ける
予測に使うなら、最初に分けてテスト用は最後まで触らない。
当てはめて係数表を読む
係数・信頼区間・p値・決定係数(重回帰は自由度調整済み)・VIF。
残差と外れ値を確かめる
等分散・独立・Cook の距離。崩れていれば頑健な標準誤差や変数の見直し。
言えることだけを書く
「関係がある」と「原因である」を分ける。データの範囲・件数・入れた変数を添える。
判断表
| こういうとき | こうする | 理由(手元の実測) |
|---|---|---|
| 目的変数が2択 | ロジスティック回帰 | 線形回帰では確率が -0.386〜1.207 になった |
| 係数の p値・信頼区間が欲しい | statsmodels | scikit-learn は出さない |
| VIF が5〜10を超える | 似た変数を外す・まとめる・Ridge | VIF 81.7 で係数の符号が逆になった |
| 説明変数の重要度を比べたい | 標準化した係数を比べる(VIF も確かめる) | 元の係数は単位に左右される |
| 学習の決定係数が高い | テスト用データ・交差検証で測り直す | 学習 0.909・テスト -30.6 があった |
| Cook の距離が1を超える点がある | 入力の誤りを確かめ、含めた結果と除いた結果を両方示す | 1点で傾きが 1.558 → 0.223 |
| 残差のばらつきが x で変わる | 頑健な標準誤差(HC3)・対数変換 | Breusch-Pagan の p値が 1.4e-06 |
| 原因かどうかを言いたい | 交絡因子を入れる・実験で確かめる | 気温を入れるとアイスの係数は 0.111 → 0.004 |
よくあるエラーとつまずき(Pythonの原文つき)
この節では、scikit-learn と statsmodels で回帰分析をするときによく出るエラー・警告の原文と、直し方が分かります。
| 出た文言(原文) | 原因 | 直し方 |
|---|---|---|
| ValueError: Expected 2D array, got 1D array instead | scikit-learn に説明変数を1次元で渡した | df[["ad"]](角かっこ2重)か x.reshape(-1, 1) |
| ValueError: Input X contains NaN. | 欠損値がある(LinearRegression は NaN を受け付けない) | dropna() か SimpleImputer で埋める |
| MissingDataError: exog contains inf or nans | statsmodels に NaN・無限大を渡した | sm.OLS(..., missing="drop") で行を除く(30件→29件で動いた) |
| ValueError: could not convert string to float: 'a' | 文字の列をそのまま渡した | ダミー変数にする(pd.get_dummies(drop_first=True)・式の C(列)) |
| ValueError: Found input variables with inconsistent numbers of samples: [29, 30] | x と y の件数が違う | 欠損を除くときは x と y を同じ行で除く |
| UserWarning: X does not have valid feature names, but LinearRegression was fitted with feature names | 表(列名あり)で学習し、配列で予測した | 予測も同じ列名の表で渡す |
| ValueError: endog must be in the unit interval. | Logit の目的変数に 0・1 以外(2 など)がある | 0 と 1 に置き換える |
| PerfectSeparationWarning: Perfect separation or prediction detected | ある値を境に0と1がきれいに分かれている(完全分離) | 係数が発散する(手元では 39.2)。変数を見直すか正則化 |
| ConvergenceWarning: Maximum Likelihood optimization failed to converge | 最尤推定が収束しない(完全分離・尺度の違い) | 標準化する・maxiter を増やす・変数を減らす |
| The condition number is large, 7.2e+03. | 多重共線性か、単位の大きさの違い | VIF を確かめる・標準化して当て直す |
add_constant を忘れると、切片の無い式になる
statsmodels の sm.OLS(y, x) は、切片を自動で入れません。忘れてもエラーは出ず、原点を通る式になります。
切片なし:係数 2.453 R2 0.9844
切片あり:切片 3.289 係数 1.998 R2 0.9786
本当の傾きは 2.0 です。切片なしの決定係数(0.9844)は、平均ではなく0を基準にした別の計算(summary には R-squared (uncentered) と出る)で、切片ありより高く見えても、良い式という意味ではありません。式の書き方(smf.ols("y ~ x", data=df))なら切片は自動で入ります。
VIF は「標準化」と「切片」に注意
statsmodels 0.15.0 の variance_inflation_factor は、既定で列を標準化してから計算します(standardize=True)。手元の糖尿病データでは、切片の列を入れても入れなくても同じ値(s1 で 59.20)でした。一方、standardize=False にして切片の列も入れないと、s1 が 576.89、age が 17.88 になり、問題の無い変数まで大きな値になりました。以前の版の記事のコードをそのまま使うときは、版とこの引数を確かめます。
ダミー変数は1つ減らす
店舗(渋谷・新宿・池袋)のような区分は、0と1の列にします。3つ全部の列と切片を入れると、列の合計が切片と同じになり計算できません(ダミー変数の罠)。C(store) で書くと、新宿が基準になり、係数は「新宿と比べて池袋は -2.63、渋谷は +5.70」と読みます。作業場所の分け方(venv)は、関連記事「Python venvの使い方|仮想環境の作成・有効化・削除をOS別にコピペ」で扱っています。
よくある質問
Q. 回帰分析とは、簡単に言うと何ですか? A. 結果の数値を、原因と考える数値の式で表す方法です。式ができると、「x がこの値なら y はいくらか」の予測と、「どの x が y と強く結びついているか」の比較ができます。
Q. 回帰とはどういう意味ですか? A. 「戻る」という意味で、ゴルトンが親子の身長を調べたときの「平均への回帰」が名前の由来です。今は、数値を数値で説明する式を作る方法全般を回帰と呼びます。機械学習では、数値を予測する問題を回帰(regression)、区分を予測する問題を分類と呼び分けます。
Q. 単回帰分析と重回帰分析の違いは何ですか? A. 説明変数が1つなら単回帰、2つ以上なら重回帰です。重回帰の係数は「ほかの変数を固定したときの効果」で、単回帰の係数とは意味が変わります。手元の糖尿病データでは、BMI の係数が単回帰の 10.2 から重回帰の 5.6 に下がりました。
Q. ロジスティック回帰と線形回帰の違いは何ですか?
A. 線形回帰は数値を、ロジスティック回帰は「1になる確率」を求めます。ロジスティック回帰の係数は対数オッズの増え方で、exp(係数) にしたオッズ比で読みます。
Q. 決定係数はいくつ以上あればよいですか? A. 共通の基準はありません。分野と目的で変わります。予測に使うなら、学習に使っていないデータでの決定係数や RMSE を見ます。学習データの決定係数は、変数を増やすだけで上がります(手元では意味の無い変数39個で 1.000)。
Q. p値が 0.05 より大きい変数は外すべきですか? A. 機械的には外しません。p値が大きいのは「このデータでは0と区別できない」という意味で、「関係が無い」の証明ではありません。多重共線性があると、本当は効いている変数のp値も大きくなります(手元では 0.49〜0.96)。目的と信頼区間を合わせて判断します。
Q. 多重共線性はどう確かめますか? A. VIF を計算します。statsmodels の公式ドキュメントは5を超えると高い共線性としており、10を目安にすることもあります。相関行列で、説明変数どうしの相関が0.8〜0.9を超える組を探すのも手がかりになります。
Q. 回帰分析で因果関係は分かりますか? A. 回帰分析だけでは分かりません。分かるのは「一緒に動く関係」です。交絡因子を入れ忘れると、関係の無い変数に大きな係数とごく小さなp値が付きます(アイスと事故の例)。原因を確かめるには、ABテストのような実験や、因果推論の設計が要ります。
まとめ
- 回帰分析は、結果の数値を原因と考える数値の式で表す手法。目的変数が数値なら単回帰・重回帰、2択ならロジスティック回帰を使う。
- 係数表は coef・std err・p値・95%信頼区間の4つを読む。p値は効果の大きさでも原因の証明でもなく、来月の値の範囲は信頼区間ではなく予測区間で示す。
- 重回帰の係数は「ほかを固定したときの効果」。VIF が5〜10を超えると係数の符号が入れ替わる(手元では VIF 81.7 で -0.20、糖尿病データの s3 は外す変数しだいで符号が逆)。
- 学習データの決定係数は変数や次数を増やすほど上がる。テスト用データで測ると、次数14は -30.6、関係の無い変数39個は学習 1.000 だった。
- ロジスティック回帰はオッズ比で読み、オッズ比は確率の倍率ではない。scikit-learn は既定で正則化され、1.8 以降は
penalty=NoneではなくC=np.infで外す。
次に読むとよい記事です。p値の意味と誤解は関連記事「p値とは|意味・有意水準・よくある誤解をPythonで実演」で、回帰直線の求め方そのものは関連記事「最小二乗法とは|公式・手計算の例とPythonでの求め方を実例で解説」で扱っています。機械学習全体の中での回帰の位置づけは、記事「機械学習とは|種類・ディープラーニングとの違いを実行結果で解説」で扱う予定です。
参考・出典
確認日はいずれも 2026年10月29日です。
- scikit-learn「LinearRegression」(1.9.1):https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html
- scikit-learn「LogisticRegression」(1.9.1。既定の正則化・penalty の非推奨):https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html
- scikit-learn「Toy datasets」(Diabetes dataset):https://scikit-learn.org/stable/datasets/toy_dataset.html
- statsmodels「Linear Regression」(0.15.0):https://www.statsmodels.org/stable/regression.html
- statsmodels「variance_inflation_factor」(0.15.0):https://www.statsmodels.org/stable/generated/statsmodels.stats.outliers_influence.variance_inflation_factor.html
- statsmodels「Logit」:https://www.statsmodels.org/stable/generated/statsmodels.discrete.discrete_model.Logit.html
- Google for Developers「ロジスティック回帰: 損失と正則化」(機械学習集中講座):https://developers.google.com/machine-learning/crash-course/logistic-regression/loss-regularization?hl=ja
- コトバンク「回帰分析」(世界大百科事典・デジタル大辞泉ほか):https://kotobank.jp/word/回帰分析
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「回帰分析とは|単回帰・重回帰・ロジスティック回帰の違いをp値・VIFで実演」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。