[시각화]plotly choropleth gis시각화

2024. 2. 5. 22:10카테고리 없음

merge_gdf=gdf.merge(df,left_on='SIG_KOR_NM', right_on='SGG_NM')

오늘은 미니프로젝트 때 한번 간단하게 다뤄본 gis시각화에 대해서 정리해볼까 합니다. GIS는 지도를 이용한 시각화로 좌표 정보를 제공하는 geojson 파일이 필요하며, 해당 파일은 geopandas를 이용하여 읽을 수 있습니다. 읽어오는 코드는 아래와 같습니다.

import geopandas as gpd

gdf=gpd.read_file('FILE_PATH')

 

그럼 다음과 같은 혹은 비슷한 자역 코드, 지역 이름, 지역 좌표 등의 데이터가 저장되어 있습니다. 이것을 시각화하고 싶다면 시각화 하고자 하는 데이터를 지역이름 혹은 코드를 통해 조인트를 걸어주면 됩니다. 저는 서울열린데이터광장에서 제공하는 API를 통해 크롤링한 부동산 실거래가 데이터를 이용하였습니다.

 

실거래가 데이터에도 컬럼명은 다르지만 같은 자치구값을 지정하는 컬럼이 존재합니다. 이 칼럼을 통해 두 데이터를 조인트 시키겠습니다.

 merged_gdf = gdf.merge(df, left_on='SIG_KOR_NM', right_on='SGG_NM')

이렇게 한다면 실거래가 데이터에 각 데이터에 해당하는 자치구마다 좌표값들이 들어가 있어 같은 좌표값을 가진 데이터들의 수를 지도 상에 표시할 수 있게 됩니다.

min_price=2000
max_price=20000

# CSV에서 SGG_NM 컬럼의 빈도수 계산
filtered_df = df.loc[(df['OBJ_AMT'] >= min_price) & (df['OBJ_AMT'] <= max_price),show_list]
sgg_nm_counts = filtered_df['SGG_NM'].value_counts().reset_index()
sgg_nm_counts.columns = ['SIG_KOR_NM', 'Counts']

# GeoDataFrame과 빈도수 데이터프레임 병합
merged_gdf = gdf.merge(sgg_nm_counts, on='SIG_KOR_NM')

# Plotly로 시각화
fig = px.choropleth_mapbox(merged_gdf,
                           geojson=merged_gdf.geometry.__geo_interface__,
                           locations=merged_gdf.index,
                           color='Counts',
                           color_continuous_scale="Viridis",
                           mapbox_style="carto-positron",
                           zoom=10,
                           center={"lat": 37.5650172, "lon": 126.9782914},
                           opacity=0.5,
                           labels={'Counts':'빈도수'},
                           hover_data={'SIG_KOR_NM': True, 'Counts': True}
                          )

fig.update_layout(margin={"r":0,"t":0,"l":0,"b":0})
fig.show()

그래서 저는 특정 가격대에서 거래된 데이터의 수를 보기 위하여 min, max peice를 선정하고 그 사이에 존재하는 값들만 추출해서 시각화하였습니다.