|
# SQL 테이블 파이썬으로 연동하기
import cx_Oracle
import pandas as pd
dsn = cx_Oracle.makedsn("DESKTOP-6L3TG4N", 1521, 'xe')
db = cx_Oracle.connect('c##scott','tiger', dsn)
cursor = db.cursor()
cursor.execute(""" select * from emv_cs """)
row = cursor.fetchall()
emv_cs = pd.DataFrame(row)
# 컬럼명 가져오기
colname = cursor.description # emv_cs 테이블에 대한 컬럼명 정보 받아오는 코드
col = []
for i in colname:
col.append(i[0])
emv_cs.columns = col
# 한글 깨짐 방지
from matplotlib import font_manager, rc
font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
rc('font', family=font_name)
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
1. 전국 전기차 충전소는 몇개인가? (시각화X)
emv_cs.count() # 4284
1.1 시도별 충전소 개수
emv_city = emv_cs.groupby('설치시도명')['충전소명'].count().reset_index()
emv_city.columns = ['지역명','개소수']
city = emv_city['지역명']
cnt = emv_city['개소수']
plt.bar(city,cnt, align='center', color='r', alpha=0.6)
plt.xticks(city, fontsize=10, rotation=45)
plt.title('지역별 전기차 충전소 설치현황')
for i in range(16):
height = cnt[i]
plt.text(region[i], height+0.25, '%.f'%height, ha='center', va='bottom', size=10)
plt.show()
2. 관리업체별 충전소 관리수
import matplotlib.pyplot as plt
emv_manage = emv_cs.groupby('관리업체명')['충전소명'].count().reset_index()
emv_manage.columns = ['관리업체명','관리개소수']
emv_manage2 = emv_manage.sort_values(by='관리개소수',ascending=False).head(10)
manage = emv_manage2['관리업체명']
cnt = emv_manage2['관리개소수']
plt.title('관리업체별 전기차 충전소\n(10개 미만 업체 제외, 28개업체(점유율 89.57%) 대상')
plt.pie(cnt, labels=manage, autopct='%.1f%%',wedgeprops=dict(width=0.8))
plt.show()
emv_manage[['관리업체명','관리개소수']][emv_manage['관리업체명']=='한국자동차환경협회']
▶ 전기차 관리업체중 10개 이상의 충전소를 운영하는 업체(전체 점유율 87.5%)를 대상으로 점유율 확인 결과
한국자동차환경협회가 10위권 내 28.5% 로 1위를 차지했으며, 관리 충전소는 총 890개로 확인됐다.
3. 관리업체 미확인 충전소
3.1 전국 관리업체 미확인개소
x1 = emv_cs[['충전소명']][emv_cs['관리업체명'].isna()].count()
x2 = emv_cs[['충전소명']][emv_cs['관리업체명'].notnull()].count()
check = pd.DataFrame({'구분':['업체확인','업체미확인'],'개소수':[3974, 310]})
color = ['lightgray','#ff9999']
plt.pie(check['개소수'], labels=check['구분'],
autopct='%.1f%%',colors = color,explode=(0,0.1), wedgeprops=dict(width=0.7), shadow=True)
plt.title('전국 관리업체 미확인 충전소\n 총 4284개소')
plt.legend(check['구분'],loc='best')
plt.show()
3.2 전국 시도별 충전소 대비 미확인 개소
x1 = x.groupby('설치시도명')['충전소명'].count().reset_index()
x1.columns = ['지역명','미확인충전소']
x1
cc =pd.merge(emv_city, x1, on='지역명', how='outer')
cc['미확인충전소'] = cc['미확인충전소'].fillna(0).astype(int)
cc
plt.bar(cc['지역명'],cc['미확인충전소'], color='red', alpha=0.6)
plt.bar(cc['지역명'],cc['개소수'], color='green', alpha=0.6, bottom=cc['미확인충전소'])
plt.title('시도별 전기차 충전소 및 관리업체 미확인 개소')
plt.ylabel('개소수',fontsize=10)
plt.xlabel('지역명',fontsize=10)
plt.xticks(cc['지역명'], fontsize=10, rotation=45)
plt.legend(('미확인','전체'),fontsize=10)
for i in range(16):
height = cc['개소수'][i]
p = round(cc['미확인충전소'][i]/cc['개소수'][i]*100,1)
plt.text(cc['지역명'][i], height+15, p)
plt.show
▶ 전국 시도별 전기차 충전소 개소수 대비 관리업체 미확인 개소가 가장 많은 곳은 경기도(9.5%)로 확인되었다.
미확인 충전소 80개 / 총 충전소 830개
4. 시도별 전기차 충전소 및 연중무휴 충전소 비율
4.1~2 시도별 전기차 충전소 및 전체 대비 연중무휴 충전소가 가장 많은 지역
words = ['없음','무휴','휴','부','x','24시간','-','없','무','X','N']
emv_cs['연중무휴']=emv_cs['휴점일'].apply(lambda x: 'Y' if x in words else 'N')
emv_cs[['충전소명','설치시도명','휴점일','연중무휴']]
emv_oyr = emv_cs[['충전소명','설치시도명','휴점일','연중무휴']][emv_cs['연중무휴']=='Y']
emv_oyr2 = emv_oyr.groupby('설치시도명')['연중무휴'].count().reset_index()
emv_oyr2.columns=['지역명','연중무휴']
nof = pd.merge(emv_city, emv_oyr2, on='지역명', how='outer')
nof['연중무휴']=nof['연중무휴'].fillna(0).astype(int)
#nof
plt.bar(nof['지역명'],nof['연중무휴'], color='red', alpha=0.6)
plt.bar(nof['지역명'],nof['개소수'], color='green', alpha=0.6, bottom=nof['연중무휴'])
plt.title('시도별 전기차 충전소 및 연중무휴 충전소')
plt.ylabel('개소수',fontsize=10)
plt.xlabel('지역명',fontsize=10)
plt.xticks(nof['지역명'], fontsize=10, rotation=45)
plt.legend(('연중무휴','전체'),fontsize=10)
for i in range(16):
height = nof['개소수'][i]
p = round(nof['연중무휴'][i]/nof['개소수'][i]*100,1)
plt.text(nof['지역명'][i], height+15, p)
plt.show
4.3 휴무일 별도확인이 필요하거나 이용조건이 있는 개소 (시각화X)
pd.set_option('display.max_rows',80)
emv_cs.groupby('휴점일')['충전소명'].count().reset_index()
Out[28]: 휴점일 충전소명 0 - 55 1 08:00~22:00 2 2 09:00~18:00 4 3 10:00~23:00 2 4 2,4주 일요일 1 5 2,4째 일요일 2 6 2/4주 일요일 8 7 24시간 3 8 24시간 이용가능 43 9 24시간운영 25 10 2주, 4주 일요일 2 11 2주,4주 일요일 2 12 N 23 13 X 4 14 o 3 15 x 18 16 고객외 이용불가 13 17 공휴일 33 18 둘째, 넷째 일요일 4 19 둘째, 넷째주 일요일 3 20 둘째,넷째 수요일 1 21 마트운영시간 1 22 마트휴점일 1 23 매월 2, 4주 일요일 2 24 매월 2, 4주수요일 1 25 매월 2,4주 일요일 3 26 매월 4주째 월요일 1 27 매월 둘째, 넷째 수요일 휴무 1 28 매월 둘째, 넷째주 일요일 5 29 매월 둘째,넷째 수요일 1 30 매월 첫번째 월요일 1 31 매월2, 4주 수요일 5 32 매월2, 4째주 일요일 1 33 매월2,4 1 34 매월2,4주 수요일 7 35 매월2,4주 일요일 1 36 매월2,4주일요일 16 37 매월2,4주화요일 2 38 매주 일요일 1 39 매주 토, 일 1 40 매주 토.일 1 41 무 1 42 무휴 49 43 법정공휴일, 토요일, 일요일 2 44 별도확인 21 45 부 9 46 설날, 추석 당일 1 47 업무시간내 1 48 없 음 8 49 없음 664 50 연중무휴 2979 51 연중휴무 18 52 영업시간내 2 53 월2회 2 54 일요일 6 55 일요일, 공휴일 18 56 일요일,공휴일 1 57 일요일만 미개방 1 58 입주민외 이용불가 4 59 자체운영 3 60 주말 74 61 주말 및 공휴일 9 62 주말, 공휴일 11 63 주말,공휴일 22 64 주말및공휴일 3 65 토, 일, 공휴일 2 66 토,일 12 67 토,일,공휴일 6 68 토,일요일 1 69 토요일 08:30~16:00 일요일 09:30~16:00 1 70 토요일, 일요일 1 71 토요일, 일요일, 공휴일 1 72 토요일,일요일 15 73 토일 1 74 평일 7 75 해당없음 2 76 휴무일 13 77 휴무일은 지자체 상황에 따라 변경 1 78 휴일 7 79 휴점일 1 |
a = emv_cs[['충전소명','충전소위치상세','완속충전기대수', '급속충전기대수']][emv_cs['휴점일']=='별도확인']
a.groupby('충전소명')['충전소위치상세'].sum().reset_index()
Out[35]: 충전소명 충전소위치상세 0 CU광주곤지암로점 주차장 1 경기광주 중앙스포츠(중앙골프연습장) 지상1층 골프연습장주차장 2 경기광주 중앙스포츠(중앙스파월드) 사우나 1층 주차장 3 경안 공공하수처리시설 주차장주차장 4 광주 공공하수처리시설 주차장 5 광주 소망교회 입구주차장입구주차장 6 광주시 문화스포츠센터 주차장주차장 7 광주시 이마트(경기광주점) 본관B3층 8 대추나무집 주차장주차장 9 청담추어정 광주점 주차장주차장 10 한국국토정보공사 광주지사 주차장주차장주차장주차장주차장주차장 |
b = emv_cs[['충전소명','충전소위치상세','완속충전기대수', '급속충전기대수']][emv_cs['휴점일']=='자체운영']
b.groupby('충전소명')['충전소위치상세'].sum().reset_index()
Out[36]: 충전소명 충전소위치상세 0 동해현진관광호텔 강원도 동해시 동굴로 125-3 (천곡동, 동해현진관광호텔)강원도 동해시 동굴로 1... 1 이마트 동해점 강원도 동해시 천곡로 100 |
▶ 충전소 휴무에 대한 별도 확인이 필요한 곳(장소 기준) 은 총 13곳으로 정보 확인이 가능한 업체, 상업시설, 공공시설 등으로 파악됐다. 따라서 전기차 운전자들이 방문 전 확인이 가능하도록 사전 휴점일 정보에 대한 업데이트가 필요한 상황이다.
5. 주차비 부과 충전소 시설별 분류
(시각화X)
# 공영주차장
emv_parking = emv_cs[['충전소명','충전소위치상세','주차료부과여부']][(emv_cs['충전소명'].str.contains('공영'))]
emv_parking[['충전소명']][emv_parking['주차료부과여부']=='Y'].count()
-> 146개
# 휴게시설
emv_parking = emv_cs[['충전소명','충전소위치상세','주차료부과여부']][(emv_cs['충전소명'].str.contains('휴게'))|(emv_cs['충전소위치상세'].str.contains('휴게'))]
emv_parking[['충전소명']][emv_parking['주차료부과여부']=='Y'].count()
-> 5개
# 아파트
emv_parking = emv_cs[['충전소명','충전소위치상세','주차료부과여부']][(emv_cs['충전소명'].str.contains('아파트'))]
emv_parking[['충전소명']][emv_parking['주차료부과여부']=='Y'].count()
-> 39개
6. 충전소가 가장 많은 장소
emv_cs['완속충전기대수'] = emv_cs['완속충전기대수'].fillna(0).astype(int)
emv_cs['급속충전기대수'] = emv_cs['급속충전기대수'].fillna(0).astype(int)
emv_cs['충전기수'] = emv_cs['완속충전기대수'] + emv_cs['급속충전기대수']
a = emv_cs[['충전소명','충전소위치상세','소재지도로명주소','완속충전기대수','급속충전기대수','충전기수']]
a[['충전소명','충전소위치상세','충전기수']][a['충전소명']=='롯데월드타워&몰지하주차장']
a[['충전소명','충전소위치상세','충전기수']][a['충전소명']=='시 청']
a2 = pd.DataFrame(a)
# 급속충전기가 가장 많은 곳
a3 = a2.groupby('충전소명')['급속충전기대수'].sum().reset_index().sort_values(by='급속충전기대수',ascending=False).head(10)
plt.bar(a3['충전소명'],a3['급속충전기대수'], color='red', alpha=0.6)
# plt.ylim(0,120)
plt.xticks(a3['충전소명'], fontsize=10, rotation=75)
plt.title('급속충전기가 많은 전국 충전장소(1~10위)')
▶ 충전소명으로 그룹핑했으나 아래와 같이 충전소 위치상세별 확인결과,
충전소명은 같으나 설치위치가 다른 충전소인 것으로 확인됨. 따라서 그룹핑에서 제외.
emv_cs[['충전소명','충전소위치상세','설치시도명','급속충전기대수']][emv_cs['충전소명']=='전기자동차 급속충전소']
import matplotlib.pyplot as plt
a3 = a2.groupby('충전소명')['급속충전기대수'].sum().reset_index()
a3_1 = a3[['충전소명','급속충전기대수']][a3['충전소명']!='전기자동차 급속충전소']
a3_1 = a3_1.sort_values(by='급속충전기대수',ascending=False).head(10)
plt.bar(a3_1['충전소명'],a3_1['급속충전기대수'], color='forestgreen', alpha=0.6)
plt.xticks(a3_1['충전소명'], fontsize=10, rotation=75)
plt.title('급속충전기가 많은 전국 충전장소(1~10위)')
#plt.ylim(0, 20)
plt.show()
▶ '전기 자동차 급속충전소'를 제외한 결과 위와 같이
1위 : ㈜이마트 속초점(4층) / 9개
10위 : 롯데 빅마켓 / 6개
로 확인됨.
# 완속 충전기가 가장 많은 곳
a4 = a2.groupby('충전소명')['완속충전기대수'].sum().reset_index().sort_values(by='완속충전기대수',ascending=False).head(10)
plt.bar(a4['충전소명'],a4['완속충전기대수'], color='orange', alpha=0.6)
plt.ylim(0,120)
plt.xticks(a4['충전소명'], fontsize=10, rotation=75)
plt.title('완속충전기가 많은 전국 충전장소(1~10위)')
▶ 완속충전기는 롯데월드타워&몰지하주차장이 118개로 제일 많고
시청 (광주광역시청) 이 32개로 두번째 순위임을 확인함.
# 전체 충전기수가 가장 많은 곳
a5 = a2.groupby('충전소명')['충전기수'].sum().reset_index().sort_values(by='충전기수',ascending=False).head(10)
plt.bar(a5['충전소명'],a5['충전기수'], color='blue', alpha=0.6)
plt.xticks(a5['충전소명'], fontsize=10, rotation=75)
plt.title('충전기수가 가장 많은 전국 충전 장소(1~10위)')
▶ 롯데월드타워는 전기차 사용을 장려하기 위해 지하 2층부터 4층 주차장까지 국내 최대 규모인 총 124기의 전기차 충전소를 운용하고 있다. 일반 충전소 103기에서 테슬라 슈퍼차져 6기와 메르세데스 벤츠 충전기 15기(급속 6기, 완속 9기)를 추가 설치했다. 국내 출시된 모든 전기차종의 충전이 가능하며, 급속 충전은 일반 전기차(64kW급) 기준 약 1시간 30분 소요된다.
('21.05 발행 이데일리 온라인 기사 발췌
https://www.edaily.co.kr/news/read?newsId=01630166629052856&mediaCodeNo=257&OutLnkChk=Y)
7. 시도별 전기차 충전소 1대당 사용 전기차 수
import cx_Oracle
dsn = cx_Oracle.makedsn("DESKTOP-6L3TG4N", 1521, 'xe')
db = cx_Oracle.connect('c##scott','tiger', dsn)
cursor = db.cursor()
cursor.execute(""" select * from emv_region """)
row2 = cursor.fetchall()
emv_region = pd.DataFrame(row2)
emv_region.columns=['지역명','21년06월','21년,07월']
use = pd.merge(emv_region, emv_city, on='지역명', how='outer')
use['개소수'] = use['개소수'].fillna(0).astype(int)
use['충전기1대당'] = round(use['21년,07월']/use['개소수']).replace(np.inf, 0).astype(int)
use2 = use[['지역명','충전기1대당']]
use2
plt.bar(use2['지역명'],use2['충전기1대당'], color='pink', alpha=0.6)
plt.xticks(use2['지역명'], fontsize=10, rotation=75)
plt.title('전기차 지역 등록 기준 시도별 충전기 1대당 충전해야하는 전기차 충전 수')
▶ 시도별 전기차 등록기준에 따른 충전소 개소수를 비교해보면 광주광역시가 충전소 1개당 350대의 전기차가 사용함을 확인할 수 있다.
단, 제조사, 등록 차종, 차종별 충전주기, 급속충전 필요여부, 시도별 충전장소/충전기 이용률, 차량 이동거리 등을 고려하면 충전기 1대당 충전해야 하는 차량 대수는 크게 달라질 것으로 판단된다.
8. 시도별 충전소 분포도
import folium
center = [37.541, 126.986]
m = folium.Map(location=center, zoom_start=10)
emv_cs2 = emv_cs[['충전소명','설치시도명','위도','경도']]
emv_cs2 = emv_cs2.dropna()
loc_data = emv_cs2[['위도','경도']].values[:len(emv_cs)].tolist()
for i in range (len(loc_data)):
folium.Circle(
location = loc_data[i], color = 'orangered', fill=False,fill_opacity=1
).add_to(m)
m.save('emv_map.html')
m
|