데이터 시각화란?

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


데이터 시각화란?

숫자와 텍스트로 이루어진 데이터를 차트, 그래프, 지도 등의 시각적 요소로 표현하는 과정

  • 데이터 속에 숨겨진 패턴, 트렌드, 상관관계를 발견할 수 있음
  • 비전문가도 쉽게 이해할 수 있는 소통의 도구
  • 복잡한 데이터도 시각화하면 한눈에 이해 가능

이러한 데이터 시각화에도 데이터의 형태가 아주 중요하다

  1. 수치형인지?
  2. 범주형인지?

이에 따라 우리가 보여줄 수 있는 시각화 방향이 다르게 이루어진다.

협업을 하는 경우

# 현재 환경을 저장하는 방법 > 버전, 패키지 명만 나옴 
pip freeze > requirements.txt 

# 로컬에서 진행하는 경우, 같은 환경에서 팀원들과 에러없이 진행하기 위해 
# 상대의 환경을 내 로컬에 설치하는 방법 
pip install -r requirements.txt

카이제곱검정(Chi-square test)이란?

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


데이터에 따른 분류

입력(x) - 출력(y)

  • 수치 - 수치: 회귀모델
  • 수치 - 범주(이진): 로지스틱회귀모델
  • 범주 - 수치: t test, ANOVA
  • 범주 - 범주: 카이제곱검정

모수적/비모수적

  • 모수적: 데이터가 정규분포를 따름
  • 비모수적: 정규분포에 대한 가정이 거의 없음 > 설명력이 떨어짐

카이제곱검정(Chi-square test)

범주형 데이터의 분포나 변수 간의 독립성을 검정하는 비모수 통계 방법

  • 관측 빈도와 기대 빈도의 차이를 이용하여 가설을 검정하며
  • 카이제곱 분포를 따르는 검정통계량을 사용

카이제곱 검정의 기본 원리

  • 기본 아이디어: 관측값과 기대값의 차이가 우연에 의한 것인지 체계적인 것인지 판단
  • 검정통계량: χ² = Σ[(관측빈도 - 기대빈도)² / 기대빈도]
  • 분포: 카이제곱 분포 (Chi-square distribution)
  • 자유도: 범주 수와 제약 조건에 따라 결정

카이제곱 검정의 기본 가정

  1. 독립성: 관측치들이 서로 독립적이어야 함
  2. 범주형 데이터: 명목형 또는 순서형 범주 데이터
  3. 충분한 빈도: 각 셀의 기대빈도가 5 이상 (Fisher의 정확검정 대안 고려)
  4. 무작위 표본: 모집단에서 무작위로 추출된 표본

카이제곱 검정의 종류

카이제곱 검정은 분석 목적에 따라 두 가지 주요 유형으로 나뉨

1. 적합성 검정 (Goodness of Fit Test)

  • 목적: 관측된 데이터가 특정 분포나 비율을 따르는지 검정
  • 사용 상황: 단일 범주형 변수의 분포 검정
  • 예시: “실린더 수 분포가 균등한가?”, “성별 비율이 1:1인가?”

2. 독립성 검정 (Test of Independence)

  • 목적: 두 범주형 변수가 서로 독립적인지 검정
  • 사용 상황: 교차표(분할표)를 이용한 연관성 분석
  • 예시: “성별과 선호도가 독립적인가?”, “치료법과 결과가 연관되어 있는가?”

예시

데이터 구조

  • 관측치 수: 32개 (32대의 자동차)
  • 변수 수: 11개 (모델명 + 10개 특성 변수)
  • 데이터 타입: CSV 형식
  • 결측치: 없음

변수 설명

