홍카나의 공부방

[DE 데브코스] 04.21 TIL - 야구 잘하는 팀 시각화, Seaborn, WordCloud 본문

Data Engineering/프로그래머스 데브코스

[DE 데브코스] 04.21 TIL - 야구 잘하는 팀 시각화, Seaborn, WordCloud

홍문관카페나무 2023. 4. 21. 13:40

Seaborn

  • Jupyter Notebook이나 Colab 환경을 이용하면 시각화를 보다 편리하게 진행할 수 있다.
  • 하지만 오랜만에 코랩이나 쥬피터를 켜기 귀찮으므로(...) VSCODE로 시각화를 진행한다.
  • VSCODE로 시각화를 이용하려면 VSCODE Extension에서 `Jupyter` Extension을 설치해야 한다.

 

vscode visualization

  • 그리고 파일 맨 위에 `#%%`을 추가하고, `Run Cell`을 누르면 시각화가 진행된다.

 

시각화 된 과정

 

  • 임의로 시각화 코드를 작성하여 VScode를 통한 시각화를 진행하였다. 코드는 다음과 같다.
# %%
import seaborn as sns
import matplotlib.pyplot as plt

# 한글 폰트 사용을 위한 세팅
from matplotlib import font_manager, rc
font_path = "C:/Windows/Fonts/NGULIM.TTF"
font = font_manager.FontProperties(fname=font_path).get_name()
rc('font', family=font)

# 꺾은선 그래프(Line plot) : continuous
# sns.lineplot(x=[1, 3, 2, 4], y=[10, 20, 10, 5])

# 막대 그래프(Bar Plot) : categorical
sns.barplot(x=["1Q", "2Q", "3Q", "4Q"], y=[120, 60, 30, 400])
plt.title("분기별 영업이익(OP) 추이")
plt.xlabel("분기")
plt.ylabel("억원")
#plt.ylim(50, 150)  # y값의 범위 설정

plt.figure(figsize=(12, 8))
plt.show()
# %%

 

스크래핑 결과 시각화하기(1)

  • 다음은 기상청에서 기온을 스크래핑 한뒤에 시각화하는 코드다.
# %%
import seaborn as sns
import matplotlib.pyplot as plt
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from matplotlib import font_manager, rc

# 한글 폰트 사용을 위한 세팅
font_path = "C:/Windows/Fonts/NGULIM.TTF"
font = font_manager.FontProperties(fname=font_path).get_name()
rc('font', family=font)

chrome_options = Options()
chrome_options.add_experimental_option("detach", True)
chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"])

driver = webdriver.Chrome(service=Service(
    ChromeDriverManager().install()), options=chrome_options)

driver.get("https://www.weather.go.kr/w/weather/forecast/short-term.do")
driver.implicitly_wait(1)
temps = driver.find_element(By.ID, "my-tchart").text
temps = [int(i) for i in temps.replace("℃", "").split("\n")]
print(temps)

sns.lineplot(
    x=[i for i in range(len(temps))],
    y=temps
)
plt.title("이번주의 날씨")
plt.show()

# %%

결과, 잘 나온다.

 

 


 

스크래핑 결과 시각화하기(2) - 야구 잘하는 팀 시각화 하기

  • 2010년부터 2022년까지 어느 팀이 야구를 잘했나 궁금했다.
  • 그래서 어느 팀이 근본이 있는지 웹 스크래핑을 이용하여 시각화를 진행하려고 한다.
  • 다음은 네이버 스포츠 - 야구 순위에서 2010년부터 2019년까지 4위 안에 속한 팀들을 추출하고
  • 2020년부터 2022년까지는 5위 안에 속한 팀을 추출하는 코드다.
# %%
import seaborn as sns
import matplotlib.pyplot as plt
import requests
import time
from bs4 import BeautifulSoup
from matplotlib import font_manager, rc

# 한글 폰트 사용을 위한 세팅
font_path = "C:/Windows/Fonts/NGULIM.TTF"
font = font_manager.FontProperties(fname=font_path).get_name()
rc('font', family=font)


freq = {}

# 2010년부터 2022년까지, 2020년부터는 5위도 포함
for i in range(0, 10):
    res = requests.get(
        f"https://sports.news.naver.com/kbaseball/record/index?category=kbo&year=201{i}")
    soup = BeautifulSoup(res.text, "html.parser")

    title = []
    for j in range(1, 5):
        title.append(soup.select(
            f"#regularTeamRecordList_table > tr:nth-child({j}) > td.tm > div span ")[1].text)
    for t in title:
        if t not in freq:
            freq[t] = 1
        else:
            freq[t] += 1
    time.sleep(0.33)

