미드프로젝트 관련 : 회귀분석, One-Hot Encoding 이용한 상관분석

블체·2025년 5월 29일
post-thumbnail

휘발되기 전에 두서없이 적어보는 개념, 이해한 바 정리

회귀분석이란?

  • 한 개 이상의 독립변수(X)가 종속변수(Y)에 어떤 영향을 미치는지를 분석하는 통계 기법
  • 두 변수 사이의 관계를 함수로 해석하는 것
  • 원인과 결과 간의 관계를 수학적 모델로 설명하려는 것

회귀분석 종류

종류설명
단순 선형 회귀독립변수 1개, 종속변수 1개
다중 선형 회귀독립변수 여러 개, 종속변수 1개
로지스틱 회귀종속변수가 범주형일 때 사용 (0 또는 1 같은 분류 문제)
릿지, 라쏘 회귀다중공선성 해결을 위한 정규화 회귀
내가 분석하고 싶은 건 boolean 데이터들
부가서비스 사용 True / False
이탈여부 True / False
의 분석
-> 연속형이 아니었고, 이진데이터라서 로지스틱 회귀로 분석

개념은 어려울지 몰라도
코드로는 쉽게 할 수 있는 느낌
boolean을 int로 바꿔서 1, 0으로 변경하고

독립변수, 종속변수 할당해서
모델 생성

해석은 마찬가지로
p-value 값이 0.05보다 작으면 유의미한 것으로 간주

의문점
내가 아는 방식 중에서는 카이스퀘어 독립성 검정이 연관성이 있는지 확인하는 검정인데
어떤 경웨 로지스틱 회귀를, 어떤 때에 카이제곱 검정을 쓰는가?
위의 미드프로젝트 사례에서는 어떤 것을 쓰는 게 맞는가?

항목로지스틱 회귀카이제곱 검정 (χ²)
목적원인 변수(X)가 결과(Y)에 영향을 미치는지 분석 (인과 관계 추정)두 범주형 변수 간에 **연관성(상관성)**이 있는지 확인 (관련성 유무 판단)
입력 변수독립변수: 범주형 또는 수치형 / 종속변수: 이진형(True/False)두 변수 모두 범주형 (2×2 교차표 또는 더 큰 표)
출력회귀계수(coef), p값, 예측 확률 등 → 예측모델 생성 가능p값 하나 → 연관성 있음/없음만 판단
해석계수가 양수/음수인지로 영향 방향 판단 (예: 가입하면 이탈률이 줄어든다)오직 연관이 있는지만 알려줌 (방향·영향력은 알 수 없음)
예측 가능 여부O (새로운 데이터 예측 가능)X (단지 관계만 평가함)
사용 예"기기보호서비스가 이탈을 줄이는 데 영향을 주는가?""기기보호서비스와 이탈 여부는 관련이 있는가?"

gpt피셜

예측모델 생성을 통한 예측이 가능한지, p값 하나로 연관성만 평가하는지
가 메인인 느낌이고 아무래도 머신러닝과 통계적 기법이라는 방식의 차이
카이제곱 검정으로 관련성 확인 후, 로지스틱 회귀로 영향성과 방향 파악하는 등 함께 쓰이기도 한다고 함
우리는 분석 정도의 과제이기 때문에 통계로 연관성만 봐도 될 것이라 추측

보조강사님의 조언

  1. 머신러닝을 이용한 분석은 프로젝트 이후, 제대로 배우고 나서 하는 것이 좋아 보임. 아직은 시기상조
  2. 통계의 경우 검정은 안 나가긴 했지만 정규 시간에 배운 범위에 있으므로 카이제곱검정까지만 접근하는 게 맞는 듯 → 상관계수 높은 값 먼저, 배경지식상 왜 관련이 없지? 싶은 것들
  3. get_dummies 이용해서 이탈 안 하는 변수의 조건, 하는 조건, 상관없어 보이는 조건
  4. (캐글의 다른 이들의 분석 참조하기 : 다른 시선으로 볼 수 있음)
  5. (GitHub 사용해 보기)

카이제곱 독립성 검정