변수명 한글명 데이터 타입 단위 설명
model 모델명 문자형 - 자동차 모델명 (예: Mazda RX4, Toyota Corolla)
mpg 연비 연속형 miles/gallon 연료 효율성 (갤런당 마일)
cyl 실린더 수 이산형 엔진 실린더 개수 (4, 6, 8)
disp 배기량 연속형 cubic inch 엔진 배기량 (세제곱인치)
hp 마력 연속형 hp 총 마력
drat 뒤차축 비율 연속형 - 후방차축 기어비
wt 중량 연속형 1000 lbs 자동차 중량 (1000파운드 단위)
qsec 1/4마일 시간 연속형 1/4마일 주행 시간
vs 엔진 형태 이진형 - V형 엔진(0) 또는 직렬 엔진(1)
am 변속기 타입 이진형 - 자동 변속기(0) 또는 수동 변속기(1)
gear 기어 수 이산형 전진 기어 개수 (3, 4, 5)
carb 카뷰레터 수 이산형 카뷰레터 개수 (1, 2, 3, 4, 6, 8)

변수별 상세 정보

연속형 변수

  • mpg (연비): 10.4 ~ 33.9 miles/gallon
  • disp (배기량): 71.1 ~ 472.0 cubic inches
  • hp (마력): 52 ~ 335 마력
  • drat (뒤차축 비율): 2.76 ~ 4.93
  • wt (중량): 1.513 ~ 5.424 (1000 lbs)
  • qsec (1/4마일 시간): 14.50 ~ 22.90 초

범주형 변수

  • cyl (실린더 수): 4기통(11대), 6기통(7대), 8기통(14대)
  • vs (엔진 형태): V형 엔진(18대), 직렬 엔진(14대)
  • am (변속기): 자동(19대), 수동(13대)
  • gear (기어 수): 3단(15대), 4단(12대), 5단(5대)
  • carb (카뷰레터): 1개(7대), 2개(10대), 3개(3대), 4개(10대), 6개(1대), 8개(1대)

독립성 검정

from scipy.stats import chi2_contingency

# 변속기 타입(am)
am_count = df['am'].value_counts()  # 범주/수치 상관없이 사용 
# 실린더 수(cyl)
cyl_count = df['cyl'].value_counts().sort_index()  # 범주/수치 상관없이 사용 

# 교차표 만드는 메소드 > .crosstab
contingency_table = pd.crosstab(df['am'], df['cyl'], margins=True)

# 합계 행렬 부분 삭제 
observed = contingency_table.iloc[:-1,:-1]
# 합계부분 제거 후 , 모델에 넣기 위한 사전 작업 
observed = contingency_table.iloc[:-1,:-1].values

# 카이제곱 검정을 통한 데이터 확인 
chi2_stat, p_val, dof, expected = chi2_contingency(observed)

print(chi2_stat)  # 카이제곱
print(p_val)  # p-value
print(dof)  # 자유도
print(expected)  # 기댓값 
# 8.740732951259268
# 0.012646605046107276 > 0.05보다 작다 = 귀무가설 기각, 대립가설 채택 
# 2
# [[6.53125 4.15625 8.3125 ]
#  [4.46875 2.84375 5.6875 ]]

실린더 수(cyl)와 변속기 유형(am) 사이의 독립성 검정에서는:

  • H₀: 실린더 수와 변속기 유형은 서로 관련이 없다
  • H₁: 실린더 수와 변속기 유형은 서로 관련이 있다

적합성 검정(Goodness of Fit Test)

2.1 언제 적합성 검정을 사용하는가?

상황 예시 질문 실무 적용
균등성 검정 “모든 범주가 똑같이 나타나는가?” 주사위 공정성, 웹사이트 A/B 테스트 균등 배분
특정 비율 검정 “예상한 비율과 일치하는가?” 시장 점유율 예측 vs 실제, 유전자 비율 검정
이론 분포 검정 “특정 확률 분포를 따르는가?” 포아송 분포, 정규분포 적합성

2.2 검정 개념 및 가설

적합성 검정은 하나의 범주형 변수가 특정 이론적 분포와 일치하는지 검정

