EDA_04. Self Oil Station Price Analysis

ouob·2023년 1월 24일
0

EDA

목록 보기
5/5
post-thumbnail

EDA/웹 크롤링/파이썬 프로그래밍

04. Self Oil Station Price Analysis

01. 셀레니움 설치

  • conda install selenium
  • pip install selenium
  • chromedriver
!pip install selenium

!pip list | grep sele # 설치되었는지 확인하는 것

02.셀레니움으로 접근

  • 페이지 접근 후 시,도 정보 수집
from selenium import webdriver
from selenium.webdriver.common.by import By
from tqdm import tqdm_notebook
import time

# url로 열기
url = "https://www.opinet.co.kr/searRgSelect.do"
driver = webdriver.Chrome("../driver/chromedriver") # window .exe
driver.get(url)

# 기다림
time.sleep(3)

# 팝업창 하나 닫음
driver.switch_to.window(driver.window_handles[-1])
driver.close()

# 기다림
time.sleep(3)

# 팝업창 또 하나 닫음
driver.switch_to.window(driver.window_handles[-1])
driver.close()

# 기다림
time.sleep(3)

메인 창으로 전환 후 접근 url 다시 요청
driver.switch_to.window(driver.window_handles[-1])
driver.get(url)

# 지역: 시/도
sido_list_raw = driver.find_element(By.ID, "SIDO_NM0")
sido_list_raw.text

# 0번째 데이터가 비어있어서 슬라이스 해줌
sido_name = [option.get_attribute("value") for option in sido_list]

# 시/도 서울로 바꿔줌
sido_list_raw.send_keys(sido_names[0])

# 구
gu_list_raw = driver.find_element(By.ID, "SIGUNGU_NM0") # 부모 태그
gu_list = gu_list_raw.find_elements(By.TAG_NAME, "option") # 자식 태그

gu_names = [option.get_attribute("value") for option in gu_list]
gu_names = gu_names[1:]

# 구마다 엑셀파일 저장
for gu in tqdm_notebook(gu_names):
    element = driver.find_element(By.ID, "SIGUNGU_NM0")
    element.send_keys(gu)
    time.sleep(3)
    
    element_get_excel = driver.find_element(By.ID, "glopopd_excel").click()
    time.sleep(3)

driver.close()

03. 데이터 정리하기

  • DataFrame
!pip install glob2

import pandas as pd
from glob import glob

# 파일 목록 한 번에 가져오기
glob("../data/지역_*.xls")

# 파일명 저장
stations_files = glob("../data/지역_*.xls")

# DataFrame 
tmp_raw = []

for file_name in stations_files:
    tmp = pd.read_excel(file_name, header=2)
    tmp_raw.append(tmp)
    
stations_raw = pd.concat(tmp_raw)
stations_raw

  • df 만들고 '구'추가 및 '가격' 형변환
stations = pd.DataFrame({
     "상호": stations_raw["상호"],
     "주소": stations_raw["주소"],
     "가격": stations_raw["휘발유"],
     "셀프": stations_raw["셀프여부"],
     "상표": stations_raw["상표"]
     
})

# '구' column 추가
stations["구"] = [eachAddress.split()[1] for eachAddress in stations["주소"]]

# 가격 데이터형 변환 object => float
# stations["가격"] = stations["가격"].astype(float) # 빈 셀이 있어서 에러가 남
# 가격 정보가 있는 주유소만 사용
stations = stations[stations["가격"] != "-"]
stations["가격"]  = stations["가격"].astype(float)
stations.info()

stations

  • index 재정렬
# 인덱스 재정렬
stations.reset_index(inplace=True)

# 기존 인덱스 삭제
del stations["index"]
stations.tail()

04. 주유 가격 정보 시각화

  • 필요한 환경 설정
import matplotlib.pyplot as plt
import seaborn as sns
import platform
from matplotlib import font_manager, rc

get_ipython().run_line_magic("matplotlib", "inline")
# %matplotlib inline

path = "C:/Windows/Fonts/malgun.ttf"

if platform.system() == "Darwin":
    rc("font", family="Arial Unicode MS")
elif platform.system() == "Windows":
    font_name = font_manager.Fontproperties(fname=path).get_name()
    rc("font", family=font_name)
else:
    print("Unkown system. sorry")
  • 셀프 유무에 따른 가격(boxplot)
# boxplot(feat. pandas)

stations.boxplot(column="가격", by="셀프", figsize=(12,8));
  • 셀프 유무에 따른 가격(boxplot)
# boxplot(feat. seaborn)

plt.figure(figsize=(12,8))
sns.boxplot(x="셀프", y="가격", data=stations, palette="Set1")
plt.grid(True)
plt.show()
  • 셀프 유무, 상표에 따른 가격(boxplot)
# boxplot(feat. seaborn)

plt.figure(figsize=(12,8))
sns.boxplot(x="상표", y="가격", hue="셀프", data=stations, palette="Set3")
plt.grid(True)
plt.show()
  • 지도 시각화
import json
import folium
import warnings
warnings.simplefilter(action="ignore", category=FutureWarning) # 경고 무시

import numpy as np

gu_data = pd.pivot_table(data=stations, index="구", values="가격", aggfunc=np.mean)

geo_path = "../data/02. skorea_municipalities_geo_simple 복사본.json"
geo_str = json.load(open(geo_path, encoding="utf-8"))

my_map = folium.Map(location=[37.5502, 126.982], zoom_start=10.5, tiles="Stamen Toner")
my_map.choropleth(
    geo_data=geo_str,
    data=gu_data,
    columns=[gu_data.index, "가격"],
    key_on="feature.id", # 데이터와 지도 합쳐줌
    fill_color="PuRd"

)
my_map

0개의 댓글