반응형
아파트_실거래가_분석_시각화.html
0.59MB
아파트 실거래가 분석, 시각화.ipynb
0.31MB
똑같지만 파일이지만 보는사람의 편의를 위해 원하는 파일을 골라서 보시면 됩니다.
# 문제정의
건설업 파산하고 위기론이라는 사람도 있고, 오히려 기회라면서 역대급 경매매물이 쏟아질 때 사놔야 된다는 사람도 있고 다양한 의견이 많다. 부동산에는 딱히 관심없지만 이참에 공부할 겸 아파트 실거래가를 분석해보자.
# 기본설정
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams['font.family'] = 'NanumSquare' #그래프에 한글설정
plt.rcParams['axes.unicode_minus'] = False #그래프에 마이너스기호 깨짐 방지.
1. 데이터 수집 및 전처리
1.1 데이터 수집
- 국토교통부 실거래가 공개시스템
https://rt.molit.go.kr/
국토교통부에서 데이터를 가져온다.
본인은 2024년 7월(이 프로젝트 할 때는 이게 최신거였다.)자료를 받았다.
In [79]:
df = pd.read_csv('data2/2024_07 아파트(매매)_실거래가.csv', encoding='cp949')
df

48846 rows × 19 columns
전국의 자료라 그런지 rows가 48846개나 된다. 근데 전국 아파트라고 생각하면 적은거 같기도?
이제 데이터를 쓰기좋게 전처리 해줘야 된다.
1.2 데이터 전처리
1.2.1 해제사유 발생일
In [95]:
#해제사유 발생일이 존재하는 데이터 삭제
# df = df.drop(index=df[df['해제사유발생일'].notnull()].index)
1.2.2 사용할 컬럼만 추출
In [97]:
df = df[['시군구','전용면적(㎡)','거래금액(만원)']]
In [99]:
df.head()

1.2.3 자료형 확인 및 변경
In [116]:
df['전용면적(㎡)'].astype('int64')
Out[116]:
0 49
1 84
2 59
3 84
4 84
..
48841 59
48842 84
48843 84
48844 74
48845 84
Name: 전용면적(㎡), Length: 48846, dtype: int64
In [128]:
df['거래금액(만원)']
Out[128]:
0 15000
1 59990
2 107000
3 419000
4 167000
...
48841 59000
48842 100500
48843 78000
48844 31000
48845 66000
Name: 거래금액(만원), Length: 48846, dtype: int64
In [130]:
df.dtypes
Out[130]:
시군구 object
전용면적(㎡) int64
거래금액(만원) int64
dtype: object
2. 시도별 아파트 매매가 데이터 추출
2.1 시도 컬럼 추가
In [297]:
df['시도'] = df['시군구'].str.split(' ').str[0]
# df = df.assign(시도 = df['시군구'].str.split(' ').str[0]) # 이 코드는 SettingWithCopyWarning 경고를 발생시키지 않는대신 df에 컬럼 추가됨.
df['시도'].unique()
Out[148]:
array(['부산광역시', '서울특별시', '대구광역시', '광주광역시', '대전광역시', '인천광역시', '울산광역시',
'경기도', '충청북도', '충청남도', '경상북도', '경상남도', '전북특별자치도', '전라남도',
'제주특별자치도', '강원특별자치도', '세종특별자치시'], dtype=object)
In [150]:
df['시도'].nunique()
Out[150]:
17
2.2 분석할 전용면적 선택
In [156]:
df['전용면적(㎡)'].value_counts() #84㎡가 제일 많으니 선택.
Out[156]:
전용면적(㎡)
84 18133
59 11132
49 1302
74 1164
39 682
...
219 1
234 1
206 1
209 1
273 1
Name: count, Length: 208, dtype: int64
2.3 분석할 전용면적 서브셋
In [161]:
df_84 = df[df['전용면적(㎡)']==84].copy()
2.4 시도별 평균,최대,최소,중간값 추출
In [166]:
df_84_mean = df_84.groupby('시도')['거래금액(만원)'].mean()
In [168]:
df_84_max = df_84.groupby('시도')['거래금액(만원)'].max()
In [170]:
df_84_min = df_84.groupby('시도')['거래금액(만원)'].min()
In [172]:
df_84_median = df_84.groupby('시도')['거래금액(만원)'].median()
In [174]:
df_84_price = pd.concat([df_84_mean,df_84_max,df_84_min,df_84_median],axis=1)
In [176]:
df_84_price
df_84_price.columns=['평균','최대','최소','중간']
In [182]:
df_84_price = df_84_price.sort_values('평균', ascending=False) # 내림차순 정렬
In [190]:
df_84_price['평균'] = round(df_84_price['평균'],1) #소수점 1자리
In [192]:
df_84_price
3. 시도별 아파트 매매가 현황 시각
- 다중막대 그래프*
In [259]:
import numpy as np
x_index = np.arange(1,len(df_84_price)+1)
x_index
Out[259]:
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17])
In [269]:
plt.rcParams['figure.figsize']=(15,5)
plt.bar(x_index-0.3, df_84_price['최대'], width=0.2, label='최대')
plt.bar(x_index-0.1, df_84_price['평균'], width=0.2, label='평균')
plt.bar(x_index+0.1, df_84_price['중간'], width=0.2, label='중간')
plt.bar(x_index+0.3, df_84_price['최소'], width=0.2, label='최소')
plt.legend()
plt.xticks(x_index, labels=df_84_price.index, rotation=45)
plt.grid(axis='y', ls=':')
plt.title('2024년 7월 시도별 아파트 매매가 현황(84㎡)', size=20)
plt.ylabel('매매가(만원)')
plt.show()

