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
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()
'Database & Data > 데이터 분석' 카테고리의 다른 글
reduce와 lambda를 통한 데이터프레임 merge 함수 (0) | 2023.05.05 |
---|---|
데이터 크롤하고 분석(Jupyter Lab) - 6 (0) | 2023.04.20 |
데이터 크롤하고 분석(Seleniuum) - 5 (0) | 2023.04.20 |
데이터 크롤하고 분석(정적 페이지와 동적 페이지) - 4 (0) | 2023.04.19 |
데이터 크롤하고 분석(BeautifulSoup) - 3 (0) | 2023.04.19 |