나와 제일 가까운 무료 WIFI는 어디 있을까?
라이브러리 임포트
import folium
import pandas as pd
import plotly.express as px
한글 깨짐 방지 코드
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()
데이터 준비하기
data = pd.read_csv('/content/dataset.csv', encoding = 'EUC-KR')
data.head()
null 데이터가 얼마나 있는지를 확인
data.isna().sum()
서민.복지시설, 서민/복지시설, 서민복지시설 → 서민복지시설 (데이터 전처리)
# group_data.loc[group_data.서비스제공사명.str.contains('LG') | group_data.서비스제공사명.str.contains('엘지'),'서비스제공사명'] = 'LGU+'
data.loc[data.설치시설구분.str.contains('서민'), '설치시설구분'] = '서민복지시설'
data.설치시설구분.unique()
데이터 분석
# 설치시도별 무료 WIFI 설치 현황 수
data['설치시도명'].value_counts()
DataFrame.groupby(by=['기준']) : groupby 연산자를 사용해 집단, 그룹별로 데이터를 집계, 요약
- 다양한 변수를 가진 데이터셋을 분석하는데 있어 그룹별로 데이터를 집계하는 분석은 사용빈도가 매우 높아서 알아두면 유용
- groupby.mean() : 집단별 평균
group_data = data.groupby(by=['설치시도명', '설치시설구분', '서비스제공사명']).count()
group_data
# 데이터 프레임의 형식으로 제공
# 설치시도별, 설치시설구분, 서비스제공사명 별 무료 WIFI 설치 현황
group_data = data.groupby(by=['설치시도명', '설치시설구분', '서비스제공사명','설치년월']).size().reset_index(name='설치수')
group_data
# 시리즈 형태로 제공(결과만 하나만 사용하고 싶으면 이 경우가 더 적절)
group_data.서비스제공사명.unique()
group_data.loc[group_data.서비스제공사명.str.contains('LG') | group_data.서비스제공사명.str.contains('엘지'),'서비스제공사명'] = 'LGU+'
group_data
데이터 시각화
- 설치시도별 WIFI 설치 현황
px.bar(group_data, x = '설치시도명', y='설치수')
- 설치시도별 WIFI 설치 현황(bar 차트 말고 histogram 차트)
px.histogram(group_data, x = '설치시도명', y='설치수')
- 설치시설구분별 WIFI 설치 현황
px.histogram(group_data, x = '설치시설구분', y='설치수')
- 서비스제공사별 WIFI 설치 현황
px.histogram(group_data, x = '서비스제공사명', y='설치수')
- 설치시도별 WIFI 설치 현황 (pie 차트)
fig = px.pie(group_data, names = '설치시도명', values='설치수')
fig.show()
- fig.update_traces() : 라벨 표시
- textposition을 inside로 표시, textinfo는 percent+label로 표시 : 차트 내부에 설치시도명과 percentage가 표출됨.
fig = px.pie(group_data, names = '설치시도명', values='설치수')
fig.update_traces(textposition='inside', textinfo='percent+label')
fig.show()
colors = ['glod', 'mediumturquoise', '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()
- 설치시설구분별 WIFI 설치 현황 (pie 차트)
fig = px.pie(group_data, names = '설치시설구분', values='설치수')
fig.update_traces(textposition='inside', textinfo='percent+label')
fig.show()
대전광역시 무료 WIFI 현황 데이터 분석 및 시각화
- 데이터 전처리
dj_df = data.loc[data['설치시도명'] == '대전광역시']
dj_df.info()
- 데이터 시각화
- 어떤 목적으로 무료 WIFI를 설치했을까?
fig = px.histogram(dj_df, x='설치시군구명', color='설치시설구분')
fig.show()
- 관리기관별 WIFI 설치 현황
fig = px.histogram(dj_df, x='설치시군구명', color='관리기관명')
fig.show()
fig = px.histogram(data, x='설치시도명', color='설치시설구분')
fig.show()
- 대전 무료 WIFI 데이터에 Null 데이터 있는지 확인
dj_df.isna().sum()
dj_df.설치년월.unique()
- 집계 데이터 프레임 만들 때, 기준이 될 수 있는 컬럼은 모두 groupby 하자.
- 합쳐서 시각화 하는 것은 차트에서 제공해줌.
group_df = dj_df.groupby(by=['설치년월', '설치시군구명', '설치시설구분', '서비스제공사명', '관리기관명']).size().reset_index(name = '설치수')
group_df.head()
- 시군구별 WIFI 설치 수와 설치시설 구분
fig = px.histogram(group_df, x='설치시군구명', y='설치수', color='설치시설구분')
fig.show()
- 시군구별 WIFI 설치 수와 서비스제공사명 구분
fig = px.histogram(group_df, x='설치시군구명', y='설치수', color='서비스제공사명')
fig.show()
- 시군구별 WIFI 설치 수와 관리기관명 구분
fig = px.histogram(group_df, x='설치시군구명', y='설치수', color='관리기관명')
fig.show()
- 시군구별 WIFI 설치 현황(pie 차트)
fig = px.pie(group_df, names='설치시군구명', values='설치수')
fig.show()
fig = px.pie(group_df, names='설치시군구명', values='설치수')
fig.update_traces(textposition='inside', textinfo='percent+label')
fig.show()
- 서비스제공사별 WIFI 설치 현황
fig = px.pie(group_df, names='서비스제공사명', values='설치수')
fig.update_traces(textposition='inside', textinfo='percent+label')
fig.show()
- 관리기관별 WIFI 설치 현황
fig = px.pie(group_df, names='관리기관명', values='설치수')
fig.update_traces(textposition='inside', textinfo='percent+label')
fig.show()
내 위치에 가까운 무료 WIFI 찾기 (TOP 10)
1. 내 위치의 좌표 찾기
1 - 1) folium 지도에 click하면 좌표 정보가 popup으로 띄워지고, 그걸 확인해서 내 위치 좌표로 사용한다.
- 지도에 ClickForMarker 함수와 LatLngPopup 함수를 적용하여 위치를 Marker표출
import folium
m = folium.Map(location=[36.3511, 127.3866], zoom_start=13)
# ClickForMarker 함수 적용
m.add_child(folium.ClickForMarker(popup='point'))
# 위도/경도 팝업 활성화 시키도록 적용 -> 지도를 탐색해서 좌표값 찾는데 도움
m.add_child(folium.LatLngPopup())
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
adress=input('도로명 주소를 입력하세요 : ')
crd = geocoding(adress)
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
2) 나랑 가장 가까운 WIFI 찾기
- 라이브러리 임포트
from geopy.distance import geodesic
2 - 1) 무료 WIFI 위치 정보 가져오기
my_wifi = pd.DataFrame(columns=['설치시군구명', '설치시설구분', '위도', '경도', '거리'])
myhome = (36.3511, 127.3866)
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()
- 우리집과 가장 가까운 WIFI top5 뽑기
my_wifi = my_wifi.sort_values(by=['거리']).head(10)
my_wifi
3) 지도 시각화
my_map = folium.Map(location=[36.350389,127.384594], 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가 여러개 잡혀서 두개로만 보이는 것! 실제 무료 WIFI는 10개가 맞다...!!
'대외활동 > ABC 지역주도형 청년 취업역량강화 ESG 지원산업' 카테고리의 다른 글
[ABC 220906 - 16일차] 나와 제일 가까운 의료 기관 찾기 (0) | 2022.09.11 |
---|---|
[ABC 220905 15일차] - 과제 실습 (0) | 2022.09.11 |
[ABC 220902 14일차] - 6번째 특강 (0) | 2022.09.05 |
[ABC 220902 - 14일차] 5번째 특강 (0) | 2022.09.05 |
[ABC 220901 - 13일차] 크롤링 및 워드 클라우드 시각화 실습 (0) | 2022.09.02 |