[Python] 파이썬 Pandas로 엑셀 데이터 읽고 분석하기

반응형

엑셀로 하루 종일 씨름하는 대신, 파이썬으로 5분 만에 데이터 분석을 끝내고 싶지 않으신가요?

안녕하세요, 개발자 여러분. 오늘은 업무 자동화의 강력한 무기가 될 Pandas 라이브러리 사용법에 대해 알아보겠습니다. 제가 데이터 분석 업무를 맡았을 때 Excel VBA로 고생하다가 Pandas를 알게 된 후 업무 시간이 절반으로 줄었습니다. 엑셀 파일 열고, 피벗 테이블 만들고, 시각화하는 과정을 모두 자동화할 수 있으니까요. 이제 그 비법을 공유하겠습니다.

1. Pandas 기초 및 설치 방법

Pandas는 파이썬에서 데이터 분석을 위한 핵심 라이브러리입니다. 엑셀과 비슷한 기능을 제공하지만, 자동화와 대용량 데이터 처리에 훨씬 강력합니다. 특히 데이터프레임(DataFrame)이라는 2차원 테이블 구조를 제공해서 엑셀 사용자가 쉽게 적응할 수 있죠.

우선 Pandas를 설치해야 합니다. 아직 설치하지 않았다면 터미널이나 명령 프롬프트에서 다음 명령어로 설치하세요.

pip install pandas
pip install openpyxl  # 엑셀 파일 처리를 위한 라이브러리
pip install xlrd      # 이전 버전 엑셀 파일(.xls) 지원
pip install matplotlib  # 시각화를 위한 라이브러리

Pandas는 보통 다음과 같이 임포트합니다. 관례적으로 pd라는 별칭을 사용하죠.

import pandas as pd
import matplotlib.pyplot as plt  # 그래프 그리기

2. 엑셀 파일 읽기 및 기본 데이터 탐색

Pandas로 엑셀 파일을 읽는 것은 매우 간단합니다. read_excel() 함수 하나로 끝납니다. 다양한 파일 형식(.xlsx, .xls, .xlsm 등)을 지원하며, 특정 시트만 선택적으로 읽을 수도 있습니다.

# 기본 사용법
df = pd.read_excel('데이터.xlsx')

# 특정 시트 읽기
df = pd.read_excel('데이터.xlsx', sheet_name='Sheet2')

# 여러 시트 읽기
all_sheets = pd.read_excel('데이터.xlsx', sheet_name=None)  # 딕셔너리 형태로 반환

# 특정 범위만 읽기 (A1:C10)
df = pd.read_excel('데이터.xlsx', usecols='A:C', nrows=10)

파일을 읽은 후에는 데이터를 탐색해야 합니다. 다음은 자주 사용하는 데이터 탐색 메서드들입니다.

메서드 설명 사용 예
head() 상위 n개 행 보기 df.head(5)
tail() 하위 n개 행 보기 df.tail(5)
info() 데이터프레임 정보 요약 df.info()
describe() 수치형 열의 통계 요약 df.describe()
shape 행과 열의 수 반환 df.shape
columns 열 이름 목록 확인 df.columns

3. 데이터 정제 및 전처리 기법

현실에서는 깨끗한 데이터를 만나기 어렵습니다. 대부분의 엑셀 파일에는 결측값, 중복값, 이상치 등이 존재합니다. Pandas는 이런 문제를 해결하는 다양한 도구를 제공합니다.

결측값 처리하기

결측값(NaN)은 데이터 분석의 큰 장애물입니다. 다음 방법으로 결측값을 확인하고 처리할 수 있습니다.

  1. 결측값 확인: df.isnull().sum()으로 각 열의 결측값 개수를 확인합니다.
  2. 결측값 제거: df.dropna()로 결측값이 있는 행을 제거합니다.
  3. 결측값 채우기: df.fillna(value)로 결측값을 특정 값으로 대체합니다.
  4. 보간법: df.interpolate()로 결측값을 주변 값을 기반으로 추정합니다.
# 결측값 확인
missing_values = df.isnull().sum()
print(missing_values)

# 결측값이 있는 행 제거
df_cleaned = df.dropna()

# 결측값을 평균으로 채우기
df['수치컬럼'] = df['수치컬럼'].fillna(df['수치컬럼'].mean())

