다양한 상관계수
다양한 상관계수
상관계수에는 피어슨 상관계수 외에도 스피어만, 켄달 등 다양한 상관계수가 있습니다.
점-이연 상관계수
dummy_model = df.model.map({'Avante': 0, 'K3': 1})
pg.corr(df.price, dummy_model)
이때의 p 값은 독립표본 t 검정에서 등분산성을 가정한 경우와 같다
avante = df.price[df.model == 'Avante']
k3 = df.price[df.model == 'K3']
pg.ttest(avante, k3, correction=False)
스피어만 상관계수
스피어만(Spearman) 상관계수는 순위 상관계수(rank correlation coefficient)입니다.
스피어만 상관계수는 변수 값을 서열로 변환을 합니다. 즉, 쉽게 말해서 등수로 바꾼다는 얘기죠. 그리고 이 등수의 피어슨 상관계수를 계산한 것이 스피어만 상관계수입니다.
스피어만 상관계수는 단조적(monotonic)이지만 선형적이지는 않은 관계를 측정할 때 사용합니다. 단조적이라는 것은 하나가 증가할 때, 다른 하나도 증가하거나 또는 하나가 증가할 때 다른 하나는 감소하는 그런 관계를 말합니다.
그런데 선형적이지 않다는 것은 이것이 직선으로 반듯하게 올라가거나 내려가는 것이 아니고 휘어져서 올라가거나 내려간다는 것이죠. 단, 단조적이라고 했으므로 올라갔다가 내려간다거나 이러지는 않습니다.
소득과 행복의 상관관계를 예로 들어봅시다. 대체로 소득이 증가하면 행복도 증가하는 것으로 알려지 있습니다. 즉, 둘의 관계는 단조증가하는 관계입니다. 그런데 소득이 100만원에서 200만원으로 늘어날 때와 1억에서 1억 100만원으로 늘어날 때 행복이 똑같이 증가하지는 않습니다. 앞의 경우에는 많이 행복하겠지만 뒤의 경우에는 별 느낌이 없겠죠. 즉 소득과 행복의 관계는 선형적이지 않다는 것입니다. 보통은 소득이 낮을 때는 소득이 조금만 올라도 행복이 크게 증가하지만, 소득이 일정이상 높아지면 그때부터는 행복이 별로 증가하지 않습니다.
이런 종류의 관계를 나타낼 때는 피어슨 상관계수를 사용하면, 소득과 행복의 상관관계가 낮게 나타납니다. 그러나 스피어만 상관계수를 사용하면 어쨌든 소득이 높은 사람이 행복도 높으므로, 상관관계가 좀 더 강하게 나타나게 됩니다.
그런데 우리가 두 변수의 관계가 선형적인지, 아닌지는 모르잖아요? 이럴 때는 피어슨과 스피어만 상관계수를 둘 다 구해서 비교해보면 됩니다. 두 가지가 비슷하게 높다면 선형에 가까운 상관관계가 있는 것이고, 피어슨은 낮은데 스피어만은 높다면 비선형에 가까운 상관관계가 있는 것으로 볼 수 있습니다.
중고차 데이터에서 가격 price
과 주행거리 mileage
의 스피어만 상관계수를 구해봅시다.
pg.corr(df.price, df.mileage, method='spearman')
cor.test(df$price, df$mileage, method = 'spearman')
켄달 상관계수
켄달(Kendall) 상관계수는 스피어만 상관계수와 비슷합니다. 다만, 계산하는 방식이 좀 다릅니다.
켄달 상관계수는 모든 사례를 둘 씩 짝 짓습니다. 그러면 $n$개의 사례가 있으면 짝이 $n(n-1)/2$가 됩니다. 예를 들어 4개의 사례가 있으면, 이것을 짝지으면 모두 6개의 짝이 만들어지죠.
다음으로 각각의 짝들을 살펴서 $x$와 $y$ 두 가지 변수에 대해서 $x$가 증가했을 때 $y$가 증가한 경우 $c$와 y가 감소한 경우 $d$를 셉니다. 켄달 상관계수는 다음과 같이 계산합니다.
$$ \frac{c - d}{n(n-1)/2} $$
결국 켄달 상관계수는 $x$가 증가할 때, $y$가 같이 증가하는 경우가 많은지, 아니면 $y$가 감소하는 경우가 많은지를 나타냅니다. 두 가지가 똑같이 반반이면 0이 됩니다.
켄달 상관계수는 스피어만 상관계수보다 이상치(outlier)에 영향을 덜 받는 경향이 있습니다. 따라서, 데이터가 적고 이상치가 많을 때는 스피어만보다 켄달을 더 권장합니다.
대신 켄달 상관계수는 데이터를 모두 조합해봐야 하기 때문에 데이터가 커지면 계산하는 시간이 좀 오래 걸린다는 단점이 있습니다.
중고차 데이터에서 가격 price
과 주행거리 mileage
의 스피어만 상관계수를 구해봅시다.
pg.corr(df.price, df.mileage, method='kendall')
cor.test(df$price, df$mileage, method = 'kendall')