[파이썬 부동산] 아파트 실거래가를 통한 데이터 시각화

이현지·2024년 8월 20일

데이터 분석

목록 보기
11/13

[파이썬 부동산] 아파트 실거래가를 통한 데이터 시각화

지난 게시글과 이어서 진행한다.

계약월 자릿수 맞추기, 거래연월 생성

계약월의 자릿수를 맞춰야 한다.
월이 10보다 작은 경우 앞에 '0'을 붙여 두 자리로 맞춘다.
예를 들어, 1월은 '01', 9월은 '09'로 변환된다.
람다 함수를 사용한다.

df1['계약월'] = df1['계약월'].apply(lambda x:'0'+ x if int(x)< 10 else x)

df1['거래연월'] = df1['계약년도']+df1['계약월']

거래연월별 데이터 집계, 평당 실거래가 계산

거래연월 기준 합계
평당 실거래가 = 거래금액 / 평수
거래연월 기준으로 개수 세기

df1_sum = df1.groupby(['거래연월']).sum()

df1_sum['평당실거래가'] = round(df1_sum['거래금액']/df1_sum['평수'], 0)

df1_sum['평당실거래가'] = df1_sum['평당실거래가'].apply(lambda x : int(x))

df1_count = df1.groupby(['거래연월']).count()

df1.groupby(['거래연월']).sum()

'거래연월' 기준으로 데이터를 그룹화하고,
각 그룹의 숫자형 데이터(예: 거래금액, 평수 등)를 합산하여 df1_sum DataFrame에 저장한다.

df1_sum['평당실거래가'] = round(df1_sum['거래금액'] / df1_sum['평수'], 0)

합산된 거래금액을 합산된 평수로 나누어 평당 실거래가를 계산하고, 소수점 이하를 반올림하여 0자리까지 나타낸다.

df1_sum['평당실거래가'].apply(lambda x : int(x))

실수형 데이터를 정수형으로 변환한다.

df1_count = df1.groupby(['거래연월']).count()

'거래연월' 기준으로 데이터를 그룹화하고,
각 그룹의 거래건수를 세어 df1_count DataFrame에 저장한다.

거래금액과 평당실거래가를 컬럼으로 하는 데이터프레임 확인

거래건수와 평당 실거래가 결합

fd = pd.concat([df1_count[['거래금액']], df1_sum[['평당실거래가']]], axis=1)

fd.columns = ['거래건수', '평당실거래가']

fd.head(2)

pd.concat([df1_count[['거래금액']], df1_sum[['평당실거래가']]], axis=1)

df1_count의 '거래금액'과 df1_sum의 '평당실거래가' 컬럼을 합쳐 새로운 DataFrame fd를 만든다.

fd.columns = ['거래건수', '평당실거래가']

fd의 컬럼 이름을 각각 '거래건수'와 '평당실거래가'로 설정한다.

X좌표는 거래연월, Y좌표는 거래건수로 한다.
팔레트(색상)도 지정 할 수 있다.

fig, ax1 = plt.subplots(figsize = (20, 10))

colot = 'tab:green'

ax1.set_xlabel('거래연월', fontsize = 12)
ax1.set_ylabel('거래건수', fontsize = 12)

ax1 = sns.barplot(x = fd.index, y = '거래건수', data = fd, palette='summer')
ax1.tick_params(axis='y')
ax1.set_xticklabels(labels=fd.index, rotation=45, fontsize = 12)

출력 그래프

그래프 수정

그래프에 추세선을 그릴 것이다.
평당실거래가를 빨간색으로 추가한다.
제목, 범례 또한 추가로 작성햐였다.

fig, ax1 = plt.subplots(figsize = (20, 10))

colot = 'tab:green'

ax1.set_xlabel('거래연월', fontsize = 12)
ax1.set_ylabel('거래건수', fontsize = 12)

ax1 = sns.barplot(x = fd.index, y = '거래건수', data = fd, palette='summer')
ax1.tick_params(axis='y')
ax1.set_xticklabels(labels=fd.index, rotation=45, fontsize = 12)



ax2 = ax1.twinx()
color = 'tab:red'

ax2.set_ylabel('평당실거래가', fontsize = 12)
ax2 = sns.lineplot(x = fd.index, y ='평당실거래가', data = fd, sort =False, color = color)
ax2.tick_params(axis = 'y', color = color)
ax2.set(ylim=(0, 3000))

for i in fd.index : 
    ax2.annotate(f"{fd['평당실거래가'][i]}",
                 xy=(list(fd.index).index(i), fd['평당실거래가'][i]+100),
                 va='center', ha='center', fontweight='light', fontsize=11,
                 color = 'tab:red')
