티스토리 뷰
제 4장 셀프 주유소는 정말 저렴할까¶
구성 및 블로그 진행 과정¶
4-1 Selenium 사용하기
-------------------------------------------------------
4-2 서울시 구별 주유소 가격 정보 얻기
4-3 구별 주유 가격에 대한 데이터의 정리
4-4 셀프 주유소는 정말 저렴한지 boxplot으로 확인하기
-------------------------------------------------------
4-5 서울시 구별 주유 가격 확인
4-6 서울시 주유 가격 상.하위 10개 주유소 지도에 표기하기
출처: 파이썬으로 데이터 주무르기 by 민형기
# Selenium에서 webdriver를 import한다.
from selenium import webdriver
4-2 서울시 구별 주유소 가격 정보 얻기¶
4-1절에서 배운 Selenium의 지식만으로 https://goo.gl/VH1A5t 에 접속해서 서울시 구별 주유소 정보를 받아오자. 지역은 서울시 정보로 한정한다.
driver = webdriver.Chrome('chromedriver')
driver.get('http://www.naver.com')
driver.get('http://www.opinet.co.kr/searRgSelect.do')
driver.get('http://www.opinet.co.kr/searRgSelect.do')
Image.open('selenium4.png')
위 사진에서 우리는 서울시만 검색할 것이니 가만히 두고, 종로구 라는 글자가 있는 부분은 바꿔줘야 한다. 리스트 박스 형태로 되어 있어서 해당 리스트의 내용을 받아와서 순차적으로 반환해주면 된다.
# 종로구라는 글자가 보이는 리스트 박스의 XPath를 이용하여 element를 찾고 gu_list_raw 변수에 저장한다.
gu_list_raw = driver.find_element_by_xpath('''//*[@id="SIGUNGU_NM0"]''')
Image.open('selenium5.png')
구를 선택하는 리스트 박스의 태그의 select 옆에 세모모양을 눌러보면 option이라는 태그에 구 이름이 저장되어 있는 것을 알 수 있다.
# 구 리스트는 find_elements_by_tag_name으로 option이라는 태그를 찾으면 된다.
gu_list = gu_list_raw.find_elements_by_tag_name('option')
gu_names = [option.get_attribute('value') for option in gu_list]
gu_names.remove('')
gu_names
#gu_names에서 첫번째 것을 한번 시험 삼아 입력해보자.
element = driver.find_element_by_id('SIGUNGU_NM0')
element.send_keys(gu_names[0])
Image.open('selenium6.png')
#조회버튼의 Xpath를 찾아서 클릭
xpath ='''//*[@id="searRgSelect"]/span'''
element_sel_gu = driver.find_element_by_xpath(xpath).click()
Image.open('selenium7.png')
#엑셀 저장 버튼을 눌러서 엑셀 내용으로 저장하자.
xpath = '''//*[@id="glopopd_excel"]/span'''
element_get_excel = driver.find_element_by_xpath(xpath).click()
import time
from tqdm import tqdm_notebook
for gu in tqdm_notebook(gu_names):
element = driver.find_element_by_id('SIGUNGU_NM0')
element.send_keys(gu)
time.sleep(2)
xpath ='''//*[@id="searRgSelect"]/span'''
element_sel_gu = driver.find_element_by_xpath(xpath).click()
time.sleep(1)
xpath = '''//*[@id="glopopd_excel"]/span'''
element_get_excel = driver.find_element_by_xpath(xpath).click()
time.sleep(1)
Image.open('selenium8.png')
# 드라이버를 닫고, 이제 저장된 엑셀 파일로 셀프 주유소가 실제로 저렴한지 여부를 확인해 보자.
driver.close()
4-3 구별 주유 가격에 대한 데이터의 정리¶
4-2절에서 받은 25개의 엑셀 파일을 우리가 다루는 data 폴더로 옮긴다. 이전처럼 read를 이용하여 읽으면 25줄을 입력해야지만 모두 읽을 수 있지만 파이썬의 glob 모듈을 사용하면 손쉽게 열 수 있다.
import pandas as pd
from glob import glob
# 지역*.xls는 지역으로 시작하면서 확장자가 xls인 파일들
glob('pydata/selenium/지역*.xls')
# station_files 변수에 각 엑셀 파일의 경로와 이름을 리스트로 저장
stations_files = glob('pydata/selenium/지역*.xls')
stations_files
# concat 명령으로 합쳐본다.
tmp_raw = []
for file_name in stations_files:
tmp = pd.read_excel(file_name, header=2)
tmp_raw.append(tmp)
station_raw = pd.concat(tmp_raw)
station_raw.info()
station_raw.head()
# 원하는 컬럼만 가지고 오고 이름도 다시 정의해서 stations 변수에 저장
# 이 단원에서는 휘발유만 다루겠다.
stations = pd.DataFrame({'Oil_store': station_raw['상호'],
'주소': station_raw['주소'],
'가격': station_raw['휘발유'],
'셀프': station_raw['셀프여부'],
'상표': station_raw['상표']
})
stations.head()
# 추가로 주소에서 구 이름만 추출하자.
# 빈칸을 기준으로 분리 후 2번째 단어 선택
stations['구'] = [eachAddress.split()[1] for eachAddress in stations['주소']]
stations.head()
# head만 보기에는 문제 없으나 500여개의 데이터가 어떤 상태인지 확인하기 쉽지 않다.
# unique() 검사 수행
stations['구'].unique()
결과가 잘 나왔다. (책에서는 '구'에 '서울특별시'와 '특별시'라는 잘못된 데이터가 끼어 있어 처리하는 과정이 있다.)
# stations[stations['구']=='서울특별시']
# stations.loc[stations['구']=='서울특별시','구']='성동구'
# stations['구'].unique()
# stations[stations['구']=='특별시']
# stations.loc[stations['구']=='특별시','구'] = '도봉구'
# stations['구'].unique()
# 가격 컬럼의 unique를 구해보자.
stations['가격'].unique()
# 숫자가 아닌 '-' 문자가 끼어있다.
stations[stations['가격']=='-']
# '-' 문자가 포함된 데이터 제외시켜 버리기
stations = stations[stations['가격'] != '-']
stations.head()
# 가격을 float 형으로 변환한다.
stations['가격'] = [float(value) for value in stations['가격']]
# 25개의 엑셀을 합쳤기 때문에 index가 중복될 수 있다.
# reset_index 명령으로 인덱스를 처음부터 다시 기록하자.
# index라는 컬럼이 하나 더 생기는데 그 부분을 제거한다.
stations.reset_index(inplace=True)
del stations['index']
stations.info()
4-4 셀프 주유소는 정말 저렴한지 boxplot으로 확인하기¶
# 한글문제 해결
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
import platform
path = 'c:/Windows/Fonts/malgun.ttf'
from matplotlib import font_manager, rc
if platform.system() == 'Darwin':
rc('font', family = 'AppleGothic')
elif platform.system() == 'Windows':
font_name = font_manager.FontProperties(fname=path).get_name()
rc('font', family=font_name)
else:
print('Unknown system... sorry~~~')
stations.boxplot(column='가격', by='셀프', figsize=(12,8));
boxplot으로 간편하게 셀프 컬럼을 기준으로 가격 분포를 확인할 수 있게 되었다. 코드의 결과를 보면 직사각형이 데이터의 대다수가 몰려 있는 곳이라는 것은 직관적으로 알 수 있다. 전반적으로 셀프 주유소인 경유가 가격이 낮게 되어 있다.
plt.figure(figsize=(12,8))
sns.boxplot(x='상표', y='가격', hue='셀프', data=stations, palette='Set3')
plt.show()
현대 오일뱅크, GS칼텍스, S-Oil, SK에너지 모두 셀프 주유소가 저렴하다. SK에너지는 그 중 가격대가 가장 높게 형성되어 있는 것을 알 수 있다.
plt.figure(figsize=(12,8))
sns.boxplot(x='상표', y='가격', data=stations, palette='Set3')
sns.swarmplot(x='상표', y='가격', data=stations, color='.6')
plt.show()
Swarmplot을 같이 그려보면 좀 더 확실히 데이터의 분포를 볼 수 있다. 셀프 주유소 말고 상표별 데이터를 확인했는데 SK에너지가 높은 가격대를 형성하는 주유소가 많았다. 전반적으로는 현대 오일뱅크가 4대 주유 브랜드 중에서는 저렴하다는 것을 확인할 수 있다.
이렇게 해서 셀프 주유소는 대체로 저렴하다고 이야기 할 수 있다. 여기서 한 단계 더 나아가서 서울시 구별 주유 가격, 서울에서 높은 가격의 주유소나 낮은 가격의 주유소에 대해서도 확인해보자.
'beginner > 파이썬 분석' 카테고리의 다른 글
셀프 주유소는 정말 저렴할까?-3 (0) | 2019.07.14 |
---|---|
셀프 주유소는 정말 저렴할까? -1 (0) | 2019.07.10 |
시카고 샌드위치 맛집 분석-3 (0) | 2019.07.08 |
시카고 샌드위치 맛집 분석-2 (0) | 2019.07.08 |
시카고 샌드위치 맛집 분석 -1 (0) | 2019.07.05 |