# 결측값을 이전 값으로 채우기 (시계열 데이터에 유용)
df['컬럼명'] = df['컬럼명'].fillna(method='ffill')

중복 데이터 처리

중복 데이터는 분석 결과를 왜곡시킬 수 있습니다. Pandas에서는 쉽게 중복을 확인하고 제거할 수 있습니다.

  • 중복 확인: df.duplicated().sum()
  • 중복 제거: df.drop_duplicates()
  • 특정 열 기준 중복 제거: df.drop_duplicates(subset=['열1', '열2'])
📝 전처리 FAQ

Q: 엑셀 파일이 너무 커서 메모리가 부족하다면?
A: chunksize 매개변수를 사용해 파일을 나눠서 처리하세요. 예: pd.read_excel('큰파일.xlsx', chunksize=1000)

Q: 열 이름이 한글인데 오류가 발생해요.
A: 인코딩 문제일 수 있습니다. encoding='utf-8'을 지정하거나, 열 이름을 영문으로 바꿔보세요.

Q: 데이터 타입 변환은 어떻게 하나요?
A: df['열이름'] = df['열이름'].astype('int64')와 같이 astype() 메서드를 사용하세요.

4. 데이터 분석 및 통계 기능

데이터를 읽고 정제했다면 이제 진짜 분석을 시작할 차례입니다. Pandas는 엑셀의 피벗 테이블, 필터, 함수 등의 기능을 훨씬 강력하게 제공합니다.

기본 통계 함수

Pandas는 데이터 요약을 위한 다양한 통계 함수를 제공합니다.

# 기본 통계량
df.describe()  # 수치형 열의 평균, 표준편차, 최소값, 최대값 등

# 특정 열의 평균
avg_value = df['매출액'].mean()

# 특정 열의 합계
total_sales = df['매출액'].sum()

# 특정 열의 최대/최소값
max_sales = df['매출액'].max()
min_sales = df['매출액'].min()

# 상관관계 계산
correlation = df[['매출액', '비용', '이익']].corr()

데이터 그룹화 (엑셀의 피벗 테이블)

groupby()는 Pandas의 가장 강력한 기능 중 하나로, 엑셀의 피벗 테이블과 유사하지만 더 유연하고 강력합니다.

# 부서별 급여 평균 구하기
df.groupby('부서')['급여'].mean()

# 부서별, 직급별 직원 수와 평균 급여 구하기
dept_stats = df.groupby(['부서', '직급']).agg({
    '직원ID': 'count',  # 직원 수 카운트
    '급여': ['mean', 'min', 'max']  # 급여 통계
})

# 연도별, 월별 매출 합계
sales_by_month = df.groupby([df['날짜'].dt.year, df['날짜'].dt.month])['매출액'].sum()

# 결과를 보기 좋게 정렬
sales_by_month = sales_by_month.sort_index()

피벗 테이블 만들기

groupby 말고도 직접 pivot_table() 함수를 사용하면 엑셀의 피벗 테이블과 매우 유사한 결과를 얻을 수 있습니다.

# 기본 피벗 테이블
pivot_data = df.pivot_table(
    values='매출액',          # 계산할 값
    index='지역',            # 행 인덱스
    columns='제품범주',       # 열 인덱스
    aggfunc='sum'           # 집계 함수
)

# 여러 값과 여러 집계 함수 사용
pivot_data = df.pivot_table(
    values=['매출액', '수량'],  # 여러 값 집계
    index=['지역', '매장'],     # 다중 인덱스
    columns='월',             # 열 인덱스
    aggfunc={
        '매출액': 'sum',      # 매출액은 합계
        '수량': ['sum', 'mean']  # 수량은 합계와 평균
    },
    fill_value=0,           # 결측값은 0으로
    margins=True            # 총계 표시
)

5. Pandas로 데이터 시각화하기

데이터를 분석했다면 이제 시각화할 차례입니다. Pandas는 Matplotlib를 기반으로 간단한 시각화 기능을 내장하고 있어 엑셀 차트처럼 데이터를 쉽게 그래프로 표현할 수 있습니다.

Pandas의 내장 plot() 메서드를 사용하면 별도의 시각화 라이브러리 없이도 기본적인 그래프를 그릴 수 있습니다. 물론 더 복잡한 시각화는 Matplotlib, Seaborn, Plotly 같은 전문 라이브러리를 사용하는 것이 좋습니다.

