Geo 데이터 및 통계 중복 시각화

이 글은 30일데이터 시각화 추가 일정 12월 23일의 기사를 썼다.있죠.
이 글에서 나는 일본 지도에 각 도도부현의 장래 추산 인구를 표시하고 싶다.e-stats를 사용하면 2020년부터 2045년까지 각 도도부현의 인구를 추산할 수 있기 때문에 애니메이션으로 지도에 그렸다.
지도를 그리는 데는 folium과plotly를 사용합니다.

컨디션


Google Colaboratory
plotly
geopandas
shapely
folium

먼저 도도부현의 데이터를 얻다


우선 도도부현을 그리기 위해서는 그 위치 데이터를 확보해야 한다.각 도도부현의 현 정부 소재지에 대한 데이터가 없다고 생각해서 국토교통성의 국토수치 정보의 행정구역 데이터로 도도부현 중심의 데이터를 만들어 그림을 그리고 싶습니다.
우선 전국의 데이터를 얻기 위해 맨 아래의 zip 파일을 다운로드한다.

이어 그 파일을 동결하면 다음과 같은 7개의 데이터가 나온다.

다음은 Geojoson 파일의 Geopandas의read-입니다.파일 방법으로 읽습니다.데이터는 다음과 같이 11.5만 줄의 도도부현 명칭, 위치 데이터 등이 있다.

그런 다음 좌표계 참조를 확인합니다.EPSG:6668.링크 데이터에 따르면 일본측지계 2011이라고 불리는 것 같다.보아하니 서일본과 동일본은 다른 것 같다.데이터 시각화 등에 「World Geodetic System 1984」가 필요하므로 CRS를 변경합니다.

그러면 만들고 싶은 데이터가 도도부현의 중심 데이터이기 때문에 도도부현의 모든 다각형을 난잡하게 합쳐서 그곳의 중심점을 얻는다.그거 샤플리로.다음 코드는 홋카이도 데이터를 사용한 예다.
# 北海道だけのデータフレームを作成
hokkaido = data[data['N03_001'] == '北海道']
# 北海道のgeometry値を全部持つMultiPolygonを作成し、中心点を取る
center_hokkaido = shapely.geometry.MultiPolygon(hokkaido.geometry.values).centroid 
그리고 folium을 사용하여 중심점을 가시화합니다.
# mapオブジェクトを作成し、中心点に先ほど作った中心点を置く
m = folium.Map([center_hokkaido.y, center_hokkaido.x], zoom_start=8)
# 指定したポイントにマーカーを置く
folium.Marker([center_hokkaido.y, center_hokkaido.x]).add_to(m)

뭐, 모두 중심점으로 만들어졌기 때문에 먼저 이 방법으로 각 도도부현의 위치 데이터를 만든다.이 순환을 통해 현명과 경도 위도를 목록에 저장하고 GeoDataFrame을 만듭니다.
ken_list = list()
center_list = list()
for ken in data['N03_001'].unique():
  ken_data = data[data['N03_001'] == ken]
  ken_center = shapely.geometry.MultiPolygon(ken_data.geometry.values).centroid
  ken_list.append(ken)
  center_list.append(ken_center)

ken_data = gpd.GeoDataFrame()
ken_data['name'] = ken_list 
ken_data['geometry'] = center_list
ken_data = ken_data.set_index('name')
완료된 데이터

장래 추산 인구 데이터의 취득


각 도도부현의 장래 추산 인구 데이터의 취득은 e-stats부터 시작된다.같은 페이지에서 다운로드하여 필요 없는 항목을 삭제하고 칼럼 이름을 간단하게 수정합니다.
jinko = pd.read_csv('/content/FEI_PREF_201230204425.csv', encoding='shift_jis')
jinko = jinko.drop(['調査年', '/項目'], axis=1)
jinko.columns = ['地域', 2020, 2025, 2030, 2035, 2040, 2045]
jinko = jinko.set_index('地域')
jinko_t = jinko.T 
jinko_t = jinko_t / jinko_t.loc[2020] * 100
jinko = jinko_t.T  
가능한 데이터.

위치 데이터와 인구 추산 데이터


두 데이터를 한데 붙이다.메르게 방법을 사용하면 간단해요.다음은 두 개의 데이터를 인덱스를 바탕으로 붙여넣은 후 경도와 위도의 열을 만들어서geometry열을 삭제합니다.
merge_data = jinko.merge(ken_data, left_index=True, right_index=True)
merge_data['x'] = merge_data.geometry.map(lambda x: x.x)
merge_data['y'] = merge_data.geometry.map(lambda x: x.y)
merge_data = merge_data.drop('geometry', axis=1)
merge_data = merge_data.reset_index()
merge_data.head()

세로 데이터 생성


시각화에 편리한 긴 형식 데이터에서melt를 사용하여 변형합니다.id_vars에서 각 데이터에 추가할 요소를 지정합니다.긴 양식을 가지런한 데이터라고 부르는 사람이 많다데이터 정의.그리고 연간 데이터를 문자열로 설정합니다.
merged_melt = pd.melt(merge_data, id_vars=['index', 'x', 'y'])
merged_melt['variable'] = merged_melt['variable'].astype('int')
merged_melt.info()

이로써 각 도도부현의 2020년 인구가 100명이라는 데이터인 위도경도 정보가 발표됐다.

plotly.express로 시각화


그럼 마지막으로 만든 데이터plotly를express를 사용하여 시각화합니다.엔화로 인구지수를 표시하는 scater맵박스 함수를 사용합니다.참고로 이 함수는 맵박스를 이용하여 지도를 표시하기 때문에 맵박스의 영패가 필요합니다.
import plotly.express as px 
# マップボックスのトークンの設定
px.set_mapbox_access_token('your token')
# グラフの描画
px.scatter_mapbox(
    merged_melt,
    lat="y",
    lon="x",
    size="value",
    hover_name="index",
    animation_frame="variable",
    height=800,
    color="value",
    color_continuous_scale=px.colors.sequential.Viridis,
    size_max=30,
    zoom=4,
)
그런 다음 다음 다음 다음 애니메이션처럼 재생성 버튼이 있는 차트를 표시하고 재생성 버튼을 클릭한 후 데이터가 시간 순서대로 이동합니다.이런 애니메이션의 도표는 매개 변수animation이다프레임에서 이동하고자 하는 열 이름 (이번 상황은'variable') 을 건네주면, 도표는 지정한 문자열 (수치를 문자열로 변환하여 전달하는 것) 으로 작동합니다.

총결산


이번 기고는 각 도도부현의 위치 데이터를 작성한 뒤 각 도도부현의 인구 추산치를 붙여 동태적인 도표로 시각화했다.plotly를 사용하면 간단하고 복잡한 동작의 도표를 만들 수 있습니다.
그러면 각지의 인구가 어떤 변화를 일으킬지 알 수 있다.그러나 한편으로는 이렇게 시간 서열의 추이를 볼 수 없다는 불만도 나왔다.그 다음 투고 해결(계속은 내일)!!
관심 있으시다면 LGTM을 주시면 좋겠습니다.
노트북: https://colab.research.google.com/drive/1q-bgBGNYiqdBbNWv_fcgxA3oyACnksYc?usp=sharing(데이터가 부족하여 이동할 수 없기 때문에 최근에 수정할 수 있습니다.)

좋은 웹페이지 즐겨찾기