plt.title('2021년 ~ 2023년 월별 인천 아파트 거래건수 및 평당 거래금액')



ax1.legend(handles=[Rectangle((0,0), 0,0, color = 'tab:green', alpha=1, label='거래건수'), Rectangle((0,0),0,0, color ='tab:red', alpha=1, label='평당실거래가')],
           loc = 'lower left', bbox_to_anchor = (0, 0.9, 1, 0), ncol = 1, fontsize = 'small', title_fontsize = 'medium')

plt.show()

기본 설정, 첫 번째 축(거래건수 막대 그래프) 생성

fig, ax1 = plt.subplots(figsize = (20, 10))

plt.subplots()를 사용해 그래프를 그릴 캔버스(fig)와 첫 번째 축(ax1)을 생성한다.

figsize=(20, 10)는 그래프의 크기를 설정하며, \
폭이 20인치, 높이가 10인치이다.

color = 'tab:green'
첫 번째 축의 색상을 설정한다.

ax1.set_xlabel('거래연월', fontsize = 12)
x축 라벨을 '거래연월'로 설정하고, 글자 크기를 12로 지정한다.

ax1.set_ylabel('거래건수', fontsize = 12)
y축 라벨을 '거래건수'로 설정하고, 글자 크기를 12로 지정한다.

ax1 = sns.barplot(x = fd.index, y = '거래건수', data = fd, palette='summer')

Seaborn의 barplot을 사용해
fd 데이터프레임의 인덱스(fd.index)를 x축으로,
'거래건수'를 y축으로 하는 막대 그래프를 그린다.
palette='summer'는 색상 팔레트를 summer 테마로 지정한다.

ax1.tick_params(axis='y')
y축의 눈금과 관련된 파라미터를 설정한다.

ax1.set_xticklabels(labels=fd.index, rotation=45, fontsize = 12)
x축의 라벨을 fd.index로 설정하고,
라벨을 45도 회전시켜 겹치지 않도록 하며,
글자 크기를 12로 설정한다.

두 번째 축 (평당 실거래가 선 그래프) 설정

ax2 = ax1.twinx()
ax1과 동일한 x축을 공유하는 새로운 y축(ax2)을 생성합니다.
이를 통해 한 그래프에 두 개의 y축을 그릴 수 있습니다.

color = 'tab:red'
두 번째 축의 색상을 설정합니다.

ax2.set_ylabel('평당실거래가', fontsize = 12)
두 번째 y축 라벨을 '평당실거래가'로 설정하고,
글자 크기를 12로 지정합니다.

ax2 = sns.lineplot(x = fd.index, y ='평당실거래가', data = fd, sort = False, color = color)

Seaborn의 lineplot을 사용해 fd 데이터프레임의 인덱스를 x축으로, '평당실거래가'를 y축으로 하는 선 그래프를 그린다.

ax2.tick_params(axis = 'y', color = color)
y축의 눈금 라벨 색상을 빨간색으로 설정한다.

ax2.set(ylim=(0, 3000))
두 번째 y축의 값 범위를 0에서 3000으로 제한한다.

for문을 통한 데이터 라벨 표시

for i in fd.index:
ax2.annotate(f"{fd['평당실거래가'][i]}",
xy=(list(fd.index).index(i), fd['평당실거래가'][i]+100),
va='center', ha='center', fontweight='light', fontsize=11,
color = 'tab:red')

for i in fd.index
fd 데이터프레임의 인덱스를 순회하면서 각 데이터 포인트에 라벨을 추가한다.

ax2.annotate(...)
함수를 사용해 각 데이터 포인트에 '평당실거래가' 값을 표시한다.
라벨의 위치는 데이터 포인트 위에 위치시키며,
글자 크기는 11로 설정하고, 글씨 색상은 빨간색으로 지정한다.

제목 설정, 범례 추가

plt.title('2021년 ~ 2023년 월별 인천 아파트 거래건수 및 평당 거래금액')

제목을 추가한다.

ax1.legend(handles=[Rectangle((0,0), 0,0, color = 'tab:green', alpha=1, label='거래건수'), Rectangle((0,0),0,0, color ='tab:red', alpha=1, label='평당실거래가')],
loc = 'lower left', bbox_to_anchor = (0, 0.9, 1, 0), ncol = 1, fontsize = 'small', title_fontsize = 'medium')

그래프의 범례(legend)를 추가한다.
Rectangle 객체를 사용해 범례에 사용될 색상을 지정한다.
loc, bbox_to_anchor, ncol, fontsize, title_fontsize
등을 통해 범례의 위치와 스타일을 설정한다.

plt.show()

profile
관심분야: 추천시스템, 자연어처리, 머신러닝, 딥러닝

0개의 댓글