본문 바로가기
시뮬레이션 기반 사이언스

[연구 데이터 분석] 파이썬 Pandas와 SciPy를 활용한 논문용 통계 분석 및 결과 표(Table) 자동 생성 스크립트

by 지식보따리상상 2026. 4. 22.

지금까지 우리는 시뮬레이션의 병렬 처리, 로그 파일에서의 데이터 파싱, 그리고 웹 대시보드 구축까지 계산 화학 및 신소재 연구의 굵직한 파이프라인을 자동화했습니다. 이제 연구의 대미를 장식할 마지막 단계가 남았습니다. 바로 추출된 수백, 수천 개의 데이터 포인트를 바탕으로 '통계적 유의성(Statistical Significance)'을 검증하고, 논문에 즉시 삽입할 수 있는 깔끔한 '결과 표(Table)'를 만드는 작업입니다. 그래핀(Graphene) 전계효과트랜지스터(GFET)의 민감도 분포나 머신러닝이 예측한 수백 개 금속유기골격체(MOFs)의 오차율을 엑셀(Excel)에서 일일이 수식으로 계산하는 것은 비효율적일 뿐만 아니라 재현성을 해치는 주요 원인입니다. 이번 포스팅에서는 파이썬의 Pandas와 SciPy 라이브러리를 활용하여 논문 심사위원(Reviewer)들이 요구하는 엄밀한 통계 수치를 1초 만에 도출하는 스크립트를 공유합니다.


1. 엑셀(Excel) 수작업의 함정과 파이썬을 이용한 재현 가능한 분석(Reproducible Analysis)

대다수의 대학원생과 연구자들이 여전히 데이터가 담긴 CSV 파일을 엑셀로 열어 평균(AVERAGE)과 표준편차(STDEV)를 계산합니다. 데이터가 몇 개 없을 때는 문제가 되지 않지만, 머신러닝(ML)이 도입된 현대의 연구에서는 데이터가 수만 행으로 늘어납니다. 이때 엑셀에서 정렬을 잘못하거나 셀 참조 범위를 실수로 한 칸만 빗나가게 설정해도 연구 결과 전체가 왜곡되는 치명적인 오류가 발생합니다.

파이썬의 'Pandas' 라이브러리를 사용하면 데이터 원본(Raw data)을 절대 훼손하지 않으면서도, 코드로 기록된 명확한 수식을 통해 통계를 산출합니다. 즉, 6개월 뒤에 논문 리비전(Revision) 요청이 들어와서 데이터를 추가해야 할 때, 엑셀 창을 띄우고 어디서부터 손대야 할지 막막해할 필요 없이 기존의 파이썬 스크립트에 새로운 데이터만 넣고 '실행(Run)' 버튼만 누르면 모든 표와 수치가 자동으로 업데이트됩니다. 이것이 바로 최고 권위의 저널들이 요구하는 '재현 가능한 연구(Reproducible Research)'의 핵심입니다.


2. SciPy를 활용한 p-value 산출과 통계적 유의성 검증

논문의 결과(Results) 섹션에서 "A 소재가 B 소재보다 흡착 에너지가 높다"라고 단순히 서술하는 것만으로는 부족합니다. 리뷰어들은 그 차이가 단순한 우연인지, 아니면 통계적으로 유의미한 차이인지 증명하는 'p-value'를 요구합니다. 계산 화학이나 분자동역학(MD) 시뮬레이션에서도 초기 조건을 미세하게 바꾼 여러 번의 독립적인 앙상블(Ensemble) 계산을 통해 통계적 엄밀성을 확보하는 추세입니다.

파이썬의 'SciPy' 라이브러리는 T-검정(T-test), 분산분석(ANOVA) 등 강력한 통계 함수를 기본으로 제공합니다. 두 소재 그룹 간의 시뮬레이션 결과 배열을 `scipy.stats.ttest_ind()` 함수에 집어넣기만 하면, 복잡한 통계학적 수식 계산 없이 즉각적으로 t-statistic(t-통계량)과 p-value를 반환합니다. p-value가 0.05 미만일 경우 표에 별표(*)를 자동으로 추가하는 로직까지 스크립트에 포함하면, 논문 작성 시간이 비약적으로 단축됩니다.


3. 실전 파이썬 코드: 통계 요약 및 논문용 표(Table) 엑셀 자동 출력

