상관관계 (Correlation)
상관관계는 두 변수가 서로 관련이 있는지 확인하는 통계적인 계산 방법이다. 데이터 분석에서 통계적 기법 중에 일반적으로 가장 흔히 쓰는 것 중에 하나 상관관계분석이다. 상관관계분석은 이해하기 쉽고 계산도 매우 간단해서 데이터 분석에서 어떤 쓸만한 사실을 찾을 때 매우 많이 사용한다. 반면 착각하게 만드는 허점도 가지고 있어 주의해서 사묭해야한다. 우선 다음 AI챗봇의 답을 살펴보자.
((프롬프트)): 데이터 분석에 나오는 상관관계에 대해서 알기쉽게 알려주세요 ((AI챗봇 답)): 상관관계(Correlation)는 두 변수(예: 키와 몸무게, 공부 시간과 시험 점수 등)가 서로 어떤 관련이 있는지를 나타내는 통계 용어입니다. 쉽게 말해, 한 변수가 변할 때 다른 변수가 어떻게 변하는지를 보는 것입니다.
상관관계의 예시
-
양의 상관관계: 한 변수가 증가하면 다른 변수도 함께 증가하는 관계
예) 키가 클수록 몸무게도 증가하는 경향이 있음 -
음의 상관관계: 한 변수가 증가하면 다른 변수는 감소하는 관계
예) 운동 시간이 많을수록 체지방률이 낮아지는 경향이 있음 -
상관관계 없음: 두 변수 사이에 뚜렷한 관련이 없는 경우
예) 신발 사이즈와 시험 점수
상관계수(Correlation Coefficient)
상관관계의 강도와 방향을 숫자로 나타낸 것이 상관계수입니다.
가장 많이 쓰는 상관계수는 피어슨 상관계수로, -1에서 1 사이의 값을 가집니다.
- 1: 완벽한 양의 상관관계 (두 변수 모두 같은 방향으로 완벽하게 움직임)
- 0: 상관관계 없음
- -1: 완벽한 음의 상관관계 (한 변수가 증가할 때 다른 변수는 완벽하게 감소)
예시로, 상관계수가 0.8이면 두 변수는 꽤 강하게 같은 방향으로 움직인다는 뜻이고, -0.7이면 반대 방향으로 꽤 강하게 움직인다는 뜻입니다.
주의할 점
- 상관관계는 인과관계가 아니다!
두 변수에 상관관계가 있다고 해서 한 변수가 다른 변수의 원인이라고 단정할 수 없습니다.
예) 아이스크림 판매량과 익사 사고 건수는 여름에 모두 증가하지만, 아이스크림을 많이 팔아서 익사 사고가 늘어나는 것은 아닙니다. (둘 다 '여름'이라는 공통 원인 때문)
시각화
상관관계를 쉽게 파악하려면 **산점도(Scatter Plot)**를 그려보는 것이 좋습니다.
점들이 대각선 방향으로 몰려 있으면 상관관계가 있다는 뜻입니다.
정리:
상관관계는 두 변수 사이의 관련성을 숫자(상관계수)로 나타내는 것이며, 데이터 분석에서 변수들 사이의 관계를 파악할 때 매우 자주 사용됩니다. 하지만 상관관계가 곧 인과관계를 의미하지는 않으니 해석에 주의해야 합니다.
상관관계는 통계학에서 나온 방법이라서 기술적인 용어로 설명을 많이 하기 때문에 정의상 설명을 처음 들으면 어려운 편이다. 두 변수가 양의 상관관계, 음의 상관관계가 얼마나 있는지 화인하는 방법이다. 두 변수의 값을 넣고 계산하면 -1과 +1 사이의 값이 나오는데 이 값이 상관의 정도가 된다. -1는 완벽한 음의 상관관계이고 한 변수가 값이 커지면 다른 한 변수는 값이 작아지는 관계인 것이다. 결과값이 1이 나오며 양의 상관관계가 되는데 한 변수의 값이 커지면 다른 변수의 값도 커지고 반대로 한 변수의 값이 작아지면 다른 변수의 값도 작아지는 관계를 만한다. 0인 것은 두 변수가 선형으로는 관계가 없다는 것을 말한다. 0인 경우에 두 변수가 전혀 관련이 없다는 뜻은 아니다. 이에 대한 설명은 뒤에 자세히 한다.
상관관계는 처음 발표되었을 때는 첨단과학기술이라고 할 만한 어려운 것이었다. 상관관계는 여러가지 계산방법이 있으며 용도나 사용법이 다르다. 그냥 상관관계라고만 말하면 피어슨(Pearson, 유명한 통계학자) 만든 피어슨 상관관계를 말한다.
상관관계를 계산하는 코드의 예제다.
((코드 시작:1))
# 선형상관관계(피어슨 상관계수) 예제 코드
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 예시 데이터 생성 (키와 몸무게)
height = [150, 155, 160, 165, 170, 175, 180]
weight = [50, 53, 56, 60, 65, 70, 75]
# numpy를 이용해 피어슨 상관계수 계산
correlation = np.corrcoef(height, weight)[0, 1]
print("피어슨 상관계수:", correlation)
# 산점도 시각화
plt.scatter(height, weight)
plt.xlabel("키(cm)")
plt.ylabel("몸무게(kg)")
plt.title("키와 몸무게의 산점도")
plt.show()
# pandas의 DataFrame을 이용해 상관계수(correlation)를 계산하는 예제
# 예시 데이터프레임 생성
df = pd.DataFrame({
"키": height,
"몸무게": weight
})
# DataFrame의 corr() 메서드로 상관계수 계산
corr_matrix = df.corr()
print("DataFrame 상관계수 행렬:")
print(corr_matrix)
# 통계 모듈을 사용하여 상관계수 계산하기
import statistics
# statistics.correlation() 함수는 Python 3.10 이상에서 사용 가능
# height와 weight의 상관계수 계산
correlation_stat = statistics.correlation(height, weight)
print("statistics 모듈로 계산한 상관계수:", correlation_stat)
# 모듈을 사용하지 않고 피어슨 상관계수를 직접 계산하는 예제
# height와 weight 리스트가 이미 정의되어 있다고 가정합니다.
def pearson_correlation(x, y):
n = len(x)
mean_x = sum(x) / n
mean_y = sum(y) / n
sum_xy = sum((xi - mean_x) * (yi - mean_y) for xi, yi in zip(x, y))
sum_xx = sum((xi - mean_x) ** 2 for xi in x)
sum_yy = sum((yi - mean_y) ** 2 for yi in y)
denominator = (sum_xx * sum_yy) ** 0.5
if denominator == 0:
return 0
return sum_xy / denominator
cor_manual = pearson_correlation(height, weight)
print("직접 계산한 피어슨 상관계수:", cor_manual)
((코드 끝:1))
상관관계 계산 코는 간단하기 때문에 직접 계상해도 된다. 하지만 python의 몇개의 패키지가 이미 지원ㅎ고 있어 그대로 사용해도 된다.
상관관계의 수식을 보자. 어렵지 않은 편이지만 굳이 자세히 볼 필요는 없다.
((수식 시작:1))
\[
r = \frac{\sum_{i=1}^{n} (x_i - \overline{x})(y_i - \overline{y})}{\sqrt{\sum_{i=1}^{n} (x_i - \overline{x})^2} \sqrt{\sum_{i=1}^{n} (y_i - \overline{y})^2*))
\]
위의 수식은 피어슨 상관계수(Pearson correlation coefficient)를 계산하는 공식입니다. 각 기호의 의미와 계산 과정을 좀 더 자세히 설명하면 다음과 같습니다.
- \( r \): 피어슨 상관계수(Pearson's r)로, 두 변수 간의 선형적 관계의 강도와 방향을 나타내는 값입니다. 값의 범위는 -1에서 1 사이입니다.
- \( r = 1 \): 완벽한 양의 선형 상관관계 (한 변수가 증가하면 다른 변수도 일정하게 증가)
- \( r = -1 \): 완벽한 음의 선형 상관관계 (한 변수가 증가하면 다른 변수는 일정하게 감소)
- \( r = 0 \): 선형 상관관계가 없음
- \( x_i \), \( y_i \): 각각 두 변수 \( X \)와 \( Y \)의 \( i \)번째 관측값입니다.
- \( \overline{x} \), \( \overline{y} \): 각각 변수 \( X \)와 \( Y \)의 평균값(산술평균)입니다.
- \( \overline{x} = \frac{1}{n} \sum_{i=1}^{n} x_i \)
- \( \overline{y} = \frac{1}{n} \sum_{i=1}^{n} y_i \)
- \( n \): 데이터의 개수(관측값의 수)입니다.
- 분자(위): \( \sum_{i=1}^{n} (x_i - \overline{x})(y_i - \overline{y}) \)
- 각 관측값에서 평균을 뺀 편차를 곱해서 모두 더한 값입니다. 두 변수의 공분산(n-1로 나누지 않은 형태)과 같습니다.
- 이 값이 크면 두 변수의 값이 평균에서 벗어나는 방향이 비슷하다는 뜻입니다.
- 분모(아래): \( \sqrt{\sum_{i=1}^{n} (x_i - \overline{x})^2} \sqrt{\sum_{i=1}^{n} (y_i - \overline{y})^2} \)
- 각각 \( X \)와 \( Y \)의 편차 제곱의 합의 제곱근입니다. 즉, 각 변수의 표준편차(분산의 제곱근)에 해당합니다(단, n-1로 나누지 않은 형태).
- 분모가 클수록 데이터의 흩어짐(산포도)이 크다는 의미입니다.
즉, 피어슨 상관계수는 두 변수의 공분산을 각 변수의 표준편차의 곱으로 나눈 값입니다. 이렇게 하면 두 변수의 단위와 크기에 상관없이 -1에서 1 사이의 값으로 표준화되어, 두 변수의 선형적 관계의 강도와 방향만을 비교할 수 있습니다.
실제 계산 과정은 다음과 같습니다.
1. 각 변수의 평균을 구한다.
2. 각 관측값에서 평균을 뺀 편차를 구한다.
3. 두 변수의 편차끼리 곱한 값을 모두 더한다(공분산).
4. 각 변수의 편차 제곱의 합을 구하고, 각각 제곱근을 취한다(표준편차).
5. 공분산을 두 표준편차의 곱으로 나눈다.
이렇게 계산된 \( r \) 값이 1에 가까울수록 강한 양의 선형관계, -1에 가까울수록 강한 음의 선형관계, 0에 가까울수록 선형관계가 거의 없음을 의미합니다.
((수식 끝:1))
위의 설명을 잘 읽어보면 상관관계의 원리가 잘 나오는데 그 원리를 수학적으로 어떻게 계산하는지 나와있다. 핵심은 두 변수의 값들이 평균으로부터 플러스 방향 또는 마이너스 방향으로 얼마나 벗어 있는지를 확인하는 것이 상관관계이다.
상관계수 (Correlation Coefficient)
상관관계를 계산해서 나온 값의 이름을 상관계수(Correlation Coefficient)라고 한다. 계수는 원래 “곱하는 수”라는 뜻인데 상관계수에 계수라는 단어가 포함된 것은 두 변수의 관계를 상수화한 것이고 다른 계산을 할 때도 이 값을 사용한다.
((프롬프트)): 계수(Coefficient)의 뜻을 알려주세요
((AI챗봇 답 시작))
계수(Coefficient)란 수학이나 통계에서 어떤 수식, 식, 또는 방정식에서 변수 앞에 곱해지는 수를 의미합니다.
즉, 계수는 변수의 크기나 영향을 조절하는 역할을 하며, 변수와 함께 그 값에 비례적으로 영향을 미칩니다.
예시들: 3x3x 3x에서 계수는 3
−5y-5y −5y에서 계수는 -5
x2x^2 x2에서 계수는 1 (보통 생략)
−x-x −x에서 계수는 -1 ((AI챗봇 답 끝))
데이터 분석이나 공학에는 수 많은 잘 알려진 계수들이 있는데 어쨌던 어떤 계산에 의해 계산된 값이 많으며 자체로 의미가 있지만 어떤 다른 계산에서 다시 활용되는 경우가 많다. 상관계수가 다시 쓰이는 또 다른 계산은 회귀분석이나 신뢰도분석 등이 있는데 내용이 어려운 편이고 이 책의 범위에서 벗어나므로 설명하지 않는다. 관심이 있다면 AI챗봇을 이용하기 바란다.
상관관계 강도 구분
상관관계가 있는지 없는지 또는 얼마나 있는지를 상관관계 강도라고 부르른데 잘 알려진 기춘값이 있다.
((프롬프트)): 상관관계 강도를 알려주세요 ((AI챗봇 답 시작)) 상관계수의 절대값(즉, 부호를 무시한 값)에 따라 상관관계의 강도를 다음과 같이 구분하는 것이 일반적입니다.
상관계수(r) 절대값 | 상관관계 강도 | 해석 예시 |
---|---|---|
0.0 ~ 0.1 | 거의 없음 | 사실상 무관함 |
0.1 ~ 0.3 | 매우 약함 | 관계가 거의 없음 |
0.3 ~ 0.5 | 약함 | 약간의 관계가 있음 |
0.5 ~ 0.7 | 중간(보통) | 어느 정도 관계가 있음 |
0.7 ~ 0.9 | 강함 | 뚜렷한 관계가 있음 |
0.9 ~ 1.0 | 매우 강함 | 거의 완벽한 관계 |
- 상관계수의 부호(+, -)는 관계의 방향(양의 상관, 음의 상관)을 의미합니다.
- 상관계수의 절대값이 1에 가까울수록 두 변수의 선형적 관계가 강하다는 뜻입니다.
- 0에 가까울수록 선형적 관계가 거의 없음을 의미합니다.
참고: 상관계수의 해석 기준은 분야나 연구 목적에 따라 다소 달라질 수 있습니다. 위 표는 통상적으로 많이 사용하는 기준입니다. ((AI챗봇 답 끝))
위의 표가 가장 잘 알려진 것인데 위의 방법이 아닌 상관계수검정이라는 검정법이 통계학에 있다.
from scipy.stats import pearsonr
# 의미 없는 예시 데이터
x = [10, 20, 30, 40, 50]
y = [12, 24, 33, 47, 55]
# 피어슨 상관계수와 p-value 계산
corr_coef, p_value = pearsonr(x, y)
print(f"피어슨 상관계수: {corr_coef:.3f}")
print(f"p-value: {p_value:.3f}")
if p_value < 0.05:
print("상관계수가 통계적으로 유의합니다.")
else:
print("상관계수가 통계적으로 유의하지 않습니다.")
가설검정이므로 통계학에서 자주 사용하는 p-value라는 것이 나오는데 p-value는 가설을 검증할 때 가설이 얼마나 확실한가를 알려주는 값이다. 이에 대한 것은 뒤에 설명한다. 여기에서는 p-value가 0.05 미만이면 통계적으로 유의한 상관관계가 있다고 해석하면 되는 것으로 이해하고 넘어가자.
위에서 성관관계 강도의 값을 보고 상관관계가 있는지 판단하는 것과 상관계수검정법 두가지를 소개했는데 상관계수검정법의 결과값이 사실 상관계수의 범위를 보고 판단하는 방법과 거의 동일한 결과가 나온다. 따라서 일반적으로 이해하기 쉬운 상관계수값의 범위를 사용하는 경우가 많다.
선형성관관계 (Linear Correlation)
피어슨 상관관계를 선형상관관계라고도 하는데 여기에 붙은 선형이라는 단어는 앞서 설명한 선형대수학의 선형과 비슷하지만 조금 다르다. 여기서 말하는 선형은 두 변수가 서로 직선적인 관계가 있는지 확인한다는 것이고 더 어렵게 두 변수의 관계를 1차함수 또는 선형함수라고 부르는 함수의 관계로 표현할 수 있는 것을 말한다. 변수(variable)는 통계학에서 어떤 대상에 대한 요소 중 하나의 값을 말한다. 예를 들어 사람의 몸무게는 사람의 신체적인 특징을 나타내는 요소 중 하나이며 사람마다 그 값이 대체로 다르다. 개체 마다 값이 달라서 변하기 때문에 변수라고 한다.
두 변수가 직선적으로 볼 때 관계가 있는지 본다는 것이다. 그래서 방법으로는 곡선, 원형 등의 관계는 볼 수 없다.
Anscombe 's Quartet