개발로 자기계발
728x90

1) Python 시각화 종류

- Matplotlib: 가장 많이 사용되는 데이터 시각화 라이브러리 중 하나이며, 다양한 유형의 그래프를 그릴 수 있다.

- Seaborn: Matplotlib에 기반을 두고 있지만, 더 간단한 인터페이스와 예쁜 그래픽 디자인을 제공하여 통계적인 분석을 위한 그래프 작업을 수행할 때 유용하다.

- Plotly: 인터랙티브 그래프를 그리는 데 특화된 라이브러리이며, 웹에서 그래프를 공유하거나 웹 애플리케이션에서 사용할 수 있다.
- Bokeh: Plotly와 유사하게 인터랙티브 그래프를 그리는 데 특화된 라이브러리다.
- ggplot: R의 ggplot2 패키지에서 영감을 받아 만든 라이브러리로, 그래픽 디자인을 중심으로 한 라이브러리다.
- Altair: Declarative 한 방식으로 그래프를 그리는 라이브러리로, 데이터 분석을 위한 시각화를 간편하게 수행할 수 있다.
- Holoviews: 다양한 유형의 그래프를 그리는 데 사용되는 라이브러리다. 다른 라이브러리들과 함께 사용되는 경우가 많다.

 

* 시각화 시 한글이 깨진다면?

import matplotlib as mpl
from matplotlib import font_manager, rc


# 한글 폰트 파일 경로를 지정하고, 폰트 이름을 가져온다.
font_path = 'malgun.ttf'
font_name = font_manager.FontProperties(fname=font_path).get_name()

# 폰트 이름을 사용하여 matplotlib의 폰트 설정
rc('font', family=font_name)

# matplotlib에서 유니코드 마이너스 기호를 제대로 표시하기 위해 설정
mpl.rcParams['axes.unicode_minus'] = False

malgun.ttf
4.14MB

 

2) Lineplot으로 보는 seaborn 예시

- 기본 선 그리기

import seaborn as sns
import matplotlib.pyplot as plt

x = [1, 2, 3, 4]
y = [4, 3, 2, 1]

sns.lineplot(x=x, y=y)
plt.show()

- x, y 데이터에 색상, 스타일, 라벨 등 옵션 추가하기

import seaborn as sns
import matplotlib.pyplot as plt

x = [1, 2, 3, 4]
y = [4, 3, 2, 1]

sns.lineplot(x=x, y=y, color='red', marker='o', linestyle='dashed')
plt.xlabel('X-axis label')
plt.ylabel('Y-axis label')
plt.title('Line plot title')
plt.show()

- 다중 데이터 그래프 그리기

import seaborn as sns
import matplotlib.pyplot as plt

x1 = [1, 2, 3, 4]
y1 = [4, 3, 2, 1]
x2 = [1, 2, 3, 4]
y2 = [2, 3, 4, 5]

sns.lineplot(x=x1, y=y1, color='red', marker='o', linestyle='dashed', label='Line 1')
sns.lineplot(x=x2, y=y2, color='blue', marker='x', linestyle='solid', label='Line 2')
plt.xlabel('X-axis label')
plt.ylabel('Y-axis label')
plt.title('Multiple line plot title')
plt.legend()
plt.show()

- Seaborn 스타일 적용하기

import seaborn as sns
import matplotlib.pyplot as plt

sns.set_style('darkgrid')

x = [1, 2, 3, 4]
y = [4, 3, 2, 1]

sns.lineplot(x=x, y=y, color='red', marker='o', linestyle='dashed')
plt.xlabel('X-axis label')
plt.ylabel('Y-axis label')
plt.title('Styled line plot title')
plt.show()

 

3) 스크래핑을 통한 시각화 실습(기상청 온도) - Lineplot 사용

 

- 라이브러리 삽입

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support.expected_conditions import presence_of_element_located

- 온도 스크래핑

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get("https://www.weather.go.kr/w/weather/forecast/short-term.do")

element = WebDriverWait(driver, 2).until(presence_of_element_located((By.ID, 'my-tchart'))).text
temps = element.replace("℃","").split("\n")
temps = [int(i) for i in temps]

driver.close()

print(temps)

- Line plot 그리기

import seaborn as sns

sns.lineplot(
    x = [i for i in range(len(temps))],
    y = temps
)

- y값 조정과 타이틀 붙이기

import matplotlib.pyplot as plt

plt.ylim(min(temps)-2, max(temps) + 2)
plt.title("Expected Temperature from now on")

sns.lineplot(
    x = [i for i in range(len(temps))],
    y = temps
)

 

4) 스크래핑을 통한 시각화 실습(프로그래머스 커뮤니티) - Barplot 사용

 

- 달려있는 Tag들을 가져와보자

import requests as req
from bs4 import BeautifulSoup as bs


res = req.get("https://hashcode.co.kr", user_agent)
soup = bs(res.text, 'html.parser')
tags = soup.find_all("ul", "question-tags")

for tag in tags:
    li_tags = tag.find_all("li")
    for li_tag in li_tags:
        print(li_tags.text.strip())

- 페이지들을 돌며 태그들의 빈도수를 dict형태로 만든다.

import time

frequency = {}

for i in range(1, 10):
    res = req.get(f"https://hashcode.co.kr/?page={i}", user_agent)
    soup = bs(res.text, 'html.parser')
    ul_tags = soup.find_all("ul", "question-tags")

    for ul_tag in ul_tags:
        li_tags = ul_tag.find_all("li")
        for li_tag in li_tags:
            tag = li_tag.text.strip()
            if tag not in frequency:
                frequency[tag] = 1
            else:
                frequency[tag] += 1
    
    time.sleep(0.5)

- Counter를 사용해 가장 빈도가 높은 value들을 추출한다.

from collections import Counter

counter = Counter(frequency)
counter.most_common(10)

- Barplot()으로 태그의 빈도수를 시각화해본다.

import seaborn as sns
import matplotlib.pyplot as plt

plt.figure(figsize=(20,10))
plt.xlabel("Tag")
plt.ylabel("Frequency")
plt.title("Frequency of question in Hashcode")


x = [x[0] for x in counter.most_common(10)]
y = [y[1] for y in counter.most_common(10)]

sns.barplot(
    x=x,
    y=y
           )
           
plt.show()
728x90
SMALL
profile

개발로 자기계발

@김잠봉

틀린부분이나 조언이 있다면 언제든 환영입니다:-)