핵심 아이디어:

  • 관측된 빈도 vs 기대되는 빈도 비교
  • χ² = Σ[(관측값 - 기대값)²/기대값]

가설 설정:

  • H₀: 관측 분포 = 기대 분포 (차이는 우연)
  • H₁: 관측 분포 ≠ 기대 분포 (체계적 차이 존재)

결과 해석 가이드:

  • p < 0.05: 기대 분포와 다르다 (H₀ 기각)
  • p ≥ 0.05: 기대 분포와 일치한다고 볼 수 있다 (H₀ 채택)
# 관측빈도
observed_cyl = df['cyl'].value_counts().sort_index()
observed_cyl  # 우리가 관측한 빈도는 11:7:14 

# 기대빈도(이론상)
n_total = len(df)
n_categories = len(observed_cyl)  # 3개 의미 
expected_equal = np.repeat(n_total / n_categories, n_categories)  
# 첫번째 인자를 두번째 인자만큼 반복 > 균등분포 
# n_total / n_categories > 평균 
print(n_total)
print(n_categories)
print(expected_equal)  # 전체 카테고리합을 개수로 나눠서 균등하게 나눔(=균등분포표현)
# 32
# 3
# [10.66666667 10.66666667 10.66666667]

# 카이제곱 검정 실행 
from scipy.stats import chi2_contingency, chisquare, fisher_exact
chi2_stat, p_val = chisquare(f_obs=observed_cyl.values, f_exp=expected_equal)
print(chi2_stat)
print(p_val)
# 2.3125
# 0.314663961018459  > 0.05보다 크다 > 귀무가설 채택 / 대립가설 기각 
# => 기대분포와 일치 

아노바(ANOVA)검정이란?

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


데이터에 따른 분류

입력(x) - 출력(y)

  • 수치 - 수치: 회귀모델
  • 수치 - 범주(이진): 로지스틱회귀모델
  • 범주 - 수치: t test, ANOVA
  • 범주 - 범주: 카이제곱검정

    모수적/비모수적

  • 모수적: 데이터가 정규분포를 따름
  • 비모수적: 정규분포에 대한 가정이 거의 없음 > 설명력이 떨어짐

ANOVA

구분 설명
목적 세 그룹 이상에서 평균 차이가 통계적으로 유의한지 검정
핵심 아이디어 그룹 간 분산(변동)과 그룹 내 분산(오차)을 비교해 F-통계량 도출
대표 예시 ① 세 가지 학습법의 시험 점수 비교
② 여러 공정 라인의 제품 수율 비교

두 그룹만 비교한다면 t-test가 적합하지만, 여러 그룹을 t-test로 반복하면 1종 오류(α)가 급격히 늘어난다 → ANOVA로 한 번에 검정!

기본 가정

  1. 독립성 : 각 관측치는 서로 독립
  2. 정규성 : 각 그룹의 데이터 분포가 정규
  3. 등분산성 : 각 그룹의 분산이 동일

가정이 심하게 깨질 때는 Kruskal-Wallis 같은 비모수 검정이나 Welch-ANOVA(등분산 가정 완화)를 고려한다.

예시

# 데이터 로딩 
ris_data = load_iris()
df = pd.DataFrame(iris_data.data, columns=iris_data.feature_names)
df['species'] = iris_data.target_names[iris_data.target]

print("데이터셋 기본 정보:")
print(f"샘플 수: {len(df)}")
print(f"변수 수: {len(df.columns)-1}")
print(f"품종: {df['species'].unique()}")
# 데이터셋 기본 정보:
# 샘플 수: 150
# 변수 수: 4
# 품종: ['setosa' 'versicolor' 'virginica']

df
# 측정 변수들의 짧은 이름 정의
measurements = ['sepal length (cm)', 'sepal width (cm)',
                'petal length (cm)', 'petal width (cm)']
short_names = ['꽃받침 길이', '꽃받침 폭', '꽃잎 길이', '꽃잎 폭']

