EDA 4 - 유가 분석

subinii·2024년 4월 12일

DS 25기

목록 보기
24/46
post-thumbnail

04. self Oil Station Price Analysis

주제 : 셀프 주유소가 정말 저렴한가?

오피넷

목표 데이터

  • 브랜드
  • 가격
  • 셀프 주유 여부
  • 위치

셀레니움으로 접근

import

from selenium import webdriver
from selenium.webdriver.common.by import By

팝업창 실행 시 실행 방법

  • 해당 url로 한 번에 접근이 안됨
  • 메인페이지로 접속이 안되고, 팝업창이 하나 나옴
import time 

def main get()
	# 페이지 접근
    url = "https://www.opinet.co.kr/searRgSelect.do"
    driver = webdriver.Chrome()
    driver.get(url)
    # 3초간 머무르기 
    time.sleep(3) 
    
    # 팝업창으로 전환
    driver.switch_to_window(driver.window_handles[-1])
    
    # 창닫기 
    driver.close()
    time.sleep(3) 
    
    # 메인 창으로 전환
    driver.switch_to_window(driver.window_handles[-1])
    
    # 접근 url 다시 요청
    driver.get(url)
main get()

페이지 접근

url = "https://www.opinet.co.kr/searRgSelect.do"
driver = webdriver.Chrome()
driver.get(url)

도시 가져오기

sido_list_raw = driver.find_element(By.ID, "SIDO_NM0")
sido_list_raw.text

# 하위 option 태그 가져오기 
sido_list = sido_list_raw.find_elements(By.TAG_NAME, "option")
len(sido_list), sido_list[17].text

# 리스트에 도시 이름만 담기 
sido_name = []
for option in sido_list:
    sido_name.append(option.get_attribute("value"))
sido_name

구 가져오기

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:]
gu_names[:5], len(gu_names)

엑셀 저장하기

창에서 클릭해 저장하기

1) driver.find_element(By.CSS_SELECTOR, "#templ_list0 > div:nth-child(7) > div > a > span").click()
2) driver.find_element(By.XPATH, '//*[@id="templ_list0"]/div[7]/div/a/span').click()
3) element_get_excel = driver.find_element(By.CSS_SELECTOR, "#templ_list0 > div:nth-child(7) > div > a > span")
element_get_excel.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(3)

    element_get_excel = driver.find_element(By.XPATH, '//*[@id="templ_list0"]/div[7]/div/a/span').click()
    time.sleep(3)

데이터 정리하기

import

  • glob : 파일 목록 한번에 가져오기
import pandas as pd
from glob import glob

파일 가져오기

  • concat : 형식이 동인하고 연달아 붙이기만 하면 될 때 사용
glob("../data/지역_*.xls")

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

# 하나만 읽기 
tmp = pd.read_excel(station_files[0], header=2)

# 모든 파일 읽기 
tmp_raw = []

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

# concat 사용해서 붙이기 
station_raw = pd.concat(tmp_raw)

데이터 확인 후 필요한 데이터만 정렬하기

# 구 이름만 뽑기 
for eachAddress in stations["주소"]:
    print(eachAddress.split()[1])

가격 정보 없는 데이터 없애기

# 가격 정보가 있는 주유소만 사용 
stations = stations[stations["가격"] != "-"]
stations.tail()
# object -> flaot 변경 
stations["가격"] = stations["가격"].astype("float")
# 인덱스 재정렬 
stations.reset_index(inplace=True)
stations.tail()
# 인덱스 삭제 
del stations["index"]

주유 가격 정보 시각화

import

import matplotlib.pyplot as plt
import koreanize_matplotlib
import seaborn as sns 
import platform 
%matplotlib inline
from matplotlib import font_manager, rc  
font_path = "C:/Windows/Fonts/malgun.ttf" 
font = font_manager.FontProperties(fname = font_path).get_name()
rc('font', family = font)

# boxplot(feat. pandas)

# boxplot(feat. seaborn)

# boxplot (feat. seaborn)

지도 시각화

import

  • import warnings : 오류 문구 무시하기
import json 
import folium 
import numpy as np
import warnings
warnings.simplefilter(action="ignore", category=FutureWarning)

각 구마다 평균 가격 지도 시각화

# 피봇하기 
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="OpenStreetMap")
my_map
folium.Choropleth(
    geo_data = geo_str, 
    data = gu_data,
    columns = [gu_data.index, "가격"],
    key_on="feature.id",
    fill_color="PuRd"
).add_to(my_map)
my_map

“이 글은 제로베이스 데이터 취업 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다.”

profile
데이터 공부 기록

0개의 댓글