Google 플랫폼 기반의 서비스답게 무료로 사용 가능하다.
간단한 신상정보와 결제용 카드(실제로 결제되진 않음)를 등록하면 바로 이용할 수 있다.
데이터 추가 버튼을 누르면 데이터 추가창으로 이동된다.
오늘 강의에선 미리 제공된 CSV파일을 이용해 진행하였기 때문에 별도의 데이터 수집과정이 생략되었다.
로컬파일 업로드를 클릭하면 다음과 같은 화면이 나오는데
Google Sheets와 연동해 url만 입력하면 데이터 업로드가 된다.
차근차근히 데이터세트와 테이블을 지정해주면 된다.
데이터세트 ID에 원하는 내용을 기입하고 데이터 세트를 만든다.
테이블이름도 원하는대로 설정하면 된다.
헤드를 지운 데이터셋이 업로드 되었기 때문에 직접 수기로 기입한다.
데이터타입의 유형과 NULL여부또한 직접 설정 가능하기 때문에 아주 편리하고, 데이터의 설명도 적어줄 수 있다.
보기만 해도 끔찍하다!
설정이 완료되었으면 테이블 만들기 버튼만 눌러주면 된다.
이렇게 생성된 데이터 테이블을 새 탭에서 열어 쿼리를 작성하자.
SELECT *
FROM `psychic-coral-351101.wanted_data_challenge.wanted_position`
LIMIT 1000
처음 쿼리문이 열리면 SELECT절에 *가 빠진 쿼리가 있다. 넣어주고 실행하면 결과가 나온다.
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 노트북으로 탐색'을 누르면 편하게 연동이 가능하다.
Colab창이 새탭에서 열리며 다음과 같은 화면이 나온다.
갑작스런 영어의 등장에 눈이 살짝 돌아가는 느낌이 들지만 당황하지 않고 모든 셀을 작동시켜주면 혼자 이거저거 임포트하고 데이터프레임으로 만들고
마지막 셀에서 describe()메서드까지 실행되며 데이터프레임의 통계치를 볼 수 있다.
총 388개의 공고에서 평균 2.6년에서 11.3년까지의 경력을 모집함을 알 수 있다.
다만 annual_to 컬럼의 최대값이 99년차(!)기 때문에 평균이 상당히 올라갔을 것이라고 추측 가능하다.
시각화에 사용할 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는 한글을 사용할 시 깨지기 때문에 사전 작업이 필요하다.
#한글폰트 지원이 되지 않기 때문에 별도로 이걸 깔아줘야한다.
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툴을 사용한 시각화가 가능하다면 우대조건에 해당될 가능성이 높아보인다.
오늘의 강의는 시간이 모자라 저연차에 대한 분석은 진행하지 못했다.
BigQuery를 사용한 쿼리작성부터 Colab을 사용한 시각화까지 진행하며 느낀점은 Google Cloud Platform의 연동성, 그리고 그 연동성에서 오는 압도적인 편리함이 놀라웠다.
Oracle을 사용할 땐 데이터테이블 생성과정에서 일일히 데이터 유형을 지정하고, NULL가능 여부도 컬럼마다 지정해주는 과정이 불편했는데 BigQuery에선 GUI방식으로 굉장히 편하게 스키마를 짤 수있었다.
오늘 진행하지 못한 저연차 공고로 직접 WordCloud를 생성하고 EDA report를 작성