# 2x2 서브플롯으로 박스플롯 생성
fig, axes = plt.subplots(2, 2, figsize=(15, 10))
axes = axes.ravel()

for i, (measure, name) in enumerate(zip(measurements, short_names)):
    sns.boxplot(data=df, x='species', y=measure, ax=axes[i])
    axes[i].set_title(f'{name} 품종별 분포')
    axes[i].set_xlabel('품종')
    axes[i].set_ylabel('측정값 (cm)')

plt.tight_layout()
plt.show()

독립성 검정

실제 데이터테이블을 보고 데이터들이 다른 영역에 침법하고 있는지를 확인

즉, 수집된 샘플이 다른 개체에 영향을 주면 안된다.

정규성 검정

  • 샤피로-윌크 검정(Shapiro-Wilk Test)은 주어진 데이터 샘플이 정규분포(Normal Distribution)를 따르는지 확인하기 위한 통계적 검정 방법
print("=== 정규성 검정 (Shapiro-Wilk Test) ===")
print("H0: 데이터가 정규분포를 따른다")
print("p > 0.05이면 정규성 가정 충족\n")

for measure, name in zip(measurements, short_names):
    print(f"[{name}]")
    for species in df['species'].unique():
        data = df[df['species'] == species][measure]
        statistic, p_value = stats.shapiro(data)
        result = "충족" if p_value > 0.05 else "위반"
        print(f"  {species}: p = {p_value:.4f} ({result})")
    print()
=== 정규성 검정 (Shapiro-Wilk Test) ===
H0: 데이터가 정규분포를 따른다
p > 0.05이면 정규성 가정 충족

[꽃받침 길이]
  setosa: p = 0.4595 (충족)
  versicolor: p = 0.4647 (충족)
  virginica: p = 0.2583 (충족)

[꽃받침 폭]
  setosa: p = 0.2715 (충족)
  versicolor: p = 0.3380 (충족)
  virginica: p = 0.1809 (충족)

[꽃잎 길이]
  setosa: p = 0.0548 (충족)
  versicolor: p = 0.1585 (충족)
  virginica: p = 0.1098 (충족)

[꽃잎 폭]
  setosa: p = 0.0000 (위반)
  versicolor: p = 0.0273 (위반)
  virginica: p = 0.0870 (충족)

등분산성 가정 검토

  • 레빈 검정(Levene Test)은 두 개 이상의 집단(group)들의 분산이 서로 같은지 확인하는 통계적 방법으로 이를 분산의 동질성(homogeneity of variance)이라 한다.
print("=== 등분산성 검정 (Levene Test) ===")
print("H0: 모든 집단의 분산이 같다")
print("p > 0.05이면 등분산성 가정 충족\n")

for measure, name in zip(measurements, short_names):
    # 각 품종별 데이터 분리
    setosa_data = df[df['species'] == 'setosa'][measure]
    versicolor_data = df[df['species'] == 'versicolor'][measure]
    virginica_data = df[df['species'] == 'virginica'][measure]

    # Levene 검정
    statistic, p_value = stats.levene(setosa_data, versicolor_data, virginica_data)
    result = "충족" if p_value > 0.05 else "위반"
    print(f"{name}: F = {statistic:.4f}, p = {p_value:.4f} ({result})")
=== 등분산성 검정 (Levene Test) ===
H0: 모든 집단의 분산이 같다
p > 0.05이면 등분산성 가정 충족

꽃받침 길이: F = 6.3527, p = 0.0023 (위반)
꽃받침 폭: F = 0.5902, p = 0.5555 (충족)
꽃잎 길이: F = 19.4803, p = 0.0000 (위반)
꽃잎 폭: F = 19.8924, p = 0.0000 (위반)

Anova 분석 > 변수 3개

f_stat, p_val = stats.f_oneway(setosa, versicolor, virginica)
print(f"F-통계량: {f_stat:.4f}")
print(f"p-value: {p_val}")
# F-통계량: 119.2645
# p-value: 1.6696691907693826e-31

