코딩 일지/파이썬 (Python)

논문 출판용 table 파이썬으로 바로 만들기

Virtuonweb 2022. 1. 25. 12:55

" 안녕하세요 virtuonweb 입니다 "

이번 글에서는 파이썬에서 OLS (ordinary least square) 결과를 테이블로 바로 만드는 법에 대해 알아볼까 한다. 

    OLS (Ordinary Least Square란?)

    OLS는 Python의 statsmodel 패키지로 할 수 있는 1차 회귀분석 기법이다.

    1차 회귀분석에 포함되는 것으로, data point와 regression된 model과의 수직거리 제곱의 합이 최소가 되도록 계산하는 기법이다.

    아래 사진을 참고하기 바란다.

    OLS, 출처 구글

    OLS 결과를 HTML 테이블로 만드는 법

    import pandas as pd
    from sklearn import datasets
    import statsmodels.api as sm
    from stargazer.stargazer import Stargazer
    from IPython.core.display import HTML

    1. pd 는 데이터프레임 조작 용도

    2. statsmodels에서 sm을 불러서 OLS를 가능하게 한다

    3. sklearn에서 예시 데이터셋을 불러온다

    4. stargazer를 통해 테이블을 만들 수 있고

    5. 이를 IPython HTML 함수를 통해 브라우저 화면 상으로 띄울 수 있다.

    -> alternative로 LaTex로 내보낼 수도 있다.

     

    diabetes = datasets.load_diabetes()
    df = pd.DataFrame(diabetes.data)
    df.columns = ['Age', 'Sex', 'BMI', 'ABP', 'S1', 'S2', 'S3', 'S4', 'S5', 'S6']
    df['target'] = diabetes.target

     

    diabetes 데이터셋은 이렇게 생겼다

    dataset column에 대한 정보는 다음에서 확인할 수 있다.

    https://github.com/scikit-learn/scikit-learn/blob/7e1e6d09b/sklearn/datasets/_base.py#L915

     

    이제 OLS를 회귀분석하고 stargazer로 테이블형태 만든뒤 HTML 함수로 present하면 된다.

    OLS를 돌리고 싶은 변수들을 원하는대로 골라준 뒤 2개의 모델을 합칠 수도 있다.

    X_1 = df[['Age', 'Sex', 'BMI', 'ABP', 'S5', 'S6']]
    X_2 = df[['Age', 'Sex', 'BMI', 'ABP', 'S1', 'S2']]
    y = df['target']
    
    est_1 = sm.OLS(y, sm.add_constant(X_1))
    OLS_model_1 = est_1.fit()
    
    est_2 = sm.OLS(y, sm.add_constant(X_2))
    OLS_model_2 = est_2.fit()
    
    stargazer = Stargazer([OLS_model_1,OLS_model_2])
    
    HTML(stargazer.render_html())

    결과는 다음과 같다.

      Dependent variable:target
      (1) (2)
    ABP 292.048*** 397.583***
      (66.417) (70.870)
    Age -45.201 24.704
      (60.581) (65.411)
    BMI 586.705*** 789.742***
      (65.453) (66.887)
    S1   197.852
        (143.812)
    S2   -169.251
        (142.744)
    S5 540.784***  
      (67.806)  
    S6 68.628  
      (66.989)  
    Sex -139.901** -82.862
      (57.931) (64.851)
    const 152.133*** 152.133***
      (2.641) (2.853)
     
    Observations 442 442
    R2 0.488 0.403
    Adjusted R2 0.481 0.395
    Residual Std. Error 55.519 (df=435) 59.982 (df=435)
    F Statistic 69.223*** (df=6; 435) 48.915*** (df=6; 435)
     
    Note: *p<0.1; **p<0.05; ***p<0.01

     

    Jupyter Notebook 상에 나타난 표를 그대로 drag 해서 복사하면 HTML 형식이 그대로 복사되기 때문에 위 테이블과 같이 티스토리에 붙여넣기 해도 깔끔한 형태가 보존된다.

     

     

     

     

     

    함께 읽으면 좋은 글