for i in range(0, 3):
    res = requests.get(
        f"https://sports.news.naver.com/kbaseball/record/index?category=kbo&year=202{i}")
    soup = BeautifulSoup(res.text, "html.parser")

    title = []
    for j in range(1, 6):
        title.append(soup.select(
            f"#regularTeamRecordList_table > tr:nth-child({j}) > td.tm > div span ")[1].text)
    for t in title:
        if t not in freq:
            freq[t] = 1
        else:
            freq[t] += 1
    time.sleep(0.33)

# SK와 SSG 합산, 넥센과 키움 합산
freq['SSG'] += freq["SK"]
freq['키움'] += freq["넥센"]

del freq["SK"]
del freq["넥센"]

freq = dict(sorted(freq.items(), key=lambda x: x[1], reverse=True))
print(freq)

x = [k for k in freq]
y = [v for v in freq.values()]

plt.figure(figsize=(12, 8))
plt.title("누가 야구를 잘했나?")
plt.ylabel("4~5위 안에 든 횟수")
plt.xlabel("팀 이름")
sns.barplot(x=x, y=y)
plt.show()
# %%

두산 > 키움 > 삼성 = LG > SSG 순서

 

  • 역시 최강두산답게 2010년부터 두산이 제일 잘했다. 그런데 작년 9등 찍은 이후에는 기대가 안 간다.
  • 두산의 팀 컬러는 원래 병살 치더라도 강공하는 팀이었는데, 어울리지 않게 무사 2루에 번트 작전은 안 냈으면 좋겠다.
  • 은근히 키움도 가을야구에 꾸준히 출석한 것을 볼 수 있다. 우승을 못했다..
  • 한화는 애도를 표한다.
  • 야구 순위 분석은 강의에 나온 내용은 아니나, 내가 직접 학습한 내용을 활용하여 임의로 만들어본 코드다.

 

 


 

Wordcloud, konlpy

  • wordcloud는 파이썬의 텍스트 클라우드 라이브러리다. 텍스트 구름을 그릴 수 있다.
  • konlpy는 한국어 형태소 분석기 라이브러리로, 주어진 문장에서 명사 등을 뽑아내는 데 사용한다. (Hannanum)
  • KoNLPy로 한국어 문장을 전처리하고, Counter를 이용해 빈도수를 측정하며, WordCloud를 이용해 시각화한다.
  • 코드는 다음과 같다.
# %%
import matplotlib.pyplot as plt
from wordcloud import WordCloud
from collections import Counter
from konlpy.tag import Hannanum