그래프 유형 Pandas 코드 용도
선 그래프 df.plot(kind='line') 시계열 데이터, 추세 분석
막대 그래프 df.plot(kind='bar') 범주별 비교
히스토그램 df['열이름'].plot(kind='hist') 데이터 분포 확인
산점도 df.plot(kind='scatter', x='열1', y='열2') 변수 간 관계 분석
파이 차트 df.plot(kind='pie', y='열이름') 비율 시각화
박스 플롯 df.plot(kind='box') 데이터 분포와 이상치 확인
# 월별 매출 추이 선 그래프
monthly_sales = df.groupby(df['날짜'].dt.strftime('%Y-%m'))['매출액'].sum()
monthly_sales.plot(kind='line', figsize=(10, 6), title='월별 매출 추이')
plt.xlabel('년월')
plt.ylabel('매출액')
plt.xticks(rotation=45)
plt.tight_layout()
plt.savefig('monthly_sales.png')  # 그래프 저장
plt.show()

# 지역별 매출 막대 그래프
region_sales = df.groupby('지역')['매출액'].sum().sort_values(ascending=False)
region_sales.plot(kind='bar', figsize=(10, 6), title='지역별 매출')
plt.xlabel('지역')
plt.ylabel('매출액')
plt.tight_layout()
plt.show()

# 매출액 분포 히스토그램
df['매출액'].plot(kind='hist', bins=20, figsize=(10, 6), title='매출액 분포')
plt.xlabel('매출액')
plt.ylabel('빈도')
plt.show()

6. 분석 결과 엑셀 파일로 내보내기

데이터 분석이 완료되면 결과를 다시 엑셀 파일로 내보내야 할 때가 많습니다. 특히 동료나 상사가 파이썬을 사용하지 않는 경우에는 더욱 그렇죠. Pandas는 다양한 형식으로 데이터를 내보내는 기능을 제공합니다.

기본 엑셀 파일 저장

to_excel() 메서드를 사용하면 데이터프레임을 엑셀 파일로 저장할 수 있습니다.

# 기본 저장
df.to_excel('결과.xlsx', index=False)

# 특정 시트에 저장
with pd.ExcelWriter('결과.xlsx') as writer:
    df.to_excel(writer, sheet_name='데이터', index=False)
    
# 여러 데이터프레임을 각각 다른 시트에 저장
with pd.ExcelWriter('종합결과.xlsx') as writer:
    df_raw.to_excel(writer, sheet_name='원본데이터', index=False)
    pivot_data.to_excel(writer, sheet_name='피벗테이블')
    monthly_sales.to_excel(writer, sheet_name='월별매출')

스타일 적용하여 저장하기

XlsxWriter 엔진을 사용하면 셀 서식, 조건부 서식, 차트 등을 포함한 고급 엑셀 기능을 사용할 수 있습니다.

  • 셀 서식 지정 (색상, 글꼴, 테두리 등)
  • 조건부 서식 적용 (특정 조건에 따라 셀 색상 변경)
  • 데이터 유효성 검사 설정
  • 차트 삽입
  • 셀 병합, 고정 창 설정 등
📝 자동화 팁

Q: 매일 업데이트되는 엑셀 파일을 자동으로 처리하려면 어떻게 해야 하나요?
A: Python의 스케줄러 라이브러리(schedule, APScheduler 등)나 운영체제의 작업 스케줄러(Windows의 Task Scheduler, Linux의 cron)를 사용해 정기적으로 스크립트를 실행할 수 있습니다.

Q: 여러 엑셀 파일을 한번에 처리하는 방법이 있나요?
A: glob 모듈을 사용해 폴더 내 모든 엑셀 파일을 가져와 처리할 수 있습니다.
import glob
excel_files = glob.glob('data/*.xlsx')
for file in excel_files:
df = pd.read_excel(file)
# 처리 로직...


Q: 다른 사람들도 내 파이썬 스크립트를 쓸 수 있게 하려면?
A: Jupyter Notebook이나 Google Colab으로 공유하거나, PyInstaller로 실행 파일을 만들어 배포할 수 있습니다.

📝 엑셀에서는 어려운 고급 분석 기법

