3 분 소요

ABC 부트캠프 [나와 가장 가까운 무료 Wifi 찾기]

image

나와 가장 가까운 무료 wifi 찾기

2020년 지역별 wifi 설치현황.csv 파일 사용

패키지 설치 및 라이브러리

pip install koreanize-matplotlib
import pandas as pd

import matplotlib.pyplot as plt
import koreanize_matplotlib
import plotly.express as px
import seaborn as sns

import folium

데이터 준비하기

df = pd.read_csv('/content/2020년 지역별 WIFI 설치현황.csv', encoding='EUC-KR')
df

image

데이터 확인하기

# 전체 데이터 결측치 확인하기
df.isna().sum()      # 5417건 결측치
# 설치시설구분의 중복을 제외한 값 확인하기
df['설치시설구분'].unique()
array(['편의시설', '교통시설', '관광', '주요거리', '공원', '공공기관', '복지센터등', '관공서',
       '서민·복지시설', '기타', '문화관광', '전통시장', '버스승차대', '지역문화시설', '서민/복지시설',
       '교육시설', '공공도서관', '공원내', '민원실', '쉼터', '휴게실', '박물관', '시장', '도서관',
       '노인복지회관', '행정복지센터', '다중이용시설', '버스정류장', '관광지역', '관광지', '복지시설',
       '보건지소', '정류장', '버스', '관광시설', '보건진료소', '서민복지시설', '터미널', '종합복지시설',
       '읍/면/동 주민센터', ' 서민·복지시설', '보건소', '공공(일반)', '주민자치센터', '노인정',
       '문화체육시설', '버스터미널'], dtype=object)
​
# 설치시설구분의 중복을 제외한 값 확인하기 ( 개수 확인 )
len(df['설치시설구분'].unique())     # len : 47개

# 설치시설구분의 중복을 제외한 값 확인하기
df['설치시도명'].unique()
array(['제주특별자치도', '서울특별시', '충청남도', '경상북도', '경기도', '부산광역시', '울산광역시', '강원도',
       '전라북도', '광주광역시', '인천광역시', '대구광역시', '경상남도', '충청북도', '전라남도', '대전광역시',
       '세종특별자치시'], dtype=object)
# 서비스제공사명의 중복을 제외한 값 확인하기
df['서비스제공사명'].unique()

image

데이터 전처리

설치구분컬럼 데이터 전처리

# 서민·복지시설, 서민/복지시설, 서민복지시설 - > 서민·복지시설 전처리
df.loc[df['설치시설구분'].str.contains('서민'), '설치시설구분'] = '서민·복지시설'    # len을 씌우면 3727건이 잡힌다.
df['설치시설구분'].unique()       # 중복되는 서민 복지 시설을 <서민·복지시설>로 통합하였다.

중복되는 <서민 복지="" 시설="">을 <서민·복지시설>로 통합하였다.

df['설치시설구분'].value_counts()     # 값의 이름을 확인하면 <서민·복지시설>로 통합

지역별 wifi 설치 현황 분석

설치시도별 <설치시설구분>과 <서비스제공사> 설치현황 집계표 만들기

group_df = df.groupby(by=['설치시도명', '설치시설구분', '서비스제공사명']).size().reset_index(name='설치수')
group_df

image

서비스제공사 설치현황 시각화

px.histogram(group_df, x='서비스제공사명', y='설치수')

image

설치시설구분 설치현황 시각화

px.histogram(group_df, x='설치시설구분', y='설치수')

image

px.pie 그래프를 사용해 비율로 비교하기

px.pie(group_df, x='설치시설구분', y='설치수')

image

설치시도별 설치현황 시각화

px.histogram(group_df, x='설치시도명', y='설치수')

image

비율로 비교하기

# 비율로 비교하기
px.pie(group_df, names='설치시도명', values='설치수')     # pie로 원 차트 표현

image

비율로 비교하기(텍스트 추가)

# 비율로 비교하기
fig = px.pie(group_df, names='설치시도명', values='설치수')     # pie로 원 차트 표현
fig.update_traces(textposition='inside', textinfo='percent+label')       # 차트안에다가 텍스트를 넣겠다. info는 퍼센트와 라벨
fig.show()

image

