본문 바로가기
프로젝트

[프로젝트] HR_면접자 정보 맞추기 프로젝트 (1)

by 단깅수 2024. 10. 1.
728x90

논문 읽는 학회에 멤버로 참여해 매주 논문을 하나씩 읽어보면서 공부했던 시절에는 매주 블로그 소재가 하나씩 생겼는데 이 활동이 끝나니까 블로그 소재가 뚝 떨어졌네요.. ㅠㅠ

 

그래서 새로운 주제, 소재를 찾아서 복귀했습니다! 바로바로 다양한 도메인의 다양한 Task를 여러 모델과 데이터를 다뤄보면서 미니 프로젝트 진행하기! 사실 어느 분야, 도메인이든 AI를 서비스에 잘 활용하기 위해서 많은 노력이 이루어지고 있습니다. 그리고 나름 도메인 몰입력이 좋은 저로서는 다양한 도메인을 접해보면서 잘 할 수 있는, 재밌어하는 도메인을 탐색하고 싶은 마음도 있었구요.

 

그래서 지금부터 다양한 도메인의 데이터를 하나씩 다뤄보면서 이런저런 재밌는 Task를 진행해보려고 합니다. 개인 미니 프로젝트 느낌이죠 

 

1. 주제 선정 배경

그 첫 번째 주인공은 HR(인사) 도메인입니다!

https://blog.roundhr.com/tech42/

 

사실 인사 도메인을 하고 싶어서 시작한 건 아닙니다. 밑에서 소개할, 데이터셋이 충분했기 때문에 시작했는데요. 보통 프로젝트 할 때 데이터셋이 없어서 고생하는 경우가 대부분이기 때문에 '개인 미니 프로젝트인데, 데이터셋 정도는 있어도 괜찮잖아?' 라는 마인드입니다! ㅎㅎ

 

인공지능(AI)은 최근 몇 년간 다양한 산업에서 급격히 발전하며 조직 운영의 근본적인 방식을 변화시키고 있습니다. 그중에서도 인사(HR) 도메인은 AI의 도입으로 특히 많은 혜택을 받고 있습니다. AI는 단순한 프로세스 자동화를 넘어, 데이터 기반의 의사결정 지원과 인간 행동 예측, 그리고 조직 효율성을 극대화하는 데 중요한 역할을 합니다.

 

그래서 보통 인사 도메인에서는 어떤 Task를 진행할 수가 있냐하면

  • 이직 예측 모델: 직원의 이직 가능성을 예측하여 사전에 대응할 수 있도록 돕습니다. 이직률이 높은 특정 부서나 직원 유형을 파악해 조직 관리 방안을 개선할 수 있습니다.
  • 이력서 스크리닝: AI는 지원자의 이력서와 직무 요구 사항을 비교해 수천 개의 지원서를 빠르게 처리할 수 있습니다. 이는 채용 담당자의 업무 부담을 줄여주고, 편견 없는 공정한 평가를 할 수 있도록 도와줍니다.
  • 화상 면접 AI: AI는 면접자의 표정, 말투, 음성 톤 등을 분석하여 지원자의 성향과 잠재력을 평가하는 데 도움을 줄 수 있습니다. 이는 인사 담당자가 좀 더 심층적인 면접 질문을 준비할 수 있도록 돕고, 면접 과정에서의 편향성을 줄이는 데 기여합니다.

등등 더 많은 Task들이 존재하지만 일단 처음은 간단하게 답변 데이터만 가지고 지원자의 성별, 연령, 경력을 맞춰보는 프로젝트를 진행할까 합니다.


2. 데이터셋 소개

https://www.aihub.or.kr/aihubdata/data/view.do?currMenu=115&topMenu=100&aihubDataSe=realm&dataSetSn=71592

 

AI-Hub

샘플 데이터 ? ※샘플데이터는 데이터의 이해를 돕기 위해 별도로 가공하여 제공하는 정보로써 원본 데이터와 차이가 있을 수 있으며, 데이터에 따라서 민감한 정보는 일부 마스킹(*) 처리가 되

www.aihub.or.kr

 

데이터셋은 AIhub에서 손쉽게 구할 수 있었습니다! 총 용량이 약 160GB 정도 되는데 이는 음성 원본 파일이 들어 있어서 그렇구요. 라벨링된 텍스트 데이터는 그렇게까지 용량이 크진 않았습니다.

 

 

보시다시피 약 70,000개의 면접 답변 데이터이구요. 지원자의 연령, 성별, 경력유무, 답변, 답변의 의도 등 여러 항목으로 구성된 데이터입니다. 데이터셋에 대해 더 궁금하신 분들은 위의 링크 접속해서 직접 확인해주시면 감사하겠습니다.