Q: 엑셀로는 할 수 없지만 Pandas로는 쉽게 할 수 있는 분석이 있나요?
A: 시계열 분석, 대용량 데이터(100만 행 이상) 처리, 텍스트 데이터 처리, 머신러닝 모델 적용 등은 엑셀보다 Pandas가 훨씬 강력합니다.

Q: 여러 엑셀 파일을 서로 연결하거나 조인하는 방법은?
A: Pandas의 merge(), concat() 함수를 사용하면 SQL처럼 데이터를 쉽게 조인하고 연결할 수 있습니다.

Q: 데이터 분석 결과를 웹에서 공유하는 좋은 방법이 있을까요?
A: Pandas 데이터프레임을 HTML로 변환해 웹에 표시하거나, Plotly, Dash 같은 라이브러리를 사용해 인터랙티브 대시보드를 만들 수 있습니다.

실제 업무에 바로 적용 가능한 코드 예제

아래는 실제 업무에서 자주 필요한 작업들을 자동화하는 완전한 코드 예제입니다. 판매 데이터를 읽어서 분석하고, 리포트를 자동으로 생성하는 스크립트입니다.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime
import os

def sales_analysis(input_file, output_folder):
    """
    판매 데이터 분석 및 자동 리포트 생성 함수
    
    Parameters:
    input_file (str): 입력 엑셀 파일 경로
    output_folder (str): 결과 저장 폴더 경로
    """
    # 출력 폴더가 없으면 생성
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)
    
    # 현재 날짜를 파일명에 사용
    today = datetime.now().strftime('%Y%m%d')
    
    # 1. 데이터 읽기
    print(f"1. '{input_file}' 파일 읽는 중...")
    df = pd.read_excel(input_file)
    
    # 2. 데이터 정제
    print("2. 데이터 정제 중...")
    
    # 결측값 확인
    missing_values = df.isnull().sum()
    print(f"   결측값 개수:\n{missing_values}")
    
    # 날짜 열이 있으면 datetime 형식으로 변환
    if '주문일자' in df.columns:
        df['주문일자'] = pd.to_datetime(df['주문일자'])
        df['년월'] = df['주문일자'].dt.strftime('%Y-%m')
        df['요일'] = df['주문일자'].dt.day_name()  # 요일 추출
    
    # 수치형 열에서 결측값을 0으로 채우기
    numeric_cols = df.select_dtypes(include=['number']).columns
    df[numeric_cols] = df[numeric_cols].fillna(0)
    
    # 문자열 열에서 결측값을 '미분류'로 채우기
    string_cols = df.select_dtypes(include=['object']).columns
    df[string_cols] = df[string_cols].fillna('미분류')
    
    # 중복 행 제거
    duplicates = df.duplicated().sum()
    if duplicates > 0:
        print(f"   중복된 행 {duplicates}개 발견, 제거 중...")
        df = df.drop_duplicates()
    
    # 3. 기본 통계 분석
    print("3. 기본 통계 분석 중...")
    
    # 기본 통계량 계산
    if '매출액' in df.columns:
        total_sales = df['매출액'].sum()
        avg_sales = df['매출액'].mean()
        max_sales = df['매출액'].max()
        print(f"   총 매출: {total_sales:,.0f}원")
        print(f"   평균 매출: {avg_sales:,.0f}원")
        print(f"   최대 매출: {max_sales:,.0f}원")
    
    # 4. 데이터 그룹화 및 피벗 테이블 생성
    print("4. 데이터 그룹화 및 피벗 테이블 생성 중...")
    
    # 카테고리별 매출 집계
    category_sales = None
    if '제품카테고리' in df.columns and '매출액' in df.columns:
        category_sales = df.groupby('제품카테고리')['매출액'].agg(['sum', 'mean', 'count'])
        category_sales.columns = ['총매출액', '평균매출액', '판매건수']
        category_sales = category_sales.sort_values('총매출액', ascending=False)
        print("   카테고리별 매출 집계 완료")
    
    # 월별 매출 추이
    monthly_sales = None
    if '년월' in df.columns and '매출액' in df.columns:
        monthly_sales = df.groupby('년월')['매출액'].sum().sort_index()
        print("   월별 매출 추이 분석 완료")
    
    # 요일별 매출 패턴
    day_sales = None
    if '요일' in df.columns and '매출액' in df.columns:
        # 요일 순서 정의
        day_order = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
        day_sales = df.groupby('요일')['매출액'].sum()
        day_sales = day_sales.reindex(day_order)
        print("   요일별 매출 패턴 분석 완료")
    
    # 지역별 매출 분석
    region_sales = None
    if '지역' in df.columns and '매출액' in df.columns:
        region_sales = df.groupby('지역')['매출액'].sum().sort_values(ascending=False)
        print("   지역별 매출 분석 완료")
    
    # 고객 구매 패턴 분석
    customer_analysis = None
    if '고객ID' in df.columns and '매출액' in df.columns:
        customer_analysis = df.groupby('고객ID').agg({
            '주문ID': 'count',  # 주문 횟수
            '매출액': ['sum', 'mean']  # 총 구매액, 평균 구매액
        })
        customer_analysis.columns = ['주문횟수', '총구매액', '평균구매액']
        customer_analysis = customer_analysis.sort_values('총구매액', ascending=False)
        print("   고객 구매 패턴 분석 완료")
    
    # 5. 시각화
    print("5. 데이터 시각화 중...")
    
    plt.figure(figsize=(15, 10))
    
    # 월별 매출 추이 그래프
    if monthly_sales is not None:
        plt.subplot(2, 2, 1)
        monthly_sales.plot(kind='line', marker='o')
        plt.title('월별 매출 추이')
        plt.xlabel('년월')
        plt.ylabel('매출액')
        plt.xticks(rotation=45)
        plt.grid(True, linestyle='--', alpha=0.7)
    
    # 카테고리별 매출 파이 차트
    if category_sales is not None:
        plt.subplot(2, 2, 2)
        top5_categories = category_sales.head(5)
        plt.pie(top5_categories['총매출액'], labels=top5_categories.index, autopct='%1.1f%%', startangle=90)
        plt.axis('equal')
        plt.title('상위 5개 카테고리 매출 비중')
    
    # 요일별 매출 막대 그래프
    if day_sales is not None:
        plt.subplot(2, 2, 3)
        day_sales.plot(kind='bar', color='skyblue')
        plt.title('요일별 매출')
        plt.xlabel('요일')
        plt.ylabel('매출액')
        plt.grid(True, linestyle='--', alpha=0.7, axis='y')
    
    # 지역별 매출 막대 그래프
    if region_sales is not None:
        plt.subplot(2, 2, 4)
        top10_regions = region_sales.head(10)
        top10_regions.plot(kind='barh', color='lightgreen')
        plt.title('상위 10개 지역 매출')
        plt.xlabel('매출액')
        plt.ylabel('지역')
        plt.grid(True, linestyle='--', alpha=0.7, axis='x')
    
    plt.tight_layout()
    plt.savefig(f"{output_folder}/sales_analysis_{today}.png", dpi=300)
    print(f"   차트 이미지 저장 완료: 'sales_analysis_{today}.png'")
    
    # 6. 분석 결과를 엑셀 파일로 저장
    print("6. 결과 저장 중...")
    
    with pd.ExcelWriter(f"{output_folder}/sales_report_{today}.xlsx", engine='xlsxwriter') as writer:
        # 원본 데이터 저장
        df.to_excel(writer, sheet_name='원본데이터', index=False)
        
        # 카테고리별 매출 저장
        if category_sales is not None:
            category_sales.to_excel(writer, sheet_name='카테고리별매출')
        
        # 월별 매출 저장
        if monthly_sales is not None:
            monthly_sales.to_excel(writer, sheet_name='월별매출')
        
        # 요일별 매출 저장
        if day_sales is not None:
            day_sales.to_excel(writer, sheet_name='요일별매출')
        
        # 지역별 매출 저장
        if region_sales is not None:
            region_sales.to_excel(writer, sheet_name='지역별매출')
        
        # 고객 분석 결과 저장
        if customer_analysis is not None:
            customer_analysis.to_excel(writer, sheet_name='고객분석')
        
        # 엑셀 통합 문서 서식 지정
        workbook = writer.book
        
        # 헤더 형식 정의
        header_format = workbook.add_format({
            'bold': True,
            'text_wrap': True,
            'valign': 'top',
            'bg_color': '#D3D3D3',
            'border': 1
        })
        
        # 숫자 형식 정의
        number_format = workbook.add_format({'num_format': '#,##0'})
        
        # 각 시트에 형식 적용
        for sheet_name in writer.sheets:
            worksheet = writer.sheets[sheet_name]
            
            # 첫 번째 행에 헤더 형식 적용
            for col_num, value in enumerate(df.columns.values):
                worksheet.write(0, col_num, value, header_format)
            
            # 열 너비 자동 조정
            worksheet.autofit()
            
            # 숫자 열에 천 단위 구분 기호 적용
            if sheet_name == '원본데이터':
                for i, col in enumerate(df.columns):
                    if col in numeric_cols:
                        worksheet.set_column(i, i, None, number_format)
    
    print(f"   결과 파일 저장 완료: 'sales_report_{today}.xlsx'")
    print("\n분석 완료!")
    return df

