Jay's Project/wanted 채용 공고 분석

[wanted 채용 공고 분석] 4. 기술 스택 분석(1) - 데이터 전처리

jay3108 2022. 1. 16. 12:14

 

지금까지 selenium을 이용하여 원티드에서 공고들을 크롤링하였고 주요업무, 자격요건, 우대사항 등으로 나누어 데이터 프레임으로 저장하였다. 우선, 프로젝트의 목적인 데이터 분석가 직무의 요구 스택들을 알아보기 위하여 수집된 데이터를 전처리하는 과정이 필요하다.

데이터 전처리는 수집된 데이터에서 어떤 요소를 활용하고 어떻게 적용할 지에 따라서 달라진다. 예를들어 머신러닝이나 딥러닝 등을 적용하는 경우에는 알고리즘에 맞게 데이터를 전처리 하며 텍스트 분석을 목적으로 하는 경우에 텍스트 안에서 세부적으로 어간추출이나 불용어 사전 작성 등의 과정이 있다.

이 프로젝트에서 첫번 째로는 기술 스택을 알아보는 목적이므로 이에 따라 어떤 데이터 전처리 이슈가 발생하고 해결방법은 어떠했는 지 정리해 본다.

 

0. 모듈 & 라이브러리

#### konlpy 설치 (jpype, java_home 환경변수 설정, 시스템파일 수정), wordcloud 설치 과정은 따로 기재하지 않았습니다. #####

import os
import sys
import pandas as pd
import numpy as np
import re

from konlpy.tag import Okt # 형태소분석기 : Openkoreatext
from collections import Counter # 빈도 수 세기
from wordcloud import WordCloud # wordcloud 만들기

import matplotlib.pyplot as plt # 시각화
import matplotlib as mpl
import seaborn as sns 

from matplotlib import font_manager, rc # font 설정
import nltk # natural language toolkit : 자연어 처리
# matplotlib 그래프 한글폰트 깨질 때 대처(Mac & Window)
import platform
if platform.system() == 'Windows':

# 윈도우인 경우
    font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()  # 한글 폰트 깨지는 겨우
    rc('font', family=font_name)
else:    
# Mac 인 경우
    rc('font', family='AppleGothic')

 

 

1. 데이터 전처리 이슈

  • 주요 업무 / 자격 요건 / 우대 사항의 항목에서 영어단어만 남기기 → 정규표현식 이용
  • 토큰화 작업 후 분석에 불필요한 영어단어 제거하기 → 불용어 사전 작성
# csv 파일 로드
df = pd.read_csv("wanted_content.csv")
# 주요 업무 / 자격 요건 / 우대 사항 컬럼으로 데이터프레임 구성하고 df2로 저장
df2 = df[['description','requirement','preferred']]
df2.head()

수집한 raw data의 csv파일을 로드하여 데이터 프레임으로 구성한 뒤 분석에 필요한 부분 주요업무, 자격요건, 우대사항만을 컬럼으로 가져와 새로운 데이터프레임으로 구성하였다.

 

실제로 저장된 raw data가 어떤 형태인 지 주요업무 컬럼의 26번쨰 항목으로 살펴보자. 이를 통해 어떤 데이터 전처리 이슈가 발생하는 지 알아본다.

df2['description'][26]

우선 텍스트 분석 시 기본적으로 발생하는 이슈인 숫자, 특수문자, 개행문자 등의 제거 이슈가 있음을 알 수 있다. 

  • 숫자 : 1
  • 특수문자 : / ( ) & ● 
  • 문장부호 : , 
  • 개행문자 : \n
# 토큰화를 위해 txt 파일로 저장
df2.to_csv('wanted.txt', encoding='utf-8-sig')
# 저장한 text로 불러오기 -> 자료형이 str로 변경
text = open('wanted.txt',encoding='utf-8-sig').read()
text

 

현재의 자료형은 pandas 데이터 프레임이다. 텍스트 분석에서 정규 표현식 전처리를 적용하거나 자연어 처리 시에는 전체 raw data를 하나의 str 형태로 합치는 것이 편하다. 여기서 세련된 방법은 아니지만 간편한 방법을 소개하면 해당 데이터프레임을 txt 파일로 저장한 후 다시 불러오는 것이다. 각 컬럼에서 for문을 이용하여 합쳐도 되지만 간단하게  프로젝트를 진행할 때 유용하게 사용할 수 있는 방법이다.

 