3. 데이터셋 가공

일단 JSON 파일 형식으로 되어 있는 데이터들을 확인하고, Formatting 해주기 위해서 보기 편한 DataFrame 형태로 좀 바꿔주었습니다.

import os
import json
import pandas as pd
import re
from tqdm import tqdm

## 폴더 경로 설정
folder_path = 'Train_labeling'

## 폴더 내 모든 json 파일 리스트 가져오기
json_files = [f for f in os.listdir(folder_path) if f.endswith('.json')]

## 데이터를 저장할 리스트
data = []

## 각 json 파일을 열어서 필요한 데이터 추출
for json_file in tqdm(json_files, desc="Processing JSON files"):
    file_path = os.path.join(folder_path, json_file)
    
    with open(file_path, 'r', encoding='utf-8') as f:
        try:
            ## JSON 파일 내용을 문자열로 읽은 후 제어 문자를 제거
            raw_data = f.read()
            clean_data = re.sub(r'[\x00-\x1F\x7F-\x9F]', '', raw_data)  ## 제어 문자 제거
            json_data = json.loads(clean_data)
            
            ## 필요한 데이터 추출
            place = json_data['dataSet']['info'].get('place', '')
            gender = json_data['dataSet']['info'].get('gender', '')
            age_range = json_data['dataSet']['info'].get('ageRange', '')
            experience = json_data['dataSet']['info'].get('experience', '')
            
            question_text = json_data['dataSet']['question']['raw'].get('text', '')
            question_emotion = json_data['dataSet']['question'].get('emotion', [])
            question_intent = json_data['dataSet']['question'].get('intent', [])
            
            answer_text = json_data['dataSet']['answer']['raw'].get('text', '')
            answer_emotion = json_data['dataSet']['answer'].get('emotion', [])
            answer_intent = json_data['dataSet']['answer'].get('intent', [])
            
            ## 데이터 리스트에 추가
            data.append({
                'place': place,
                'gender': gender,
                'ageRange': age_range,
                'experience': experience,
                'question_text': question_text,
                'question_emotion': question_emotion,
                'question_intent': question_intent,
                'answer_text': answer_text,
                'answer_emotion': answer_emotion,
                'answer_intent': answer_intent
            })
        
        except json.JSONDecodeError as e:
            print(f"Error decoding JSON in file {json_file}: {e}")

## 데이터프레임으로 변환
df = pd.DataFrame(data)

## 데이터셋 저장
df.to_csv('Interview.csv', index = False)

4. EDA

가공된 데이터를 가지고 본격적으로 모델 학습에 들어가기 전에 일단 데이터 EDA를 진행해주려고 합니다. 지원자들의 분포라고 생각하시면 편하겠네요. 성별, 경력, 연령대, 답변의 길이를 가지고 2 x 2로 시각화해보았습니다.

import matplotlib.pyplot as plt
import seaborn as sns

## 서브플롯 설정 (2x2)
fig, axes = plt.subplots(2, 2, figsize=(12, 10))

## 색상 팔레트 설정
pastel_colors_1 = sns.color_palette("pastel")
pastel_colors_2 = sns.color_palette("Set3")

## (1,1) : gender에 대한 원그래프 시각화
gender_counts = df['gender'].value_counts()
axes[0, 0].pie(gender_counts, labels=gender_counts.index, autopct='%1.1f%%', startangle=90, colors=pastel_colors_1)
axes[0, 0].set_title('Gender Distribution')

## (1,2) : experience에 대한 원그래프 시각화
experience_counts = df['experience'].value_counts()
axes[0, 1].pie(experience_counts, labels=experience_counts.index, autopct='%1.1f%%', startangle=90, colors=pastel_colors_2)
axes[0, 1].set_title('Experience Distribution')

## (2,1) : ageRange에 대한 막대그래프 시각화
sns.countplot(x='ageRange', data=df, ax=axes[1, 0], palette=pastel_colors_1, order=sorted(df['ageRange'].unique()))
axes[1, 0].set_title('Age Range Distribution')

## (2,2) : answer_length에 대한 KDE plot + 막대그래프 시각화
sns.histplot(df['answer_length'], kde=True, ax=axes[1, 1], bins=10)
axes[1, 1].set_title('Answer Length KDE + Histogram')

## 레이아웃 조정
plt.tight_layout()
plt.show()

 

이상으로 이번 포스팅은 마치려고 합니다.

다음 포스팅에서 실제로 모델 학습 부분과 Inference 부분을 다뤄보도록 하겠습니다.

매우 바쁘고 하루하루 힘든 일상이지만..! 여러분 모두 파이팅!!

728x90