# 스크립트 실행 예시
if __name__ == "__main__":
    # 여기에 실제 파일 경로 입력
    input_file = "판매데이터.xlsx"
    output_folder = "분석결과"
    
    # 분석 함수 실행
    df = sales_analysis(input_file, output_folder)

실무에서 자주 쓰이는 추가 코드 스니펫

다음은 실무에서 자주 필요한 작업들을 쉽게 처리할 수 있는 코드 스니펫입니다. 복사해서 바로 사용해보세요.

# 1. 여러 시트 한 번에 읽기
def read_all_sheets(file_path):
    """모든 시트를 하나의 데이터프레임으로 통합"""
    # 엑셀 파일의 모든 시트를 딕셔너리로 읽기
    all_sheets = pd.read_excel(file_path, sheet_name=None)
    
    # 시트 이름을 새로운 열로 추가하여 모든 데이터프레임 통합
    dfs = []
    for sheet_name, df in all_sheets.items():
        df['시트명'] = sheet_name
        dfs.append(df)
    
    # 모든 시트 데이터 병합
    combined_df = pd.concat(dfs, ignore_index=True)
    return combined_df

# 2. 폴더 내 모든 엑셀 파일 처리
def process_all_excel_files(folder_path):
    """지정된 폴더 내 모든 엑셀 파일 처리"""
    import glob
    
    # 폴더 내 모든 엑셀 파일 경로 가져오기
    excel_files = glob.glob(f"{folder_path}/*.xlsx") + glob.glob(f"{folder_path}/*.xls")
    
    # 각 파일 처리 결과 저장할 리스트
    all_dfs = []
    
    for file in excel_files:
        print(f"처리 중: {file}")
        df = pd.read_excel(file)
        df['파일명'] = os.path.basename(file)
        all_dfs.append(df)
    
    # 모든 파일 데이터 통합
    if all_dfs:
        combined_df = pd.concat(all_dfs, ignore_index=True)
        return combined_df
    return None

