REGR_(線形回帰)ファンクション

線形回帰ファンクションは次のとおりです。

  • REGR_SLOPE

  • REGR_INTERCEPT

  • REGR_COUNT

  • REGR_R2

  • REGR_AVGX

  • REGR_AVGY

  • REGR_SXX

  • REGR_SYY

  • REGR_SXY

構文

linear_regr::=

関連項目:

構文、セマンティクスおよび制限事項の詳細は、「分析ファンクション」を参照してください。

目的

線形回帰ファンクションは、微分最小2乗法で求めた回帰直線を数値の組の集合に対応付けます。これは、集計ファンクションまたは分析ファンクションとして使用できます。

関連項目:

exprの書式の詳細は、「集計ファンクション」および「SQL式」を参照してください。

これらのファンクションは、引数として、任意の数値データ型、または暗黙的に数値データ型に変換可能な数値以外のデータ型を取ります。Oracleは、数値の優先順位が最も高い引数を判断し、残りの引数をそのデータ型に暗黙的に変換して、そのデータ型を戻します。

関連項目:

暗黙的な変換の詳細は、表2-8を参照してください。数値の優先順位の詳細は、「数値の優先順位の詳細」を参照してください。

Oracleは、expr1またはexpr2がNULLであるすべての組を排除した後、このファンクションを(expr1, expr2)の組の集合に適用します。Oracleは、データでの引渡し中、同時にすべての回帰ファンクションを計算します。

