ABC부트캠프: Day11 [나와 가장 가까운 무료 Wifi 찾기]
ABC 부트캠프 [나와 가장 가까운 무료 Wifi 찾기]
나와 가장 가까운 무료 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
데이터 확인하기
# 전체 데이터 결측치 확인하기
df.isna().sum() # 5417건 결측치
# 설치시설구분의 중복을 제외한 값 확인하기
df['설치시설구분'].unique()
array(['편의시설', '교통시설', '관광', '주요거리', '공원', '공공기관', '복지센터등', '관공서',
'서민·복지시설', '기타', '문화관광', '전통시장', '버스승차대', '지역문화시설', '서민/복지시설',
'교육시설', '공공도서관', '공원내', '민원실', '쉼터', '휴게실', '박물관', '시장', '도서관',
'노인복지회관', '행정복지센터', '다중이용시설', '버스정류장', '관광지역', '관광지', '복지시설',
'보건지소', '정류장', '버스', '관광시설', '보건진료소', '서민복지시설', '터미널', '종합복지시설',
'읍/면/동 주민센터', ' 서민·복지시설', '보건소', '공공(일반)', '주민자치센터', '노인정',
'문화체육시설', '버스터미널'], dtype=object)
# 설치시설구분의 중복을 제외한 값 확인하기 ( 개수 확인 )
len(df['설치시설구분'].unique()) # len : 47개
# 설치시설구분의 중복을 제외한 값 확인하기
df['설치시도명'].unique()
array(['제주특별자치도', '서울특별시', '충청남도', '경상북도', '경기도', '부산광역시', '울산광역시', '강원도',
'전라북도', '광주광역시', '인천광역시', '대구광역시', '경상남도', '충청북도', '전라남도', '대전광역시',
'세종특별자치시'], dtype=object)
# 서비스제공사명의 중복을 제외한 값 확인하기
df['서비스제공사명'].unique()
데이터 전처리
설치구분컬럼 데이터 전처리
# 서민·복지시설, 서민/복지시설, 서민복지시설 - > 서민·복지시설 전처리
df.loc[df['설치시설구분'].str.contains('서민'), '설치시설구분'] = '서민·복지시설' # len을 씌우면 3727건이 잡힌다.
df['설치시설구분'].unique() # 중복되는 서민 복지 시설을 <서민·복지시설>로 통합하였다.
중복되는 <서민 복지="" 시설="">을 <서민·복지시설>로 통합하였다.서민>
df['설치시설구분'].value_counts() # 값의 이름을 확인하면 <서민·복지시설>로 통합
지역별 wifi 설치 현황 분석
설치시도별 <설치시설구분>과 <서비스제공사> 설치현황 집계표 만들기서비스제공사>설치시설구분>
group_df = df.groupby(by=['설치시도명', '설치시설구분', '서비스제공사명']).size().reset_index(name='설치수')
group_df
서비스제공사 설치현황 시각화
px.histogram(group_df, x='서비스제공사명', y='설치수')
설치시설구분 설치현황 시각화
px.histogram(group_df, x='설치시설구분', y='설치수')
px.pie 그래프를 사용해 비율로 비교하기
px.pie(group_df, x='설치시설구분', y='설치수')
설치시도별 설치현황 시각화
px.histogram(group_df, x='설치시도명', y='설치수')
비율로 비교하기
# 비율로 비교하기
px.pie(group_df, names='설치시도명', values='설치수') # pie로 원 차트 표현
비율로 비교하기(텍스트 추가)
# 비율로 비교하기
fig = px.pie(group_df, names='설치시도명', values='설치수') # pie로 원 차트 표현
fig.update_traces(textposition='inside', textinfo='percent+label') # 차트안에다가 텍스트를 넣겠다. info는 퍼센트와 라벨
fig.show()
서울특별시 무료 wifi 현황 데이터 분석 및 시각화
서울특별시 데이터 준비하기
# sl_df = df[df['설치시도명']=='서울특별시'] <-허용도 가능하나 밑에 것이 베스트
sl_df = df.loc[df['설치시도명']=='서울특별시']
sl_df.info()
서울특별시(구별)는 어떤 목적으로 무료 wifi를 설치 했나?
# 구로구 -> 왜 기타만 많은지 확인
# 성동구 -> 지역문화시설 많은지 확인
# 광진구 - 관광 -> 지도시각화 확인 필요
# 서대문구 -> 주요거리 뭔지 확인 필요
# 강남구 -> 편의시설
# 지도 시각화 할 때 설치시설구분으로 마커 다르게 표출
fig = px.histogram(sl_df, x='설치시군구명', color='설치시설구분')
fig.show()
가장 많은 와이파이가 설치되어 있는 구는 어디일까?
sl_group_df = sl_df.groupby(by=['설치시군구명', '설치시설구분', '서비스제공사명']).size().reset_index(name='설치수')
sl_group_df
그래프로 그려보자!
fig = px.pie(sl_group_df, names='설치시군구명', values='설치수') # pie로 원 차트 표현
fig.update_traces(textposition='inside', textinfo='percent+label') # 차트안에다가 텍스트를 넣겠다. info는 퍼센트와 라벨
fig.show()
내 위치와 가장 가까운 무료 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
내 위치에서 가장 가까운 무료 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 형식으로 추출해서
마커 된 파일로 어디서든 사용할 수 있다는 점에서 좋은 것 같다
댓글남기기