Python SciPy

SciPy 최적화와 통계를 결합한 데이터 분석

PyExplorer 2025. 3. 31. 09:59
728x90

SciPy 최적화와 통계를 결합한 데이터 분석

1. 들어가며

데이터 분석 과정에서는 최적화와 통계적 방법을 결합하여 보다 정교한 분석을 수행하는 경우가 많습니다. SciPy는 이러한 작업을 효과적으로 수행할 수 있는 강력한 도구들을 제공하는 라이브러리입니다. 특히 scipy.optimize 모듈과 scipy.stats 모듈을 함께 활용하면 데이터의 특성을 이해하고, 최적의 해를 도출하는 과정을 쉽게 구현할 수 있습니다.

이번 포스팅에서는 SciPy를 이용해 최적화와 통계를 결합한 데이터 분석 방법을 설명하고, 실전 예제를 통해 이해를 돕도록 하겠습니다.


2. SciPy 최적화와 통계 모듈 개요

2.1 SciPy 최적화 (scipy.optimize)

SciPy의 최적화 모듈은 다양한 종류의 최적화 문제를 해결하는 방법을 제공합니다. 다음과 같은 기능들이 주요 기능입니다.

  • 함수 최소화: minimize 함수를 사용해 다양한 알고리즘으로 함수의 최소점을 찾을 수 있습니다.
  • 방정식의 근 찾기: root 함수를 이용해 비선형 방정식의 해를 찾을 수 있습니다.
  • 최적화 제약 조건 처리: 경계(bound)와 선형, 비선형 제약 조건을 적용할 수 있습니다.

2.2 SciPy 통계 (scipy.stats)

SciPy의 통계 모듈은 다양한 통계적 분석과 확률 분포를 다루는 기능을 제공합니다.

  • 확률 분포: 다양한 확률 분포에서 난수를 생성하고, 확률 밀도 함수(PDF), 누적 분포 함수(CDF)를 계산할 수 있습니다.
  • 검정과 추론: t-검정, 카이제곱 검정 등 통계적 가설 검정을 수행할 수 있습니다.
  • 기술 통계: 평균, 분산, 왜도, 첨도 등을 계산할 수 있습니다.

3. 실전 예제: 최적화와 통계를 결합한 데이터 분석

다음 예제에서는 주어진 데이터를 기반으로 최적의 모델을 찾고, 그 모델이 통계적으로 의미 있는지를 검증하는 과정을 다룹니다.

3.1 데이터 준비

아래는 특정 현상에서 얻은 데이터라고 가정한 예제입니다. 이 데이터를 기반으로 모델을 적합하고 분석해 보겠습니다.

import numpy as np
import matplotlib.pyplot as plt

# 임의의 데이터 생성 (예: 특정 시스템에서 얻은 측정값)
np.random.seed(0)
x_data = np.linspace(0, 10, 100)
y_data = 3.5 * np.sin(0.5 * x_data) + np.random.normal(0, 0.5, size=len(x_data))

# 데이터 시각화
plt.figure(figsize=(10, 6))
plt.scatter(x_data, y_data, color='blue', label='관측 데이터')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.grid(True)
plt.show()

3.2 최적화: 비선형 모델 피팅

이제 데이터를 기반으로 비선형 모델을 최적화해보겠습니다. 여기서는 사인 함수를 기반으로 모델을 만들고, SciPy의 curve_fit 함수를 이용해 최적의 파라미터를 찾습니다.

from scipy.optimize import curve_fit

# 모델 함수 정의 (비선형 모델)
def model_func(x, a, b, c):
    return a * np.sin(b * x) + c

# curve_fit을 이용한 최적화
params, covariance = curve_fit(model_func, x_data, y_data, p0=[3, 0.5, 0])

# 최적의 파라미터 출력
a_opt, b_opt, c_opt = params
print(f"최적의 파라미터: a={a_opt:.2f}, b={b_opt:.2f}, c={c_opt:.2f}")

3.3 최적화 결과 시각화

최적화된 모델과 실제 데이터를 시각화하여 얼마나 잘 적합되었는지 확인해보겠습니다.

# 최적화된 모델 예측값
y_pred = model_func(x_data, a_opt, b_opt, c_opt)

plt.figure(figsize=(10, 6))
plt.scatter(x_data, y_data, color='blue', label='관측 데이터')
plt.plot(x_data, y_pred, color='red', label='최적화된 모델')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.grid(True)
plt.show()

3.4 통계적 분석: 모델의 신뢰성 평가

이제 최적화된 모델이 통계적으로 의미가 있는지 평가해보겠습니다. 이를 위해 잔차 분석과 결정 계수($R^2$)를 계산합니다.

from scipy.stats import linregress

# 잔차 계산
residuals = y_data - y_pred

# 결정 계수(R^2) 계산
ss_res = np.sum(residuals**2)
ss_tot = np.sum((y_data - np.mean(y_data))**2)
r_squared = 1 - (ss_res / ss_tot)

print(f"결정 계수 (R^2): {r_squared:.4f}")

3.5 통계적 검정: 정규성 검정

잔차가 정규 분포를 따르는지 검정하여 모델이 적절한지 확인해보겠습니다. Shapiro-Wilk 검정을 수행합니다.

from scipy.stats import shapiro

# Shapiro-Wilk 검정
shapiro_test = shapiro(residuals)
print(f"Shapiro-Wilk 검정 통계량: {shapiro_test.statistic:.4f}, p-value: {shapiro_test.pvalue:.4f}")

# p-value > 0.05면 정규성을 만족한다고 판단
if shapiro_test.pvalue > 0.05:
    print("잔차는 정규성을 만족합니다.")
else:
    print("잔차는 정규성을 만족하지 않습니다.")

4. 결론

이번 포스팅에서는 SciPy의 최적화와 통계 기능을 결합하여 데이터 분석을 수행하는 방법을 살펴보았습니다. 주요 내용을 요약하면 다음과 같습니다.

  1. 최적화 수행: scipy.optimize 모듈의 curve_fit을 이용해 비선형 모델을 최적화했습니다.
  2. 모델 적합성 시각화: 최적화된 모델과 실제 데이터를 비교하여 적합성을 평가했습니다.
  3. 통계적 분석: 결정 계수와 Shapiro-Wilk 검정을 통해 모델의 신뢰성을 확인했습니다.

이와 같이 SciPy를 활용하면 데이터 분석 과정에서 최적의 모델을 찾고, 통계적 검정을 통해 분석의 정확성을 높일 수 있습니다.

앞으로는 다양한 최적화 알고리즘과 고급 통계 방법을 결합한 더 복잡한 분석 방법을 소개하도록 하겠습니다. 데이터 분석 과정에서 최적화와 통계의 중요성을 이해하고, SciPy를 활용하여 효율적인 분석을 수행해보시기 바랍니다.


5. 참고 자료

728x90