일원분산 분석(One-way ANOVA)

import statsmodels.api as sm
from statsmodels.formula.api import ols

# 선형회귀 분석 ols
# Q("sepal length (cm)" 변수 하나를 넣고, 모델 훈련시키고
model = ols('Q("sepal length (cm)") ~ C(species)', data=df).fit()

# residual > 잔차를 계산한것, F > F 통계량 값
anova_table = sm.stats.anova_lm(model, typ=2)
anova_table

사후검정(Post-hoc test)

사후 검정은 분산분석(ANOVA)에서 “집단 간 차이가 있다”는 결과를 얻은 후, 구체적으로 어떤 집단들 사이에 유의미한 차이가 있는지 알아보기 위해 수행하는 추가 분석

from statsmodels.stats.multicomp import pairwise_tukeyhsd
turkey = pairwise_tukeyhsd(endog=df["sepal length (cm)"], groups=df["species"], alpha=0.05)
print(turkey)
   Multiple Comparison of Means - Tukey HSD, FWER=0.05   
=========================================================
  group1     group2   meandiff p-adj lower  upper  reject
---------------------------------------------------------
    setosa versicolor     0.93   0.0 0.6862 1.1738   True
    setosa  virginica    1.582   0.0 1.3382 1.8258   True
versicolor  virginica    0.652   0.0 0.4082 0.8958   True
---------------------------------------------------------
  • setosa > versicolor > virginica 순서대로 sepal length 차이가 크다
  • reject: 귀무가설 기각 여부 / true면 기각
  • 좀 더 객관적으로 파악하고 싶을때 사용

회귀모델(Linear Regression)이란?

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


데이터에 따른 분류

입력(x) - 출력(y)

  • 수치 - 수치: 회귀모델
  • 수치 - 범주(이진): 로지스틱회귀모델
  • 범주 - 수치: t test, ANOVA
  • 범주 - 범주: 카이제곱검정

모수적/비모수적

  • 모수적: 데이터가 정규분포를 따름
  • 비모수적: 정규분포에 대한 가정이 거의 없음 > 설명력이 떨어짐

단순 회귀모델(Simple Linear Regression)?

하나의 독립 변수(X)와 하나의 종속 변수(Y)사이의 선형 관계를 모델링하는 회귀 분석

[y = \beta_0 + \beta_1 x + \varepsilon]

  • $y$: 종속 변수 (예측하고 싶은 값)
  • $x$: 독립 변수 (입력 변수)
  • $\beta_0$: 절편 (Intercept)
  • $\beta_1$: 기울기 (Slope) — $x$가 1 증가할 때 $y$가 얼마나 증가하는지
  • $\varepsilon$: 오차 (실제값과 예측값의 차이)

시각적 설명

직선 하나로 데이터를 설명

  • 산점도 위에 가장 잘 맞는 직선을 그리는 것이 목표
  • 직선은 최소제곱법(Least Squares)으로 구함 → 오차제곱합을 최소화

단순 회귀의 가정

가정 항목 설명
선형성 X와 Y 사이에 선형 관계가 있어야 함
독립성 관측치 간의 오차는 서로 독립적이어야 함
등분산성 오차의 분산은 일정해야 함 (Homoscedasticity)
정규성 오차는 정규분포를 따라야 함

장점과 단점

장점 단점
단순하고 해석 쉬움 변수 하나만 고려 → 실제 상황 반영 부족
시각화가 용이함 비선형 관계는 설명 불가
빠르게 계산됨 이상치에 민감

단순 vs 다중 회귀 차이

