Akashic Records

데이터 그룹 연산(groupby) 본문

Python for Beginners

데이터 그룹 연산(groupby)

Andrew's Akashic Records 2024. 8. 2. 11:03
728x90

 

파이썬에서 데이터 분석을 할 때, 데이터 그룹 연산은 매우 중요한 부분입니다. 특히 pandas 라이브러리는 이러한 연산을 쉽게 처리할 수 있도록 다양한 기능을 제공합니다. 여기서는 주로 groupby 메소드를 사용하는 방법에 대해 설명하겠습니다.

1. groupby 기본

데이터를 특정 기준에 따라 그룹화하고 각 그룹별로 다양한 집계 연산을 수행합니다.

import pandas as pd

# 예제 데이터 생성
data = {'Name': ['John', 'Anna', 'John', 'Mike', 'Anna'],
        'Score': [88, 92, 85, 91, 95],
        'Subject': ['Math', 'Math', 'History', 'Science', 'Science']}
df = pd.DataFrame(data)

# 'Name'을 기준으로 그룹화하고 각 그룹의 평균 점수 계산
grouped = df.groupby('Name')
print(grouped['Score'].mean())

2. 여러 열을 그룹화 기준으로 사용

여러 열을 그룹화 기준으로 설정하여 더 세부적인 분석을 할 수 있습니다.

# 'Name'과 'Subject'를 기준으로 그룹화
multi_grouped = df.groupby(['Name', 'Subject'])
print(multi_grouped['Score'].sum())

3. agg()

하나 이상의 집계 함수를 그룹에 적용합니다. 여러 개의 함수를 동시에 적용할 수 있으며, 사용자 정의 함수도 적용 가능합니다.

# 여러 집계 함수를 동시에 적용
results = grouped['Score'].agg(['mean', 'sum', 'max'])
print(results)

# 사용자 정의 함수 사용
def range_func(x):
    return x.max() - x.min()

custom_agg = grouped['Score'].agg(range_func)
print(custom_agg)

4. transform()

transform 메소드는 그룹별로 데이터를 변환할 때 사용합니다. 이는 원본 데이터프레임의 구조를 유지하면서, 각 그룹의 계산 결과를 원래 데이터에 맞게 조정할 수 있습니다.

# 점수를 각 그룹별 평균 점수로 나누어 정규화
normalized_scores = grouped['Score'].transform(lambda x: x / x.mean())
df['Normalized Score'] = normalized_scores
print(df)

5. filter()

filter 메소드는 특정 조건을 만족하는 그룹만을 필터링 할 때 사용합니다.

# 평균 점수가 90점 이상인 그룹만 필터링
high_score_groups = grouped.filter(lambda x: x['Score'].mean() > 90)
print(high_score_groups)

6. apply()

apply 메소드는 그룹별로 복잡한 로직이나 여러 연산을 수행할 수 있게 해줍니다. agg와 비슷하지만 더 자유도가 높습니다.

# 각 그룹별로 최고 점수와 최저 점수의 차이 계산
score_range = grouped.apply(lambda x: x['Score'].max() - x['Score'].min())
print(score_range)

위의 예제들을 통해 pandas에서 제공하는 다양한 groupby 관련 메소드들의 사용 방법과 실제 데이터에 적용하는 방법을 알 수 있습니다. 이러한 기능들을 활용하여 데이터를 다양한 각도에서 분석하고 인사이트를 도출할 수 있습니다.

집계 함수

pandas에서 groupby와 함께 사용할 수 있는 집계 함수들은 데이터를 요약하고 분석하는 데 매우 유용합니다. 이러한 함수들은 각 그룹에 대한 통계를 계산하여 그 결과를 반환합니다. 여기서는 가장 흔히 사용되는 집계 함수들을 자세히 설명하겠습니다.

집계 함수의 종류

  1. sum() - 그룹 내 모든 값의 합을 계산합니다.
  2. mean() - 그룹 내 값의 평균을 계산합니다.
  3. median() - 그룹 내 값의 중앙값을 계산합니다.
  4. min() - 그룹 내 최소값을 찾습니다.
  5. max() - 그룹 내 최대값을 찾습니다.
  6. std() - 그룹 내 표준편차를 계산합니다.
  7. var() - 그룹 내 분산을 계산합니다.
  8. count() - 그룹 내 요소의 개수를 계산합니다.
  9. nunique() - 그룹 내 유니크한 값의 개수를 계산합니다.
  10. first() - 그룹 내 첫 번째 값을 반환합니다.
  11. last() - 그룹 내 마지막 값을 반환합니다.