news_content = """
올해 1분기 현대로템 전차 수출 실적이 전년 동기 대비 8800% 이상 증가한 것으로 나타났다. K2 흑표전차 완제품 해외 납품이 본격적으로 이뤄지면서 기저효과 영향으로 높은 증가율을 기록한 것이다. 일부 가상화폐 폭등에 버금가는 성장률로 올해 현대로템 실적에 대한 기대감을 높인다.
최근 입수한 수출 통관 집계 자료에 따르면 현대로템 올해 1분기 방산부문(디펜스솔루션) 수출 실적은 약 2361억 원(1억7733만 달러, 환율 4월 19일 기준)이다. 작년 1분기(약 27억 원, 199만 달러)에 비해 약 8811.1% 증가한 수치다.
현대로템은 올해 K2 전차 5대를 폴란드에 인도했다고 밝힌 바 있다. 완제품 해외 납품이 이뤄지면서 수출 실적이 크게 성장했다. 월별로는 1월 958억 원, 2월 23억 원, 3월 1381억 원 수준으로 집계됐다. 해당 수치는 통관 기준 수출 실적이기 때문에 실제 매출 실적과는 차이가 있다. 현대로템에 따르면 전차의 경우 납품 이후 고객사로부터 검수에 합격하면 매출 실적으로 잡힌다. 제품 통관 과정에서 잡히는 수출 실적과 매출 반영 시점이 다르기 때문에 회사가 발표하는 분기 실적과 통관 과정에서 잡히는 수출 실적이 다르게 집계될 수 있다. 하지만 통관을 거쳐 집계되는 수출 실적을 통해 향후 반영될 매출 규모 등을 미리 가늠해볼 수 있다.
현대로템 관계자는 “각 부문별 통관 수출 실적은 공개하지 않고 공시 예정인 실적에서도 8000%에 달하는 성장률이 잡히는 항목은 없을 것”이라며 “다만 관세청 등에 확인한 결과 통관을 거친 수출 실적은 기저효과로 인해 해당 규모 수치가 나올 수 있는 것으로 확인했다”고 설명했다.
이 기간 철도부문(레일솔루션) 수출(통관 기준) 실적은 약 1560억 원(1억1715만 달러)을 기록했다. 전년(약 2767억 원, 2억770만 달러) 대비 43.6%가량 줄어든 것으로 집계됐다. 철도부문 역시 지난 2018년 분기 수출 실적이 4000% 넘게 증가한 적이 있다. 중국 업체들이 덤핑 수준 저가 수주에 나서면서 2017년 현대로템이 타격을 받았고 이에 따른 기저효과 탓이다.
방산(전차)과 철도부문 수출 실적을 종합하면 극적인 효과는 떨어진다. 철도부문 부진을 방산부문이 메웠다. 올해 1분기 방산과 철도부문 총 수출 실적은 약 3923억 원(2억9448만 달러, 에코플랜트 제외)으로 전년(약 2793억 원, 2억970만 달러) 대비 약 40.4% 증가한 것으로 집계됐다.
내수와 수출, 에코플랜트사업 등을 포함한 전체 실적도 비슷한 추이를 보이면서 방산 수출 증가에 힘입어 수익성이 대폭 개선될 전망이다. 업계에서는 현대로템이 올해 1분기 매출 8220억 원, 영업이익 400억 원의 실적을 거둘 것으로 보고 있다. 매출은 전년(6770억 원) 대비 21.4%, 영업이익(전년 240억 원)은 70.1% 증가한 실적을 기록할 것으로 예상하고 있다. 부문별 매출 실적은 수출 통관 실적과 마찬가지로 철도부문(약 4010억 원, 7.5% 감소)은 줄고 방산부문(약 3510억 원, 92.1% 증가)은 성장할 것으로 전망했다. 여기에 에코플랜트사업도 매출이 14.6% 증가한 710억 원 수준으로 전체 실적에 힘을 보탤 것으로 내다봤다.
올해 연간 실적도 긍정적으로 전망하고 있다. 철도부문이 3분기까지 부진하지만 방산부문 매출이 꾸준히 성장세를 이어가 연간 3조6920억 원 수준 매출 실적을 기록할 것으로 분석했다. 2022년(3조1530억 원) 대비 16.7%가량 늘어난 수치다. 또한 방산수출 증가에 따라 영업이익은 약 63.7% 증가한 2410억 원 수준을 기록할 것으로 예상하고 있다.
업계 관계자는 “상대적으로 마진율이 높은 전차 수출이 본격화되면서 현대로템 전체 실적을 끌어올릴 것”이라며 “폴란드에 이어 루마니아 등 추가 수주 가능성까지 열려 있어 실적 성장세가 지속될 것으로 전망하고 있다”고 말했다. 현대로템은 현재 1000대 규모 K2 전차를 폴란드에 공급하는 사업을 진행하고 있다. 납품은 국내 생산 수출과 현지 생산으로 이뤄진다. 이달 초 컨소시엄 이행합의서를 체결하고 본격적으로 본 계약 협상에 돌입한 상태다. K2 전차 폴란드 현지 생산을 위한 구체적인 협의도 이뤄지고 있다.
납품되는 전차 모델의 경우 총 1000대 중 180대는 한국형과 동일하고 820대는 폴란드형(K2PL) 모델로 공급될 예정이다. 폴란드형인 K2PL에는 원격조종기관총탑(RCWS)과 대전차 로켓 및 미사일 방호체계 등이 더해지는 것으로 알려졌다. 생산 방식은 K2PL 전차 820대 중 320대가 국내에서 생산돼 납품되고 나머지 500대는 현지 생산으로 공급될 예정이다.
한편 지난 17일 동아일보는 폴란드 국영 방산업체 PGZ를 이끄는 세바스티안 흐바웨크 회장이 방한한다고 단독보도를 통해 밝힌 바 있다. 보도에 따르면 세바스티안 흐바웨크 회장은 현대로템 K2 전차 등 계약한 제품들의 생산시설을 점검하고 20조 원 넘는 규모의 추가 수출계약과 관련한 막바지 조율을 위해 한국을 방문했다. 방한 기간 흐바웨크 회장은 현대로템과 현대자동차그룹 남양연구소, 한화에어로스페이스, 한국항공우주산업(KAI) 등을 방문하는 것으로 알려졌다. PGZ는 31개 폴란드 국영방산업체들을 통합한 방산그룹이다.
"""

hanna = Hannanum()
nouns = hanna.nouns(news_content)
counter = Counter(nouns)

wc = WordCloud(font_path="C:/Windows/Fonts/NGULIM.TTF", background_color="white", height=1600, width=1600)
img = wc.generate_from_frequencies(counter)
plt.imshow(img)

# %%

결과

 

 

오늘 공부하며 어려웠던 내용

  • 예전에 Kaggle이나 투자 학회 활동하면서 시각화를 좀 다뤄봤기에 어렵진 않았다.

 

반응형