[원티드 프리온보딩 데이터 분석 챌린지] 1주차 1일 - BigQuery와 Colab을 이용한 WordCloud 생성

김경남·2023년 3월 6일
0

프리온보딩

목록 보기
1/2
post-thumbnail

3월 데이터 챌린지

💾EDA에서 시작해 프로덕트 분석까지

1. BigQuery

  • 장점
    • Google Cloud Platform에서 제공하는 서비스이기 때문에 설치가 필요없음
    • 2단계 인증을 통한 데이터 보호 가능
    • 타 구글 플랫폼과 연동이 용이 (ex. Colab, Google Sheets)
    • 빠른 속도
    • 경쟁업체 대비 저렴한 가격

  • 단점
    • 수시로 데이터를 업데이트 해야하는 경우 부적합(ex. OLTP-온라인 트랜잭션 처리)

BigQuery 가입하기


Google 플랫폼 기반의 서비스답게 무료로 사용 가능하다.
간단한 신상정보와 결제용 카드(실제로 결제되진 않음)를 등록하면 바로 이용할 수 있다.

데이터 추가 및 데이터테이블 생성

데이터 추가


데이터 추가 버튼을 누르면 데이터 추가창으로 이동된다.

오늘 강의에선 미리 제공된 CSV파일을 이용해 진행하였기 때문에 별도의 데이터 수집과정이 생략되었다.

로컬파일 업로드를 클릭하면 다음과 같은 화면이 나오는데

Google Sheets와 연동해 url만 입력하면 데이터 업로드가 된다.

차근차근히 데이터세트와 테이블을 지정해주면 된다.

데이터세트 생성

데이터세트 ID에 원하는 내용을 기입하고 데이터 세트를 만든다.

테이블이름도 원하는대로 설정하면 된다.

스키마 설정


헤드를 지운 데이터셋이 업로드 되었기 때문에 직접 수기로 기입한다.

데이터타입의 유형과 NULL여부또한 직접 설정 가능하기 때문에 아주 편리하고, 데이터의 설명도 적어줄 수 있다.

보기만 해도 끔찍하다!

설정이 완료되었으면 테이블 만들기 버튼만 눌러주면 된다.


이렇게 생성된 데이터 테이블을 새 탭에서 열어 쿼리를 작성하자.

Query 작성

SELECT * 
FROM `psychic-coral-351101.wanted_data_challenge.wanted_position` 
LIMIT 1000

처음 쿼리문이 열리면 SELECT절에 *가 빠진 쿼리가 있다. 넣어주고 실행하면 결과가 나온다.

EDA

JD(Job Description)에 있는 주요업무, 자격요건, 우대사항을 분리하여 각각의 컬럼으로 생성하는 과정을 진행할것이다.

SELECT
position_id  
, position
  , SPLIT(SPLIT(jd, '주요업무')[safe_offset(1)], '자격요건')[safe_offset(0)] AS responsibilities 
  , SPLIT(SPLIT(SPLIT(jd, '주요업무')[safe_offset(1)], '자격요건')[safe_offset(1)], '우대사항')[safe_offset(0)] AS requirements
  , SPLIT(SPLIT(SPLIT(SPLIT(jd, '주요업무')[safe_offset(1)], '자격요건')[safe_offset(1)], '우대사항')[safe_offset(1)], '혜택 및 복지')[safe_offset(0)] AS preference
  , annual_from 
  , annual_to  
  , GENERATE_ARRAY(annual_from, annual_to, 1) AS target_annual 
  FROM wanted_data_challenge.wanted_position
#WHERE 쓰지 않도록 하겠습니다.


#position_id |  position  | responsibilities | requirements | preference | annual_from | annual_to | target_annual 
# 회사소개 , 주요업무, 자격요건, 우대사항, 복지 및 혜택 

SPLIT을 사용했을때 에러를 방지하고 NULL값을 리턴하기 위해 safe_offset()을 사용한다.
(사실 이때쯤 Google Sheets의 계정권한 부여문제로 인해 제대로 못들어서 식은땀이 났다.)

  • 실행 결과

만들어진 쿼리결과 창의 '데이터 탐색' 버튼을 눌러 'Colab 노트북으로 탐색'을 누르면 편하게 연동이 가능하다.

2. Colab 준비

Colab창이 새탭에서 열리며 다음과 같은 화면이 나온다.

갑작스런 영어의 등장에 눈이 살짝 돌아가는 느낌이 들지만 당황하지 않고 모든 셀을 작동시켜주면 혼자 이거저거 임포트하고 데이터프레임으로 만들고


마지막 셀에서 describe()메서드까지 실행되며 데이터프레임의 통계치를 볼 수 있다.

총 388개의 공고에서 평균 2.6년에서 11.3년까지의 경력을 모집함을 알 수 있다.

다만 annual_to 컬럼의 최대값이 99년차(!)기 때문에 평균이 상당히 올라갔을 것이라고 추측 가능하다.

3. 데이터 시각화

시각화에 사용할 KR-WordRank패키지를 인스톨

!pip install krwordrank #wordcloud 

데이터시각화에 필요한 패키지를 임포트

