TOP
본문 바로가기
📚 목차
자격증/빅데이터분석기사

[빅분기 실기] 9회 기출문제 1유형: melt 안 쓰고 더 쉽게 풀기

by 기록자_Recordian 2025. 6. 20.
728x90
반응형
이전 내용
 

[빅분기 실기] 모듈의 뒷부분 이름이 기억나지 않을 때

이전 내용 [빅분기 실기] 작업형 3유형: groom 체험 문제 풀이이전 내용 [빅분기 실기] 작업형 1유형 판다스 중요 문법 정리이전 내용 [빅분기 실기] 작업형 1유형: transfrom('mean') vs mean()이전 내용 [빅

puppy-foot-it.tistory.com

 

1유형 중요 팁에 대해 보고싶다면?

[빅분기 실기] 작업형 1유형 판다스 중요 문법 정리


빅분기 실기 9회 기출 - 작업형 1유형 문제2

Q. 연도별 범죄 데이터를 이용하여 아래의 문제를 풀고 답하여라.

1) 검거율 = 검거건수 / 발생건수
2) 각 연도에서 가장 높은 검거율을 기록한 범죄유형 찾기
3) 해당 범죄유형의 검거건수를 구한 후, 이 값들을 모두 합산 - 정수로 출력

 

시험용 데이터는 아래와 같다.

import pandas as pd

df = pd.read_csv('crime.csv')
df

 

1. pd.melt 사용하기

보통 melt를 써서 풀라고 하는데, 알다시피 pd.melt에 넣어야 하는 매개변수를 외워야 하는 게 만만치 않다.

물론, help() 함수를 써도 되는데, 필자의 경우 그래도 이해하기가 쉽지 않았다.

 

우선, pd.melt를 사용하여 풀면 아래와 같다.

# melt 사용
df_long = pd.melt(df, id_vars=['연도', '구분'], var_name='범죄유형', value_name='건수')

# 피벗 사용
df_pivot = df_long.pivot_table(index=['연도', '범죄유형'], columns='구분', values='건수')
df_pivot['검거율'] = df_pivot['검거건수'] / df_pivot['발생건수']

# 각 연도에서 가장 높은 검거율을 기록한 범죄유형 찾기
listbox = df_pivot.groupby(['연도'])['검거율'].idxmax()
max_crime = df_pivot.loc[listbox]

# 해당 범죄유형의 검거건수를 구한 후, 이 값들을 모두 합산
total_crime = max_crime['검거건수'].sum()
print(int(total_crime))

 

1번 문제인 검거율을 구하기 위해서

melt를 해서 데이터를 긴 형태로 만들고 → 여기서 피벗 테이블을 사용하는 방식을 해야 하는데...솔직히 pd.melt 사용법도 헷갈리는데, pivot_table() 함수까지 사용해야 하는 건 난이도가 꽤 높다. (물론, 두 함수를 아예 모르는 거에 비하면 난이도가 내려가긴 하지만)


2. stack()과 unstack()을 활용해서 풀기

공부 중에 같이 시험 준비를 하는 분께서 이를 훨씬 더 쉽게 풀 수 있는 방법을 알려주셨다.

우선 답안 코드부터 공개하면 아래와 같다.

df = df.set_index(['연도', '구분']).stack().unstack(level=1)
df['검거율'] = df['검거건수'] / df['발생건수']

# 각 연도에서 가장 높은 검거율 기록한 범죄유형 찾기
yearly_df = df.groupby('연도')['검거율'].idxmax()

# 해당 범죄유형의 검거건수를 구한 후, 이 값들을 모두 합산
result = df.loc[yearly_df,'검거건수'].sum()
print(int(result))

 

앞서 pd.melt를 이용한 함수에서는 melt 후에 피벗테이블을 진행해줘야 하는 번거로움이 있었는데.

여기서는 그걸 단 한 줄만에 해버린다.

 

한 줄씩 상세하게 설명해보자면,

 

1) 데이터프레임에 stack() 적용하기

.stack() 함수를 사용하게 되면, 컬럼 중 일부를 아래로 내려서 행(index)으로 바꾸게 된다.

df = df.stack()
print(df)

 

데이터프레임을 stack 한 뒤 출력해보면, 모든 데이터가 한 줄로 쭉 나열된 상태로 형성된다.

이 데이터프레임의 인덱스를 출력해보면

print(df.index)

 

이런 형태인데, 이중에서 우리는 연도별 구분(발생건수, 검거건수)별로 건수가 나눠지도록 해야하므로,

set_index(['연도', '구분']) 을 줘서 '연도'와 '구분'을 인덱스로 설정하게끔 추가해준다.

그리고나서 데이터프레임을 출력해보면

df = df.set_index(['연도', '구분']).stack()
print(df)

이런 형태로 바뀌었는데, 중요한 건 검거율(검거건수 / 발생건수)를 구하기 위해서는 둘의 데이터가 한 행에 같이 나와야 아래와 같은 방식으로 검거율 계산이 수월해지기 때문에,  

df['검거율'] = df['검거건수'] / df['발생건수']

 

구분을 컬럼으로 나누기 위해 .unstack()을 사용하여 검거건수와 발생건수가 컬럼이 되도록 해준다.

level=1을 사용하여, index 중 두 번째인 '구분'을 컬럼으로 보내준다.

df = df.unstack(level=1)
print(df)

※ level: 인덱스가 여러 계층(Multi Index)일 때, 그 중 몇 번째 인덱스를 열로 보낼지를 지정하는 것

 

이 과정을 한 줄로 줄이면, 아래와 같은 코드가 완성되는 것이다.

df = df.set_index(['연도', '구분']).stack().unstack(level=1)

단 한 줄로 앞서 melt와 pivot_table을 사용했을 때 보다 훨씬 더 간단하게 검거율을 구할 수 있다.


다음 내용

 

[빅분기 실기] 제10회 빅데이터분석기사 실기 후기

이전 내용 [빅분기 실기] 9회 기출문제 1유형: melt 안 쓰고 더 쉽게 풀기이전 내용 [빅분기 실기] 모듈의 뒷부분 이름이 기억나지 않을 때이전 내용 [빅분기 실기] 작업형 3유형: groom 체험 문제 풀

puppy-foot-it.tistory.com

728x90
반응형