Python 고급

Python statsmodels를 이용한 통계 분석

PyExplorer 2024. 12. 27. 08:33
728x90

Python statsmodels를 이용한 통계 분석

들어가며

Python은 통계 분석과 데이터 분석을 위한 강력한 도구를 제공합니다. 그중 statsmodels는 다양한 통계 모델과 테스트를 제공하는 인기 있는 라이브러리입니다. 오늘 포스팅에서는 statsmodels를 이용해 통계 분석을 수행하는 방법을 단계별로 설명합니다. 간단한 데이터 예제를 통해 회귀 분석, 분산 분석(ANOVA), 그리고 시계열 분석을 수행하는 법을 배워봅시다.


statsmodels 설치

statsmodels를 사용하려면 먼저 해당 라이브러리를 설치해야 합니다. 아래 명령어를 실행하여 설치할 수 있습니다.

pip install statsmodels

데이터 준비

통계 분석을 위해 간단한 데이터셋을 생성합니다. 예를 들어, 학생들의 공부 시간과 시험 점수 간의 관계를 분석하는 데이터를 사용하겠습니다.

import pandas as pd
import numpy as np

# 데이터 생성
np.random.seed(42)
study_hours = np.random.uniform(1, 10, 100)  # 1시간에서 10시간 사이의 공부 시간
scores = 50 + 5 * study_hours + np.random.normal(0, 5, 100)  # 점수 생성

data = pd.DataFrame({
    'Study_Hours': study_hours,
    'Scores': scores
})

print(data.head())

단순 선형 회귀 분석

1. 모델 생성 및 학습

statsmodels를 사용해 공부 시간(Study_Hours)과 시험 점수(Scores) 간의 관계를 분석해봅니다. 이를 위해 단순 선형 회귀 모델을 생성합니다.

import statsmodels.api as sm

# 종속 변수와 독립 변수 설정
X = data['Study_Hours']  # 독립 변수
Y = data['Scores']  # 종속 변수

# 독립 변수에 상수항 추가
X = sm.add_constant(X)  # 상수항 추가

# 모델 생성 및 학습
model = sm.OLS(Y, X).fit()

2. 결과 요약

모델 학습이 완료되면 결과를 요약할 수 있습니다.

# 결과 요약 출력
print(model.summary())

결과 해석

  • coef: 각 변수의 계수를 보여줍니다.
  • P>|t|: 각 계수가 통계적으로 유의한지 확인하는 p-value입니다. 일반적으로 p-value가 0.05 미만이면 유의하다고 판단합니다.
  • R-squared: 모델의 설명력을 나타냅니다. 값이 1에 가까울수록 더 나은 설명력을 가집니다.

분산 분석 (ANOVA)

다음으로, 그룹 간 평균의 차이를 검정하는 ANOVA(분산 분석)를 수행합니다. 예를 들어, 공부 시간을 3개의 그룹으로 나누고 각 그룹의 평균 점수 차이를 검정합니다.

from statsmodels.stats.anova import anova_lm

# 그룹 나누기
bins = [0, 4, 7, 10]  # 공부 시간 구간
labels = ['Low', 'Medium', 'High']
data['Study_Group'] = pd.cut(data['Study_Hours'], bins=bins, labels=labels)

# ANOVA 분석
anova_model = sm.OLS.from_formula('Scores ~ Study_Group', data=data).fit()
anova_results = anova_lm(anova_model)

print(anova_results)

결과 해석

  • df: 각 그룹의 자유도입니다.
  • F: F-통계량입니다.
  • PR(>F): p-value로, 그룹 간 평균 차이가 유의미한지 확인합니다.

시계열 분석

statsmodels는 시계열 데이터를 분석하는 데에도 강력한 기능을 제공합니다. 간단한 ARIMA 모델을 사용하여 시계열 예측을 수행해보겠습니다.

1. 시계열 데이터 준비

# 시계열 데이터 생성
np.random.seed(42)
time = pd.date_range(start='2023-01-01', periods=100, freq='D')
values = np.cumsum(np.random.normal(0, 1, 100))  # 누적합으로 시계열 데이터 생성

time_series_data = pd.DataFrame({'Date': time, 'Value': values}).set_index('Date')

print(time_series_data.head())

2. ARIMA 모델 학습

from statsmodels.tsa.arima.model import ARIMA

# ARIMA 모델 생성 및 학습
arima_model = ARIMA(time_series_data, order=(1, 1, 1)).fit()

# 모델 결과 요약
print(arima_model.summary())

3. 예측 수행

# 미래 값 예측
forecast = arima_model.forecast(steps=10)
print(forecast)

마치며

이번 포스팅에서는 statsmodels를 활용한 기본적인 통계 분석 방법을 알아보았습니다. 단순 선형 회귀 분석, ANOVA, 그리고 시계열 분석을 통해 statsmodels의 강력한 기능을 확인할 수 있었습니다. 더 나아가 다양한 통계 모델을 적용해보고, 데이터를 기반으로 인사이트를 도출해보세요.

궁금한 점이 있거나 추가로 다루었으면 하는 주제가 있다면 댓글로 남겨주세요. Deep Python Studio에서 더욱 유익한 콘텐츠로 찾아뵙겠습니다!

728x90

'Python 고급' 카테고리의 다른 글

Python Django 웹 애플리케이션  (0) 2024.12.29
Python Flask 웹 서버 구현  (0) 2024.12.28
Python Scikit-learn을 활용한 머신러닝 기초  (0) 2024.12.26
Python Matplotlib Seaborn 데이터 시각화  (0) 2024.12.25
Python NumPy  (0) 2024.12.24