인덱싱 된 데이터를 보기 편하게, 혹은 의도하는 수치를 보여주기 위해선 집계함수를 사용한 집계 과정 또한 필요하다. 집계를 할 땐 어떤 컬럼을 기준으로 잡고 작업할 것인지 와 멀티 인덱스를 마주쳤을 때 이를 어떻게 해소 시킬 것인지가 가장 난관이 될 것이다.
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 74485 entries, 0 to 74484
Data columns (total 29 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 사고번호 74485 non-null object
1 사고년도 74485 non-null int64
2 사고월 74485 non-null int64
3 사고일 74485 non-null int64
4 사고시각 74485 non-null int64
5 사고요일 74485 non-null int64
6 시군구_대범주 74485 non-null object
7 시군구_소범주 74485 non-null object
8 사고내용 74485 non-null object
9 사망자수 74485 non-null int64
10 중상자수 74485 non-null int64
11 경상자수 74485 non-null int64
12 부상신고자수 74485 non-null int64
13 사고유형_대범주 74485 non-null object
14 사고유형_소범주 74485 non-null object
15 법규위반 74485 non-null object
16 노면상태_대범주 74485 non-null object
17 노면상태_소범주 74485 non-null object
18 기상상태 73575 non-null object
19 도로형태_대범주 74485 non-null object
...
27 피해운전자연령 72049 non-null float64
28 피해운전자상해정도 72225 non-null object
dtypes: float64(2), int64(9), object(18)
memory usage: 16.5+ MB
Output is truncated. View as a scrollable element or open in a text editor. Adjust cell output settings...
단순 집계
수치형 변수의 최소값 위치 구하기
df.select_dtypes('number').idxmin()
사고년도 0
사고월 0
사고일 0
사고시각 0
사고요일 507
사망자수 0
중상자수 0
경상자수 12
부상신고자수 0
가해운전자연령 2953
피해운전자연령 2248
dtype: int64
select_dtypes() 함수를 통해 데이터 프레임 내부에 해당 타입과 같은 타입의 컬럼 정보를 알 수 있다. (number, int64, float64, object 등등)
사망자수, 중상자수의 합계를 행 별로 구하기
col = ['사망자수','중상자수']
df[col].sum(axis=1)
기본적인 sum() 함수는 열 별로 합계를 구하지만, 행 별로 합계를 구할 수도 있다. sum함수 옵션인 axis을 1로 주면 된다.
# 사망자와 중상자가 모두 없다면 0
# 사망자만 있거나 중상자만 있다면 1
# 사망자와 중상자가 모두 있다면 2
0 0
1 0
2 0
3 0
4 0
..
74480 0
74481 0
74482 0
74483 1
74484 0
Length: 74485, dtype: int64
df[col].sum(axis=1).describe()
describe() 함수는 결측치를 제외한 데이터의 요약본을 리턴한다. 대체적으로 수치형 변수들의 최소값, 최대값, 중앙값, 평균 등의 정보를 한 눈에 볼 때 자주 사용한다.
count 74485.000000
mean 0.266913
std 0.501200
min 0.000000
25% 0.000000
50% 0.000000
75% 0.000000
max 11.000000
dtype: float64
단일열 기준 집계
요일별 중상자수의 합계
# agg 메서드 사용
df.groupby(['사고요일'])[['중상자수']].agg('sum')
or
# 직접 집계함수의 메서드 사용
df.groupby(['사고요일'])[['중상자수']].sum()
or
# agg와 딕셔너리 사용
df.groupby(['사고요일']).agg({'중상자수':'sum'})
집계함수를 사용하는 방법에는 위 3가지 방법이 있다. 3가지 방법 모두 속도나 부하에는 큰 차이가 없으니, 취향에 맞는 방식으로 작업하면 될 것 같다.
중상자수
사고요일
0 2777
1 2956
2 2792
3 2940
4 3008
5 2758
6 2181
요일 별 부상신고자수, 중상자수의 합계
df.groupby(['사고요일'])[['부상신고자수','중상자수']].sum()
부상신고자수 중상자수
사고요일
0 1231 2777
1 1196 2956
2 1217 2792
3 1169 2940
4 1363 3008
5 1346 2758
6 1085 2181
기상상태별 부상신고자수의 합계, 사고건수
df.groupby(['기상상태']).agg({'부상신고자수':['sum','count']})
부상신고자수
sum count
기상상태
눈 20 119
맑음 7636 65872
비 553 4686
안개 0 4
흐림 309 2894
사고요일병 사고건수, 가해운전자연령의 평균, 중상사수의 합계
my_dict = {'가해운전자연령':['count','mean'],
'중상자수': 'sum'}
my_agg = df.groupby(['사고요일']).agg(my_dict)
my_agg.columns= ['사고건수','가해운전자연령평균','중상자수합계']
my_agg['사고건당중상자수'] = my_agg['중상자수합계'] / my_agg['사고건수']
my_agg
사고건수 가해운전자연령평균 중상자수합계 사고건당중상자수
사고요일
0 10498 49.088779 2777 0.264527
1 10898 48.502936 2956 0.271242
2 10662 48.483493 2792 0.261865
3 10875 48.511448 2940 0.270345
4 11701 48.076831 3008 0.257072
5 10328 47.033695 2758 0.267041
6 7765 46.206182 2181 0.280876
복수열 기준 집계
요일별 사고유형별 중상자수의 평균
df.groupby(['사고요일','사고유형_대범주'])[['중상자수']].mean()
중상자수
사고요일 사고유형_대범주
0 차대사람 0.363176
차대차 0.222663
차량단독 0.298551
1 차대사람 0.373498
차대차 0.227740
차량단독 0.323529
2 차대사람 0.356309
차대차 0.218470
차량단독 0.327485
3 차대사람 0.379464
차대차 0.222537
차량단독 0.334320
4 차대사람 0.347826
차대차 0.218335
차량단독 0.292264
5 차대사람 0.342304
차대차 0.233135
차량단독 0.338870
6 차대사람 0.361547
차대차 0.247035
차량단독 0.279570
위 시리즈처럼 여러 데이터가 한 인덱스에 묶여있는 경우, 시각화를 했을 때 데이터를 확인하기가 불편하므로 멀티 인덱스를 해제해주는 작업이 따로 필요하다. 멀티 행인덱스를 풀어줄 땐 reset_index()를 통해 인덱스를 재설정하고, 멀티 컬럼 인덱스를 풀어줄 땐 컬럼명 재지정을 통해 멀티인덱스를 해제할 수 있다.
# 멀티인덱스(행) 해제
df.groupby(['사고요일','사고유형_대범주'])[['중상자수']].mean().reset_index()
# 멀티인덱스(열) 해제 (예시)
# df.groupby(['사고요일','사고유형_대범주'])[['중상자수']].mean().columns = ['사고요일','사고유형_대범주','중상자수']
사고요일 사고유형_대범주 중상자수
0 0 차대사람 0.363176
1 0 차대차 0.222663
2 0 차량단독 0.298551
3 1 차대사람 0.373498
4 1 차대차 0.227740
5 1 차량단독 0.323529
6 2 차대사람 0.356309
7 2 차대차 0.218470
8 2 차량단독 0.327485
9 3 차대사람 0.379464
10 3 차대차 0.222537
11 3 차량단독 0.334320
12 4 차대사람 0.347826
13 4 차대차 0.218335
14 4 차량단독 0.292264
15 5 차대사람 0.342304
16 5 차대차 0.233135
17 5 차량단독 0.338870
18 6 차대사람 0.361547
19 6 차대차 0.247035
20 6 차량단독 0.279570
Unstack과 Pivot Table
Unstack
my_agg = df.groupby(['사고요일','사고유형_대범주'])[['중상자수']].mean()
my_agg
중상자수
사고요일 사고유형_대범주
0 차대사람 0.363176
차대차 0.222663
차량단독 0.298551
1 차대사람 0.373498
차대차 0.227740
차량단독 0.323529
2 차대사람 0.356309
차대차 0.218470
차량단독 0.327485
3 차대사람 0.379464
차대차 0.222537
차량단독 0.334320
4 차대사람 0.347826
차대차 0.218335
차량단독 0.292264
5 차대사람 0.342304
차대차 0.233135
차량단독 0.338870
6 차대사람 0.361547
차대차 0.247035
차량단독 0.279570
my_agg.unstack()
unstack() 함수는 인덱스와 컬럼을 재배치하는 함수다. 컬럼을 인덱스로, 인덱스를 컬럼으로 보낸다.
중상자수
사고유형_대범주 차대사람 차대차 차량단독
사고요일
0 0.363176 0.222663 0.298551
1 0.373498 0.227740 0.323529
2 0.356309 0.218470 0.327485
3 0.379464 0.222537 0.334320
4 0.347826 0.218335 0.292264
5 0.342304 0.233135 0.338870
6 0.361547 0.247035 0.279570
Pivot Table
pd.pivot_table(df, index='사고요일', columns='사고유형_대범주', values='중상자수', aggfunc='mean', fill_value=0)
pivot_table() 함수는 옵션마다 사용자가 지정하는 값에 따라 피보팅하는 함수이다. 피벗할 데이터프레임, index : 행 위치에 들어갈 컬럼, columns : 열 위치에 들어갈 컬럼, values : 데이터로 사용할 컬럼, aggfunc : 집계함수, full_vaule : 결측치를 채울 값을 알맞게 넣어주면 된다.
사고유형_대범주 차대사람 차대차 차량단독
사고요일
0 0.363176 0.222663 0.298551
1 0.373498 0.227740 0.323529
2 0.356309 0.218470 0.327485
3 0.379464 0.222537 0.334320
4 0.347826 0.218335 0.292264
5 0.342304 0.233135 0.338870
6 0.361547 0.247035 0.279570
pd.pivot_table(df, index=['사고요일','사고유형_대범주'], columns='가해운전자성별', values='중상자수', aggfunc='mean', fill_value=0)
가해운전자성별 남 여
사고요일 사고유형_대범주
0 차대사람 0.378920 0.356322
차대차 0.230284 0.202802
차량단독 0.305136 0.142857
1 차대사람 0.392455 0.343373
차대차 0.228007 0.232716
차량단독 0.331034 0.187500
2 차대사람 0.380310 0.318949
차대차 0.221415 0.209877
차량단독 0.314465 0.521739
3 차대사람 0.395986 0.379771
차대차 0.222051 0.231237
차량단독 0.335443 0.333333
4 차대사람 0.363344 0.336397
차대차 0.221346 0.210698
차량단독 0.289634 0.368421
5 차대사람 0.354234 0.358396
차대차 0.239201 0.215250
차량단독 0.339286 0.350000
6 차대사람 0.384403 0.320158
차대차 0.252118 0.231501
차량단독 0.279693 0.277778
'빅데이터분석👨💻' 카테고리의 다른 글
[Python] 빅데이터분석 시각화 - 그래프 그리기 (Matplotlib) (0) | 2023.12.20 |
---|---|
[Python] 빅데이터 분석 기초 - 객체 병합 함수 (concat, join, merge) (0) | 2023.12.18 |
[Python] 빅데이터 분석 기초 - 필터링 (Filtering) (1) | 2023.11.27 |
[Python] 빅데이터 분석 기초 - 인덱싱 (Indexing) (0) | 2023.11.27 |
[Python] 빅데이터 분석 기초 - 이상치 처리 (Check the Outlier) (0) | 2023.11.24 |