expr1は、従属変数の値(y値)として解析されます。expr2は、独立変数の値(x値)として解析されます。

  • REGR_SLOPEは、直線の傾きを戻します。戻り値は数値データ型で、NULLになる場合もあります。NULL (expr1, expr2)の組を排除した後、このファンクションは次の計算を行います。

    COVAR_POP(expr1, expr2) / VAR_POP(expr2)
    
  • REGR_INTERCEPTは、回帰直線のy切片を戻します。戻り値は数値データ型で、NULLになる場合もあります。NULL (expr1, expr2)の組を排除した後、このファンクションは次の計算を行います。

    AVG(expr1) - REGR_SLOPE(expr1, expr2) * AVG(expr2)
    
  • REGR_COUNTは整数を戻します。この整数は、回帰直線に適応させるために使用されるNULLでない数値の組です。

  • REGR_R2は、回帰に対する決定係数(Rの2乗または適合度とも呼ぶ)を戻します。戻り値は数値データ型で、NULLになる場合もあります。VAR_POP (expr1)およびVAR_POP (expr2)は、NULLの組が排除された後に評価されます。戻り値は次のとおりです。

                         NULL if VAR_POP(expr2)  = 0
    
                            1 if VAR_POP(expr1)  = 0 and 
                                 VAR_POP(expr2) != 0
    
    POWER(CORR(expr1,expr),2) if VAR_POP(expr1)  > 0 and
                                 VAR_POP(expr2  != 0
    

これ以外のすべての回帰ファンクションの戻り値は数値データ型で、NULLになる場合もあります。

  • REGR_AVGXは、回帰直線の独立変数(expr2)の平均を求めます。NULL(expr1, expr2)の組を排除した後、このファンクションは次の計算を行います。

    AVG(expr2)
    
  • REGR_AVGYは、回帰直線の従属変数(expr1)の平均を求めます。NULL(expr1, expr2)の組を排除した後、このファンクションは次の計算を行います。

    AVG(expr1)
    

REGR_SXYREGR_SXXREGR_SYYは補助ファンクションです。これらは、様々な診断統計の計算に使用されます。

  • NULL (expr1, expr2)の組を排除した後、REGR_SXXは次の計算を行います。

    REGR_COUNT(expr1, expr2) * VAR_POP(expr2)
    
  • NULL (expr1, expr2)の組を排除した後、REGR_SYYは次の計算を行います。

    REGR_COUNT(expr1, expr2) * VAR_POP(expr1)
    
  • NULL (expr1, expr2)の組を排除した後、REGR_SXYは次の計算を行います。

    REGR_COUNT(expr1, expr2) * COVAR_POP(expr1, expr2)
    

次の例は、サンプル表sh.salesおよびsh.productsに基づいています。

一般的な線形回帰の例

次の例では、分析書式で使用される様々な線形回帰ファンクションを比較します。これらのファンクションの分析書式は、モデル別で従業員ごとに予測される給与の検索などの計算で、回帰統計を使用する場合に有効です。次の個々の線形回帰ファンクションについての項では、これらのファンクションの集計書式の例を示します。

SELECT job_id, employee_id ID, salary,
REGR_SLOPE(SYSDATE-hire_date, salary)
   OVER (PARTITION BY job_id) slope,
REGR_INTERCEPT(SYSDATE-hire_date, salary)
   OVER (PARTITION BY job_id) intcpt,
REGR_R2(SYSDATE-hire_date, salary)
   OVER (PARTITION BY job_id) rsqr,
REGR_COUNT(SYSDATE-hire_date, salary)
   OVER (PARTITION BY job_id) count,
REGR_AVGX(SYSDATE-hire_date, salary)
   OVER (PARTITION BY job_id) avgx,
REGR_AVGY(SYSDATE-hire_date, salary)
   OVER (PARTITION BY job_id) avgy
   FROM employees
   WHERE department_id in (50, 80)
   ORDER BY job_id, employee_id;

JOB_ID        ID     SALARY SLOPE    INTCPT  RSQR  COUNT       AVGX      AVGY
---------- ----- ---------- ----- --------- ----- ------ ---------- ---------
SA_MAN       145      14000  .355 -1707.035  .832      5  12200.000  2626.589
SA_MAN       146      13500  .355 -1707.035  .832      5  12200.000  2626.589
SA_MAN       147      12000  .355 -1707.035  .832      5  12200.000  2626.589
SA_MAN       148      11000  .355 -1707.035  .832      5  12200.000  2626.589
SA_MAN       149      10500  .355 -1707.035  .832      5  12200.000  2626.589
SA_REP       150      10000  .257   404.763  .647     29   8396.552  2561.244
SA_REP       151       9500  .257   404.763  .647     29   8396.552  2561.244
SA_REP       152       9000  .257   404.763  .647     29   8396.552  2561.244
SA_REP       153       8000  .257   404.763  .647     29   8396.552  2561.244
SA_REP       154       7500  .257   404.763  .647     29   8396.552  2561.244
SA_REP       155       7000  .257   404.763  .647     29   8396.552  2561.244
SA_REP       156      10000  .257   404.763  .647     29   8396.552  2561.244
. . .

REGR_SLOPEおよびREGR_INTERCEPTの例

次の例では、サンプル表hr.employeesを使用して、勤務時間(SYSDATE - hire_date)と給与に関する線形回帰モデルの傾きと回帰を計算します。結果はjob_id別にグループ化されます。

SELECT job_id,
REGR_SLOPE(SYSDATE-hire_date, salary) slope,
REGR_INTERCEPT(SYSDATE-hire_date, salary) intercept
   FROM employees
   WHERE department_id in (50,80)
   GROUP BY job_id
   ORDER BY job_id;

JOB_ID     SLOPE    INTERCEPT
---------- ----- ------------
SA_MAN      .355 -1707.030762
SA_REP      .257   404.767151
SH_CLERK    .745   159.015293
ST_CLERK    .904   134.409050
ST_MAN      .479  -570.077291

REGR_COUNTの例

次の例では、サンプル表hr.employeesを使用して、勤務時間(SYSDATE - hire_date)と給与について、job_id別の数を計算します。結果はjob_id別にグループ化されます。

SELECT job_id,
REGR_COUNT(SYSDATE-hire_date, salary) count
   FROM employees
   WHERE department_id in (30, 50)
   GROUP BY job_id
   ORDER BY job_id, count;

JOB_ID          COUNT
---------- ----------
PU_CLERK            5
PU_MAN              1
SH_CLERK           20
ST_CLERK           20
ST_MAN              5

REGR_R2の例

次の例では、サンプル表hr.employeesを使用して、勤務時間(SYSDATE - hire_date)と給与の線形回帰に対する決定係数を計算します。

SELECT job_id,
REGR_R2(SYSDATE-hire_date, salary) Regr_R2
   FROM employees
   WHERE department_id in (80, 50)
   GROUP by job_id
  ORDER BY job_id, Regr_R2;

JOB_ID        REGR_R2
---------- ----------
SA_MAN      .83244748
SA_REP     .647007156
SH_CLERK   .879799698
ST_CLERK   .742808493
ST_MAN      .69418508

REGR_AVGYおよびREGR_AVGXの例

次の例では、サンプル表hr.employeesを使用して、勤務時間(SYSDATE - hire_date)と給与の平均値を計算します。結果はjob_id別にグループ化されます。

SELECT job_id,
REGR_AVGY(SYSDATE-hire_date, salary) avgy,
REGR_AVGX(SYSDATE-hire_date, salary) avgx
   FROM employees
   WHERE department_id in (30,50)
   GROUP BY job_id
   ORDER BY job_id, avgy, avgx;

JOB_ID           AVGY       AVGX
---------- ---------- ----------
PU_CLERK    2950.3778       2780
PU_MAN      4026.5778      11000
SH_CLERK    2773.0778       3215
ST_CLERK    2872.7278       2785
ST_MAN      3140.1778       7280

REGR_SXY、REGR_SXXおよびREGR_SYYの例

次の例では、サンプル表hr.employeesを使用して、勤務時間(SYSDATE - hire_date)と給与の線形回帰について、3種類の診断統計を計算します。

SELECT job_id,
REGR_SXY(SYSDATE-hire_date, salary) regr_sxy,
REGR_SXX(SYSDATE-hire_date, salary) regr_sxx,
REGR_SYY(SYSDATE-hire_date, salary) regr_syy
   FROM employees
   WHERE department_id in (80, 50)
   GROUP BY job_id
   ORDER BY job_id;
 
JOB_ID       REGR_SXY    REGR_SXX   REGR_SYY
---------- ---------- ----------- ----------
SA_MAN        3303500   9300000.0    1409642
SA_REP     16819665.5  65489655.2 6676562.55
SH_CLERK      4248650   5705500.0    3596039
ST_CLERK      3531545   3905500.0 4299084.55
ST_MAN        2180460   4548000.0  1505915.2