서울특별시 무료 wifi 현황 데이터 분석 및 시각화

서울특별시 데이터 준비하기

# sl_df = df[df['설치시도명']=='서울특별시']     <-허용도 가능하나 밑에 것이 베스트
sl_df = df.loc[df['설치시도명']=='서울특별시']
sl_df.info()

서울특별시(구별)는 어떤 목적으로 무료 wifi를 설치 했나?

# 구로구 -> 왜 기타만 많은지 확인
# 성동구 -> 지역문화시설 많은지 확인
# 광진구 - 관광 -> 지도시각화 확인 필요
# 서대문구 -> 주요거리 뭔지 확인 필요
# 강남구 -> 편의시설
# 지도 시각화 할 때 설치시설구분으로 마커 다르게 표출
fig = px.histogram(sl_df, x='설치시군구명', color='설치시설구분')
fig.show()

image

가장 많은 와이파이가 설치되어 있는 구는 어디일까?

sl_group_df = sl_df.groupby(by=['설치시군구명', '설치시설구분', '서비스제공사명']).size().reset_index(name='설치수')
sl_group_df

image

그래프로 그려보자!

fig = px.pie(sl_group_df, names='설치시군구명', values='설치수')     # pie로 원 차트 표현
fig.update_traces(textposition='inside', textinfo='percent+label')       # 차트안에다가 텍스트를 넣겠다. info는 퍼센트와 라벨
fig.show()

image

내 위치와 가장 가까운 무료 wifi 찾아서 지도 시각화하기

사용자의 위도와 경도를 추출해보자

# 도로명 주소를 입력하면 -> 좌표값으로 변환 -> 지도에 표출
from geopy.geocoders import Nominatim

# 도로명 주소를 입력하면 좌표값을 반환하는 함수 선언
def geocoding(address):
  geocoder = Nominatim(user_agent='South Korea', timeout=None)
  geo = geocoder.geocode(address)
  crd = {"lat": float(geo.latitude), "lng": float(geo.longitude) }

  return crd

address = input("도로명 주소를 입력하세요")
crd = geocoding(address)
print(crd)
print('위도', crd['lat'])
print('경도', crd['lng'])

# 지도에 시각화
my_map = folium.Map(location=[crd['lat'], crd['lng']], zoom_start=13)
folium.Marker([crd['lat'], crd['lng']], icon=folium.Icon(color='red', icon='fa-home', prefix='fa')).add_to(my_map)
my_map

image

내 위치에서 가장 가까운 무료 wifi top10 찾기

# 모든 와이파이 위치 좌표와 내 위치 좌표 거리계산 -> 가장 가까운(짧은 거리) TOP 10
# 좌표 거리 계산 필요

from geopy.distance import geodesic

# 지도 시각화에 필요한 정보만 담은 df 재정의
my_wifi_df = pd.DataFrame(columns=['설치시군구명', '설치시설구분', '위도', '경도', '거리'])

# 거리 계산을 하려면 좌표값을 튜플 형태로 제공해야 함
my_home = (crd['lat'], crd['lng'])

for n in df.index:
  wifi_loc = (df.loc[n, '위도'], df.loc[n, '경도'])    # 거리 계산을 위해 튜플 형태로 저장
  # my_wifi_df 데이터 담기
  my_wifi_df.loc[n] = [df.loc[n, '설치시군구명'], df.loc[n, '설치시설구분'],
                       df.loc[n, '위도'], df.loc[n, '경도'],
                       geodesic(my_home, wifi_loc).kilometers]     # 내 와이파이 개수와 거리를 계산해서 킬로미터로 계산

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

마커를 사용한 내 위치와 가장 가까운 무료 wifi top 10 지도 시각화

my_map = folium.Map(location=[crd['lat'], crd['lng']], zoom_start=13)
folium.Marker([crd['lat'], crd['lng']], icon=folium.Icon(color='red', icon='fa-home', prefix='fa')).add_to(my_map)

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

my_map

오늘은 정말 유용한 데이터 시각화를 배운 것 같다.

마지막으로 시각화한 파일을 .html 형식으로 추출해서

마커 된 파일로 어디서든 사용할 수 있다는 점에서 좋은 것 같다

댓글남기기