항목 단순 회귀 다중 회귀
독립 변수 1개 2개 이상
수식 $y = \beta_0 + \beta_1 x$ $y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \cdots$
설명력 제한적 더 많은 요인 반영 가능
# y = Q("quality")
# x = Q("fixed acidity") + Q("volatile acidity") ...  
# > 다중회귀모델 
Rformula = 'Q("quality") ~ Q("fixed acidity") + Q("volatile acidity") + Q("citric acid") \
+ Q("residual sugar") + Q("chlorides") + Q("free sulfur dioxide") + Q("total sulfur dioxide") \
+ Q("density") + Q("pH") + Q("sulphates") + Q("alcohol")'

regression_result = ols(Rformula, data=wine).fit()   
# .fit(): 모델통을 만들겠다 >(= 파라미터 훈련) 훈련되는 파라미터가 존재 > wine data
# ols().fit() > 선형회귀모델 구현 > 최적의 fit을 찾아나간다(모델) 
regression_result.summary()  # > Rsquared 값이랑 등등을 볼 수 있게 됨
OLS Regression Results
Dep. Variable:	Q("quality")	R-squared:	0.292
Model:	OLS	Adj. R-squared:	0.291
Method:	Least Squares	F-statistic:	243.3
Date:	Fri, 01 Aug 2025	Prob (F-statistic):	0.00
Time:	06:47:52	Log-Likelihood:	-7215.5
No. Observations:	6497	AIC:	1.445e+04
Df Residuals:	6485	BIC:	1.454e+04
Df Model:	11		
Covariance Type:	nonrobust		
coef	std err	t	P>|t|	[0.025	0.975]
Intercept	55.7627	11.894	4.688	0.000	32.447	79.079
Q("fixed acidity")	0.0677	0.016	4.346	0.000	0.037	0.098
Q("volatile acidity")	-1.3279	0.077	-17.162	0.000	-1.480	-1.176
Q("citric acid")	-0.1097	0.080	-1.377	0.168	-0.266	0.046
Q("residual sugar")	0.0436	0.005	8.449	0.000	0.033	0.054
Q("chlorides")	-0.4837	0.333	-1.454	0.146	-1.136	0.168
Q("free sulfur dioxide")	0.0060	0.001	7.948	0.000	0.004	0.007
Q("total sulfur dioxide")	-0.0025	0.000	-8.969	0.000	-0.003	-0.002
Q("density")	-54.9669	12.137	-4.529	0.000	-78.760	-31.173
Q("pH")	0.4393	0.090	4.861	0.000	0.262	0.616
Q("sulphates")	0.7683	0.076	10.092	0.000	0.619	0.917
Q("alcohol")	0.2670	0.017	15.963	0.000	0.234	0.300
Omnibus:	144.075	Durbin-Watson:	1.646
Prob(Omnibus):	0.000	Jarque-Bera (JB):	324.712
Skew:	-0.006	Prob(JB):	3.09e-71
Kurtosis:	4.095	Cond. No.	2.49e+05

R-squared: 0.292의 의미

  1. R-squared는 결정계수의 의미로 모델의 설명력을 의미
  2. 0과 1사이의 값
  3. 1에 가까울수록 설명력이 좋다
    • 보통 0.7 이상이면 설명력이 좋다, 유의미하다고 해석함

t검정(t-test)란?

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


데이터에 따른 분류

입력(x) - 출력(y)

  • 수치 - 수치: 회귀모델
  • 수치 - 범주(이진): 로지스틱회귀모델
  • 범주 - 수치: t test, ANOVA
  • 범주 - 범주: 카이제곱검정

모수적/비모수적

  • 모수적: 데이터가 정규분포를 따름
  • 비모수적: 정규분포에 대한 가정이 거의 없음 > 설명력이 떨어짐

t 검정(t-test)

두 집단의 평균이 통계적으로 유의미한 차이가 있는지 검증하는 통계 분석 방법

t 검정은 모집단의 분산을 모르고 표본 크기가 작을 때(일반적으로 30개 미만) 사용하는 검정 방법으로 정규분포 대신 t분포를 사용하여 검정을 수행한다.