# 3. 피벗 테이블과 차트 자동 생성
def create_pivot_with_chart(df, index_cols, value_col, chart_type='bar', figsize=(10, 6)):
    """
    데이터프레임에서 피벗 테이블을 생성하고 차트로 시각화
    
    Parameters:
    df (DataFrame): 분석할 데이터프레임
    index_cols (list): 피벗 테이블의 인덱스 열
    value_col (str): 집계할 값이 있는 열
    chart_type (str): 차트 유형 ('bar', 'line', 'pie')
    figsize (tuple): 그림 크기
    """
    # 피벗 테이블 생성
    pivot = df.pivot_table(
        values=value_col,
        index=index_cols,
        aggfunc='sum'
    ).sort_values(value_col, ascending=False)
    
    # 차트 생성
    plt.figure(figsize=figsize)
    
    if chart_type == 'bar':
        pivot.plot(kind='bar')
        plt.xticks(rotation=45)
    elif chart_type == 'line':
        pivot.plot(kind='line', marker='o')
        plt.xticks(rotation=45)
    elif chart_type == 'pie':
        # 파이 차트는 너무 많은 항목이 있으면 보기 어려움, 상위 항목만 선택
        pivot.head(10).plot(kind='pie', y=value_col)
        plt.axis('equal')
    
    plt.title(f"{', '.join(index_cols)}별 {value_col} 분석")
    plt.grid(True, linestyle='--', alpha=0.7)
    plt.tight_layout()
    
    return pivot

