
주요 학습내용
1. 웹데이터 불러오기
2. 데이터 시각화
사용할 자료
- 오피넷 주유소 정보 : https://www.opinet.co.kr/searRgSelect.do
- 확인하고자 하는 데이터
- 셀프주유소는 정말 저렴할까?
from selenium import webdriver
from selenium.webdriver.common.by import By
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 = sido_list_raw.find_elements(By.TAG_NAME, 'option')
방법 1) for문 사용
sido_names = []
for option in sido_list:
sido_names.append(option.get_attribute("value"))
sido_names
sido_names = sido_names[1:]
방법 2) 한줄로 작성
sido_names = [option.get_attribute("value") for option in sido_list]
sido_names = sido_names[1:]

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, len(gu_names)

# selector 사용
driver.find_element(By.CSS_SELECTOR, "#templ_list0 > div:nth-child(7) > div > a > span").click()
# xpath 사용
driver.find_element(By.XPATH, "//*[@id='templ_list0']/div[7]/div/a/span").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 pandas as pd
from glob import glob
glob("../data/지역_*.xls")
stations_files = glob("../data/지역_*.xls")
tmp = pd.read_excel(stations_files[0], header = 2)
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
stations = pd.DataFrame({
"상호": stations_raw["상호"],
"주소": stations_raw["주소"],
"가격": stations_raw["휘발유"],
"셀프": stations_raw["셀프여부"],
"상표": stations_raw["상표"]
})
stations.tail()
for eachAddress in stations["주소"]:
print(eachAddress.split())
stations["구"] = [eachAddress.split()[1] for eachAddress in stations["주소"]]
stations

stations = stations[stations["가격"] != "-"]
# 가격 데이터형 변환 object => float
stations["가격"] = stations["가격"].astype("float")
stations
stations.reset_index(inplace=True)
stations.tail()
del stations["index"]
del stations["level_0"]
stations.tail()
- outlier
이상치에는 (1) 일반 이상치(outliers)와 (2) 극단적인 점(extreme points) 두 가지 범주가 있습니다. Q3 + 1.5xIQR보다 큰 값 또는 Q1 - 1.5xIQR보다 작은 값은 이상치로 간주됩니다. Q3 + 3xIQR보다 큰 값 또는 Q1 - 3xIQR보다 작은 값은 극단적인 점(또는 극단적인 이상치)으로 간주됩니다.
[출 처] https://rpkgs.datanovia.com/rstatix/reference/outliers.html#:~:text=Boxplots%20are%20a%20popular%20and,points%20(or%20extreme%20outliers).
import matplotlib.pyplot as plt
import seaborn as sns
import platform
from matplotlib import font_manager, rc
get_ipython().run_line_magic("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("Unknown system")
stations.boxplot(column="가격", by="셀프", figsize = (12,8));
- 모든 셀프주유소가 더 싸진않지만, 평균적으로 셀프주유소가 더 싼 것을 확인할 수 있다.
plt.figure(figsize = (12, 8))
sns.boxplot(x ="셀프", y="가격", data=stations, palette="Set3")
plt.grid(True)
plt.show()
- seaborn을 사용하면 좀 더 시각적으로 예쁘게 그릴 수 있다
plt.figure(figsize = (12, 8))
sns.boxplot(x="상표", y="가격", hue="셀프", data = stations, palette="Set3")
plt.show()
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)
gu_data.head()
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"
)
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