4. 시도별 아파트 매매가 분포
4.1 서울시 서브셋
In [279]:
df_84_seoul = df_84[df_84['시도']=='서울특별시'].copy()
df_84_seoul
4.2 구 컬럼 추가
In [286]:
df_84_seoul['구'] = df_84_seoul['시군구'].str.split(' ').str[1]
df_84_seoul['구']
Out[286]:
1 도봉구
3 서초구
4 강동구
6 강동구
7 강동구
...
47514 송파구
47515 송파구
47521 강북구
47527 성북구
47529 성북구
Name: 구, Length: 3073, dtype: object
In [292]:
df_84_seoul['구'].unique()
Out[292]:
array(['도봉구', '서초구', '강동구', '관악구', '노원구', '송파구', '강남구', '영등포구', '강북구',
'은평구', '동작구', '서대문구', '성북구', '마포구', '중랑구', '강서구', '구로구', '동대문구',
'광진구', '양천구', '금천구', '성동구', '중구', '용산구', '종로구'], dtype=object)
In [294]:
df_84_seoul['구'].nunique()
Out[294]:
25
4.3 박스플롯 시각화
4.3.1 구별 데이터 분리
In [302]:
#구이름
seoul_gu = df_84_seoul['구'].unique()
seoul_gu
Out[302]:
array(['도봉구', '서초구', '강동구', '관악구', '노원구', '송파구', '강남구', '영등포구', '강북구',
'은평구', '동작구', '서대문구', '성북구', '마포구', '중랑구', '강서구', '구로구', '동대문구',
'광진구', '양천구', '금천구', '성동구', '중구', '용산구', '종로구'], dtype=object)
In [306]:
df_seoul_gu = []
for i in range(len(seoul_gu)):
df_seoul_gu.append(df_84_seoul.groupby('구')['거래금액(만원)'].get_group(seoul_gu[i]))
4.3.2 박스플롯으로 시각화
In [354]:
plt.boxplot(df_seoul_gu, labels=seoul_gu, showmeans=True)
plt.xticks(rotation=45)
plt.title('2024년 7월 시도별 아파트 매매가 분포(84㎡)', size=20)
plt.ylabel('매매가(만원)')
plt.show()

5. 시도별 아파트 구별 평균 매매가, 거래건수
5.1 시도별 아파트 구별 평균 매매가
In [323]:
df_84_seoul_mean = df_84_seoul.groupby('구')['거래금액(만원)'].mean()
In [325]:
df_84_seoul_mean = round(df_84_seoul_mean,1)
In [327]:
df_84_seoul_mean
Out[327]:
구
강남구 229498.2
강동구 129332.6
강북구 72204.3
강서구 103556.6
관악구 87089.3
광진구 142891.7
구로구 86343.4
금천구 76655.2
노원구 84372.5
도봉구 63841.7
동대문구 99307.2
동작구 129961.9
마포구 151989.3
서대문구 114940.0
서초구 261673.0
성동구 150617.8
성북구 91130.6
송파구 177969.9
양천구 109172.3
영등포구 119861.0
용산구 173266.7
은평구 90519.7
종로구 148286.4
중구 126370.4
중랑구 84280.7
Name: 거래금액(만원), dtype: float64
5.2 시도별 아파트 구별 거래건수
In [334]:
df_84_seoul_count = df_84_seoul.groupby('구')['거래금액(만원)'].count()
In [336]:
df_84_seoul_count.sort_values()
Out[336]:
구
종로구 22
금천구 29
용산구 36
강북구 46
중구 54
중랑구 75
관악구 75
광진구 78
도봉구 86
구로구 106
은평구 116
동대문구 118
강남구 137
서초구 141
양천구 150
강서구 151
성동구 157
강동구 158
영등포구 163
서대문구 166
노원구 167
마포구 187
성북구 196
동작구 223
송파구 236
Name: 거래금액(만원), dtype: int64
In [338]:
df_84_seoul_mean_count = pd.concat([df_84_seoul_mean, df_84_seoul_count], axis=1)
df_84_seoul_mean_count
df_84_seoul_mean_count.columns = ['평균매매가(만원)', '거래건수'] # 컬럼명 변경
df_84_seoul_mean_count = df_84_seoul_mean_count.sort_values('평균매매가(만원)', ascending=False) #평균매매가 내림차순으로 변경
df_84_seoul_mean_count
fig, ax1 = plt.subplots()
ax1.bar(df_84_seoul_mean_count.index, df_84_seoul_mean_count['평균매매가(만원)'], label='평균매매가')
plt.xticks(rotation=45)
ax2 = ax1.twinx()
ax2.plot(df_84_seoul_mean_count['거래건수'], 'k^--', mfc='r', mec='r', label='거래건수')
ax1.legend(loc='upper left', edgecolor='k')
ax2.legend(loc='upper right', edgecolor='k')
ax1.set_ylabel('평균매매가(만원)')
ax2.set_ylabel('거래건수')
plt.title('2024년 7월 서울시 아파트 평균매매가, 거래건수(84㎡)', size=20)
plt.show()
반응형
'데이터 분석' 카테고리의 다른 글
서울시 110년간의 폭염과 열대야 분석 (1911-2020)_데이터분석 및 시각화 (0) | 2024.12.28 |
---|---|
서울시 기온변화_데이터 분석 및 시각화 (1) | 2024.12.27 |
데이터 분석 이미지 자료들 (1) | 2024.12.26 |
인구 변화 데이터 분석 및 시각화 (2) | 2024.12.22 |
데이터 분석 메모 (3) | 2024.12.19 |