1. 기본 통계량 계산
기본 통계량 계산은 데이터 분석의 기초 단계로, 데이터셋의 전반적인 특성을 파악하는 데 중요한 역할을 합니다. 이는 데이터의 중심 경향성, 퍼짐 정도, 분포의 형태 등을 요약하여 보여줍니다.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'국가': ['브라질', '미국', '이탈리아', '한국', '일본'],
'연간_소비량': [5.1, 4.2, 5.9, 2.8, 3.3],
'카페_수': [25000, 32000, 18000, 12000, 22000]
})
df
# describe() 메서드를 사용한 종합적인 통계량 계산
print("기본 통계량:")
print(df.describe())
# 개별 통계량 계산
print("개별 통계량:")
print("평균 연간 소비량:", df['연간_소비량'].mean())
print("연간 소비량 중앙값:", df['연간_소비량'].median())
print("연간 소비량 표준편차:", df['연간_소비량'].std())
print("카페 수 최대값:", df['카페_수'].max())
print("카페 수 최소값:", df['카페_수'].min())
# 특정 백분위수 계산
# 0.75는 75번째 백분위수 (제3사분위수)를 의미합니다.
print("75번째 백분위수:")
print(df.quantile(0.75))
# 상관관계 계산
# 이 메서드는 숫자형 열 간의 피어슨 상관계수를 계산합니다.
# 결과값은 -1에서 1 사이이며, 1에 가까울수록 강한 양의 상관관계를,
# -1에 가까울수록 강한 음의 상관관계를 나타냅니다.
print("상관관계:")
print(df.corr())
이러한 통계치는 시각화나 데이터 요약, 가설 검증 등 다양한 데이터 분석 작업에 활용됩니다. 특히, describe() 메서드를 사용하면 데이터프레임의 모든 숫자형 열에 대한 기본 통계량을 한 번에 계산할 수 있어 효율적입니다. 아래 이미지는 이러한 데이터 분석 기법을 활용한 시각화 예시입니다.
여기서 주의해야 할 점은 상관관계가 인과관계를 의미하지 않는다는 것입니다. 상관관계는 두 변수 간의 관련성을 나타내는 지표로, 두 변수 사이의 선형적인 관계를 측정합니다. 따라서 상관관계가 높다고 해서 반드시 인과관계가 있다는 것은 아닙니다. 이를 고려하여 데이터를 분석하고 해석하는 것이 중요합니다.
2. 그룹화 연산 (groupby)
groupby 메서드는 데이터를 그룹으로 분할한 후, 각 그룹에 대해 연산을 수행하는 강력한 도구입니다. 이를 통해 데이터를 그룹화하고, 그룹별로 통계량을 계산하거나 변환, 필터링, 적용 등 다양한 연산을 수행할 수 있습니다. groupby 메서드는 데이터프레임의 열을 기준으로 그룹을 형성합니다.
import pandas as pd
df = pd.DataFrame({
'대륙': ['아시아', '유럽', '아시아', '북미', '유럽', '아시아', '북미', '유럽'],
'국가': ['한국', '이탈리아', '일본', '미국', '프랑스', '중국', '캐나다', '독일'],
'연간_소비량': [2.8, 5.9, 3.3, 4.2, 5.4, 3.0, 4.5, 5.8],
'카페_수': [12000, 18000, 22000, 32000, 15000, 25000, 20000, 16000]
})
df
# 단일 열 기준 그룹화
print("대륙별 평균 연간 소비량:")
print(df.groupby('대륙')['연간_소비량'].mean())
# 다중 열 기준 그룹화
print("대륙별, 국가별 평균 연간 소비량:")
print(df.groupby(['대륙', '국가'])['연간_소비량'].mean())
# 여러 열에 대한 다양한 집계 함수 적용
print("대륙별 다양한 통계량:")
print(df.groupby('대륙').agg({
'연간_소비량': ['mean', 'max'],
'카페_수': ['sum', 'min']
}))
# 그룹 내 순위 계산
df['소비량_순위'] = df.groupby('대륙')['연간_소비량'].rank(ascending=False)
print("대륙 내 연간 소비량 순위:")
df
3. 데이터 집계 aggregate
aggregate 함수는 그룹화된 데이터에 대해 다양한 집계 연산을 효율적으로 수행하는 도구로, 여러 열에 대해 서로 다른 집계 함수를 동시에 적용할 수 있는 것이 특징입니다. 이 함수를 사용하려면 먼저 데이터를 groupby() 메서드로 그룹화한 후, aggregate()를 호출하여 원하는 집계 함수를 지정합니다. 예를 들어, df.groupby('category').aggregate({'sales': 'sum', 'price': 'mean'})와 같이 사용하여 카테고리별로 판매량의 합계와 가격의 평균을 한 번에 계산할 수 있습니다.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'대륙': ['아시아', '유럽', '아시아', '북미', '유럽', '아시아', '북미', '유럽'],
'국가': ['한국', '이탈리아', '일본', '미국', '프랑스', '중국', '캐나다', '독일'],
'연간_소비량': [2.8, 5.9, 3.3, 4.2, 5.4, 3.0, 4.5, 5.8],
'카페_수': [12000, 18000, 22000, 32000, 15000, 25000, 20000, 16000]
})
df
# 기본 aggregate 사용
print("대륙별 평균 연간 소비량:")
print(df.groupby('대륙')['연간_소비량'].agg('mean'))
print("대륙별 연간 소비량 통계:")
print(df.groupby('대륙')['연간_소비량'].agg(['mean', 'median', 'std']))
4 데이터변환 transform
transform 함수는 그룹 연산의 결과를 원본 데이터프레임의 형태와 크기로 변환하여 반환합니다. 이 함수는 각 그룹의 집계 결과를 해당 그룹의 모든 행에 적용할 때 유용하며, 원본 데이터와 동일한 인덱스를 유지하여 쉽게 결합하거나 비교할 수 있습니다. transform은 평균, 합계 등의 기본적인 집계 함수뿐만 아니라 사용자 정의 함수도 지원하며, 여러 열에 대해 서로 다른 변환을 동시에 적용할 수 있습니다. 이 함수는 각 행에 대해 해당 행이 속한 그룹의 통계값을 계산할 수 있어, 데이터 정규화, 표준화, 누적 통계 계산 등에 활용됩니다
import pandas as pd
import numpy as np
df = pd.DataFrame({
'대륙': ['아시아', '유럽', '아시아', '북미', '유럽', '아시아', '북미', '유럽'],
'국가': ['한국', '이탈리아', '일본', '미국', '프랑스', '중국', '캐나다', '독일'],
'연간_소비량': [2.8, 5.9, 3.3, 4.2, 5.4, 3.0, 4.5, 5.8],
'카페_수': [12000, 18000, 22000, 32000, 15000, 25000, 20000, 16000]
})
df
# transform 함수 사용
print("transform을 사용한 대륙별 평균 연간 소비량:")
df['평균_소비량'] = df.groupby('대륙')['연간_소비량'].transform('mean')
df
print("\ntransform을 사용한 대륙별 카페 수 합계:")
df['총_카페_수'] = df.groupby('대륙')['카페_수'].transform('sum')
df
5. 피벗 테이블 (pivot_table)
피벗 테이블은 복잡한 데이터를 보기 쉽게 정리해주는 도구입니다. 엑셀의 피벗 테이블과 유사한 이 기능은 데이터를 원하는 방식으로 재구성할 수 있게 해줍니다. 피벗 테이블의 주요 특징은 데이터를 행, 열, 값으로 재배열하여 새로운 관점에서 데이터를 분석할 수 있게 해준다는 점입니다. 이를 통해 대량의 데이터에서 중요한 패턴이나 트렌드를 쉽게 발견할 수 있습니다. 또한, 데이터 집계 기능을 제공하여 합계, 평균, 개수 등 다양한 통계를 자동으로 계산해줍니다.
import pandas as pd
import numpy as np
# 샘플 데이터 생성
df = pd.DataFrame({
'대륙': ['아시아', '유럽', '아시아', '북미', '유럽', '아시아', '북미', '유럽'] * 2,
'국가': ['한국', '이탈리아', '일본', '미국', '프랑스', '중국', '캐나다', '독일'] * 2,
'연도': [2022] * 8 + [2023] * 8,
'연간_소비량': [2.8, 5.9, 3.3, 4.2, 5.4, 3.0, 4.5, 5.8,
3.0, 6.1, 3.5, 4.4, 5.6, 3.2, 4.7, 6.0],
'카페_수': [12000, 18000, 22000, 32000, 15000, 25000, 20000, 16000,
13000, 19000, 23000, 33000, 16000, 27000, 21000, 17000]
})
df
# 피벗 테이블 생성
pivot = pd.pivot_table(df,
values=['연간_소비량', '카페_수'],
index=['대륙', '국가'],
columns='연도',
aggfunc={'연간_소비량': 'mean', '카페_수': 'sum'},
fill_value=0)
print("\n피벗 테이블:")
pivot
# 특정 값만 선택하여 피벗 테이블 생성
pivot_specific = pd.pivot_table(df,
values='연간_소비량',
index='대륙',
columns='연도',
aggfunc='mean')
print("\n대륙별, 연도별 평균 연간 소비량:")
pivot_specific
5. 크로스탭 (crosstab)
크로스탭(교차표)은 두 개 이상의 범주형 변수 간의 관계를 표 형태로 요약하는 통계적 도구입니다. 이 표는 행과 열로 구성되며, 각각은 서로 다른 변수의 범주를 나타냅니다. 표의 각 셀에는 두 변수의 교차점에 해당하는 빈도수, 백분율, 또는 기타 집계 값이 포함됩니다. 크로스탭의 주요 특징으로는 행과 열 끝에 표시되는 주변 합계, 원시 데이터를 집계된 형태로 변환하는 능력, 그리고 주로 2차원이지만 다차원으로도 확장 가능한 구조가 있습니다. 이 도구는 주로 COUNT, SUM, AVERAGE 등의 집계 함수를 사용하여 데이터를 요약하고, 범주형 변수 간의 관계를 시각화하는 데 활용됩니다.
import pandas as pd
import numpy as np
# 샘플 데이터 생성
df = pd.DataFrame({
'대륙': ['아시아', '유럽', '아시아', '북미', '유럽', '아시아', '북미', '유럽'] * 2,
'국가': ['한국', '이탈리아', '일본', '미국', '프랑스', '중국', '캐나다', '독일'] * 2,
'연도': [2022] * 8 + [2023] * 8,
'소비_수준': ['중', '고', '중', '고', '고', '저', '고', '고',
'중', '고', '중', '고', '고', '중', '고', '고']
})
df
# 기본 크로스탭
cross_tab = pd.crosstab(df['대륙'], df['소비_수준'])
print("\n대륙별 소비 수준 크로스탭:")
cross_tab
# 다중 인덱스를 사용한 크로스탭
multi_cross_tab = pd.crosstab([df['대륙'], df['연도']], df['소비_수준'])
print("\n대륙 및 연도별 소비 수준 크로스탭:")
multi_cross_tab
# 정규화된 크로스탭 (비율로 표시)
normalized_cross_tab = pd.crosstab(df['대륙'], df['소비_수준'], normalize='index')
print("\n대륙별 소비 수준 비율 크로스탭:")
normalized_cross_tab