오늘은 새로운 개념을 더 배우진 않았고, 지금까지 배웠던 개념들을 돌아보고, 새로운 프로젝트를 진행하는 시간을 가졌다.
프로젝트 내용은 크게 5단계로 이루어져 있다.
- 데이터 불러오기
- 결측값 및 파생 변수 생성
- 데이터 집계 및 부분선택
- 데이터 집계 및 데이터 처리
- 데이터 프레임 저장
5단계를 자세하게 하나씩 살펴보자.
1. 데이터 불러오기
주어진 csv파일은 다움과 같다. 2022년도 서울의 아파트 실매매가에 대한 데이터인데, 이를 데이터프레임으로 변환하고, 데이터프레임의 전체적인 크기, 각 변수 별 데이터 유형들을 확인해보는 코드를 작성해야한다.
import pandas as pd
df_trade = pd.read_csv('./아파트(매매)_실거래가_서울_2022.csv',
encoding = 'CP949',
skiprows = 16
)
print('전체 관측치와 변수의 개수: ', df_trade.shape)
print('변수 별 데이터 유형\n')
print(df_trade.dtypes)
데이터프레임을 사용해야하기 때문에 pandas 라이브러리를 import하는 코드로 시작한다.
다음은 같은 경로 내에 존재하는 서울 아파트의 실거래가 csv파일을 불러와 'df_trade'라는 이름의 데이터프레임으로 변환한다.
이때, csv파일 내에 한글이 존재하기 때문에 인코딩 방식을 지정해주어야 한다. csv파일을 보게 되면 상위 16개의 행을 보면 데이터파일에 대한 설명이 있고, 17번째 행부터 실질적인 레이블들이 존재하기 때문에 skiprows 매개변수를 16으로 지정해주었다.
다음으로 전체 관측치와 변수의 개수는 df_trade.shape를 통해 확인할 수 있었고, df_trade.dtypes를 통해 데이터들의 유형을 확인할 수 있었다. 위의 코드를 통해 주어진 기능들을 모두 구현했으니 다음 단계로 넘어가보자.
2. 결측값 및 파생 변수 생성
먼저 결측값에 대해 알아보자. 결측값이란 알려지지 않고, 비어있거나 오류가 발생한 값을 말한다.
cod = df_trade['해제사유발생일'].isnull()
df_trade = df_trade.loc[cond]
df_trade['평당거래금액(만원)'] = df_trade['거래금액(만원)'] / df_trade['전용면적(㎡)']
다음의 코드를 보게 되면 해제 사유 발생일이 존재하는 행을 삭제하는 코드임을 알 수 있다. 또한 df_trade['평당거래금액(만원)']이라는 레이블을 새로 만들고, 거래 금액을 전용 면적으로 나누는 값을 넣는다. 여기서 평당 거래 금액이라는 변수는 거래 금액의 값과 전용 면적의 값으로 만들어지기 때문에 파생변수라고 한다.
3. 데이터 집계 및 부분 선택
여기서 새로운 변수인 target을 정의해야한다. 코드를 보자.
target = df_trade.groupby('시군구',as_index = False)['평당거래금액(만원)'].mean().nlargest(5,'평당거래금액(만원)')
cond1 = df_trade[df_trade['시군구'].isin(target['시군구'])]
cond2 = df_trade.loc[df_trade['거래유형'] == '중개거래']
df_sub = df_trade[df_trade['시군구'].isin(target['시군구'])]
df_sub = df_sub.loc[df_sub['거래유형'] == '중개거래']
target은 시군구별 평당거래금액의 평균을 구한 뒤 평균 값이 높은 5개의 지역을 저장하고 있다. 시군구별 평당거래금액이기 때문에 시군구와 평당거래금액을 그룹으로 묶은 뒤 평균값을 구하는 .mean()메서드를 이용한다. 다음으로 평당거래금액의 평균이 높은 5개의 관측치이기 때문에 nlargest메서드를 이용하여 target의 값을 정해준다.
다음으로 2가지의 조건이 있다.
- df_trade 데이터프레임의 관측치 중 '시군구' 변수가 target에 속하는 관측치만을 선택하여 출력하시오.
- df_trade 데이터프레임의 관측치 중 '거래유형'이 '중개거래'인 관측치만을 선택하여 출력하시오.
이 두가지 조건을 구현하기 위해 cond1과 cond2 변수를 사용하여 구현했다. 마지막으로 조건 1과 조건 2를 모두 만족하는 관측치를 새로운 데이터프레임인 df_sub에 저장하는 코드인데 이 부분에서 더 좋은 알고리즘이 있었다. 바로 AND연산을 진행하는 것이다. 내가 작성한 코드를 보면 이 보다 더 간결하게 작성할 수 있을 것 같았다. 다음의 코드는 기존의 코드를 보완한 코드이다.
target = df_trade.groupby('시군구', as_index=False)['평당거래금액(만원)'].mean().nlargest(5, '평당거래금액(만원)')
cond1 = df_trade['시군구'].isin(target['시군구'])
display(df_trade[cond1])
cond2 = df_trade['거래유형'] == '중개거래'
display(df_trade[cond2])
df_sub = df_trade[cond1 & cond2]
display(df_sub)
이렇게 수정하면 조금 더 간결하고, 가독성이 올라가는 것을 알 수 있다.
4. 데이터 집계 및 데이터 처리
거의 마지막 단계이다. 3번에서 저장한 df_sub 데이터프레임을 대상으로 '단지명' 별 "거래건수", "평당평균거래금액(만원)", "최대거래금액(만원)", "최소전용면적(㎡)"들을 구한 뒤 df_result에 저장하는 단계이다. 이때 단지명을 기준으로 하기 때문에 그룹으로 묶어야 한다. 다음을 살펴보자.
df_result= pd.DataFrame(df_sub.value_counts('단지명'))
df_result['평당평균거래금액(만원)'] = df_sub.groupby('단지명')["평당거래금액(만원)"].mean()
df_result['최대거래금액(만원)'] = df_sub.groupby('단지명')["거래금액(만원)"].max()
df_result['최소전용면적(㎡)'] = df_sub.groupby('단지명')['전용면적(㎡)'].min()
df_result.columns = ['거래건수', '평당평균거래금액(만원)', '최대거래금액(만원)', '최소전용면적(㎡)']
df_result = df_result.head(15)
df_result = df_result.sort_values(['거래건수', '평당평균거래금액(만원)'], ascending = [False,False])
단지명을 기준으로 거래건수는 단지명의 중복되는 개수를 세면 되고, 평당평균거래금액은 단지명 별로 평당거래금액의 평균을 내면 된다. 그룹을 지어 나머지의 값들도 구한 뒤 데이터 프레임 명들을 마지막으로 정리해준다.
여기서 df_result의 조건 몇가지를 살펴보자.
- 거래 건수가 많은 15개의 관측치를 선택할 것
- 거래 건수가 동일할 경우 평당 평균 거래 금액이 높은 순서로 정렬할 것.
위와 같은 조건이 있기 때문에 상위 15개를 판별해야했고, sort_values 메서드를 통해 거래건수와 평당평균거래금액을 내림차순으로 정렬하게 되었다.
마지막 단계를 살펴보자.
5. 데이터 프레임 저장
df_result.to_csv('agg_result.csv')
해당 코드는 비교적 단순하다. 경로를 설정해주고, csv파일 명을 지정해주면 데이터프레임을 csv파일로 저장할 수 있게 된다. 경로를 나타내는 문자열을 자세히 보면 별 다른 경로 없이 저장하고자 하는 csv명만 대입한 것을 알 수 있다. 이는 ipynb파일과 동일한 위치에 파일을 저장한다는 뜻과 같다.
이렇게 하여 프로젝트가 끝이 났다. 지금까지 수업을 진행해주셨던 교수님께서는 오늘이 마지막이라고 하셨다. 그동안 비전공자의 눈높이에서 설명을 해주셨기에 내가 알고 있는 지식을 많이 보완할 수 있었다. 정말 값진 시간이었고, 다음에 모시는 교수님 수업도 열심히 들어야겠다.
매번 어딘가에서 타인이 작성한 코드를 사용하는 일은 빈번하게 있었지만,
내가 처음부터 작성하는 일은 결코 쉬운 일이 아니었다.
이번 프로젝트를 통해 지금까지 배웠던 개념들을 응용하는 능력을 길렀던 것 같다.
'ABC부트캠프 데이터 탐험가 과정' 카테고리의 다른 글
[12일차] ABC 부트캠프 ESG Day(데이터로 보는 분야) (2) | 2024.07.20 |
---|---|
[11일차] ABC 부트캠프 파이썬을 이용한 데이터 크롤링 1 (2) | 2024.07.18 |
[9일차] ABC 부트캠프 파이썬을 이용한 데이터 처리 심화 (0) | 2024.07.16 |
[8일차] ABC 부트캠프 Pandas를 이용한 데이터 분석 1 (2) | 2024.07.15 |
[7일차] ABC 부트캠프 파이썬 데이터분석 및 Pandas 모듈 (2) | 2024.07.13 |