2017-08-14 9 views
0
で日付の列に基づいて、列の型間の相関行列を作成

私はこのようになりますテーブルを持っている:私は私のproduct_typeによる相関を与える相関行列を作成しようとしていは、SAS

product_type sales date 
A    470  1/1/2017 
A    233  1/2/2017 
A    312  1/3/2017 
A    139  1/4/2017 
A    343  1/5/2017 
A    234  1/6/2017 
B    441  1/1/2017 
B    175  1/2/2017 
B    293  1/3/2017 
B    109  1/4/2017 
B    314  1/5/2017 
B    55  1/6/2017 
C    292  1/1/2017 
C    212  1/2/2017 
C    372  1/3/2017 
C    452  1/4/2017 
C    362  1/5/2017 
C     6  1/6/2017 

日付に基づいて私はこのように私の出力を必要とする:

A B C 
A 1.0 0.8 0.1 
B 0.2 1.0 0.2 
C 0.6 0.2 1.0 

私はこれを行う方法を知っている唯一の方法は、このような日付に基づいて、列に各product_typeを破る新しいテーブルを作成することです:

proc sql; 
create table test as 
select date 
     ,sum(case when product_type = 'A' then sales else . end) as A 
     ,sum(case when product_type = 'B' then sales else . end) as B 
     ,sum(case when product_type = 'C' then sales else . end) as C 
from work.data 
group by 1; 
quit; 

proc corr data=work.test; 
run; 

これは私が望む行列を得ますが、product_typesに数十の一意の値があると、それぞれの行を書くのに非常に時間がかかるでしょう。

また、私はこれを試してみた:

proc corr data=data; 
by product_type notsorted; 
run; 

しかし、これはちょうど私が探しているものではありませんこれは、日付と売上との相関関係を取得します。

私もこれを試してみました:

proc corr data=data; 
by date product_type notsorted; 
run; 

を私は本当にこのコードがやっている内容を正確に把握していないが、それは私のSASを墜落しました。

最初のテーブルを使用してこれを効率的に取得する方法についてのご意見はありますか?

+0

0.8は第1行(AxB)の2番目の値を表しますか?それはすべての日付でAとBの相関関係ですか? – Reeza

+0

@Reezaはい、すべての日付です。 – Jarom

+0

次に私の答えはTRANSPOSEであり、CORRはあなたに望ましい結果を与えます。 – Reeza

答えて

1

各製品が列であるようにデータを再フォーマットし、次に製品間の相関を見つける必要があります。 PROC TRANSPOSEを使用してデータを長いものから長いものに変更し、PROC CORRを使用してマトリックスを作成します。これは完全に動的なので、製品や日付を追加すると機能します。それ以外の場合は、上記のSQLメソッドを使用して手動で行うことができます。

EDIT:サンプルコードです。

proc sort data=have; 
by date product_type; 
run; 

proc transpose data=have out=wide prefix=PT_; 
by date; 
var sales; 
id product_type; 
idlabel product_type; 
run; 

proc corr data=wide; 
var PT_:; 
run; 
+0

私はPROC TRANSPOSEのバリエーションをたくさん試しましたが、私の例でPROC SQLが行うことを複製することはできません。代わりに、 'product_type'に' col1'、 'col2'、' col3'などがあります。私はSASが各列の間に相関行列を作成しようとしていると思います。 PROC TRANSPOSEを使用してPROC SQLと同じフォーマットで取得する方法を知っていますか? – Jarom

+0

PROC TRANSPOSEの一部が欠けている可能性が最も高いです。上記のコードを参照してください。 – Reeza