하나로 합쳐진 txt 파일을 text라는 변수로 저장하여 불러왔다. 앞서 살펴본 것과 같은 데이터 전처리가 필요함을 알 수있다. 텍스트 분석에서는 주로 정규표현식을 이용하여 위의 이슈를 해결한다. 정규 표현식을 활용할 때는 어떠한 형태의 텍스트만 남길 것인 지를 고민해야 한다. 위의 raw data에서 살펴보면 기술 스택이나 업무 등은 영어로 비교적 깔끔하게 기재되어 있음을 알 수 있다. 따라서 영어 대문자와 소문자만 남기면 'Tableau', 'Amplitude', 'Redash' 등의 시각화 툴을 가져올 수 있다. 

 

2. 정규 표현식을 이용한 전처리

# 정규표현식을 이용한 영어 추출
cleaned_content = re.sub('[^A-Za-z \s]','',text) # 알파벳 대문자 or 소문자 or 공백문자를 제외하고 모두 삭제
cleaned_content = cleaned_content.lower() # 빈도수 분석을 위해 모두 소문자로 만든다.
print(cleaned_content)

re.sub('[^A-Za-z \s]','',text) : 정규 표현식에서 알파벳 대문자와 소문자, 그리고 공백문자를 제외한 모든 항목을 제거하였다. 이후 남은 단어를 모두 소문자로 만들어 빈도 수가 정확히 체크 될 수 있도록 하였다. 영어 텍스트 분석 시 잊지말아야 하는 사항이다. 

2.1 nltk를 이용한 토큰화

이제 자연어처리 라이브러리인 nltk에서 토큰화함수를 불러와 토큰화하면 다음과 같이 깔끔하게 토큰화된 단어를 가져 올 수 있다. 이 과정 공백문자도 모두 제거할 수 있었다. 토큰화된 단어들은 word_tokens 라는 변수로 저장하였다. 

nltk.download('punkt') # 토큰화 작업을 위한 리소스 다운로드
word_tokens = nltk.tokenize.word_tokenize(cleaned_content)
print(word_tokens)

 

3. 불용어 사전 작성

stop_words = ['data','descriptionrequirementpreferred']  # 불용어 사전 만들기
# '데이터', '분석'은 검색 키워드라 제거한다. 많은 빈도수를 가지지만 분석의 의미가 없다.
word_tokens = [word for word in word_tokens if not word in stop_words] #불용어 제거
cleaned_counted = Counter(word_tokens) # 토큰화한 문자열 빈도 수 세기
cleaned_counted_ranked = dict(cleaned_counted.most_common()) # 빈도수 내림차순 정렬 후 딕셔너리화
cleaned_counted_ranked

다음 단계로 토큰 모음에서 불용어를 선별한다. stop_word 로 불용어 사전을 직접 만들어 제거하는 방식이다. 이후 남은 토큰들을 Counter를 활용하여 빈도수를 체크한다. 이 때, 살아남은 토큰들의 빈도수를 내림차순으로 알아보면서 분석에 불필요한 단어들을 다시 불용어 사전에 넣어서 정제하는 과정을 반복한다. 해당 사례에서는 상당히 단어 전처리가 잘 되었기 때문에 불용어 사전에 넣을 단어들이 많지 않았다. data의 경우 채용공고에서 빈번히 쓰였으나 분석에서 유의미 하지 않으므로 제거하였고 나머지는 dataframe에서 하나의 string으로 합치는 과정에서 컬럼명이 들어간 것이라 제거하였다.

 

dict()로 딕셔너리화 하는 과정에서 오류가 발생하였다. TypeError: 'dict' object is not callable. 위에서 빈 딕셔너리를 만들고 dict 라는 이름으로 지정하였기 때문에 dict() 함수가 작동하지 않은 것이다. 객체나 변수 명을 지정할 때 앞으로 유의하자.

 

여기까지 기술 스택 분석을 위한 데이터 전처리를 진행했다. 데이터 전처리는 어떤 아웃풋을 원하는가에 따라 결정된다. raw data 단계에서 이미 기술 스택들이 영어 단어 형태로 잘 정리되어 있었기 떄문에 비교적 손쉽게 전처리를 진행할 수 있었다. 그러나 앞으로 big data나 소스가 여러 곳인 데이터들을 전처리하려면 정규표현식에 대해 조금 더 깊은 이해가 필요하다고 생각한다. 또한 앞으로 다양한 raw data를 다뤄보면서 발생하는 이슈들을 정리해 나가고자 한다. 

 

다음 포스팅에서는 빈도 수를 바탕으로 데이터 시각화를 진행해 본다.