판다스 계층적 데이터 요약 기법

지역 및 도시별 판매 데이터를 계층적으로 요약하는 방법을 소개합니다. 여러 단계의 중첩된 그룹화와 통계 계산을 통해 종합적인 보고서를 생성할 수 있습니다.

데이터 생성

import pandas as pd
import numpy as np

regions = ['North', 'East', 'South', 'Central']
products = ['TV', 'Refrigerator', 'Washer', 'AC']

city_mapping = {
    'North': ['Seoul', 'Incheon', 'Busan'],
    'East': ['Daegu', 'Ulsan', 'Gwangju'],
    'South': ['Suwon', 'Changwon', 'Cheonan'],
    'Central': ['Daejeon', 'Jeonju', 'Cheongju']
}

def create_dataset(entries):
    records = []
    for _ in range(entries):
        area = np.random.choice(regions)
        location = np.random.choice(city_mapping[area])
        item = np.random.choice(products)
        revenue = round(np.random.uniform(1000, 5000), 2)
        units = np.random.randint(1, 100)
        records.append([area, location, item, revenue, units])
    return records

sales_df = pd.DataFrame(
    create_dataset(1000),
    columns=['Area', 'City', 'Product', 'Revenue', 'Units']
)

단일 계층 요약

지역별 총계 계산:

area_summary = sales_df.groupby('Area').sum(numeric_only=True)
total_row = pd.DataFrame(area_summary.sum()).T
total_row.index = ['Total']
area_summary = pd.concat([area_summary, total_row])

제품별 요약:

product_table = pd.pivot_table(
    sales_df,
    index='Product',
    values=['Revenue', 'Units'],
    aggfunc='sum',
    margins=True,
    margins_name='Grand Total'
)

이중 계층 요약

def regional_summary(group):
    return pd.pivot_table(
        group,
        index='City',
        values=['Revenue', 'Units'],
        aggfunc=np.sum,
        margins=True,
        margins_name=f"{group['Area'].iloc[0]} Total"
    )

result = sales_df.groupby('Area').apply(regional_summary)

삼중 계층 요약

def multi_level_summary(data, metrics, hierarchy):
    base_table = pd.pivot_table(
        data,
        values=metrics,
        index=hierarchy,
        aggfunc='sum',
        margins=True,
        margins_name='Overall'
    ).reset_index()
    
    grouped = base_table.groupby(hierarchy[0])
    processed = grouped.apply(
        lambda subset: pd.pivot_table(
            subset,
            index=hierarchy[1:],
            values=metrics,
            aggfunc='sum',
            margins=True,
            margins_name=f"{subset[hierarchy[0]].iloc[0]} Subtotal"
        )
    )
    
    return processed[~processed.index.get_level_values(-1).str.contains('Subtotal')]

multi_level_summary(
    sales_df,
    ['Revenue', 'Units'],
    ['Area', 'City', 'Product']
).sample(10)

이 기법은 pivot_table과 groupby를 조합하여 복잡한 계층 구조의 데이터 요약을 자동화합니다. 지역-도시-상품의 삼중 구조뿐 아니라 더 많은 계층으로 확장 적용 가능합니다.

태그: pandas 데이터집계 계층적그룹화 pivot_table groupby

5월 26일 20:29에 게시됨