import pandas as pd
import plotly. express as px
df = pd.read_csv('/content/dataset.csv', encoding ='EUC-KR')
df.info()
df.isna() # Null값을 'True'로 처리해줌
df.isna().sum() # Null데이터가 몇 건인지 한번에 확인 가능
1) 첫번째 코드는 모든 데이터 값의 null값 여부를 출력해주는데 null값인 경우 True로 표시된다.
2) 두번째 코드는 컬럼별로 어떤 컬럼에 몇 개의 null값이 있는지 보여준다. 아래의 출력값을 보면 설치년월에 5천여개의 null값이 있는 것을 알 수 있다.
기준 컬럼별 갯수가 궁금해 카운트 하고 싶을 때는 두가지 방법이 있다. (집계함수)
df['설치시도명'].value_counts()
df.groupby(['설치시도명']).count()
그럼 여러 컬럼을 이용해 groupby하면 어떨까?
group_df = df.groupby(by=['설치시도명','설치시설구분', '서비스제공사명']).count()
group_df
group_df = df.groupby(by=['설치시도명','설치시설구분', '서비스제공사명']).size()
group_df
group_df = df.groupby(by=['설치시도명','설치시설구분', '서비스제공사명']).size().
reset_index(name='설치개수')
group_df
참고. 데이터값 전처리
df.설치시설구분.unique()
df.loc[df.설치시설구분.str.contains('서민'), '설치시설구분'] = '서민복지시설'
# 설치시도별 WIFI 설치 현황
px.bar(group_df, x='설치시도명', y='설치개수')
# 설치시도별 WIFI 설치 현황
px.histogram(group_df, x='설치시도명', y='설치개수') #하나의 막대그래프로 작성
# 설치시도별 WIFI 설치 현황
fig = px.pie(group_df, names ='설치시도명', values='설치개수')
#figure를 사용해야 legend를 차트에 넣을 코드를 넣을 수 있다.
fig.update_traces(textposition = 'inside', textinfo = 'percent+label')
fig.show()
dj_df = df.loc[df['설치시도명']=='대전광역시']
group_dj = dj_df.groupby(by=['설치년월','설치시군구명','설치시설구분', '서비스제공사명',
'관리기관명']).size().reset_index(name='설치개수')
group_dj
#시군구별 wifi 설치시설 구분
fig = px.histogram(group_dj, x='설치시군구명', color ='설치시설구분')
fig.show()
#시군구별 wifi 설치개수와 설치시설 구분
fig = px.histogram(group_dj, x='설치시군구명', y='설치개수', color ='설치시설구분')
fig.show()
# 1. 라이브러리 임포트
import pandas as pd
import folium
from geopy.geocoders import Nominatim
from geopy.distance import geodesic
# 2.데이터 준비하기
df = pd.read_csv('/content/dataset.csv', encoding = 'EUC-KR')
# 2-1. 대전 지역 데이터 준비하기
dj_df = df.loc[df['설치시도명']=='대전광역시']
# 3. 주소를 좌표로 변환할 함수 준비
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
# 4. 사용자에게 주소 입력받기
address = input('도로명주소를 입력하세요.')
# 5. 사용자 주소를 좌표로 변환 후, 튜플 형태로 변수에 담기
crd = geocoding(address)
IMHERE = (crd['lat'], crd['lng'])
# 6. 데이터프레임 새로 생성 후, 사용자 주소와의 거리 계산하여 담기
c_wifi = pd.DataFrame(columns=['설치시군구명', '설치시설구분', '위도', '경도', '거리'])
for n in df.index:
w_loc = (df.loc[n, '위도'], df.loc[n, '경도'])
c_wifi.loc[n] = [df.loc[n, '설치시군구명'], df.loc[n, '설치시설구분'],
df.loc[n, '위도'], df.loc[n, '경도'], geodesic(IMHERE,
w_loc).kilometers]
# 6-1. 대전 데이터프레임 새로 생성 후, 사용자 주소와의 거리 계산하여 담기
c_wifi = pd.DataFrame(columns=['설치시군구명', '설치시설구분', '위도', '경도', '거리'])
for n in dj_df.index:
w_loc = (dj_df.loc[n, '위도'], dj_df.loc[n, '경도'])
c_wifi.loc[n] = [dj_df.loc[n, '설치시군구명'],
dj_df.loc[n, '설치시설구분'], dj_df.loc[n, '위도'],
dj_df.loc[n, '경도'], geodesic(IMHERE, w_loc).kilometers]
# 7. 사용자 주소와 가장 가까운 무료 와이파이 상위 10곳 구하기
c_wifi = c_wifi.sort_values(by=['거리']).head(10)
# 8. 지도 준비
w_map = folium.Map(location=[df['위도'].mean(), df['경도'].mean()], zoom_start=14)
# 9. 사용자 주소와 상위 10곳의 와이파이 마커 올리기
folium.Marker([crd['lat'], crd['lng']],
icon=folium.Icon(color='red', icon='glyphicon glyphicon-home')).add_to(w_map)
for n in c_wifi.index:
folium.Marker([c_wifi.loc[n, '위도'], c_wifi.loc[n, '경도']],
popup='<pre>'+'시군구명: '+
c_wifi.loc[n, '설치시군구명']+', 시설구분: '+c_wifi.loc[n, '설치시설구분']+
'</pre>', icon=folium.Icon(color='cadetblue',icon='wifi'
,prefix='fa')).add_to(w_map)
w_map
위 지도는 전국 와이파이 데이터 기준으로 시각화한 지도이다.