3 분 소요

이번 대시보드는 ChatGPT를 활용해 생성한 기본 인사 데이터를 기반으로, Python을 통해 전처리하고, Tableau로 시각화한 과정을 담고 있습니다.

0. 데이터

인사 관련 데이터를 ChatGPT로 생성하여 사용하였으며, 전달하고자 하는 핵심 정보가 명확히 드러나도록 Python을 활용해 전처리한 결과를 원본 데이터로 삼아 Tableau에서 시각화를 진행하였습니다.

  • 원본 데이터
직원이름 성별 부서 입사연도 입사일 퇴사일 인사이동여부 인사이동일 전부서 현재부서
이영식 개발 2023 2023-07-01 2024-11-01 N     개발
양영미 마케팅 2023 2023-07-01 2024-06-30 N     마케팅
이도윤 데이터 2023 2023-07-06 2025-04-15 N     데이터
류서영 개발 2023 2023-09-14   Y 2024-12-01 개발 데이터
김상호 개발 2023 2023-09-26 2024-10-15 N     개발
윤유진 개발 2023 2023-10-01   Y 2024-06-01 개발 마케팅
류정호 인사 2023 2023-10-12   N     인사
김상훈 데이터 2023 2023-10-25   Y 2024-07-15 데이터 개발
김선영 개발 2023 2023-11-04 2024-08-15 N     개발

해당 원본데이터는 다음과 같은 조건과 순서에 따라 전처리되었습니다:

  1. 인사이동 여부 처리 인사이동일이 존재하면 인사이동여부를 “Y”, 존재하지 않으면 “N”으로 설정합니다.

  2. 기준연월 생성 각 직원별로 2023년 7월부터 2025년 7월까지의 기준연월을 생성합니다.

  3. 퇴사자 필터링 퇴사일이 기준연월보다 빠르면(퇴사일 < 기준연월) 해당 월부터는 퇴사자로 간주하여 데이터에서 제외합니다.

  4. 재직자 유지 반대로, 기준연월이 퇴사일 이전인 경우 해당 기간까지는 지속적으로 재직 중인 직원으로 간주하여 포함시킵니다.

  5. 기준부서 생성 기준연월이 인사이동일보다 빠르면 전부서를, 이후라면 현재부서를 기준으로 기준부서 컬럼을 새롭게 생성합니다.

import pandas as pd
from datetime import datetime
from dateutil.relativedelta import relativedelta

# 데이터 불러오기
data=pd.read_excel("/HR_좌석배치도.xlsx")

# 날짜형 컬럼 변환
for col in ["입사일", "퇴사일", "인사이동일"]:
    data[col] = pd.to_datetime(data[col], errors='coerce')

# 인사이동여부 컬럼 재생성
data["인사이동여부"] = data["인사이동일"].notna().map({True: "Y", False: "N"})

# 기준연월 생성
base_months = []
start = datetime(2023, 7, 1)
end = datetime(2025, 7, 1)
while start <= end:
    base_months.append(start)
    start += relativedelta(months=1)

# 결과 저장
result = []

for _, row in data.iterrows():
    for base in base_months:
        입사일 = row["입사일"]
        퇴사일 = row["퇴사일"]
        인사이동일 = row["인사이동일"]

        # 기준연월이 입사일 이상이어야 함
        if 입사일 <= base and (pd.isna(퇴사일) or base <= 퇴사일):
            new_row = row.copy()
            new_row["기준연월"] = base.strftime("%Y년 %m월")

            # 기준부서 설정
            if not pd.isna(인사이동일) and base > 인사이동일:
                기준부서 = row["현재부서"]
            else:
                기준부서 = row["전부서"] if pd.notna(row["전부서"]) else row["부서"]

            new_row["기준부서"] = 기준부서

            result.append(new_row)

# 최종 데이터프레임
final_df = pd.DataFrame(result)
final_df = final_df[["기준연월"] + [col for col in data.columns] + ["기준부서"]]
final_df = final_df.sort_values(by=["기준연월", "직원이름"]).reset_index(drop=True)

