2017-05-11 2 views
1

を返すstats_crosstabカイ二乗検定、私は次のクエリ(簡体字)行っております: DFを::TBLはのOracle SQL:0

Person Category Count 
Person1 Category1 7 
Person1 Category2 1 
Person1 Category3 1 
Person1 Category4 39 
Person2 Category1 6 
Person2 Category2 2 
Person2 Category3 1 
Person2 Category4 35 
Person3 Category1 7 
Person3 Category2 1 
Person3 Category3 1 
Person3 Category4 14 

これは私が取得しています結果である

SELECT STATS_CROSSTAB(Person, Category, 'CHISQ_DF') DF, 
STATS_CROSSTAB(Person, Category, 'CHISQ_OBS') CHI_SQUARED, 
STATS_CROSSTAB(Person, Category, 'CHISQ_SIG') CHI_SIG 
FROM 
tbl 

を6(正しい) CHI_SQUARED:0(正しくない) CHI_SIG:1(間違っている)

私はresuを計算しました手動でLTとの答えは次のようになります。 DF:6(正しいです) CHI_SQUARED:4.5(修正されていません) CHI_SIG:0.87(正しくない)問題を引き起こしている何

?私は別の例から、これが可能でなければならないことを知っています。

+0

'CHI_SQUARED'と' CHI_SIG'の値の真円度は疑わしいと思われます。あなたはどんなクライアントを使っていますか?それが価値あるものであれば、サンプルデータでSTATS_CROSSTAB()を実行したとき、私は '6、8.98294755、0.174539362'を得ました。 – APC

+0

@APC Oracle SQL Developerを使用しています。私はあなたが少なくとも答えを得ていることに驚いています。 6は正しいはずですが(私はそれに小さな誤差を付けました)、4.5は正しいはずです。 –

+0

カウントは考慮されていると思われるようです。ではない。 PersonとCategoryの列で関数を呼び出しています。 Count列は完全に無視されます。適切な統計を取得したい場合は、各行「回数」を繰り返す必要があります。 (あなたはサブクエリーでそれを行うことができます - 私は答えでどのように表示されますか) – mathguy

答えて

2

なぜあなたのクエリが動作していない:あなたはカウントは考慮されていることを考えているようです。ではない。列PersonCategoryの関数を呼び出しています。 Count列は完全に無視されます。

あなたが適切な統計情報を取得したい場合は、それぞれの行に「カウント」回繰り返す必要があります。あなたはサブクエリーでそれを行うことができます。どのように動作させるか:

with tbl (Person, Category, cnt) as (
     select 'Person1', 'Category1', 7 from dual union all 
     select 'Person1', 'Category2', 1 from dual union all 
     select 'Person1', 'Category3', 1 from dual union all 
     select 'Person1', 'Category4', 39 from dual union all 
     select 'Person2', 'Category1', 6 from dual union all 
     select 'Person2', 'Category2', 2 from dual union all 
     select 'Person2', 'Category3', 1 from dual union all 
     select 'Person2', 'Category4', 35 from dual union all 
     select 'Person3', 'Category1', 7 from dual union all 
     select 'Person3', 'Category2', 1 from dual union all 
     select 'Person3', 'Category3', 1 from dual union all 
     select 'Person3', 'Category4', 14 from dual 
    ) 
SELECT STATS_CROSSTAB(Person, Category, 'CHISQ_DF') DF, 
STATS_CROSSTAB(Person, Category, 'CHISQ_OBS') CHI_SQUARED, 
STATS_CROSSTAB(Person, Category, 'CHISQ_SIG') CHI_SIG 
FROM 
(select person, category 
    from tbl 
connect by level <= cnt 
     and prior person = person 
     and prior category = category 
     and prior sys_guid() is not null 
); 

DF        CHI_SQUARE    CHI_SIG 
-- ---------------------------------------- ------------------- 
6 4.55259268824609733700642791551882460974 0.60233419532255972 
+0

この表のように、より多くのリテラルされている必要がありますカウントが0よりも常に大きいですが、そうでない場合どのような(例えば人物2、カテゴリー1、0)。 –

+0

@SvenCozijn - これは 'stats_crosstab'とは関係のない別の質問です。それはいくつかの方法で行うことができます。助けが必要な場合は、このサイトに別の質問を投稿してください。 (あなたはこの投稿を参照することができますが、質問は本当に違います)。 – mathguy