import pandas as pd
import matplotlib.pyplot as plt
from krwordrank.word import KRWordRank
import numpy as np

아까 만들어진 원본데이터의 손상을 피하고 NULL값으로 인한 에러를 막는 작업을 진행한다.

df = results.copy() # results 복사 dataframe

df.head(5)

df['responsibilities'] = df['responsibilities'].replace(np.nan, '없음')
df['requirements'] = df['requirements'].replace(np.nan, '없음')
df['preference'] = df['preference'].replace(np.nan, '없음')

주요업무의 시각화를 위해 값들을 list로 변화시킨다.

texts = df["responsibilities"].values.tolist() 
print(texts)

단어 추출 함수, 빈도 rank, 그래프를 추출한다.

wordrank_extractor = KRWordRank(
    min_count = 3, # 단어 최소 출현 빈도수
    max_length = 15, # 단어의 character 길이의 최대 값
    verbose = True
)

beta = 0.85  
max_iter = 10

keywords, rank, graph = wordrank_extractor.extract(texts, beta, max_iter) 


stopwords = {'대한','분이면', '있습니다.','분석','데이터', '위한', 'and', '통해', '통한','있는','the','to','in','for','of'}  
passwords = {word:score for word, score in sorted(keywords.items(), key=lambda x:-x[1])[:100] if not (word in stopwords)}  
for word, r in sorted(passwords.items(), key = lambda x:x[1], reverse = True)[:30] : 
  print((word, r))

또한 불용어를 지정해 데이터 분석에 무의미하거나 너무 자주 나타나는 단어(ex.데이터)를 제거해 분석을 용이하게 만들었다.

WordCloud

WordCloud는 한글을 사용할 시 깨지기 때문에 사전 작업이 필요하다.

#한글폰트 지원이 되지 않기 때문에 별도로 이걸 깔아줘야한다.
import matplotlib as mpl
import matplotlib.pyplot as plt
 
%config InlineBackend.figure_format = 'retina'
 
!apt -qq -y install fonts-nanum
 
import matplotlib.font_manager as fm
fontpath = '/usr/share/fonts/truetype/nanum/NanumBarunGothic.ttf'
font = fm.FontProperties(fname=fontpath, size=9)
plt.rc('font', family='NanumBarunGothic') 

오늘 이 작업을 위해 달려왔다. WordCloud를 생성하자.

from wordcloud import WordCloud
from wordcloud import ImageColorGenerator


wc = WordCloud(font_path = fontpath, width = 1000, height = 1000, scale = 3.0, max_font_size = 250)
gen = wc.generate_from_frequencies(passwords)
plt.figure()
plt.imshow(gen)

익숙한 워드클라우드결과창이 나온다.

'비즈니스 서비스를 기반으로 다양한 지표를 추출하고 가설을 설계하여 도출된 결과를 통해 인사이트를 도출해 문제를 개선한다.'

슥 훑어보고 조합만 했는데 항상 구인공고에서 보이던 느낌의 문장이 나왔다.

자격요건과 우대조건또한 같은 방식으로 코드를 작성해 워드클라우드를 만든다.

req = df['requirements'].values.tolist() 
print(req)

wordrank_extractor = KRWordRank(
    min_count = 3, # 단어 최소 출현 빈도수
    max_length = 15, # 단어의 character 길이의 최대 값
    verbose = True
)

beta = 0.85  
max_iter = 10

keywords, rank, graph = wordrank_extractor.extract(req, beta, max_iter) # texts만 req로 바꾸면 된다.


stopwords = {'대한','분이면', '있습니다.','분석','데이터', '위한', 'and', '통해', '통한','있는','the','to','in','for','of'}  #불용어도 새로 설정한다.
passwords = {word:score for word, score in sorted(keywords.items(), key=lambda x:-x[1])[:100] if not (word in stopwords)}  
for word, r in sorted(passwords.items(), key = lambda x:x[1], reverse = True)[:30] : 
  print((word, r))

SQL과 Cohort A/B테스트 등등 필요한 자격요건에 대해 알 수있다.

역시 같은 방법으로 우대조건을 시각화 하면

Google(아마도 Google Analytics), Tableau, R, Python같은 웹분석 서비스와 BI툴을 사용한 시각화가 가능하다면 우대조건에 해당될 가능성이 높아보인다.

4. 결론

오늘의 강의는 시간이 모자라 저연차에 대한 분석은 진행하지 못했다.

BigQuery를 사용한 쿼리작성부터 Colab을 사용한 시각화까지 진행하며 느낀점은 Google Cloud Platform의 연동성, 그리고 그 연동성에서 오는 압도적인 편리함이 놀라웠다.

Oracle을 사용할 땐 데이터테이블 생성과정에서 일일히 데이터 유형을 지정하고, NULL가능 여부도 컬럼마다 지정해주는 과정이 불편했는데 BigQuery에선 GUI방식으로 굉장히 편하게 스키마를 짤 수있었다.

📒 과제

오늘 진행하지 못한 저연차 공고로 직접 WordCloud를 생성하고 EDA report를 작성

profile
초보 데이터분석가(희망)

0개의 댓글