2022.09.05

나와 제일 가까운 무료 wifi 찾고 지도 시각화 하기

나와 가까운 무료 wifi를 찾아보자.

import folium
import pandas as pd
import plotly.express as px

라이브러리를 임포트 해준다.

data = pd.read_csv('/content/data.csv', encoding='EUC-KR')

데이터를 준비해준다. 데이터 형식이 euc-kr이라서 encoding형식도 같아야 한다.

데이터의 null 값을 없애기 위해

data.isna().sum() # 누락확인 -> 설치년월일

isna를 이용하여 값을 없애주고 sum으로 더해준다.

data.설치시설구분.unique() # 서민복지시설(전처리)

설치시설구분을 알기 위해 unique로 종류가 무엇이 있는지 살펴본다.
"서민·복지시설, 서민/복지시설, 서민·복지시설, 서민복지시설"
이렇게 종류가 나오게 되는데 자세히 보면, 서민복지시설의 종류가 많이 존재하는 것을 볼 수 있다.

data.loc[data.설치시설구분.str.contains('서민'), '설치시설구분'] = '서민복지시설'

서민이라는 문구를 포함하는 str형식의 설치시설구분 컬럼 값의 위치를 나타내기 위해 설정하였다.

# 설치시도별 무료 WIFI 설치 현황 수
data['설치시도명'].value_counts()

# 설치시도별, 설치시설구분, 서비스제공사명 무료 WIFI 설치 현황
group_data = data.groupby(by=['설치시도명', '설치시설구분', '서비스제공사명']).size().reset_index(name='총설치수') 

reset_index에서 형식을 변환하고 name을 사용함으로써 새로운 컬럼을 만들어준다.

# 설치시도별 WIFI 설치 현황
px.histogram(group_data, x='설치시도명', y='총설치수')


설치시도별 top 3순위로 서울특별시, 경기도, 전라남도/강원도 가 많은 것을 볼 수 있다.

# 서비스제공사별 WIFI 설치 현황
px.histogram(group_data, x='서비스제공사명', y='총설치수')

이번에는 서비스제공사별 top 3를 알아보자.

서비스제공사가 너무 많아서 가려졌지만, KT가 압도적으로 많았고 그 다음이 SKT, 그리고 LG U+였다.

# 설치시도별 WIFI 설치 현황
fig = px.pie(group_data, names='설치시도명', values='총설치수')
fig.show()

막대그래프로 보는 것도 좋지만 역시 한눈에 차이를 볼 때에는 파이그래프 또한 빼놓을 수 없다.

파이그래프를 참고하니 막대그래프에서는 확실하게 차이를 구분할 수 없었던 전라남도와 강원도의 차이를 분명하게 알 수 있었다.

그렇다면 내가 살고 있는 도시는 어떨까?

내가 살고 있는 대전에는 무료 wifi가 얼마나 설치되어 있을까?

dj_df = data.loc[data['설치시도명']=='대전광역시']
dj_df.info()

데이터의 설치시도명을 대전광역시로 제한하여 새로운 데이터프레임을 만든다.

# 시군구에 따른 설치시설별 와이파이 설치 현황
fig = px.histogram(dj_df, x='설치시군구명', color='설치시설구분')
fig.show()

대전에는 서구, 중구, 동구, 유성구, 대덕구, 5개의 구역으로 나뉘어지는데
그래프를 보면 서구와 대덕구에 집중적으로 설치되어있으며, 유성구는 현저히 부족한 것을 볼 수 있다.

dj_group = dj_df.groupby(by=['설치년월', '설치시군구명', '설치시설구분', '서비스제공사명', '관리기관명']).size().reset_index(name='총설치수')

이번에는 groupby를 사용하여 다시 시각화를 해보겠다.

# 시군구별 WIFI 설치 수와 설치시설 구분
fig = px.histogram(dj_group, x='설치시군구명', y='총설치수', color='설치시설구분')
fig.show()


위에서 보였던 막대그래프와 전혀 다른 결과가 나왔다!
groupby를 하면서 null값이 사라지면서 null값이 포함되었던 처음 그래프와 다르게 나타난 것을 알 수 있다.

지도 시각화

import folium


from geopy.geocoders import Nominatim

def geocoding(address):
  geolocoder = Nominatim(user_agent = 'South Korea', timeout =None)
  geo = geolocoder.geocode(address)
  crd = {"lat": float(geo.latitude), "lng": float(geo.longitude)}

  return crd

address = input('도로명 주소를 입력하세요.')
crd = geocoding(address)
from geopy.distance import geodesic


my_wifi = pd.DataFrame(columns=['설치시군구명','설치시설구분','위도', '경도', '거리'])

keypoint = address.split(' ')[0]
data = data.loc[data.설치시도명.str.contains(keypoint)] # 많은 데이터 중 지역 설정

for n in data.index:
  wifi_loc = (data.loc[n, '위도'], data.loc[n, '경도']) 

  my_wifi.loc[n] = [data.loc[n, '설치시군구명'], data.loc[n, '설치시설구분'], data.loc[n, '위도'], data.loc[n, '경도'], geodesic((crd['lat'], crd['lng']), wifi_loc).kilometers]


my_wifi =my_wifi.sort_values(by=['거리']).head(10)
my_wifi

my_map = folium.Map(location= [crd['lat'], crd['lng']], zoom_start=14)

for n in my_wifi.index:
  folium.Marker([my_wifi.loc[n, '위도'], my_wifi.loc[n, '경도']],
                popup='<pre >' +my_wifi.loc[n, '설치시설구분']+'</pre>',
                icon=folium.Icon(icon ='wifi', prefix ='fa')).add_to(my_map)

folium.Marker([crd['lat'], crd['lng']], icon=folium.Icon(color ='red', icon = 'glyphicon glyphicon-home')).add_to(my_map)

my_map


그럼 이렇게 나온다.

-끝!-

profile
Do (Awe)Something!

0개의 댓글