# 4. 날짜/시간 데이터 분석 헬퍼 함수
def analyze_datetime(df, date_col):
    """
    날짜/시간 열을 분석하여 유용한 파생 변수 생성
    
    Parameters:
    df (DataFrame): 분석할 데이터프레임
    date_col (str): 날짜/시간 열 이름
    
    Returns:
    DataFrame: 파생 변수가 추가된 데이터프레임 사본
    """
    # 원본 데이터프레임 복사
    result_df = df.copy()
    
    # 날짜/시간 열이 datetime 형식인지 확인하고 변환
    if result_df[date_col].dtype != 'datetime64[ns]':
        result_df[date_col] = pd.to_datetime(result_df[date_col], errors='coerce')
    
    # 다양한 시간 관련 파생 변수 생성
    result_df['년'] = result_df[date_col].dt.year
    result_df['월'] = result_df[date_col].dt.month
    result_df['일'] = result_df[date_col].dt.day
    result_df['요일'] = result_df[date_col].dt.day_name()  # 요일명
    result_df['요일번호'] = result_df[date_col].dt.dayofweek  # 0=월요일, 6=일요일
    result_df['주차'] = result_df[date_col].dt.isocalendar().week
    result_df['분기'] = result_df[date_col].dt.quarter
    result_df['월말'] = result_df[date_col].dt.is_month_end  # 월말 여부
    result_df['주말'] = result_df['요일번호'].isin([5, 6])  # 주말 여부
    
    # 시간이 포함된 경우
    if not (result_df[date_col].dt.hour == 0).all():
        result_df['시간'] = result_df[date_col].dt.hour
        result_df['오전오후'] = result_df[date_col].dt.strftime('%p')  # AM/PM
        
        # 시간대 구분 (아침, 오전, 오후, 저녁, 심야)
        conditions = [
            (result_df['시간'] >= 5) & (result_df['시간'] < 9),
            (result_df['시간'] >= 9) & (result_df['시간'] < 12),
            (result_df['시간'] >= 12) & (result_df['시간'] < 18),
            (result_df['시간'] >= 18) & (result_df['시간'] < 22),
            (result_df['시간'] >= 22) | (result_df['시간'] < 5)
        ]
        labels = ['아침', '오전', '오후', '저녁', '심야']
        result_df['시간대'] = np.select(conditions, labels, default='기타')
    
    return result_df

마무리: Pandas로 데이터 분석 업무 자동화하기

이제 Pandas를 사용하여 엑셀 데이터를 효과적으로 분석하는 방법에 대해 알아보았습니다. 지루하고 반복적인 엑셀 작업을 파이썬 스크립트로 자동화하면 시간을 크게 절약하고 오류를 줄일 수 있습니다. 특히 대용량 데이터를 처리하거나 복잡한 분석을 수행할 때 Pandas의 강력함이 빛을 발합니다.

처음에는 익숙한 엑셀을 두고 파이썬으로 전환하는 것이 부담스러울 수 있습니다. 하지만 기본적인 Pandas 기능만 익혀도 업무 효율성이 크게 향상됩니다. 반복적인 보고서 생성, 여러 파일 통합, 복잡한 계산 등을 단 몇 줄의 코드로 처리할 수 있게 됩니다.

⚠️ 주의

처음부터 너무 복잡한 자동화를 시도하지 마세요. 작은 부분부터 시작하여 점진적으로 확장하는 것이 좋습니다. 완벽한 시스템을 구축하려다 포기하는 경우가 많습니다. 가장 자주 반복하는 작업 하나를 자동화하는 것부터 시작하세요.

앞으로도 엑셀만 알고 계신 분들에게 파이썬과 Pandas의 세계를 알려드리고 싶습니다. 데이터 분석은 결국 비즈니스 의사결정을 돕는 도구입니다. 더 많은 시간을 코딩보다는 인사이트를 찾는 데 할애하실 수 있도록, 파이썬으로 루틴한 작업을 자동화하고 더 가치 있는 분석에 집중하시길 바랍니다.

마지막으로, 파이썬과 Pandas는 데이터 분석의 시작일 뿐입니다. 익숙해지면 머신러닝, 자연어 처리, 웹 스크래핑 등 더 다양한 가능성이 열립니다. 하지만 지금은 이 글에서 배운 기본기를 잘 다지는 것이 중요합니다. 행운을 빕니다!

Designed by JB FACTORY