시각화 라이브러리, Seaborn
스크래핑의 결과는 대부분 텍스트로 이루어져 있다. 그런데 텍스트 만으로 확인하기에는 인사이트를 얻기에 무리가 있다. 이러한 정보를 요약해서 한눈에 보여주는 방법으로 시각화(Visualization)를 활용한다.
Seaborn 라이브러리
matplotlib을 기반으로 하는 시각화 라이브러리이다. 다양한 그래프를 고수준(high-level) 즉, 짧은 코드로도 품질 좋은 시각화를 진행할 수 있다.
Seaborn 설치 및 불러오기
%pip install seaborn
import seaborn as sns
꺾은선 그래프(Line Plot)
lineplot을 통해 꺾은선 그래프를 그릴 수 있다.
sns.lineplot(x=[1, 3, 2, 4], y=[4, 3, 2, 1])
막대 그래프(Bar Plot)
barplot을 통해 막대그래프를 그릴 수 있다. 범주형 데이터의 값과 그 값의 크기를 직사각형으로 나타낸 그림이다.
sns.barplot(x=[1,2,3,4],y=[0.7,0.2,0.1,0.05])
Plot 속성
plot의 속성을 활용하기 위해 matplotlib 라이브러리를 사용해야 한다. matplotlib.pyplot의 속성을 변경해서 그래프에 다양한 요소를 변경/추가할 수 있다.
import matplotlib.pyplot as plt
- plt.title() : 그래프에 제목을 추가
- plt.xlabel(), plt.ylabel() : 그래프의 축에 설명을 추가
- plt.xlim(), plt.ylim() : 그래프의 축의 범위를 지정
- plt.figure(figsize = (x, y)) : 그래프의 크기를 지정
기상청 날씨 정보 시각화하기
https://www.weather.go.kr/w/weather/forecast/short-term.do << 실습을 진행할 웹 사이트
기상청 날씨 스크래핑
selenium을 활용해 기상청의 온도 텍스트를 불러오고, 해당 텍스트를 전처리하는 과정이다. 텍스트를 가져온 직후에는 줄 넘김(\n)과 섭씨 기호가 포함된 형태이다. 그래서 섭씨 기호를 제거하고, 줄 넘김을 기준으로 split하였다. 마지막으로 문자열을 정수로 형변환하여 마무리하였다.
from selenium import webdriver
from selenium.webdriver import ActionChains
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.actions.action_builder import ActionBuilder
from selenium.webdriver import Keys, ActionChains
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get("https://www.weather.go.kr/w/weather/forecast/short-term.do")
driver.implicitly_wait(0.5)
tmps = driver.find_element(By.ID, "my-tchart").text
print(tmps)
# result
# 15℃
# 15℃
# ...
# 12℃
# 14℃
tmps = [int(i) for i in tmps.replace("℃","").split("\n")]
print(tmps)
# result : [15, 15, 14, 13, 11, 10, 10, 9, 9, 8, 8, 7, 7, 7, 7, 7, 8, 9, 11, 12, 14]
기상청 날씨 시각화
import seaborn as sns
import matplotlib.pyplot as plt
plt.title("Temperature")
plt.ylim(min(tmps)-2, max(tmps)+2)
sns.lineplot(x = [i for i in range(len(tmps))], y = tmps)
해시코드 질문 태그 빈도 시각화
https://hashcode.co.kr << 실습을 진행할 웹 사이트
beautifulsoup을 활용하여 질문의 태그 빈도를 확인하는 실습을 진행한다.
질문 빈도 체크
페이지네이션을 활용하여 1~10 페이지에 사용된 태그별 개수를 수집한다. 과부하를 방지하기 위해 time 라이브러리를 사용하였다.
from bs4 import BeautifulSoup
import requests
import time
frequency = {}
for i in range(1, 11):
res = requests.get("https://hashcode.co.kr/?page={}".format(i), user_agent)
soup = BeautifulSoup(res.text, "html.parser")
ul_tags = soup.find_all("ul", "question-tags")
for ul in ul_tags:
li_tags = ul.find_all("li")
for li in li_tags:
tag = li.text.strip()
frequency[tag] = a.get(tag, 0) + 1
time.sleep(0.5)
상위 빈도 10개 추출
collections 라이브러리의 Counter를 활용하여 딕셔너리의 상위 요소를 쉽게 확인할 수 있다.
from collections import Counter
counter = Counter(frequency)
counter.most_common(10)
# result
# [('python', 145),
# ('c', 40),
# ('java', 40),
# ('c++', 26),
# ('javascript', 23),
# ('html', 16),
# ('coding-test', 16),
# ('pandas', 15),
# ('css', 10),
# ('error', 10)]
스크래핑 결과 시각화
import seaborn as sns
import matplotlib.pyplot as plt
x = [e[0] for e in counter.most_common(10)]
y = [e[1] for e in counter.most_common(10)]
plt.figure(figsize=(9, 5))
plt.title("Frequency")
plt.xlabel("Tag")
plt.ylabel("Frequency")
sns.barplot(x = x, y = y)
워드클라우드(Wordcloud)
워드클라우드란 자주 등장하는 텍스트나 중요도나 인기도를 고려해 표현한 것이다. 워드클라우드를 만들기 위한 과정은 다음과 같다.
- 자연어 문장에서 키워드 추출
- 키워드가 등장한 빈도 측정
- 전처리한 정보와 라이브러리를 바탕으로 생성
wordcloud, konlpy 라이브러리
wordcloud는 파이썬의 텍스트 클라우드 라이브러리이다. 이를 기반으로 텍스트 구름을 그릴 수 있다. konlpy는 한국어 형태소 분석기 라이브러리로 주어진 문장에서 명사 등을 뽑아 내는 데 사용할 수 있다.
Seaborn 설치 및 불러오기
%pip install wordcloud
%pip install konlpy
워드클라우드 생성
라이브러리 불러오기
# 시각화에 쓰이는 라이브러리
import matplotlib.pyplot as plt
from wordcloud import WordCloud
# 횟수를 기반으로 딕셔너리 생성
from collections import Counter
# 문장에서 명사를 추출하는 형태소 분석 라이브러리
from konlpy.tag import Hannanum
사용할 문자열 초기화
national_anthem = """
동해물과 백두산이 마르고 닳도록
하느님이 보우하사 우리나라 만세
무궁화 삼천리 화려 강산
대한 사람 대한으로 길이 보전하세
남산 위에 저 소나무 철갑을 두른 듯
바람 서리 불변함은 우리 기상일세
무궁화 삼천리 화려 강산
대한 사람 대한으로 길이 보전하세
가을 하늘 공활한데 높고 구름 없이
밝은 달은 우리 가슴 일편단심일세
무궁화 삼천리 화려 강산
대한 사람 대한으로 길이 보전하세
이 기상과 이 맘으로 충성을 다하여
괴로우나 즐거우나 나라 사랑하세
무궁화 삼천리 화려 강산
대한 사람 대한으로 길이 보전하세
"""
형태소(명사) 분석
Java가 설치되어 있지 않은 경우 실행 중 오류가 발생할 수 있다. 만약 Java 설치 이후에도 오류가 발생한다면, 환경 변수 Path에 jvm.dll의 경로를 추가해주어야 한다.
hannanum = Hannanum()
nouns = hannanum.nouns(national_anthem)
words = [noun for noun in nouns if len(noun) > 1]
counter = Counter(words)
워드클라우드 생성
font_path는 각자 다를 수 있으며, colab 환경에서는 그대로 적용해도 무방하다.
wordcloud = WordCloud(
font_path='/usr/share/fonts/truetype/nanum/NanumGothic.ttf',
background_color='white',
width=1000,
height=1000
)
img = wordcloud.generate_from_frequencies(counter)
plt.imshow(img)
워드클라우드 만들기 - 해시코드 질문 키워드
https://hashcode.co.kr << 실습을 진행할 웹 사이트
해당 페이지에서 질문 제목을 스크래핑한 후 형태소 분석을 진행해 워드클라우드를 그리는 실습을 진행한다.
질문 가져오기
import requests
from bs4 import BeautifulSoup
import time
questions = []
for i in range(1, 6):
res = requests.get("https://hashcode.co.kr/?page={}".format(i), {"User-Agent": user_agent})
soup = BeautifulSoup(res.text, "html.parser")
parsed_dates = soup.find_all("li", "question-list-item")
for data in parsed_dates:
questions.append(data.h4.text.strip())
time.sleep(0.5)
워드클라우드 생성
라이브러리 불러오기
# 시각화에 쓰이는 라이브러리
import matplotlib.pyplot as plt
from wordcloud import WordCloud
# 횟수를 기반으로 딕셔너리 생성
from collections import Counter
# 문장에서 명사를 추출하는 형태소 분석 라이브러리
from konlpy.tag import Hannanum
형태소(명사) 추출
hannanum = Hannanum()
words = []
for q in questions:
nouns = hannanum.nouns(q)
words += nouns
counter = Counter(words)
워드클라우드 생성
wordcloud = WordCloud(
font_path = '/usr/share/fonts/truetype/nanum/NanumGothic.ttf',
background_color = 'white',
width = 1000,
height = 1000,
)
img = wordcloud.generate_from_frequencies(counter)
plt.axis('off')
plt.imshow(img)
'[프로그래머스] 데이터 엔지니어링 데브코스 3기 > TIL(Today I Learn)' 카테고리의 다른 글
[TIL - 12일 차] 파이썬 장고 프레임웍을 사용해서 API 서버 만들기 (2) (0) | 2024.04.09 |
---|---|
[TIL - 11일 차] 파이썬 장고 프레임웍을 사용해서 API 서버 만들기 (1) (0) | 2024.04.08 |
[TIL - 9일 차] 데이터 엔지니어링 : 파이썬으로 웹 데이터를 크롤하고 분석하기 (4) (0) | 2024.04.04 |
[TIL - 8일 차] 데이터 엔지니어링 : 파이썬으로 웹 데이터를 크롤하고 분석하기 (3) (0) | 2024.04.03 |
[TIL - 7일 차] 데이터 엔지니어링 : 파이썬으로 웹 데이터를 크롤하고 분석하기 (2) (0) | 2024.04.02 |