Processor

【Pandas】 DataFrame에서 그룹별 회귀분석하기

작성자 임베디드코리아 작성일26-04-16 00:24 조회108회 댓글0건
< * DataFrame 에서 그룹별 회귀분석하기 * >
◆ 파이썬에서 그룹별 회귀분석을 수행하려면, pandas로 데이터를 그룹화하고,
    statsmodels 또는 sklearn 라이브러리를 사용하여 각 그룹에 대해 회귀 모델을 개별적으로
    학습시키는 방식으로 구현할 수 있다.

1. 필요한 라이브러리 설치
    pip install pandas statsmodels scikit-learn

2. 데이터 준비
______< 예시 : 데이터를 생성 >_____________________________________
import pandas as pd
import numpy as np

# 샘플 데이터 생성
data = pd.DataFrame({
    'Group': ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'],
    'X': [1, 2, 3, 1, 2, 3, 1, 2, 3],
    'Y': [2, 4, 6, 1, 2, 3, 3, 6, 9]
})

print(data)
------------------------------------------------------------------------------
데이터 출력 :
  Group  X  Y
0    A  1  2
1    A  2  4
2    A  3  6
3    B  1  1
4    B  2  2
5    B  3  3
6    C  1  3
7    C  2  6
8    C  3  9


3. 그룹별 회귀분석 수행
(1) statsmodels 사용
    statsmodels는 회귀분석 결과를 해석하기에 적합한 통계 요약을 제공한다.
______________________________________________________________________________
import statsmodels.api as sm

# 그룹별 회귀분석
grouped = data.groupby('Group')
results = {}

for name, group in grouped:
    X = group['X']
    Y = group['Y']

    # X에 상수 추가 (절편 포함)
    X = sm.add_constant(X)

    # 회귀분석 수행
    model = sm.OLS(Y, X).fit()
    results[name] = model

# 결과 요약 출력
for group, model in results.items():
    print(f"Group {group} Regression Summary:")
    print(model.summary())
    print("\n")
------------------------------------------------------------------------
출력 예시
Group A Regression Summary:
                            OLS Regression Results                           
==============================================================================
Dep. Variable:                      Y  R-squared:                      1.000
Model:                            OLS  Adj. R-squared:                  1.000
...

Group B Regression Summary:
                            OLS Regression Results                           
==============================================================================
Dep. Variable:                      Y  R-squared:                      1.000
Model:                            OLS  Adj. R-squared:                  1.000
...

Group C Regression Summary:
                            OLS Regression Results                           
==============================================================================
Dep. Variable:                      Y  R-squared:                      1.000
Model:                            OLS  Adj. R-squared:                  1.000
...


(2) sklearn 사용
    sklearn은 회귀 모델을 학습시키고 예측하는 데 적합하다.
____________________________________________________________________________________
from sklearn.linear_model import LinearRegression

# 그룹별 회귀분석
grouped = data.groupby('Group')
models = {}

for name, group in grouped:
    X = group[['X']].values  # sklearn에서는 2D 배열이 필요
    Y = group['Y'].values

    # 모델 생성 및 학습
    model = LinearRegression()
    model.fit(X, Y)
    models[name] = model

    # 회귀 계수 및 절편 출력
    print(f"Group {name} Coefficients: {model.coef_[0]}, Intercept: {model.intercept_}")
--------------------------------------------------------------------------------------------------
출력 예시
Group A Coefficients: 2.0, Intercept: 0.0
Group B Coefficients: 1.0, Intercept: 0.0
Group C Coefficients: 3.0, Intercept: 0.0


4. 그룹별 회귀 결과 저장
  결과를 데이터프레임으로 저장하여 한눈에 확인할 수 있다.
_________________________________________________________________________________
results_df = pd.DataFrame([
    {'Group': name, 'Coefficient': model.coef_[0], 'Intercept': model.intercept_}
    for name, model in models.items()
])

print(results_df)
--------------------------------------------------------------------------------------------
출력 :
  Group  Coefficient  Intercept
0    A          2.0        0.0
1    B          1.0        0.0
2    C          3.0        0.0


5. 그룹별 회귀 결과 시각화
_____________________________________________________________________
import matplotlib.pyplot as plt

# 그룹별 회귀 결과 시각화
for name, group in grouped:
    X = group['X']
    Y = group['Y']

    # 회귀선
    pred_Y = models[name].predict(X.values.reshape(-1, 1))

    # 산점도 및 회귀선
    plt.scatter(X, Y, label=f"Group {name}")
    plt.plot(X, pred_Y, label=f"Regression Line {name}")

plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.title('Group-wise Regression')
plt.show()
--------------------------------------------------------------------------