首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >表中列间相关性的计算

表中列间相关性的计算
EN

Stack Overflow用户
提问于 2018-10-23 13:02:56
回答 2查看 3.5K关注 0票数 1

我正在尝试创建一个存储过程,用于计算临时表中某些列之间的关联。

我有一个查询,它生成一个临时表,如下所示,

代码语言:javascript
复制
 Date         USA     JAPAN    FRANCE   UK 
 2018-01-01   5       3.2      1.6      2.8
 2018-01-02   6.8     8.2      0.9      3.5
 2018-01-03   4.3     6.2      3.3      2.1
 2018-01-04   3.9     6.2      4.5      7.8
 ...
 2018-01-31   7.6     5.1      4.7      5.1

我想计算所有列之间的相关性。下面的查询正是这样做的。

代码语言:javascript
复制
SELECT 
(Avg(SeriesA * SeriesB) - (Avg(SeriesA) * Avg(SeriesB))) / (StDevP(SeriesA) * StDevP(SeriesB))  
FROM myTempTbl

但是,我临时表中的列数可能会发生变化,例如,另一个国家可能会被添加或删除等等。

计算所有列与输出结果之间的相关性的最佳方法是什么,如下所示?

我想要的结果如下(由关联组成),

代码语言:javascript
复制
    Country1  Country2   Correlation
    USA       JAPAN      0.1
    USA       FRANCE     0.1
    USA       UK         0.1
    JAPAN     FRANCE     0.1
    JAPAN     UK         0.1
    FRANCE    UK         0.1
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-23 13:22:21

但是,我怀疑这就是您想要的结果,但是,我得到的结果与您的结果不匹配(我获得了每个行的相关性的值0 ),这可能是因为您的示例数据意味着更多的数据(您没有提供这些数据,因此您问题中的预期结果并不代表所提供的样本数据)。然而,这至少应该把你推向正确的方向:

代码语言:javascript
复制
CREATE TABLE CountryData (DataDate date,
                          Country varchar(15),
                          SomeDecimal decimal(2,1)); --No idea what this represents

WITH VTE AS(
    SELECT *
    FROM (VALUES('20180101',5  ,3.2,1.6,2.8),
                ('20180102',6.8,8.2,0.9,3.5),
                ('20180103',4.3,6.2,3.3,2.1),
                ('20180104',3.9,6.2,4.5,7.8),
                ('20180131',7.6,5.1,4.7,5.1)) V([Date],USA,JAPAN,FRANCE,UK))
--Pivot the data. This is not dynamic, I am simply showing you what you need to data to look like.
--It was far quicker for me to take your existing data and pivot it, than transcribe it all in Normal Form
INSERT INTO CountryData
SELECT V.[Date],
       C.Country,
       CASE C.Country WHEN 'USA' THEN USA
                      WHEN 'JAPAN' THEN JAPAN
                      WHEN 'FRANCE' THEN FRANCE
                      WHEN 'UK' THEN UK
       END AS SomeDecimal
FROM VTE V
     CROSS APPLY (VALUES('USA'),('JAPAN'),('FRANCE'),('UK')) C(Country);
GO
--How your data should look
SELECT *
FROM CountryData;
GO
--And now the (much simpler) non-dynamic solution
SELECT CDa.Country AS Country1,
       CDb.Country As Country2,
       (Avg(CDa.SomeDecimal * CDb.SomeDecimal) - (Avg(CDa.SomeDecimal) * Avg(CDb.SomeDecimal))) / (StDevP(CDa.SomeDecimal) * StDevP(CDb.SomeDecimal)) AS Correlation
FROM CountryData CDa
     JOIN CountryData CDb ON CDa.Country != CDb.Country
GROUP BY CDa.Country, CDb.Country
ORDER BY CDa.Country, CDb.Country;

GO
DROP TABLE CountryData;
票数 3
EN

Stack Overflow用户

发布于 2020-12-11 00:06:43

选择(Avg(x * y) - (Avg(x) *Avg(Y))/ (StDevP(x) * StDevP(y))作为“相关性”

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52949805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档