t 검정의 종류

  1. 단일표본 t 검정 (One-sample t-test)
    • 하나의 표본 평균이 특정 값(모집단 평균)과 차이가 있는지 검정
    • 예: 우리 학교 학생들의 평균 키가 전국 평균 170cm와 다른가?
  2. 독립표본 t 검정 (Independent samples t-test)
    • 서로 독립적인 두 집단의 평균 차이를 검정
    • 예: 남학생과 여학생의 수학 점수에 차이가 있는가?
  3. 대응표본 t 검정 (Paired samples t-test)
    • 동일한 대상에서 두 번 측정한 값의 차이를 검정
    • 예: 다이어트 프로그램 전후의 체중 변화가 있는가?

기본 가정사항

t 검정을 사용하기 위해서는 다음 조건들이 충족되어야 함

  1. 정규성: 데이터가 정규분포를 따라야 함
  2. 독립성: 각 관측치는 서로 독립적이어야 함
  3. 등분산성: 두 집단을 비교할 때 분산이 비슷해야 함(독립표본 t 검정의 경우)

t 통계량 계산

t 통계량은 다음과 같이 계산된다

t = (표본평균 - 모집단평균) / (표준오차)
  1. 이 값을 t분포표와 비교하여 p-value를 구하고
  2. 유의수준(보통 0.05)과 비교하여 귀무가설의 기각 여부를 결정
    • 0.05 이하: 귀무가설 기각, 대립가설 채택
    • 0.05 이상: 귀무가설 채택, 대립가설 기각

주의사항

  • 표본 크기가 큰 경우(n>30)에는 z 검정을 사용할 수도 있음
  • 정규성 가정이 심하게 위배되면 비모수 검정(Mann-Whitney U test, Wilcoxon signed-rank test)을 고려
  • 다중 비교 시에는 제1종 오류를 조정해야 함
    • 1종오류: 귀무가설이 사실인데, 거젓이라고 결정
    • 2종오류: 귀무가설이 거짓인데, 사실이라고 결정

t 검정은 통계학에서 가장 기본적이면서도 널리 사용되는 검정 방법으로, 연구 설계와 데이터 특성에 맞는 적절한 t 검정을 선택하는 것이 중요하다.

# 통계 라이브러리 import 
from scipy import stats
from statsmodels.formula.api import ols, glm

# 와인의 퀄리티 확인 
red_wine = wine.loc[wine['type'] == 'red', 'quality']
white_wine = wine.loc[wine['type'] == 'white', 'quality']
white_wine
# t-test 함수에 red_wine,white_wine 를 x값으로써 집어 넣는다 
stats.ttest_ind(red_wine, white_wine)
TtestResult(statistic=np.float64(-10.149363059143164), 
pvalue=np.float64(8.168348870049682e-24), df=np.float64(2950.750452166697))
  1. pvalue=np.float64(8.168348870049682e-24)
    • 0.05보다 p-value값이 작아서 귀무가설 기각 / 대립가설 채택
  2. tatistic=np.float64(-10.149363059143164)
    • 음수 > 적포도주의 평균 품질이 낮다 = 두 집단간 평균 차이가 심함
'귀무가설(H0)' :  적포도주와 백포도주의 평균 품질 점수는 같다
'대립가설(H1)' : 적포도주와 백포도주의 평균의 품질 점수는 다르다

결론: 두 와인 종류와 등급간에는 매우 유의미하다 => 대립가설 채택


equal_var=False 를 쓰는때는 언제인가?

stats.ttest_ind(red_wine, white_wine, equal_var=False)

이 옵션을 넣기위해서는

  1. 정규성 검정 먼저 해보고
  2. 등분산성 검정을 한 뒤

정규성 검정은 성립하지만 등분산성 검정을 만족하지 못할때 Welch's t-test를 한다. ((모수))

Welch's t-test: equal_var = False

만약, 반대로 정규성 검정을 만족하지 못하고, 등반산성 검정만 성립한다면 Mann-Whitrney U 검정을 시행한다. (비모수)