뉴닉 물물교환: 사람들은 무엇에 의문을 표하나?

치섭·2021년 11월 25일
0

plotly charts

목록 보기
1/2
post-thumbnail

파이썬 plotly 파이차트 만들기

안녕하세요.
혹시 뉴닉이라는 구독 메일링 서비스를 아시나요?
시사 상식을 늘리고 싶다면 꼭 추천드리고 싶은 메일링 서비스입니다.
기사를 찾아 보지 않아도 세상을 알 수 있어요.

뉴닉에서 물물교환이라는 재미있는 프로젝트를 하더라구요.
물음표와 물음표 주고받기라는 프로젝트입니다.
https://mmgh.newneek.co/#question

뉴닉 물물 교환의 글들을 보다가 문득
사람들은 뭘 가장 궁금해하고, 고민할까? 라는 생각이 들었습니다.
그래서 크롤링으로 사람들의 질문들을 가져와서
가장 등장 빈도수가 높은 단어를 가지고 파이 그래프를 만들어보려고 합니다.

1. 크롤링하기

from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import chromedriver_autoinstaller
import time
from tqdm.auto import tqdm

# 크롬 버전에 맞춰 chromedriver 자동으로 다운로드하기
chrome_ver = chromedriver_autoinstaller.get_chrome_version().split('.')[0]
try:
    driver = webdriver.Chrome(f'./{chrome_ver}/chromedriver.exe')
except:
    chromedriver_autoinstaller.install(True)
    driver = webdriver.Chrome(f'./{chrome_ver}/chromedriver.exe')

# 데이터 가져올 url지정하고 셀레니움으로 페이지 열기
url='https://mmgh.newneek.co/#question'
driver.get(url)

# 무한 스크롤
prev_height = driver.execute_script("return document.body.scrollHeight")
while True:
    driver.execute_script("window.scrollTo(0,document.body.scrollHeight)")
    time.sleep(1)
    curr_height = driver.execute_script("return document.body.scrollHeight")

    if(curr_height == prev_height):
        break
    else:
        prev_height = driver.execute_script("return document.body.scrollHeight")

requests 라이브러리를 쓰면 더 빠른 크롤링이 가능한데
이 페이지는 페이지 스크롤을 통한 로딩으로 텍스트를 불러오는 식이라서
셀레니움으로 가져와야겠더라구요.
BeautifulSoup 라이브러리와 selenium,
크롬 드라이버를 버전에 맞춰 자동으로 다운로드 하기위한
chromedriver_autoinstaller 라이브러리를 import 했습니다.

2. 형태소 분석기로 명사만 추출하기

from eunjeon import Mecab
import operator

# 질문만 가져오기
box= ""
for val in tqdm(driver.find_elements_by_class_name('Comment_message__3UoSi')):
    box+= f"{val.text} "

# 형태소 분석기 불러오기
mecab = Mecab()

# 명사만 저장
word_rank = {}
for n in mecab.nouns(box):
    if n not in word_rank:
        word_rank[n]=1
    else:
        word_rank[n]+=1
    # 불용어 지정
    spwords = ['수','걸까','것','무엇','거','때','건','뉴','등','년','게','뭘까','걸까요','']
    try:
        for i in spwords:
            del word_rank[i]
    except:
        pass

word_rank = sorted(word_rank.items(), key=operator.itemgetter(1), reverse=True)


print(f'빈도수 상위 30개 단어는 다음과 같습니다.\n{word_rank[:30])}'

제가 사용한 형태소 분석기는 속도가 빠른 mecab입니다.
1번에서 가져온 데이터 중 명사만을 추출해 비어있는 box에 담고,
word_rank에 빈도수를 카운트해서 넣었어요.
spwords는 불용어로, 뜻이 있는 단어가 아닌 것은 제거해주었습니다.
operator 라이브러리를 이용해 word_rank의 value값에 따라 정렬을 해주었습니다

3. 반응형 파이차트 만들기

import pandas as pd
import plotly.offline
import plotly.express as px
df = pd.DataFrame(word_rank[:20], columns=['단어','빈도수'])
fig = px.pie(df, values='빈도수', names='단어', title='사람들은 무엇에 대해 고민할까?', labels= {'단어':'빈도수'}, hole=.4)
fig.update_traces(textposition='inside', textinfo='percent+label')
fig.show()
fig.write_html("./사람들은 무엇에 대해 고민할까.html")
fig.write_image(r'C:\Users\crowdparti\Downloads\사람들은 무엇에 대해 고민할까.jpeg')

pandas로 데이터를 테이블로 만들어 주고
plotly를 이용해 파이 차트를 만들었습니다.
도넛 차트를 좋아해서 도넛 모양으로 만들겠습니다.
너무 갯수가 많으니 상위 30개만 가지고 파이차트를 만들겠습니다.
그리고 write_html로 파일을 저장했습니다.

4. 결과물


velog 내에서 html을 삽입하는 방법이 없는건지 못찾은건지 ㅜㅜ
부득이하게 이미지로 대체합니다.

아무튼 이것이 그 결과물입니다.
https://blog.naver.com/rlahatnr/222558288361
위의 블로그에서 html 파일을 다운받으시면 반응형 그래프를 확인할 수 있습니다.

우선 뉴니커들이 가장 의문을 많이 표한 것은 "사람"이라는 것을 알 수 있었네요.
'나'와 '내'가 상위권에 자리한 걸로 보아 나 자신에 대한 생각들이 주를 이뤘다는 것을 알 수 있었습니다.
우리, 행복, 인간, 세상, 사회 등 사회에 대한 고민들도 보이고
꿈, 방법, 존재, 마음, 사랑 같은 추상적이고 철학적인 생각들도 찾아 볼 수 있네요.

5. 느낀점

문득 사람들이 물물교환에 내놓은 생각은 무엇이 있을지 궁금해져서
재미삼아 해보았는데 흥미로운 결과가 나왔네요.

저는 항상 고민이었던 "구걸하는 아이들에게 적선을 하지 않으면 정말 아이들이 학교에 갈 수 있을까?"를 물물교환에 내놓았습니다.

여행을 가면 관광지에서 제발 1달러만 달라고 하는 아이들이나
자기보다 더 어린 동생의 손을 잡고 길거리에서 아세톤을 입에 머금고 불쇼를 하는 아이들을 쉽게 볼 수 있는데,
이 아이들에 대한 국가의 정책은 여행객들에게 적선을 하지 않을 것을 권고하는 것이더라구요.

관광지에 아예 표지판이 있었어요. [아이들에게 적선하지 마시오.]
아이들이 구걸로 생활을 유지할 수 있다는걸 알게되면 학교를 못가게 된다구요.
하지만 제가 적선을 하지 않는다고 애들이 정말 학교에 갈 수 있을까요?
당장 형편이 어려워 길거리로 내몰린 아이들이잖아요...

이게 항상 저의 딜레마였거든요. 내가 뭘 할 수 있을지도 궁금했고요.
저는 이게 궁금했는데 다른 분들도 '사람'에 대한 의문을 갖고 계셨군요.

다른 사람들의 생각을 엿볼 수 있었던 재미있는 결과였습니다.
다음에는 노래 제목에 가장 많이 들어가는 단어가 무엇인지 찾아보려고 합니다.

읽어주셔서 감사합니다!

profile
주니어 웹개발자

0개의 댓글