티스토리 뷰
먼저 데이터집계/통계 테스트를 위하여 데이터프레임을 불러옵니다.
저는 공공데이터포털에서 대전광역시_대전공공구매플랫폼 기준 업종 대분류별 구별 기업수 CSV 데이터를 다운받아왔어요.
https://www.data.go.kr/data/15097216/fileData.do
대전광역시_대전공공구매플랫폼 기준 업종 대분류별 구별 기업수_20210930
대전광역시 대전공공구매플랫폼(https://www.djpp.or.kr/)에서 제공하는 기업정보에 대한 표준산업분류체계 대분류 업종 기준 구별 기업수 입니다. 기준시점은 2021년 3/4분기 이며, 2021년 공공데이터
www.data.go.kr
import pandas as pd
import numpy as np
file = pd.read_csv("대전광역시_대전공공구매플랫폼 기준 업종 대분류별 구별 기업수_20210930.csv", encoding='cp949')
file
pandas groupby를 통해서 데이터 집계/통계를 낼 수 있는 함수는 다음과 같습니다.
그 중, 제가 빨간색으로 칠해놓은 mode, range, IQR은 groupby 이후 apply를 통해 따로 처리를 해주어야 합니다.
설명 | |
describe | 기초통계량. 각종 통계량을 요약해서 출력. |
first | 값 목록 중 첫번째값 |
last | 값 목록 중 마지막값 |
max | 값 목록 중 최대값 |
min | 값 목록 중 최소값 |
mean | 값들의 평균값 |
median | 값의 중간값 |
mode | 최빈수, 가장 빈도가 높은 값 |
range | 범위 |
IQR | Interquartile range의 약자. 사분범위 (Q1~Q4) 중 Q3 - Q1의 값. |
sum | 값들의 합계 |
size | 그룹 데이터의 개수 |
count | 그룹 데이터의 개수 |
std | 표준편차 |
var | 분산 |
quantile | 분위 (describe에 포함되어 출력됨) |
제가 빨갛게 칠해놓은 mode, range, IQR를 빼고는 모두 같은 코드로
기준컬럼, 통계내고자하는 컬럼, 통계함수를 원하는대로 설정하여 다양하게 값을 통계낼 수 있어요
# 기준컬럼 리스트 설정
groupList = ['업종대분류', '시도명']
# 집계/통계 내고자하는 컬럼 설정
y = '기업 수'
# 집계/통계 함수 리스트 설정
groupbyList = ['count','max', 'sum', 'std']
# 출력 결과 컬럼명을 원하는대로 설정
cg_columns = {'count': '개수', 'max': '최대값', 'sum':'합계', 'std': '표준편차'}
# 통계내어 데이터프레임을 만듦
file2 = file.groupby(groupList, as_index=False)[y].agg(groupbyList).reset_index().rename(columns=cg_columns)
file2
mode의 경우
_mode = file.groupby(groupList, as_index=False)[y].apply(lambda x: pd.Series({ "최빈수" : x.mode().iloc[0] }))
range, IQR의 경우 사용자정의 함수를 사용합니다
아래 블로그 게시물에 작성되어있는 range, IQR에 필요한 함수를 참조했어요.
https://rfriend.tistory.com/391
[Python pandas] GroupBy 집계 메소드와 함수 (Group by aggregation methods and functions)
지난번 포스팅에서는 row나 column 기준으로 GroupBy의 Group을 지정할 수 있는 4가지 방법으로 Dicts, Series, Functions, Index Levels 를 소개하였습니다. 이번 포스팅에서는 Python pandas에서 연속형 변수의..
rfriend.tistory.com
# range, IQR의 경우
def range_func(x):
max_val = np.max(x)
min_val = np.min(x)
range_val = max_val - min_val
return range_val
def iqr_func(x):
q3, q1 = np.percentile(x, [75, 25])
iqr = q3 - q1
return iqr
file3 = file.groupby(groupList, as_index=False)[y].apply(lambda x: pd.Series({ "범위" : range_func(x), "IQR": iqr_func(x) }))
따로따로 생성된 여러 통계 데이터프레임들을 합치기 위해 functools을 사용하면 끝!
import functools as ft
final = ft.reduce(lambda left, right: pd.merge(left, right, how="left", on=groupList), [file2, file3])
'프로그래밍 > Python' 카테고리의 다른 글
[Python3] import 문 사용하지 않고 모듈 불러오는 방법 (0) | 2022.09.20 |
---|---|
[python] 파이썬으로 pytesseract를 이용하여 이미지 캡챠 뚫기 (0) | 2022.08.06 |
[pandas] DataFrame 특정 열 소수점자리 설정하기 (0) | 2022.07.08 |
[pandas] 데이터프레임 특정 열에 절대값 부여하기 pd.DataFrame Absolute value for specific column (abs) (0) | 2022.07.07 |
[pandas] 데이터프레임 특정 컬럼 데이터타입 변경하기 (0) | 2022.07.06 |