티스토리 뷰

728x90
반응형

 

 

 

 

먼저 데이터집계/통계 테스트를 위하여 데이터프레임을 불러옵니다.

저는 공공데이터포털에서  대전광역시_대전공공구매플랫폼 기준 업종 대분류별 구별 기업수 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])

728x90
반응형
댓글