데이터 흐름 읽기: 기술 통계 분석과 판다스 코드 구현 전략

데이터 전후방 정리 이후의 핵심 분석 과정

데이터 클리닝 및 전처리 작업이 완료되면, 실제 인사이트 도출을 위한 본격적인 탐색 단계로 진입하게 됩니다. 이 과정은 단순한 숫자의 나열을 넘어, 변수 간의 상관관계나 패턴을 발견하여 비즈니스 의사결정을 뒷받침하는 근거를 마련하는 것이 목적입니다. 기술 통계학적 접근법을 활용하면 방대한 행렬 형태의 데이터를 몇 가지 핵심 지표로 요약할 수 있으며, 이를 통해 그룹별 차이나 다차원적인 트렌드를 파악할 수 있습니다.

본 콘텐츠에서는 파이썬 라이브러리인 판다스 (pandas) 를 활용하여 효율적으로 통계 분석을 수행하는 방법을 다룹니다. 데이터의 기본 성향을 파악하는 기술통계부터 시작하여, 그룹별 집계, 빈도 분석 및 데이터베이스 구조를 기반으로 한 고급 분석 도구인 피벗 테이블 활용법까지 다루겠습니다. 각 사례마다 실제 비즈니스 맥락에 부합하는 실행 가능한 스크립트를 제공하여 이론과 실무 간의 괴리를 해소하는 데 중점을 둡니다.

기본적인 데이터 성향 파악: 기술 통계 개요

기술 통계 (Descriptive Statistics) 는 주어진 데이터셋의 전체적인 모습을 간략화하여 보여주는 첫 번째 분석 도구입니다. 평균, 중앙값, 최빈값 같은 집중 경향성 지표와 분산, 표준편차, 범위 같은 산포도 지표를 활용함으로써 데이터가 어떻게 분포되어 있는지 직관적으로 이해할 수 있습니다. 특히 데이터 분포의 왜도나 첨도와 같은 형태 특성을 살펴보면 이상치 유무나 편향된 데이터를 미리 감지할 수 있어 중요합니다.

1. 데이터의 중심 위치 산출 (집중 경향성)

데이터가 어디에 모여 있는지를 나타내는 대표적인 지표로는 산술평균, 중간값 (Median), 그리고 가장 자주 나타나는 값인 최빈값 (Mode) 이 있습니다. 평균은 극단적인 값을 포함하는 경우 왜곡되기 쉽지만, 중앙값은 그러한 영향력을 배제하고 대표값을 보여줍니다. 최빈값은 주로 범주형 데이터 분석 시 유용하게 쓰입니다.

실무 예시: 온라인 쇼핑몰에서 고객의 개별 결제 금액 분포를 분석한다고 가정해 봅시다. 소수의 VIP 고객이 높은 금액을 지출하면 평균은 과대평가될 수 있으므로, 중앙값과 분위수를 함께 검토하여 일반 고객층의 실제 구매력을 반영해야 합니다.

import pandas as pd
import numpy as np

class DataInsightEngine:
    """데이터 통계적 특성 분석을 위한 유틸리티 클래스"""
    
    def __init__(self, df):
        self.df = df

    def extract_central_values(self, target_column):
        """주요 중심값 지표 (평균, 중앙값, 최빈값) 추출"""
        avg_val = self.df[target_column].mean()
        mid_val = self.df[target_column].median()
        freq_val = self.df[target_column].mode()
        
        report = {
            "average": avg_val,
            "median": mid_val,
            "most_frequent": freq_val.tolist() if not freq_val.empty else ["None"]
        }
        
        print(f"[{target_column}] 분석 결과:")
        print(f"  산술평균: {report['average']:.2f}")
        print(f"  중앙값: {report['median']:.2f}")
        print(f"  최빈값: {report['most_frequent'][0]}")
        
        return report

    def calculate_quartile_ranges(self, target_column, percent_list=[25, 50, 75]):
        """지정된 퍼센타일 기반의 분위수 계산"""
        q_vals = self.df[target_column].quantile([p / 100 for p in percent_list])
        
        print(f"\n[{target_column}] 분위수 상세:")
        for pct, val in zip(percent_list, q_vals.values):
            print(f"  {pct}%: {val:.2f}")
        return q_vals

# 시뮬레이션: 실제 거래 금액 데이터 생성
if __name__ == "__main__":
    np.random.seed(123)
    # 대다수 유저 (150 원 기준) 와 소수 고액 유저 (800 원 기준) 혼합
    tx_amounts = np.concatenate([
        np.random.normal(150, 50, 950),
        np.random.normal(800, 200, 50)
    ])
    tx_amounts = np.clip(tx_amounts, 10, None) 
    df_sales = pd.DataFrame({'transaction_amt': tx_amounts})
    
    analyst = DataInsightEngine(df_sales)
    analyst.extract_central_values('transaction_amt')
    analyst.calculate_quartile_ranges('transaction_amt', [10, 25, 50, 75, 90])
    
    print(f"\n해석: 평균값은 고액 사용자가 포함된 반면, 중앙값은 일반적인 사용자를 더 잘 대변함.")

2. 데이터의 확산 정도 측정 (산포도)

데이터가 평균 주변에서 얼마나 넓게 퍼져있는지를 확인하기 위해 분산, 표준편차, 범위 (Range), 사분위범위 (IQR) 등을 사용합니다. 특히 표준편차가 크다는 것은 데이터의 불확실성이 높음을 의미하며, 변이계수 (CV) 를 사용하면 평균의 크기 차이 없이 상대적인 변동성을 비교할 수 있습니다.

실무 예시: 여러 지역의 점포가 있을 때, 각 매장의 매출 안정성을 평가하려면 단순 매출액뿐만 아니라 일일 매출의 표준편차를 확인해야 합니다. 이를 통해 어떤 매장이 예측 가능성이 높은지, 혹은 리스크가 큰지 식별할 수 있습니다.

import pandas as pd
import numpy as np

def analyze_dispersion_metrics(df_source, col_name):
    """특정 열의 산포도 관련 주요 지표 반환 함수"""
    vals = df_source[col_name]
    
    variance_val = vals.var()
    std_dev_val = vals.std()
    min_val = vals.min()
    max_val = vals.max()
    diff_range = max_val - min_val
    
    q1 = vals.quantile(0.25)
    q3 = vals.quantile(0.75)
    iqr_val = q3 - q1
    
    cv_val = std_dev_val / vals.mean()  # 변이계수
    
    return {
        "variance": variance_val,
        "std_dev": std_dev_val,
        "range": diff_range,
        "iqr": iqr_val,
        "coefficient_variation": cv_val
    }

# 시뮬레이션: 다양한 매장 성과 데이터 생성
if __name__ == "__main__":
    np.random.seed(123)
    branch_data = {
        'Branch_North': np.random.normal(50, 5, 30),
        'Branch_South': np.random.normal(52, 12, 30),
        'Branch_East': np.random.normal(48, 4, 30),
        'Branch_West': np.random.normal(55, 15, 30)
    }
    df_branches = pd.DataFrame(branch_data)
    
    for branch in df_branches.columns:
        print(f"--- {branch} 성과 분석 ---")
        stats = analyze_dispersion_metrics(df_branches, branch)
        print(f"표준편차: {stats['std_dev']:.2f}, 변이계수: {stats['coefficient_variation']:.3f}")
        print(f"데이터 변동폭 (IQR): {stats['iqr']:.2f}\n")

태그: python pandas descriptive-statistics data-analysis NumPy

7월 1일 21:05에 게시됨