본문 바로가기

대외활동/ABC 지역주도형 청년 취업역량강화 ESG 지원산업

[ABC 220905 15일차] - 나와 제일 가까운 무료 WIFI는 어디 있을까?

반응형

나와 제일 가까운 무료 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개가 맞다...!!

 

LIST