집계 함수 사용 예제

import pandas as pd

# 예제 데이터 생성
data = {'Category': ['A', 'B', 'A', 'A', 'B', 'C', 'C', 'C'],
        'Values': [10, 20, 30, 40, 50, 60, 70, 80]}
df = pd.DataFrame(data)

# Category별로 그룹화
grouped = df.groupby('Category')

# 각 그룹별로 집계 함수 적용
sum_values = grouped['Values'].sum()
mean_values = grouped['Values'].mean()
min_values = grouped['Values'].min()
max_values = grouped['Values'].max()
std_values = grouped['Values'].std()
var_values = grouped['Values'].var()
count_values = grouped['Values'].count()
unique_values = grouped['Values'].nunique()
first_values = grouped['Values'].first()
last_values = grouped['Values'].last()

# 결과 출력
print("Sum:", sum_values)
print("Mean:", mean_values)
print("Min:", min_values)
print("Max:", max_values)
print("STD:", std_values)
print("VAR:", var_values)
print("Count:", count_values)
print("Nunique:", unique_values)
print("First:", first_values)
print("Last:", last_values)

 

agg() 함수를 사용하면 여러 집계 함수를 한 번에 적용할 수도 있습니다. 이는 코드를 간결하게 만들고, 여러 통계를 동시에 비교할 때 유용합니다. agg() 함수의 사용법을 잘 이해하고 활용한다면, pandas를 사용한 데이터 분석이 훨씬 효율적이고 강력해질 것입니다.

groupby 예제

pandas에서 groupby를 사용하는 예제를 작성해 보겠습니다. 이 예제에서는 다음과 같은 데이터 분석 작업을 수행합니다:

  1. 멀티 레벨 인덱스를 사용한 그룹화
  2. 다양한 집계 함수를 동시에 사용
  3. 조건에 따른 필터링과 사용자 정의 함수를 사용한 집계

데이터 생성 및 초기 설정

이 예제에서는 상점별, 월별 판매 데이터를 사용하여 다음을 수행합니다:

  • 각 상점에서 월별로 가장 많이 팔린 제품 카테고리를 찾습니다.
  • 월별 전체 판매량과 평균 판매량을 계산합니다.
  • 상점별 전체 판매량이 특정 임계값을 초과하는 경우만 필터링하여 분석합니다.
import pandas as pd
import numpy as np

# 예제 데이터 생성
data = {
    'Store': ['Store 1', 'Store 1', 'Store 2', 'Store 2', 'Store 1',
			'Store 3', 'Store 3', 'Store 2'],
    'Month': ['Jan', 'Feb', 'Jan', 'Feb', 'Jan', 'Feb', 'Jan', 'Feb'],
    'Category': ['Electronics', 'Clothing', 'Electronics', 'Clothing', 
    		'Groceries', 'Electronics', 'Groceries', 'Groceries'],
    'Sales': [200, 150, 300, 240, 450, 500, 400, 600]
}

df = pd.DataFrame(data)

# 멀티 레벨 그룹화: Store와 Month 별로
grouped = df.groupby(['Store', 'Month'])

# 판매량에 따라 가장 많이 팔린 제품 카테고리를 찾는 사용자 정의 함수
def top_category(group):
    return group.groupby('Category')['Sales'].sum().idxmax()

# 각 그룹에 대한 여러 집계: 최대 판매 제품 카테고리, 총 판매량, 평균 판매량
aggregated = grouped.apply(lambda x: pd.Series({
    'Top Category': top_category(x),
    'Total Sales': x.Sales.sum(),
    'Average Sales': x.Sales.mean()
}), include_groups=False)

# 필터링: 상점별로 전체 판매량이 700을 초과하는 경우만 선택
filtered = aggregated.groupby(level=0).filter(lambda x: x['Total Sales'].sum() > 700)

print(filtered)

결과