아래의 코드는 이전 포스팅에서 파싱했던 시뮬레이션 결과 파일(`simulation_data.csv`)을 불러와, 소재 그룹별로 평균과 표준편차를 구하고, 대조군과의 T-검정을 수행한 뒤, 최종 결과를 논문에 첨부하기 좋은 깔끔한 형태의 엑셀(.xlsx) 파일로 내보내는 자동화 스크립트입니다.



import pandas as pd
from scipy import stats
import numpy as np

# 1. 시뮬레이션 결과 데이터 불러오기 (예: 소재 이름, 계산된 밴드갭 등)
# 데이터프레임 컬럼 구조 가정: ['Material_Type', 'Bandgap_eV']
df = pd.read_csv('simulation_data.csv')

# 2. Pandas groupby를 이용한 소재별 기술 통계(Descriptive Statistics) 자동 계산
# 평균(mean)과 표준편차(std), 샘플 수(count)를 한 번에 계산
summary_df = df.groupby('Material_Type')['Bandgap_eV'].agg(
    Mean='mean', 
    Std='std', 
    Count='count'
).reset_index()

# 논문 표기 방식(예: 1.25 ± 0.03)으로 포맷팅된 텍스트 컬럼 추가
summary_df['Result (Mean ± SD)'] = summary_df.apply(
    lambda row: f"{row['Mean']:.3f} ± {row['Std']:.3f}", axis=1
)

# 3. SciPy를 이용한 T-검정 (대조군 대비 p-value 산출)
# 예시로 'Graphene_Ref'를 대조군(Control)으로 설정
control_data = df[df['Material_Type'] == 'Graphene_Ref']['Bandgap_eV']
p_values = []
significance = []

for material in summary_df['Material_Type']:
    if material == 'Graphene_Ref':
        p_values.append(np.nan)
        significance.append('Ref')
        continue
        
    test_data = df[df['Material_Type'] == material]['Bandgap_eV']
    t_stat, p_val = stats.ttest_ind(control_data, test_data, equal_var=False)
    p_values.append(p_val)
    
    # p-value 기준에 따른 유의성 별표 표기
    if p_val < 0.001: sig = '***'
    elif p_val < 0.01: sig = '**'
    elif p_val < 0.05: sig = '*'
    else: sig = 'ns'
    significance.append(sig)

summary_df['p-value'] = p_values
summary_df['Significance'] = significance

# 4. 논문 삽입용 최종 테이블 정리 및 엑셀(Excel)로 출력
final_table = summary_df[['Material_Type', 'Count', 'Result (Mean ± SD)', 'p-value', 'Significance']]
print(final_table)

# 엑셀 파일로 저장 (인덱스 제외)
final_table.to_excel('Publication_Table_Summary.xlsx', index=False)
print("성공적으로 엑셀 파일이 생성되었습니다.")

4. 생성된 데이터 표(Table)를 논문에 적용하는 노하우

위 스크립트를 실행하여 생성된 `Publication_Table_Summary.xlsx` 파일을 열어보면, 논문의 'Table 1'에 그대로 복사해서 붙여넣을 수 있을 정도로 데이터가 완벽하게 포맷팅되어 있습니다. 평균과 표준편차 사이에 '±' 기호가 알맞은 소수점 자리 수로 들어가 있으며, 통계적 유의성을 나타내는 별표(*)까지 자동으로 매핑되어 있습니다.

이를 Microsoft Word나 LaTeX로 작성 중인 논문 원고에 가져갈 때는, 선의 굵기나 폰트(예: Times New Roman) 등 시각적인 서식만 저널의 가이드라인에 맞게 조정해 주면 됩니다. 계산 로직이 파이썬 스크립트라는 '코드'의 형태로 보존되어 있기 때문에, 새로운 후보 물질에 대한 시뮬레이션이 100개가 추가되더라도 이 표를 업데이트하는 데 걸리는 시간은 단 1초면 충분합니다.


결론: 데이터를 다루는 깊이가 연구자의 클래스를 증명합니다

아무리 뛰어난 시뮬레이션을 수행하고 최첨단 머신러닝 알고리즘을 적용했더라도, 최종적으로 독자와 심사위원을 설득하는 것은 논리적으로 잘 정리된 '숫자(통계)'입니다. 파이썬의 Pandas와 SciPy를 결합한 자동화 스크립트는 인간의 단순 반복 작업과 실수를 원천적으로 제거하고 데이터에 객관적인 신뢰성을 부여합니다. 10편의 연재글을 통해 우리는 시뮬레이션 환경 구축부터 데이터 분석의 끝단까지 살펴보았습니다. 이 워크플로우를 여러분의 실제 연구에 도입하여 압도적인 효율을 경험해 보시기 바랍니다.