#한글 깨짐 방지
import matplotlib as mpl
import matplotlib.pyplot as plt
%config InlineBackend.figure_format = 'retina'
!apt -qq -y install fonts-nanum
import matplotlib.font_manager as fm
fontpath = '/usr/share/fonts/truetype/nanum/NanumBarunGothic.ttf'
font = fm.FontProperties(fname=fontpath, size=9)
plt.rc('font', family='NanumBarunGothic')
mpl.font_manager._rebuild()
#라이브러리 임포트
import folium
import pandas as pd
import plotly.express as px
#데이터 준비하기
data = pd.read_csv('경로복사해', encoding='파일보고 넣어 ex) EUC-KR')
data.head()
^ 데이터 정보 확인
^ 누락된 데이터 있는지 확인
^데이터 분석
^ size 확인
^ 위에 size 확인 코드가지고 count 한 것임
^ reset_index하기
^ reset_index 하고 콜롬 추가 이름을 <설치수>로 지정해주기
위에서 name만 바꿔준 것임.
^reset_index 합계?
^ LGU+, LG U+ 이와같은 것들을 다 같은 형식의 LG U+로 바꾸고 싶지만
콜라보 되어있기에 전처리 어렵다. 데이터 왜곡될 가능성 크다.
group_data.loc[group_data.서비스제공사명.str.contains('LG'), '서비스제공사명'] = 'LGU+' #LG들어가있는 모든 것 LGU+로 통칭해라.
group_data.서비스제공사명.unique()
^ LG 들어가 있는 모든 데이터들 LGU+ 하나의 이름으로 합쳐주는 방법
^
# 설치시도별 WIFI 설치 현황
px.bar(group_data, x = '설치시도명', y = '설치수')
^
px.histogram(group_data, x = '설치시도명', y = '설치수')
^ histogram
^ histogram
^
px.pie(group_data, names = '설치시도명', values = '설치수')
or
fig = px.pie(group_data, names = '설치시도명', values = '설치수')
fig.show()
^
colors = ['gold', 'mediumtrurquoise', 'darkorange','lightgreen']
fig = px.pie(group_data, names = '설치시도명', values = '설치수')
fig.update_traces(textposition= 'inside', textinfo='percent+label', hoverinfo='value', textfont_size=20,
marker = dict(colors=colors, line=dict(color='#000000', width=2)))
fig.show()
hoverinfo='value'
#hoverinfo 클릭했을 때 정보가 보인다.
^ textinfo='percent+label+value'
^ textinfo='percent'
dj_df = data.loc[data['설치시도명']=='대전광역시']
dj_df.info()
^
# 어떤 목적으로 무료 WIFI 설치 했는지 확인
fig=px.histogram(dj_df, x='설치시군구명', color ='설치시설구분')
fig.show()
^
fig=px.histogram(data, x='설치시도명', color ='설치시설구분')
fig.show()
^ (1) 데이터 이름 확인하기
^ (2)
#서민.복지시설, 서민/복지시설, 서민·복지시설, 서민복지시설 -> 서민복지시설
data.loc[data.설치시설구분.str.contains('서민'), '설치시설구분'] ='서민복지시설'
data.설치시설구분.unique()
** however, 이거는 맨 위에 전처리 과정 작업으로 초반에 해줘야 함.
^ 위에 전처리해주고 그래프 다시 해주기
dj_df.isna().sum()
dj_df.설치년월.unique()
# 집계 데이터프레임 만들 때, 기준이 될 수 있는 컬럼을 모두 groupby 하자
# 합쳐서 시각화는 차트에서 제공 해줌
group_dj = dj_df.groupby(by=['설치년월','설치시군구명', '설치시설구분', '서비스제공사명', '관리기관명']).size().reset_index(name='설치수')
group_dj
^ groupby할때 null은 자동적으로 예외시켜준다.
^
fig = px.histogram(group_dj, x = '설치시군구명', y='설치수', color ='설치시설구분')
fig.show()
^ fig 서비스제공사명
^ fig 관리기관명
^
fig = px.pie(group_dj, names = '설치시군구명', values='설치수')
fig.show()
^ fig.update_traces(textposition='inside', textinfo ='percent+label')
^ names 설치시설구분
^ names 서비스제공사명
^ names 관리기관명
# 1) 내 위치 자표 찾기
# 1-1) folium 지도에 click 하면 좌표정보가 popup으로 띄어주고 그걸 확인해서 내 위치 좌표로 사용한다.
# 지도에 ClickForMarker 함수와 LatLngPopup 함수를 적용하여 위치를 Marker 표출
import folium
m = folium.Map(location=[36.478725, 127.288507], zoom_start=14)
m
#ClickForMarker 함수 적용
m.add_child(folium.ClickForMarker(popup='point'))
# 위도/경도 팝업 활성화 시키도록 적용 -> 지도를 탐색해서 좌표값 찾는데 도움
m.add_child(folium.LatLngPopup())
^
# Latitude:36.478725
# Longitude: 127.288507
#1-2) 도로명 주소 -> 좌표 값으로 변환
from geopy.geocoders import Nominatim
def geocoding(address):
geolocoder = Nominatim(user_agent = 'South Korea', timeout =None)
geo = geolocoder.geocode(address)
crd = {"lat": str(geo.latitude), "lng": str(geo.longitude)}
return crd
crd = geocoding('대전 서구 대덕대로 319')
print(type(crd))
print(crd['lat'])
print(crd['lng'])
myhome = folium.Map(location=[crd['lat'], crd['lng']], zoom_start=14)
folium.Marker([crd['lat'], crd['lng']], icon=folium.Icon(color ='red', icon = 'glyphicon glyphicon-home')).add_to(myhome)
myhome
^ 도로명 주소 지정해주고 지도 표시해주기
^
from geopy.geocoders import Nominatim
def geocoding(address):
geolocoder = Nominatim(user_agent = 'South Korea', timeout =None)
geo = geolocoder.geocode(address)
crd = {"lat": str(geo.latitude), "lng": str(geo.longitude)}
return crd
address = input('도로명 주소를 입력하세요.')
crd = geocoding(address)
print(crd['lat'])
print(crd['lng'])
myhome = folium.Map(location=[crd['lat'], crd['lng']], zoom_start=14)
folium.Marker([crd['lat'], crd['lng']], icon=folium.Icon(color ='red', icon = 'glyphicon glyphicon-home')).add_to(myhome)
myhome
^ 도로명 주소 받아 지도 표시해주기
질문함:
if 사용자가 도로명 주소 가 아닌 다른 거 입력했을 때 try except 를 사용해 오류임을 표시할 수 있음.
이 경우에는 address 부터 아래 끝까지 try except 안에 넣어줘야함.
^ tuple형태로 맞춰준 것임.
^
# 2) 나랑 가장 가까운 WIFI 찾기
from geopy.distance import geodesic #거리를 계산해주는 친구
# 2-1) 무료 WIFI 위치 정보 가져오기
my_wifi = pd.DataFrame(columns=['설치시군구명','설치시설구분','위도', '경도', '거리']) #거리 콜롬 없는거 새로 만들어줌
myhome = (36.478725, 127.3866) #tuple형태
for n in data.index:
wifi_loc = (data.loc[n, '위도'], data.loc[n, '경도']) #tuple형태
#my_wifi dataframe에 담기
my_wifi.loc[n] = [data.loc[n, '설치시군구명'], data.loc[n, '설치시설구분'], data.loc[n, '위도'], data.loc[n, '경도'], geodesic(myhome, wifi_loc).kilometers]
my_wifi.head()
^
# myhome과 가장 가까운 WIFI top 10 뽑기
my_wifi =my_wifi.sort_values(by=['거리']).head(10)
my_wifi
^
# 3) 지도 시각화
my_map = folium.Map(location=[36.448262,127.423692], 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([36.3511, 127.3866], icon=folium.Icon(color ='red', icon = 'glyphicon glyphicon-home')).add_to(my_map)
my_map
^ 주어진 오늘의 미션
사용자에게 도로명 주소를 입력받아 마커를 표시하고 그 위치에 가장 가까운 WIFI 10 곳 하나의 셀에 입력
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
^ head(10) 집 주위 10개의 와이파이 보여주었는지 확인
keypoint = address.split(' ')[0]
data = data.loc[data.설치시도명.str.contains(keypoint)]