2025년 2학기 계량분석 강의자료

5주차: 신뢰도와 타당도

신뢰도의 이해와 측정


1. 신뢰도의 개념

신뢰도(Reliability):

→ 같은 대상을 반복해서 측정했을 때, 결과가 **얼마나 일관되게 나오는가**

쉽게 말하면:

신뢰도가 높으면:


2. 신뢰도 측정 방법

(1) 재검사법 (Test-retest method)

(2) 반분법 (Split-half method)

(3) 내적 일관성 분석 (Internal consistency)

  • 신뢰도는 측정 결과의 **일관성**을 의미한다.
  • **재검사법:** 시간 차이를 두고 같은 질문 반복
  • **반분법:** 설문을 반으로 나누어 비교
  • **내적 일관성:** 문항들이 서로 잘 맞아야 신뢰도 ↑
  • 신뢰도가 높아야 **측정 결과를 믿고 해석할 수 있다.**

타당도의 이해와 측정


1. 타당도의 개념

타당도(Validity):

→ 내가 측정하려는 것을, 도구가 **정확하게** 잘 측정했는가?

신뢰도 vs 타당도

📌 **예시**


2. 타당도의 종류

(1) 내용 타당도 (Content Validity)

(2) 기준 타당도 (Criterion-related Validity)

(3) 개념 타당도 (Construct Validity)

  • **타당도:** “정확히 내가 알고 싶은 것을 재고 있는가?”
  • **내용 타당도:** 개념의 내용을 빠짐없이 대표했는가?
  • **기준 타당도:** 다른 기준과 결과가 잘 맞아떨어지는가?
  • **개념 타당도:** 추상적 개념을 제대로 측정했는가? (집중/판별 구분)
  • 신뢰도가 높아도 타당도가 낮을 수 있으므로, **둘 다 중요**하다.

신뢰도 분석 실습 (Python)


1. 크론바흐 알파(Cronbach’s Alpha)


2. 가상 시나리오


3. Python 실습

import pandas as pd
import numpy as np

# 가상 데이터 생성 (148명, 7개 문항, 응답 0~6)
np.random.seed(42)  # 재현성을 위해 시드 고정
data = np.random.randint(0, 7, size=(148, 7))
df = pd.DataFrame(data, columns=[f'문항{i+1}' for i in range(7)])

# 6번 문항은 역코딩 처리
df['문항6'] = 6 - df['문항6']

# 크론바흐 알파 함수 정의
def calculate_cronbach_alpha(df):
    """
    주어진 DataFrame의 문항들에 대한 크론바흐 알파 계수를 계산합니다.

    Args:
        df (pd.DataFrame): 각 열이 설문 문항을 나타내는 데이터프레임.
    
    Returns:
        float: 계산된 크론바흐 알파 계수.
    """
    n_items = len(df.columns)  # 문항 수
    item_variances = df.var()  # 각 문항의 분산
    total_variance = df.sum(axis=1).var()  # 총점의 분산
    
    alpha = (n_items / (n_items - 1)) * (1 - (item_variances.sum() / total_variance))
    return alpha

# 크론바흐 알파 계산
cronbach_alpha = calculate_cronbach_alpha(df)
print(f"크론바흐 알파 계수: {cronbach_alpha:.4f}")

# 해석
if cronbach_alpha >= 0.7:
    print("=> 신뢰도가 높습니다. (문항 구성이 적절)")
else:
    print("=> 신뢰도가 낮습니다. (문항 개선 필요)")

4. 결과 해석


신뢰도가 낮은 설문 예시


1. 시나리오

👉 이렇게 되면 답변 패턴이 뒤죽박죽 → 크론바흐 알파 ↓


2. Python 실습

import pandas as pd
import numpy as np

np.random.seed(24)

# 신뢰도 낮은 설문 데이터 (148명, 7문항)
# 일부 문항은 '무작위' 값으로 넣어서 일관성이 약하게 함
data_low_reliability = np.column_stack([
    np.random.randint(3, 7, size=148),   # 문항1 (인지욕구)
    np.random.randint(2, 7, size=148),   # 문항2 (인지욕구)
    np.random.randint(0, 7, size=148),   # 문항3 (엉뚱한 문항)
    np.random.randint(0, 7, size=148),   # 문항4 (엉뚱한 문항)
    np.random.randint(3, 7, size=148),   # 문항5 (인지욕구)
    np.random.randint(0, 7, size=148),   # 문항6 (엉뚱한 문항)
    np.random.randint(2, 7, size=148)    # 문항7 (인지욕구)
])

df_low = pd.DataFrame(data_low_reliability, columns=[f'문항{i+1}' for i in range(7)])

# 크론바흐 알파 함수 (앞서 정의한 것 재사용)
def calculate_cronbach_alpha(df):
    """
    주어진 DataFrame의 문항들에 대한 크론바흐 알파 계수를 계산합니다.

    Args:
        df (pd.DataFrame): 각 열이 설문 문항을 나타내는 데이터프레임.
    
    Returns:
        float: 계산된 크론바흐 알파 계수.
    """
    n_items = len(df.columns)
    item_variances = df.var()
    total_variance = df.sum(axis=1).var()
    alpha = (n_items / (n_items - 1)) * (1 - (item_variances.sum() / total_variance))
    return alpha

cronbach_alpha_low = calculate_cronbach_alpha(df_low)
print(f"신뢰도가 낮은 설문 - 크론바흐 알파: {cronbach_alpha_low:.4f}")

3. 예상 결과