# 엑셀로 저장
final_df.to_excel("/HR_좌석배치도(전처리).xlsx")
  • 전처리된 데이터
기준연월 직원이름 성별 부서 입사연도 입사일 퇴사일 인사이동여부 인사이동일 전부서 현재부서 기준부서
2023년 07월 양영미 마케팅 2023 2023-07-01 00:00:00 2024-06-30 00:00:00 N     마케팅 마케팅
2023년 07월 이영식 개발 2023 2023-07-01 00:00:00 2024-11-01 00:00:00 N     개발 개발
2023년 08월 양영미 마케팅 2023 2023-07-01 00:00:00 2024-06-30 00:00:00 N     마케팅 마케팅
2023년 08월 이도윤 데이터 2023 2023-07-06 00:00:00 2025-04-15 00:00:00 N     데이터 데이터
2023년 08월 이영식 개발 2023 2023-07-01 00:00:00 2024-11-01 00:00:00 N     개발 개발
2023년 09월 양영미 마케팅 2023 2023-07-01 00:00:00 2024-06-30 00:00:00 N     마케팅 마케팅
2023년 09월 이도윤 데이터 2023 2023-07-06 00:00:00 2025-04-15 00:00:00 N     데이터 데이터
2023년 09월 이영식 개발 2023 2023-07-01 00:00:00 2024-11-01 00:00:00 N     개발 개발
2023년 10월 김상호 개발 2023 2023-09-26 00:00:00 2024-10-15 00:00:00 N     개발 개발
2023년 10월 류서영 개발 2023 2023-09-14 00:00:00   Y 2024-12-01 00:00:00 개발 데이터 개발

1. 대시보드 주제

이번 대시보드는 인사 데이터를 기준연월별로 시각화하여 직원들의 재직 현황은 물론, 최근 3년간 발생한 퇴직 및 인사이동 이슈를 한눈에 확인할 수 있도록 설계되었습니다.

2. 대시보드 구성

1. 배치도

  • 총 4개의 부서를 기반으로 부서 배치도를 디자인하였습니다.
  • Illustration을 활용해 시각적으로 구분 가능한 배치도 레이아웃을 배경으로 설정하였습니다.
  • 각 부서 자리에 실제 재직 중인 직원들이 표시되도록 구성하여 직원 분포와 부서별 현황을 직관적으로 확인할 수 있습니다.

2. 최근 3년간 News

  • 최근 3년간의 인사 변동 이슈(퇴직, 인사이동) 를 정리한 섹션입니다.
  • “누가, 언제, 어디서, 어디로, 무엇을”에 해당하는 정보를 정리하여 인사 흐름을 요약한 뉴스 형태로 시각화하였습니다.
  • 예시:
    • 데이터팀의 OOO이 2025년 1월에 개발팀으로 인사이동했습니다.
    • 마케팅팀의 OOO은 2024년 6월에 퇴사하였습니다.

3. 결론

해당 대시보드는 단순히 데이터를 나열하는 것을 넘어, 조직 내 인사 흐름을 시간축 기반으로 시각화하여 인사이트를 제공하는 것을 목표로 합니다. 직원별 근무 이력, 퇴사 시점, 인사이동 이력을 함께 확인할 수 있어 조직 관리 및 인력 운영에 있어 실질적인 참고자료가 될 수 있습니다. 특히, 부서 이동 및 퇴직 시점을 함께 분석함으로써 인적 자원 변화의 흐름을 손쉽게 파악할 수 있도록 설계되었습니다.

💬 분석 피드백

  • 만든 데이터를 사용해서 그러지 인사 데이터가 깔끔함
  • 기준연월을 이동시켰을 때 만약 최근 News가 없다면 없다고 따로 표시해도 좋을 듯
  • 최근 3개월으로 정적인 것이 아닌 최근 N개월로 해서 사용자가 더 유동적으로 정보를 볼 수 있도록 해도 좋을듯