이 코드는 다음을 수행합니다:

  • 상점과 월별로 데이터를 그룹화합니다.
  • 각 그룹 내에서 top_category 사용자 정의 함수를 사용하여 가장 많이 팔린 카테고리를 찾습니다.
  • apply 메서드를 사용하여 각 그룹에 대해 최고 판매 제품 카테고리, 총 판매량, 평균 판매량을 계산합니다.
  • 마지막으로, filter를 사용하여 특정 조건을 만족하는 상점 그룹만을 선택합니다.

이 예제는 복잡한 groupby 연산을 수행하는 방법을 보여주며, 실제 비즈니스 데이터 분석에도 유용하게 활용될 수 있습니다.

apply()

pandas에서 apply() 메소드를 사용하는 고급 예제를 제시하겠습니다. 이 예제에서는 여러 복잡한 연산을 그룹화된 데이터에 적용하면서, 각 그룹의 데이터를 기반으로 다양한 계산을 수행하고 결과를 종합하는 방식을 보여줄 것입니다.

예제 시나리오

이 데이터셋은 여러 상점에서 여러 제품의 월별 판매 데이터를 포함하고 있습니다. 목표는 다음과 같습니다:

  • 각 상점에 대해, 각 월별로 판매된 제품의 가격 변동성을 계산합니다.
  • 월별 판매량과 판매 금액에 대한 비율을 계산하여 가장 효율적인 제품을 찾습니다.
  • 각 상점의 월별 최고 판매 제품과 해당 제품의 판매 비율을 확인합니다.

데이터 준비

import pandas as pd
import numpy as np

# 예제 데이터 생성
data = {
    'Store': ['Store 1', 'Store 1', 'Store 2', 'Store 2', 'Store 1', 
    		'Store 3', 'Store 3', 'Store 2'],
    'Month': ['Jan', 'Feb', 'Jan', 'Feb', 'Jan', 'Feb', 'Jan', 'Feb'],
    'Product': ['Product A', 'Product B', 'Product A', 'Product B',
    		'Product C', 'Product A', 'Product C', 'Product C'],
    'Sales': [100, 150, 200, 250, 300, 350, 400, 450],
    'Quantity': [10, 15, 20, 25, 30, 35, 40, 45]
}

df = pd.DataFrame(data)

# 가격 열 추가
df['Price'] = df['Sales'] / df['Quantity']

고급 apply() 사용

# 그룹화 정의: Store와 Month 별
grouped = df.groupby(['Store', 'Month'])

# 복잡한 로직을 적용하는 사용자 정의 함수
def complex_operations(group):
    # 가격 변동성 계산
    price_volatility = group['Price'].std() / group['Price'].mean()

    # 가장 효율적인 제품 계산
    efficiency = (group['Sales'] / group['Quantity']).idxmax()
    most_efficient_product = group.loc[efficiency, 'Product']

    # 최고 판매 제품 찾기
    top_selling_product = group.loc[group['Sales'].idxmax(), 'Product']
    top_sales_ratio = group['Sales'].max() / group['Sales'].sum()

    return pd.Series({
        'Price Volatility': price_volatility,
        'Most Efficient Product': most_efficient_product,
        'Top Selling Product': top_selling_product,
        'Top Sales Ratio': top_sales_ratio
    })

# apply 메소드를 이용한 복합 연산 적용
result = grouped.apply(complex_operations)

print(result)

결과

설명

  • 가격 변동성: 각 그룹(상점 및 월별)의 제품 가격 변동성을 계산합니다. 이는 가격의 표준편차를 평균으로 나눈 값으로, 가격의 안정성을 평가하는 데 사용됩니다.
  • 가장 효율적인 제품: 각 그룹별로 단위 제품당 판매 금액이 가장 높은 제품을 식별합니다. 이는 판매액 대비 수량의 비율이 가장 높은 제품을 찾는 것입니다.
  • 최고 판매 제품: 각 그룹에서 판매 금액이 가장 높은 제품을 찾고, 그 제품의 판매 금액이 전체 그룹 판매액 중 차지하는 비율을 계산합니다.

이 예제는 apply() 메소드의 유연성을 보여주며, 각 그룹에 대해 다양한 유형의 분석을 동시에 수행하는 방법을 설명합니다. 이러한 접근 방식은 데이터를 깊이 있게 분석하고, 중요한 비즈니스 인사이트를 도출하는 데 매우 유용합니다.

728x90
Comments