(출처: ㅇㅅㅈ 멘토님 특강)

  • 정의 : 두 범주형 변수 사이에 연관성(독립성 여부)이 있는지 확인하는 검정

  • 조건 : 범주형 X 범주형 데이터 (교차표 형태)

  • 예시
    → 성별과 과목 선호가 관계가 있는가?
    → 흡연 여부와 질병 발병이 관련 있는가?

  • 해석

    • p-value < 0.05 → 두 변수는 관련 있음 → H₀ 기각
    • p-value ≥ 0.05 → 두 변수는 독립임 → H₀ 유지

분석 절차

1. One-Hot Encoding

  • 범주형 데이터를 숫자 벡터로 변환하는 인코딩 기법

  • 각 범주를 이진 변수인 1, 0으로 나타냄

  • 고유값에 해당하는 컬럼에만 1, 나머지는 0

  • pd.get_dummies()

    • pandas에서 범주형 데이터를 이진(0/1) 변수들로 바꾸는 함수
  • 주의점 : 다중공선성 문제
    다중공선성 : 통계학의 회귀분석에서 독립변수들 간에 강한 상관관가 나타나는 문제
    성별이라는 변수에 "남자", "여자"가 있다면

성별_남자성별_여자
10

두 열은 완전히 종속적
따라서 열 하나를 제거해서

성별_여자
1

만 남기면 불필요한 중복 제거

  • drop_first=True로 열 한 개 제거
현재 하나의 범주가 아닌 여러 범주를 한 번에 상관계수를 구하려고 변환하였음.
회귀 분석이 아닌 탐색적 분석만을 위한 One-Hot-Encoding이었고,
추후 카이제곱 독립성 검정을 시행할 것이므로 범주마다 열 하나씩 제외하는 것보다는 그대로 두는 것 선택
  • 주의점 : 차원의 저주
    • 데이터의 차원이 증가할수록, 데이터가 희소해지고 모델의 성능이 저하되는 현상
boolean 이외 범주형 데이터는 최대 4개의 unique 값을 가짐. → 해당 없음

2. 상관계수 행렬

  • 2차원 행렬로, 각 변수(열) 간의 상관계수를 보여줌
  • .corr()
    • pandas의 DF 메서드로, column간의 상관계수(피어슨 상관계수)를 계산해주는 함수
  • 주의점
    • 피어슨 상관계수는 '선형 상관성'을 측정 (선형 관계 가정)
    • Boolean 값의 경우 1, 0뿐이므로 패턴이 우연히 겹칠 수 있음
카이제곱 독립성 검정을 통해 두 변수의 연관성 검정

3. 히트맵

  • 행렬 형태의 데이터를 색상으로 시각화한 그래프
  • 상관계수 행렬을 히트맵으로 표현

4. 카이제곱 검정

  • |상관계수| > 3 인 쌍들 대상으로 카이제곱 검정
from scipy.stats import chi2_contingency

# 상관계수 절댓값 기준 필터링
threshold = 0.3
corr_filtered = corr_matrix[(corr_matrix.abs() > threshold) & (corr_matrix.abs() < 1)]

# 중복 제거
import numpy as np
checked_pairs = set()

for col in corr_filtered.columns:
    for row in corr_filtered.index:
        if not np.isnan(corr_filtered.loc[row, col]):
            pair = tuple(sorted([row, col]))
            if row != col and pair not in checked_pairs:
                checked_pairs.add(pair)

                # 카이제곱 검정
                contingency = pd.crosstab(df_encoded[row], df_encoded[col])
                chi2, p, dof, expected = chi2_contingency(contingency)

                print(f"[{row} vs {col}]")
                print(f"카이제곱 통계량: {chi2:.2f}, p-value: {p:.4f}")
                if p < 0.05:
                    print("→ 유의미한 연관성 있음 (독립 아님)\n")
                else:
                    print("→ 통계적으로 독립 (연관성 없음)\n")

한 번에도 할 수 있는데 하나씩 할 생각했네 역시 머리가 나쁘면 고생...

느낀 점
우리 조가 중하는 가고 있다고 생각했는데, 다른 조들은 엄청나게 앞서 가고 있었음...어리석음에 반성
문서화, 구조화하는 능력이 확실히 부족한 듯. 확실히 이 부분은 개선 필요 O
느낀 점 2
아이고 내 시간

profile
벨로그 적응할 수 있을까

0개의 댓글