일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- GIT
- 리눅스
- 파이썬
- write by GPT-4
- chatGPT's answer
- 자바
- 자바네트워크
- android
- flet
- Java
- 뉴턴역학
- 자바암호
- 소프트웨어공학
- 시스템
- 고전역학
- 웹 크롤링
- JVM
- Database
- NIO
- python
- lombok
- oracle
- 유닉스
- 역학
- 코틀린
- Spring boot
- 인프라
- GPT-4's answer
- kotlin
- write by chatGPT
- Today
- Total
Akashic Records
데이터 그룹 연산(groupby) 본문
파이썬에서 데이터 분석을 할 때, 데이터 그룹 연산은 매우 중요한 부분입니다. 특히 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
와 함께 사용할 수 있는 집계 함수들은 데이터를 요약하고 분석하는 데 매우 유용합니다. 이러한 함수들은 각 그룹에 대한 통계를 계산하여 그 결과를 반환합니다. 여기서는 가장 흔히 사용되는 집계 함수들을 자세히 설명하겠습니다.
집계 함수의 종류
sum()
- 그룹 내 모든 값의 합을 계산합니다.mean()
- 그룹 내 값의 평균을 계산합니다.median()
- 그룹 내 값의 중앙값을 계산합니다.min()
- 그룹 내 최소값을 찾습니다.max()
- 그룹 내 최대값을 찾습니다.std()
- 그룹 내 표준편차를 계산합니다.var()
- 그룹 내 분산을 계산합니다.count()
- 그룹 내 요소의 개수를 계산합니다.nunique()
- 그룹 내 유니크한 값의 개수를 계산합니다.first()
- 그룹 내 첫 번째 값을 반환합니다.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
를 사용하는 예제를 작성해 보겠습니다. 이 예제에서는 다음과 같은 데이터 분석 작업을 수행합니다:
- 멀티 레벨 인덱스를 사용한 그룹화
- 다양한 집계 함수를 동시에 사용
- 조건에 따른 필터링과 사용자 정의 함수를 사용한 집계
데이터 생성 및 초기 설정
이 예제에서는 상점별, 월별 판매 데이터를 사용하여 다음을 수행합니다:
- 각 상점에서 월별로 가장 많이 팔린 제품 카테고리를 찾습니다.
- 월별 전체 판매량과 평균 판매량을 계산합니다.
- 상점별 전체 판매량이 특정 임계값을 초과하는 경우만 필터링하여 분석합니다.
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()
메소드의 유연성을 보여주며, 각 그룹에 대해 다양한 유형의 분석을 동시에 수행하는 방법을 설명합니다. 이러한 접근 방식은 데이터를 깊이 있게 분석하고, 중요한 비즈니스 인사이트를 도출하는 데 매우 유용합니다.
'Python for Beginners' 카테고리의 다른 글
시계열 데이터 다루기-색인을 가지는 시계열 데이터 (0) | 2024.08.20 |
---|---|
시계열 데이터 다루기-datetime (0) | 2024.08.19 |
데이터 분석 후 그래프와 시각화 (0) | 2024.07.30 |
Pandas의 DataFrame에서 Index 활용 및 데이터 관리 (0) | 2024.07.29 |
범주형 데이터 관리 Categorical (1) | 2024.07.23 |