본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.
본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.
AI Generated
2025. 12. 17. · 45 Views
상관관계 분석 완벽 가이드
데이터 간의 관계를 이해하는 상관관계 분석의 모든 것. 상관계수 계산부터 히트맵 시각화, 다중공선성까지 초급 개발자를 위한 완벽 가이드입니다.
목차
1. 상관관계란 무엇인가
어느 날 김개발 씨는 쇼핑몰 데이터를 분석하던 중 흥미로운 패턴을 발견했습니다. "광고비를 늘리면 매출이 올라가는 것 같은데, 이게 우연일까요?" 옆자리 박시니어 씨가 웃으며 말했습니다.
"그건 상관관계를 분석해봐야 알 수 있어요."
상관관계는 두 변수가 함께 변화하는 패턴을 수치로 나타낸 것입니다. 마치 친구 관계처럼 한쪽이 변하면 다른 쪽도 영향을 받는지를 측정합니다.
이것을 제대로 이해하면 데이터 속에 숨겨진 관계를 발견하고 더 나은 예측 모델을 만들 수 있습니다.
다음 코드를 살펴봅시다.
import pandas as pd
import numpy as np
# 샘플 데이터 생성
data = {
'광고비': [100, 150, 200, 250, 300],
'매출액': [200, 280, 350, 420, 500],
'날씨': [20, 22, 25, 23, 21]
}
df = pd.DataFrame(data)
# 상관관계 확인
print(df.corr())
# 광고비와 매출액의 상관계수: 0.99 (강한 양의 상관관계)
김개발 씨는 데이터 분석팀에 배치된 지 한 달이 된 주니어 개발자입니다. 오늘은 마케팅팀 김대리님이 급하게 달려왔습니다.
"김 개발자님, 우리가 광고비를 늘리면 정말 매출이 오르는지 확인해주실 수 있나요?" 김개발 씨는 엑셀 파일을 열어 데이터를 살펴봤습니다. 광고비가 100만원일 때 매출은 200만원, 150만원일 때는 280만원...
뭔가 패턴이 있는 것 같긴 한데, 이게 확실한 관계인지 어떻게 알 수 있을까요? 바로 이럴 때 필요한 것이 상관관계 분석입니다.
상관관계를 쉽게 비유하자면, 마치 댄스 파트너의 호흡과 같습니다. 한 사람이 왼쪽으로 움직일 때 파트너도 함께 왼쪽으로 움직인다면 둘은 좋은 호흡을 가진 것입니다.
반대로 한 사람이 왼쪽으로 갈 때 다른 사람이 오른쪽으로 간다면 호흡이 맞지 않는 것이죠. 데이터도 마찬가지입니다.
옛날에는 개발자들이 이런 관계를 눈으로 일일이 확인해야 했습니다. 엑셀에서 그래프를 그려보고, "음, 이게 증가하는 것 같기도 하고..." 하며 주관적으로 판단했습니다.
데이터가 많아지면 더 큰 문제였습니다. 1000개의 변수가 있다면 어떻게 모든 관계를 확인할 수 있을까요?
더욱이 사람마다 다르게 해석하는 문제도 있었습니다. 바로 이런 문제를 해결하기 위해 상관계수라는 개념이 등장했습니다.
상관계수를 사용하면 두 변수의 관계를 -1부터 1까지의 숫자로 표현할 수 있습니다. 1에 가까우면 함께 증가하는 관계, -1에 가까우면 한쪽이 증가할 때 다른 쪽이 감소하는 관계, 0에 가까우면 별 관계가 없다는 뜻입니다.
무엇보다 객관적이고 정확한 수치라는 큰 이점이 있습니다. 위의 코드를 한 줄씩 살펴보겠습니다.
먼저 pandas로 데이터프레임을 만듭니다. 광고비, 매출액, 날씨라는 세 개의 변수를 담았습니다.
이 부분이 핵심입니다. 다음으로 df.corr() 메서드를 호출하면 모든 변수 간의 상관계수가 계산됩니다.
마지막으로 결과가 표 형태로 반환됩니다. 실제 현업에서는 어떻게 활용할까요?
예를 들어 쇼핑몰 서비스를 개발한다고 가정해봅시다. 매출에 영향을 주는 요인을 찾고 싶을 때 상관관계 분석을 활용하면 광고비, 방문자 수, 할인율, 배송비 등 여러 변수 중에서 정말 중요한 변수를 빠르게 찾아낼 수 있습니다.
네이버, 쿠팡 같은 많은 기업에서 이런 패턴을 적극적으로 사용하고 있습니다. 하지만 주의할 점도 있습니다.
초보 개발자들이 흔히 하는 실수 중 하나는 상관관계가 높다고 해서 인과관계라고 착각하는 것입니다. 이렇게 하면 잘못된 결론을 내릴 수 있습니다.
따라서 상관관계는 어디까지나 "관계가 있다"는 것만 알려줄 뿐, "원인이다"라고 말해주지는 않는다는 점을 기억해야 합니다. 다시 김개발 씨의 이야기로 돌아가 봅시다.
박시니어 씨의 설명을 들은 김개발 씨는 고개를 끄덕였습니다. "아, 광고비와 매출액의 상관계수가 0.99네요.
정말 강한 관계가 있군요!" 상관관계를 제대로 이해하면 데이터 속에서 의미 있는 패턴을 찾아내고, 더 정확한 분석을 할 수 있습니다. 여러분도 오늘 배운 내용을 실제 프로젝트에 적용해 보세요.
실전 팁
💡 - 상관계수는 선형 관계만 측정합니다. 곡선 관계는 잡아내지 못할 수 있습니다.
- 상관관계가 높다고 해서 반드시 인과관계가 있는 것은 아닙니다.
2. corr로 상관계수 계산
김개발 씨는 이제 본격적으로 상관계수를 계산해보려고 합니다. "pandas에 corr() 메서드가 있다고 들었는데, 어떻게 사용하는 거죠?" 박시니어 씨가 화면을 가리키며 설명을 시작했습니다.
corr() 메서드는 pandas 데이터프레임에서 모든 숫자형 변수 간의 상관계수를 자동으로 계산해주는 강력한 도구입니다. 마치 계산기처럼 복잡한 수식을 대신 계산해줍니다.
이것을 제대로 활용하면 수십, 수백 개의 변수 관계를 단 한 줄의 코드로 파악할 수 있습니다.
다음 코드를 살펴봅시다.
import pandas as pd
# 실무 데이터 예시
data = {
'매출액': [100, 150, 200, 250, 300],
'방문자수': [500, 720, 950, 1100, 1400],
'광고비': [10, 15, 20, 25, 30],
'할인율': [5, 10, 8, 12, 15]
}
df = pd.DataFrame(data)
# 피어슨 상관계수 계산 (기본값)
correlation_matrix = df.corr(method='pearson')
print(correlation_matrix)
# 특정 변수 쌍의 상관계수만 확인
print(f"매출액과 방문자수의 상관계수: {df['매출액'].corr(df['방문자수']):.3f}")
김개발 씨는 이제 실전 데이터를 앞에 두고 있습니다. 마케팅팀에서 받은 엑셀 파일에는 매출액, 방문자 수, 광고비, 할인율 등 다양한 변수가 들어있습니다.
"이걸 일일이 계산하려면 얼마나 걸릴까요?" 박시니어 씨가 웃으며 답했습니다. "걱정 마세요.
pandas의 corr() 메서드를 쓰면 1초도 안 걸립니다." corr() 메서드를 쉽게 비유하자면, 마치 자동 번역기와 같습니다. 우리가 영어 문장을 입력하면 순식간에 한국어로 번역해주듯이, corr()는 데이터를 입력하면 순식간에 모든 상관계수를 계산해줍니다.
심지어 결과를 깔끔한 표 형태로 보여주기까지 합니다. corr() 메서드가 없던 시절에는 어땠을까요?
개발자들은 복잡한 수학 공식을 직접 코드로 작성해야 했습니다. 평균을 구하고, 표준편차를 계산하고, 공분산을 구한 뒤 나누고...
코드가 수십 줄이 되었습니다. 더 큰 문제는 실수하기 쉬웠다는 점입니다.
변수가 10개만 되어도 45개의 상관계수를 계산해야 했으니까요. 바로 이런 문제를 해결하기 위해 pandas에 corr() 메서드가 포함되었습니다.
corr() 메서드를 사용하면 단 한 줄로 모든 계산이 끝납니다. 또한 결과가 데이터프레임 형태로 반환되어 바로 분석하거나 시각화할 수 있습니다.
무엇보다 검증된 알고리즘을 사용하기 때문에 계산 실수가 없다는 큰 이점이 있습니다. 위의 코드를 한 줄씩 살펴보겠습니다.
먼저 실무에서 흔히 볼 수 있는 형태의 데이터프레임을 만듭니다. 그 다음 df.corr() 메서드를 호출하면 모든 변수 쌍의 상관계수가 계산됩니다.
이 부분이 핵심입니다. method 파라미터로 'pearson', 'spearman', 'kendall' 중 하나를 선택할 수 있는데, 기본값은 피어슨입니다.
마지막으로 특정 변수 쌍만 확인하고 싶다면 각 컬럼의 corr() 메서드를 직접 호출할 수 있습니다. 실제 현업에서는 어떻게 활용할까요?
예를 들어 이커머스 회사에서 매출 예측 모델을 만든다고 가정해봅시다. 먼저 corr()로 모든 변수의 상관관계를 확인한 뒤, 매출액과 상관계수가 높은 변수들만 선택하여 모델에 투입합니다.
이렇게 하면 불필요한 변수를 제거하고 더 정확한 예측 모델을 만들 수 있습니다. 많은 데이터 사이언티스트들이 탐색적 데이터 분석의 첫 단계로 이 방법을 사용합니다.
하지만 주의할 점도 있습니다. 초보 개발자들이 흔히 하는 실수 중 하나는 결측값이 있는 데이터에 바로 corr()를 적용하는 것입니다.
이렇게 하면 해당 행이 자동으로 제외되어 예상과 다른 결과가 나올 수 있습니다. 따라서 먼저 df.dropna()나 df.fillna()로 결측값을 처리한 뒤 상관계수를 계산해야 합니다.
다시 김개발 씨의 이야기로 돌아가 봅시다. 코드를 실행한 김개발 씨는 감탄했습니다.
"와, 정말 1초 만에 모든 상관계수가 나왔네요!" corr() 메서드를 제대로 이해하면 복잡한 데이터 분석도 간단하게 처리할 수 있습니다. 여러분도 오늘 배운 내용을 실제 프로젝트에 적용해 보세요.
실전 팁
💡 - corr() 메서드는 숫자형 데이터만 계산합니다. 문자형은 자동으로 제외됩니다.
- method='spearman'은 비선형 관계를 더 잘 포착합니다.
3. 상관관계 히트맵 그리기
김개발 씨는 상관계수 표를 보며 고개를 갸웃거렸습니다. "숫자로는 보이는데, 한눈에 들어오지 않네요..." 박시니어 씨가 노트북을 열며 말했습니다.
"그럴 땐 히트맵을 그려보세요. 색깔로 보면 훨씬 이해하기 쉬울 겁니다."
히트맵은 상관계수를 색깔로 시각화한 그래프입니다. 마치 날씨 지도에서 온도를 색으로 표현하듯이 상관관계의 강도를 색으로 나타냅니다.
이것을 제대로 활용하면 수십 개의 변수 관계를 한눈에 파악하고 중요한 패턴을 빠르게 발견할 수 있습니다.
다음 코드를 살펴봅시다.
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# 데이터 준비
data = {
'매출액': [100, 150, 200, 250, 300],
'방문자수': [500, 720, 950, 1100, 1400],
'광고비': [10, 15, 20, 25, 30],
'할인율': [5, 10, 8, 12, 15],
'재구매율': [20, 25, 30, 35, 40]
}
df = pd.DataFrame(data)
# 상관계수 계산
correlation_matrix = df.corr()
# 히트맵 그리기
plt.figure(figsize=(10, 8))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', center=0)
plt.title('상관관계 히트맵')
plt.show()
김개발 씨는 앞서 계산한 상관계수 표를 다시 봤습니다. 숫자가 빽빽하게 들어찬 표를 보니 머리가 지끈거렸습니다.
"매출액과 방문자 수는 0.99, 매출액과 광고비는 0.98... 이걸 언제 다 읽죠?" 이럴 때 필요한 것이 바로 시각화입니다.
히트맵을 쉽게 비유하자면, 마치 교통 혼잡도 지도와 같습니다. 빨간색은 막히는 구간, 파란색은 원활한 구간을 나타내듯이, 히트맵도 빨간색은 강한 양의 상관관계, 파란색은 강한 음의 상관관계를 나타냅니다.
색깔만 봐도 어디가 중요한지 바로 알 수 있습니다. 히트맵이 없던 시절에는 어땠을까요?
개발자들은 상관계수 표를 출력한 뒤 형광펜으로 중요한 부분을 표시했습니다. 변수가 10개면 그나마 괜찮았지만, 50개, 100개가 되면 불가능했습니다.
더 큰 문제는 동료들에게 설명할 때였습니다. "여기 보세요, 0.85고 여기는 -0.72고..." 듣는 사람도 지루하고 말하는 사람도 힘들었습니다.
바로 이런 문제를 해결하기 위해 seaborn 라이브러리의 히트맵이 등장했습니다. 히트맵을 사용하면 복잡한 상관관계를 직관적으로 이해할 수 있습니다.
또한 회의 자료나 보고서에 넣기도 좋습니다. 무엇보다 패턴을 빠르게 발견할 수 있다는 큰 이점이 있습니다.
예를 들어 여러 변수가 동시에 높은 상관관계를 보이는 군집을 쉽게 찾아낼 수 있습니다. 위의 코드를 한 줄씩 살펴보겠습니다.
먼저 데이터프레임을 만들고 corr()로 상관계수를 계산합니다. 그 다음 plt.figure()로 그림 크기를 설정합니다.
이 부분이 핵심입니다. sns.heatmap() 함수에 상관계수 매트릭스를 전달하면 히트맵이 생성됩니다.
annot=True는 각 셀에 숫자를 표시하고, cmap='coolwarm'은 색상 테마를 지정하며, center=0은 0을 중심으로 색상을 배치합니다. 마지막으로 plt.show()로 그래프를 화면에 표시합니다.
실제 현업에서는 어떻게 활용할까요? 예를 들어 데이터 분석 보고서를 작성한다고 가정해봅시다.
경영진에게 "이 5개 변수 중에서 매출에 가장 큰 영향을 주는 것은 방문자 수입니다"라고 설명할 때, 히트맵을 보여주면 설득력이 훨씬 높아집니다. 색깔로 한눈에 들어오니까요.
많은 데이터 분석가들이 탐색적 분석 결과를 공유할 때 이 방법을 사용합니다. 하지만 주의할 점도 있습니다.
초보 개발자들이 흔히 하는 실수 중 하나는 변수가 너무 많을 때도 무조건 히트맵을 그리는 것입니다. 이렇게 하면 글자가 너무 작아져서 오히려 보기 어려울 수 있습니다.
따라서 변수가 20개 이상이면 중요한 변수만 선택하거나 그림 크기를 충분히 크게 설정해야 합니다. 다시 김개발 씨의 이야기로 돌아가 봅시다.
히트맵을 본 김개발 씨는 감탄했습니다. "와, 매출액 행이 거의 다 빨간색이네요.
모든 변수와 강한 상관관계가 있다는 뜻이군요!" 히트맵을 제대로 이해하면 복잡한 데이터 관계도 쉽게 파악하고 효과적으로 전달할 수 있습니다. 여러분도 오늘 배운 내용을 실제 프로젝트에 적용해 보세요.
실전 팁
💡 - cmap='RdBu_r'을 사용하면 빨강-파랑 반전 색상을 얻을 수 있습니다.
- vmin=-1, vmax=1을 지정하면 색상 범위를 고정할 수 있습니다.
4. 양의 상관관계 vs 음의 상관관계
김개발 씨는 히트맵을 보며 궁금증이 생겼습니다. "여기는 빨간색이고 저기는 파란색인데, 이게 무슨 차이죠?" 박시니어 씨가 설명을 시작했습니다.
"그건 양의 상관관계와 음의 상관관계의 차이입니다."
양의 상관관계는 한 변수가 증가할 때 다른 변수도 함께 증가하는 관계이고, 음의 상관관계는 한 변수가 증가할 때 다른 변수는 감소하는 관계입니다. 마치 시소처럼 한쪽이 올라가면 다른 쪽은 내려가는 것이 음의 상관관계입니다.
이 둘을 제대로 구분하면 데이터의 숨겨진 의미를 정확하게 해석할 수 있습니다.
다음 코드를 살펴봅시다.
import pandas as pd
import matplotlib.pyplot as plt
# 양의 상관관계 예시
positive_data = {
'공부시간': [1, 2, 3, 4, 5],
'시험점수': [50, 60, 70, 80, 90]
}
df_positive = pd.DataFrame(positive_data)
# 음의 상관관계 예시
negative_data = {
'게임시간': [5, 4, 3, 2, 1],
'시험점수': [50, 60, 70, 80, 90]
}
df_negative = pd.DataFrame(negative_data)
# 상관계수 확인
print(f"양의 상관관계: {df_positive.corr().iloc[0, 1]:.2f}") # 1.00
print(f"음의 상관관계: {df_negative.corr().iloc[0, 1]:.2f}") # -1.00
김개발 씨는 실무 데이터를 분석하다가 흥미로운 발견을 했습니다. 광고비와 매출액은 상관계수가 0.98인데, 할인율과 이익률은 -0.85였습니다.
"어? 이건 마이너스네요?" 박시니어 씨가 고개를 끄덕였습니다.
"맞아요. 그게 바로 음의 상관관계입니다." 양의 상관관계와 음의 상관관계를 쉽게 비유하자면, 마치 계단을 오르는 것과 내려가는 것의 차이와 같습니다.
양의 상관관계는 두 친구가 함께 계단을 올라가는 것이고, 음의 상관관계는 한 친구가 올라갈 때 다른 친구는 내려가는 것입니다. 둘 다 관계가 있다는 점에서는 같지만, 방향이 정반대입니다.
이 개념을 이해하지 못하면 어떤 일이 벌어질까요? 예전에 한 주니어 개발자가 할인율과 이익률의 상관계수를 보고 "관계가 없네요"라고 보고했다가 혼났습니다.
-0.85는 매우 강한 관계인데, 음수라는 이유로 무시한 것입니다. 이런 실수를 하면 중요한 인사이트를 놓치게 됩니다.
더 큰 문제는 잘못된 의사결정으로 이어질 수 있다는 점입니다. 바로 이런 실수를 피하기 위해 상관계수의 부호를 정확히 이해해야 합니다.
양의 상관관계를 파악하면 시너지를 내는 변수를 찾을 수 있습니다. 예를 들어 광고비를 늘리면 매출도 증가한다는 것을 알 수 있습니다.
음의 상관관계를 파악하면 트레이드오프 관계를 발견할 수 있습니다. 할인을 많이 하면 매출은 늘지만 이익률은 떨어진다는 것을 알 수 있습니다.
무엇보다 비즈니스 전략을 세울 때 큰 도움이 됩니다. 위의 코드를 한 줄씩 살펴보겠습니다.
먼저 양의 상관관계 예시로 공부시간과 시험점수 데이터를 만듭니다. 공부를 많이 할수록 점수가 높아지는 전형적인 양의 관계입니다.
이 부분이 핵심입니다. 다음으로 음의 상관관계 예시로 게임시간과 시험점수를 만듭니다.
게임을 많이 할수록 점수가 낮아지는 음의 관계입니다. 마지막으로 corr()로 각각의 상관계수를 확인하면 하나는 1.00, 다른 하나는 -1.00이 나옵니다.
실제 현업에서는 어떻게 활용할까요? 예를 들어 이커머스 회사에서 가격 전략을 수립한다고 가정해봅시다.
가격과 판매량의 상관관계를 분석했더니 -0.70이 나왔습니다. 이는 가격을 올리면 판매량이 줄어든다는 뜻입니다.
이런 정보를 바탕으로 최적의 가격대를 찾을 수 있습니다. 많은 기업이 가격 탄력성 분석에 이 개념을 활용합니다.
하지만 주의할 점도 있습니다. 초보 개발자들이 흔히 하는 실수 중 하나는 상관계수의 절댓값만 보고 부호를 무시하는 것입니다.
0.8과 -0.8은 강도는 같지만 의미가 완전히 다릅니다. 따라서 반드시 부호까지 함께 해석해야 합니다.
또한 음의 상관관계가 나쁜 것이라고 생각하는 실수도 있는데, 음의 상관관계도 중요한 인사이트를 제공합니다. 다시 김개발 씨의 이야기로 돌아가 봅시다.
박시니어 씨의 설명을 들은 김개발 씨는 고개를 끄덕였습니다. "아, 그래서 할인을 많이 하면 이익이 줄어드는군요.
당연한 건데 데이터로 보니 더 명확하네요!" 양의 상관관계와 음의 상관관계를 제대로 구분하면 데이터가 말하는 진짜 의미를 정확하게 이해할 수 있습니다. 여러분도 오늘 배운 내용을 실제 프로젝트에 적용해 보세요.
실전 팁
💡 - 상관계수의 절댓값이 클수록 관계가 강합니다. 부호는 방향만 나타냅니다.
- 0에 가까운 상관계수는 선형 관계가 약하거나 없다는 뜻입니다.
5. 상관관계와 인과관계 구분
김개발 씨는 분석 결과를 들고 신나게 팀장님께 보고했습니다. "아이스크림 판매량과 익사 사고가 강한 상관관계를 보입니다.
아이스크림을 덜 팔면 익사 사고가 줄어들 겁니다!" 팀장님이 웃으며 말했습니다. "김 개발자님, 상관관계와 인과관계는 다릅니다."
상관관계는 두 변수가 함께 움직이는 패턴이고, 인과관계는 한 변수가 다른 변수의 원인이 되는 관계입니다. 마치 친구가 항상 같이 다니는 것과 한 친구가 다른 친구를 데리고 다니는 것의 차이입니다.
이 둘을 제대로 구분하지 못하면 잘못된 결론을 내리고 엉뚱한 의사결정을 할 수 있습니다.
다음 코드를 살펴봅시다.
import pandas as pd
import numpy as np
# 교란 변수가 있는 경우
np.random.seed(42)
temperature = np.array([15, 20, 25, 30, 35]) # 온도 (교란 변수)
# 온도가 올라가면 아이스크림 판매와 익사 사고 모두 증가
ice_cream_sales = temperature * 10 + np.random.randint(0, 10, 5)
drowning_cases = temperature * 0.3 + np.random.randint(0, 3, 5)
df = pd.DataFrame({
'온도': temperature,
'아이스크림판매': ice_cream_sales,
'익사사고': drowning_cases
})
# 상관계수 확인
print(df.corr())
# 아이스크림판매와 익사사고의 상관계수는 높지만, 인과관계는 없음!
# 진짜 원인은 '온도'라는 교란 변수
김개발 씨는 당황했습니다. 분명 데이터는 명확했습니다.
아이스크림 판매량과 익사 사고 건수의 상관계수가 0.95였으니까요. "그런데 왜 인과관계가 아니죠?" 팀장님이 화이트보드에 그림을 그리며 설명하기 시작했습니다.
상관관계와 인과관계를 쉽게 비유하자면, 마치 비둘기와 아침의 관계와 같습니다. 비둘기가 울면 아침이 오는 것처럼 보이지만, 비둘기가 아침을 만드는 것은 아닙니다.
진짜 원인은 해가 뜨는 것이고, 비둘기와 아침은 모두 해가 뜨는 것의 결과일 뿐입니다. 아이스크림과 익사 사고도 마찬가지입니다.
이 둘을 혼동하면 어떤 일이 벌어질까요? 예전에 한 회사가 고객 만족도와 매출의 상관관계를 발견하고 "고객 만족도만 올리면 매출이 오른다"는 전략을 세웠습니다.
하지만 실제로는 좋은 제품이라는 공통 원인 때문에 둘 다 높았던 것입니다. 고객 만족도를 억지로 올리려고 과도한 할인을 했더니 매출은 늘었지만 수익은 오히려 줄어들었습니다.
이런 실수는 비즈니스에 큰 손실을 가져올 수 있습니다. 바로 이런 실수를 피하기 위해 인과관계 분석이라는 별도의 방법론이 필요합니다.
상관관계 분석으로는 관계의 존재만 알 수 있습니다. 인과관계를 확인하려면 실험이나 도구 변수, 회귀 불연속 설계 같은 고급 기법이 필요합니다.
가장 확실한 방법은 무작위 대조 실험입니다. A 그룹에만 처치를 하고 B 그룹은 그대로 두었을 때 차이가 나는지 확인하는 것입니다.
무엇보다 제3의 변수, 즉 교란 변수의 존재를 항상 의심해야 합니다. 위의 코드를 한 줄씩 살펴보겠습니다.
먼저 온도라는 교란 변수를 만듭니다. 이 부분이 핵심입니다.
온도가 올라가면 아이스크림 판매도 증가하고 익사 사고도 증가합니다. 하지만 아이스크림이 익사 사고를 일으키는 것은 아닙니다.
다음으로 세 변수의 상관관계를 확인하면 모두 높은 상관계수를 보입니다. 마지막으로 이 경우 진짜 원인은 온도라는 것을 이해해야 합니다.
실제 현업에서는 어떻게 활용할까요? 예를 들어 마케팅팀에서 "이메일 발송 횟수와 구매율이 상관관계가 있으니 이메일을 더 많이 보내자"고 제안했다고 가정해봅시다.
하지만 실제로는 관심 있는 고객이 이메일을 더 많이 받고 구매도 더 많이 하는 것일 수 있습니다. 무작정 이메일을 늘리면 스팸으로 인식되어 오히려 역효과가 날 수 있습니다.
따라서 A/B 테스트로 인과관계를 검증한 뒤 전략을 실행해야 합니다. 하지만 주의할 점도 있습니다.
초보 개발자들이 흔히 하는 실수 중 하나는 상관관계를 발견하면 바로 인과관계라고 결론 내리는 것입니다. "상관관계가 인과관계를 의미하지 않는다"는 원칙을 항상 기억해야 합니다.
따라서 상관관계를 발견했다면 "왜 이런 관계가 나타났을까?"라는 질문을 던져야 합니다. 다시 김개발 씨의 이야기로 돌아가 봅시다.
팀장님의 설명을 들은 김개발 씨는 얼굴이 빨개졌습니다. "아, 진짜 원인은 온도였군요.
아이스크림을 금지할 뻔했네요." 상관관계와 인과관계를 제대로 구분하면 데이터를 올바르게 해석하고 현명한 의사결정을 할 수 있습니다. 여러분도 오늘 배운 내용을 실제 프로젝트에 적용해 보세요.
실전 팁
💡 - 상관관계를 발견하면 항상 "제3의 변수가 있을까?"를 고민하세요.
- 인과관계를 확인하려면 실험이나 고급 통계 기법이 필요합니다.
6. 다중공선성 이해
김개발 씨는 회귀 모델을 만들다가 이상한 경고 메시지를 발견했습니다. "multicollinearity detected...
이게 뭐죠?" 박시니어 씨가 화면을 보더니 고개를 끄덕였습니다. "아, 독립변수들끼리 상관관계가 너무 높네요.
다중공선성 문제입니다."
다중공선성은 회귀 모델에서 독립변수들끼리 강한 상관관계를 가질 때 발생하는 문제입니다. 마치 축구팀에서 같은 역할을 하는 선수가 여러 명 있는 것처럼 변수들이 중복된 정보를 제공합니다.
이것을 해결하지 않으면 모델의 계수가 불안정해지고 해석이 어려워집니다.
다음 코드를 살펴봅시다.
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
# 다중공선성 예시 데이터
np.random.seed(42)
n = 100
height_cm = np.random.normal(170, 10, n) # 키(cm)
height_m = height_cm / 100 # 키(m) - 완전히 같은 정보!
weight = 0.5 * height_cm + np.random.normal(0, 5, n) # 몸무게
df = pd.DataFrame({
'키_cm': height_cm,
'키_m': height_m,
'몸무게': weight
})
# 상관관계 확인 - 키_cm과 키_m의 상관계수는 1.0!
print(df.corr())
# VIF(분산팽창계수)로 다중공선성 확인
from statsmodels.stats.outliers_influence import variance_inflation_factor
# VIF가 10 이상이면 다중공선성이 심각함
X = df[['키_cm', '키_m']]
vif_data = pd.DataFrame()
vif_data["변수"] = X.columns
vif_data["VIF"] = [variance_inflation_factor(X.values, i) for i in range(len(X.columns))]
print(vif_data)
김개발 씨는 키와 몸무게로 건강 점수를 예측하는 모델을 만들고 있었습니다. 데이터에는 키를 센티미터와 미터 두 가지로 기록한 변수가 있었습니다.
"둘 다 넣으면 정보가 더 많아지니까 좋겠죠?" 박시니어 씨가 고개를 저었습니다. "아니에요.
그게 바로 다중공선성 문제를 일으킵니다." 다중공선성을 쉽게 비유하자면, 마치 회의에서 같은 의견을 가진 사람이 여러 명 있는 것과 같습니다. 한 사람이 "찬성입니다"라고 말하면 충분한데, 열 명이 똑같이 "찬성입니다"라고 말하면 정보는 늘어나지 않고 회의만 길어집니다.
모델도 마찬가지입니다. 같은 정보를 제공하는 변수가 여러 개 있으면 혼란만 가중됩니다.
다중공선성이 있으면 어떤 일이 벌어질까요? 회귀 모델의 계수가 불안정해집니다.
데이터를 조금만 바꿔도 계수가 크게 요동칩니다. 또한 어떤 변수가 진짜 중요한지 판단하기 어려워집니다.
더 큰 문제는 통계적 검정력이 떨어진다는 점입니다. 진짜 유의미한 변수도 유의하지 않다고 나올 수 있습니다.
바로 이런 문제를 해결하기 위해 VIF(분산팽창계수) 같은 진단 도구를 사용합니다. VIF를 계산하면 각 변수의 다중공선성 정도를 수치로 확인할 수 있습니다.
일반적으로 VIF가 10 이상이면 문제가 심각하다고 판단합니다. 해결 방법은 여러 가지가 있습니다.
상관관계가 높은 변수 중 하나를 제거하거나, PCA 같은 차원 축소 기법을 사용하거나, Ridge 회귀 같은 정규화 방법을 적용할 수 있습니다. 무엇보다 모델링 전에 변수 간 상관관계를 꼭 확인하는 습관이 중요합니다.
위의 코드를 한 줄씩 살펴보겠습니다. 먼저 키를 센티미터와 미터로 각각 저장합니다.
이 부분이 핵심입니다. 이 두 변수는 완벽한 선형 관계를 가지므로 상관계수가 1.0입니다.
다음으로 corr()로 상관관계를 확인하면 키_cm과 키_m이 완벽히 상관되어 있음을 알 수 있습니다. 마지막으로 VIF를 계산하면 두 변수 모두 매우 높은 값이 나옵니다.
실제 현업에서는 어떻게 활용할까요? 예를 들어 부동산 가격 예측 모델을 만든다고 가정해봅시다.
전용면적, 공급면적, 평수라는 세 변수가 있는데, 이들은 모두 집의 크기를 나타내므로 강한 상관관계를 가집니다. 세 개를 모두 넣으면 다중공선성 문제가 발생합니다.
따라서 하나만 선택하거나, 세 개를 결합한 새로운 변수를 만들어야 합니다. 많은 데이터 사이언티스트들이 모델링 전 EDA 단계에서 이 문제를 미리 확인합니다.
하지만 주의할 점도 있습니다. 초보 개발자들이 흔히 하는 실수 중 하나는 상관관계가 높다고 무조건 변수를 제거하는 것입니다.
때로는 높은 상관관계를 가지면서도 각각 고유한 정보를 제공하는 경우도 있습니다. 따라서 도메인 지식과 함께 판단해야 합니다.
VIF 값만 맹신하지 말고 실제 모델 성능과 해석 가능성도 함께 고려해야 합니다. 다시 김개발 씨의 이야기로 돌아가 봅시다.
박시니어 씨의 설명을 들은 김개발 씨는 고개를 끄덕였습니다. "아, 키_cm과 키_m은 같은 정보니까 하나만 쓰면 되는군요!" 다중공선성을 제대로 이해하면 더 안정적이고 해석 가능한 회귀 모델을 만들 수 있습니다.
여러분도 오늘 배운 내용을 실제 프로젝트에 적용해 보세요.
실전 팁
💡 - VIF가 10 이상이면 다중공선성을 의심하세요.
- 상관계수 히트맵으로 변수 간 관계를 먼저 확인하세요.
7. 중요 변수 선택하기
김개발 씨는 100개의 변수를 가진 데이터셋을 받았습니다. "이걸 다 모델에 넣어야 하나요?" 박시니어 씨가 웃으며 말했습니다.
"아니요, 상관관계 분석으로 중요한 변수만 골라내세요."
변수 선택은 예측 모델을 만들 때 정말 중요한 변수만 골라내는 과정입니다. 마치 배낭여행을 갈 때 꼭 필요한 물건만 챙기는 것처럼 불필요한 변수는 제거합니다.
이것을 제대로 하면 모델이 더 빠르고 정확해지며 과적합도 방지할 수 있습니다.
다음 코드를 살펴봅시다.
import pandas as pd
import numpy as np
# 실무 데이터 예시
np.random.seed(42)
n = 100
df = pd.DataFrame({
'매출액': np.random.normal(1000, 200, n),
'방문자수': np.random.normal(5000, 1000, n),
'광고비': np.random.normal(100, 20, n),
'할인율': np.random.normal(10, 3, n),
'날씨': np.random.randint(0, 2, n), # 관계 없는 변수
'요일': np.random.randint(0, 7, n), # 관계 없는 변수
})
# 목표 변수와의 상관계수 확인
target = '매출액'
correlations = df.corr()[target].abs().sort_values(ascending=False)
print(correlations)
# 임계값 설정 (예: 0.3 이상만 선택)
threshold = 0.3
selected_features = correlations[correlations > threshold].index.tolist()
selected_features.remove(target) # 목표 변수 자신은 제외
print(f"선택된 변수: {selected_features}")
김개발 씨는 머리가 복잡했습니다. 데이터에는 고객 나이, 성별, 지역, 구매 이력, 클릭 수, 체류 시간 등 100개가 넘는 변수가 있었습니다.
"이걸 다 넣으면 모델이 더 정확해지지 않을까요?" 박시니어 씨가 고개를 저었습니다. "오히려 반대예요.
불필요한 변수가 많으면 과적합이 일어납니다." 변수 선택을 쉽게 비유하자면, 마치 요리할 때 재료를 고르는 것과 같습니다. 김치찌개를 끓이는데 김치, 돼지고기, 두부는 필수지만 딸기나 초콜릿을 넣으면 맛이 이상해집니다.
모델도 마찬가지입니다. 예측에 도움이 되는 변수만 넣어야 좋은 결과가 나옵니다.
변수 선택을 제대로 하지 않으면 어떤 일이 벌어질까요? 모델 학습 시간이 엄청나게 길어집니다.
변수가 100개면 10개일 때보다 10배 이상 오래 걸립니다. 또한 과적합이 발생합니다.
학습 데이터에는 잘 맞지만 새로운 데이터에는 성능이 떨어집니다. 더 큰 문제는 모델 해석이 어려워진다는 점입니다.
어떤 변수가 진짜 중요한지 알 수 없습니다. 바로 이런 문제를 해결하기 위해 변수 선택 기법을 사용합니다.
가장 간단한 방법은 목표 변수와의 상관계수를 계산하는 것입니다. 상관계수가 높은 변수들만 선택하면 됩니다.
일반적으로 절댓값 0.3 이상이면 고려할 만합니다. 더 정교한 방법으로는 전진 선택, 후진 제거, 단계적 선택 같은 기법도 있습니다.
또한 Lasso 회귀처럼 자동으로 변수를 선택해주는 알고리즘도 있습니다. 무엇보다 도메인 지식과 통계적 방법을 함께 사용하는 것이 중요합니다.
위의 코드를 한 줄씩 살펴보겠습니다. 먼저 실무에서 흔히 볼 수 있는 형태의 데이터를 만듭니다.
매출액을 예측하는 것이 목표입니다. 이 부분이 핵심입니다.
df.corr()로 모든 상관계수를 계산한 뒤 매출액 열만 추출합니다. abs()로 절댓값을 구하고 sort_values()로 정렬하면 중요한 변수 순서를 확인할 수 있습니다.
다음으로 임계값을 설정하여 상관계수가 높은 변수만 필터링합니다. 마지막으로 선택된 변수 목록을 얻습니다.
실제 현업에서는 어떻게 활용할까요? 예를 들어 고객 이탈 예측 모델을 만든다고 가정해봅시다.
초기 데이터에는 50개의 변수가 있습니다. 먼저 상관관계 분석으로 이탈 여부와 관련 높은 변수 15개를 추립니다.
그 다음 이 15개로 모델을 만들어봅니다. 50개를 모두 쓸 때보다 학습 시간은 1/10로 줄고, 성능은 오히려 5% 향상되었습니다.
많은 캐글 우승자들이 이런 변수 선택 과정을 매우 중요하게 여깁니다. 하지만 주의할 점도 있습니다.
초보 개발자들이 흔히 하는 실수 중 하나는 상관계수만 보고 변수를 선택하는 것입니다. 상관계수는 선형 관계만 측정하므로 비선형 관계는 놓칠 수 있습니다.
따라서 mutual information 같은 다른 지표도 함께 고려해야 합니다. 또한 도메인 지식을 무시하고 통계 수치만 믿는 실수도 있습니다.
전문가가 중요하다고 하는 변수는 상관계수가 낮아도 포함시켜야 할 수 있습니다. 다시 김개발 씨의 이야기로 돌아가 봅시다.
변수를 선택하고 모델을 돌린 김개발 씨는 깜짝 놀랐습니다. "와, 10개 변수만 써도 100개 쓸 때랑 성능이 비슷하네요.
게다가 훨씬 빨라요!" 변수 선택을 제대로 하면 더 빠르고 정확하며 해석 가능한 모델을 만들 수 있습니다. 여러분도 오늘 배운 내용을 실제 프로젝트에 적용해 보세요.
실전 팁
💡 - 상관계수 절댓값 0.3 이상을 기준으로 시작해보세요.
- 비선형 관계는 mutual information으로 추가 확인하세요.
- 도메인 지식과 통계 방법을 함께 사용하세요.
이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!
댓글 (0)
함께 보면 좋은 카드 뉴스
vLLM 통합 완벽 가이드
대규모 언어 모델 추론을 획기적으로 가속화하는 vLLM의 설치부터 실전 서비스 구축까지 다룹니다. PagedAttention과 연속 배칭 기술로 GPU 메모리를 효율적으로 활용하는 방법을 배웁니다.
Web UI Demo 구축 완벽 가이드
Gradio를 활용하여 머신러닝 모델과 AI 서비스를 위한 웹 인터페이스를 구축하는 방법을 다룹니다. 코드 몇 줄만으로 전문적인 데모 페이지를 만들고 배포하는 과정을 초급자도 쉽게 따라할 수 있도록 설명합니다.
Sandboxing & Execution Control 완벽 가이드
AI 에이전트가 코드를 실행할 때 반드시 필요한 보안 기술인 샌드박싱과 실행 제어에 대해 알아봅니다. 격리된 환경에서 안전하게 코드를 실행하고, 악성 동작을 탐지하는 방법을 단계별로 설명합니다.
Voice Design then Clone 워크플로우 완벽 가이드
AI 음성 합성에서 일관된 캐릭터 음성을 만드는 Voice Design then Clone 워크플로우를 설명합니다. 참조 음성 생성부터 재사용 가능한 캐릭터 구축까지 실무 활용법을 다룹니다.
Tool Use 완벽 가이드 - Shell, Browser, DB 실전 활용
AI 에이전트가 외부 도구를 활용하여 셸 명령어 실행, 브라우저 자동화, 데이터베이스 접근 등을 수행하는 방법을 배웁니다. 실무에서 바로 적용할 수 있는 패턴과 베스트 프랙티스를 담았습니다.