여러가지 데이터/프로그래밍 & 분석

[python][지하철 승하차 자료] 회사원은 언제 연차를 낼까? 1. 승하차인원 분석기간 선정

레까 2025. 3. 9. 13:48

- 개요

회사원의 연차는 최소 1년에 12일(1달에 1개)입니다.

전 회사를 처음 다닐 때 연차를 언제 써야하는지 의문을 가져서 사람들이 연차를 언제 쓰나 관찰을 했습니다.

제가 보기에 급한 일이 생긴 게 아니라면 연차를 연휴에 껴서 써서 더 길게 쓰는 사람이 가장 많았습니다.

최근에 역별 일별 시간대별 승하차 자료가 공개되어 있는 것을 보고 회사에서 관찰한 사실이 정말 그런지 확인해볼 수 있겠다는 생각이 들어 포스트를 작성하게 되었습니다.

 

시작은 제 호기심이긴 합니다만 이런 분석은 경제적인 측면에서 의미가 있습니다.

사람들이 연차를 많이 쓰는 날에는 회사 근처의 지하철역을 이용하는 사람, 상권에서 커피를 마시고, 식사를 많이 하는 사람이 적을 수밖에 없습니다. 그럼 회사를 안 간 사람들은 집에서 쉴 수도 있겠지만 그 시간에 다른 곳에 가서 회사에 출근했을 때 안 할 무언가를 하며 돈을 쓰겠죠.

그럼 연차를 많이 낼 꺼 같은 기간과 그렇지 않은 기간에 같은 광고를 내도 그 효과가 다를겁니다.

연차를 많이 내는 날을 분석하면 연차가 많은 시기가 언제인지 예측도 가능하므로 맞춤형 광고로 좀 더 경제적인 이득을 볼 수 있습니다.

 

물론 저는 연차에 대한 분석만 할 겁니다.

- 연차 쓰는 사람 추정

인터넷에 공개된 회사원의 연차 사용 횟수 같은 통계는 없습니다.

저는 지하철 승하차 자료로 출근시간, 퇴근시간 승하차수로 연차를 쓴 사람 수를 추정하겠습니다.

회사에 출근하는 사람이 많으면 연차를 덜 쓴 거고 반대면 연차를 많이 쓴 것이겠죠.

회사를 안 나오는 이유가 연차뿐이 아니기에 정확하진 않겠지만 제가 구할 수 있는 자료로는 이게 최선인 것 같습니다.

 

- 데이터 수집

서울교통공사(링크)에서 역별 일별 시간대별 승하차인원 정보 데이터에서 

아래 4개 파일을 받았습니다.

서울교통공사_역별 일별 시간대별 승하차인원 정보_20221231.csv

서울교통공사_역별 일별 시간대별 승하차인원 정보_20231031.csv

서울교통공사_역별 일별 시간대별 승하차인원 정보_23.11_24.01.csv
서울교통공사_역별 일별 시간대별 승하차인원(24.2~24.5).csv

 

이 데이터에는 서울교통공사에서 관리하는 역의 일별 시간대별 승차/하차 인원 정보가 정리되어있습니다.

 

- 승하차인원 기본 분석

많은 역 중 가산디지털단지역을 기준으로 분석을 하겠습니다.

가산디지털단지에는 많은 기업이 자리잡고 있으므로 아침에 하차하는 사람은 출근, 저녁에 승차하는 사람은 퇴근인원일겁니다.

이 문장이 사실인지 한 번 확인해보죠.

먼저 데이터를 읽고 가산디지털단지역의 데이터만 추출합니다.

""" 
데이터 읽기
"""
inpath = './data'
files = ['서울교통공사_역별 일별 시간대별 승하차인원 정보_20221231.csv',
          '서울교통공사_역별 일별 시간대별 승하차인원 정보_20231031.csv',
          '서울교통공사_역별 일별 시간대별 승하차인원 정보_23.11_24.01.csv',
          '서울교통공사_역별 일별 시간대별 승하차인원(24.2~24.5).csv']
dfs = []

# 파일에 따라 열 이름이 다르므로 열 이름 통일을 해야함
col_names = ['연번', '날짜', '호선', '역번호', '역명', '구분', '06시 이전', '06시-07시', '07시-08시',
       '08시-09시', '09시-10시', '10시-11시', '11시-12시', '12시-13시', '13시-14시',
       '14시-15시', '15시-16시', '16시-17시', '17시-18시', '18시-19시', '19시-20시',
       '20시-21시', '21시-22시', '22시-23시', '23시-24시', '24시 이후']
for file in files:
    df = pd.read_csv(os.path.join(inpath, file), encoding='cp949')
    df.rename(columns=dict(zip(df.columns, col_names)), inplace=True)
    dfs.append(df)
df = pd.concat(dfs)
    
"""
가산디지털단지역의 승차(in), 하차(out) 인원 자료 추출
"""
df_in = df[(df['역명']=='가산디지털단지') & (df['구분']=='승차')]
df_out = df[(df['역명']=='가산디지털단지') & (df['구분']=='하차')]

 

모든 기간 평균 시간대별 승하차인원을 구하고 그려봅시다.

"""
필요한 열만 추출
"""
use_col = ['날짜', '구분', '06시 이전', '06시-07시', '07시-08시',
       '08시-09시', '09시-10시', '10시-11시', '11시-12시', '12시-13시', '13시-14시',
       '14시-15시', '15시-16시', '16시-17시', '17시-18시', '18시-19시', '19시-20시',
       '20시-21시', '21시-22시', '22시-23시', '23시-24시', '24시 이후']

"""
axis=0: 세로방향으로 평균 >>> 2022년 일평균 승차, 하차인원수
"""
yy_in = df_in[use_col[2:]].mean(axis=0).values
yy_out = df_out[use_col[2:]].mean(axis=0).values

"""
간단하게 시계열을 그려 비교
"""
import matplotlib.pyplot as plt
xx = range(5, 24 + 1)
fig = plt.figure(figsize=(10, 3))
ax = fig.add_subplot()
ax.plot(xx, yy_in, label='in')
ax.plot(xx, yy_out, label='out')
ax.set_xticks(xx);
ax.legend()

 

가산디지털단지의 2022년 일평균 승차(in)와 하차(out) 인원수의 시계열(x축: 시간, y축: 인원수)

 

가산디지털단지역에서 하차한 인원은(주황선) 8~9시 사이에, 승차한 인원은(파란선) 18~19시에 가장 많습니다.

출근은 보통 9시까지 퇴근은 6시 시작하니까 출근시간에는 지하철에서 내리는 사람이 많고, 퇴근시간에는 지하철에서 타는 사람이 많은 모습이 시계열에 잘 나타납니다.

 

요즘은 유연근무로 출퇴근 시간을 바꿀 수 있으니 7~8, 8~9, 9~10시간대에 하차한 인원을 출근인원으로, 17~18, 18~19, 19~20시간대에 승차한 인원을 퇴근인원으로 정의하겠습니다.

 

출근인원, 퇴근인원에 대해 x축을 2022년 1월 1일부터 2024년 5월 31일까지 시계열로 그리면 주말에는 출근을 안할테니까 7일 주기의 순환이 보일겁니다. 이것도 확인해보죠.

"""
df_commute라는 pd.DateFrmae()에 일별 출근인원수, 퇴근인원수를 저장
"""
df_gasan = df[use_col][df['역명'] == '가산디지털단지'].copy()
df_gasan['출근인원수'] = df_gasan[['07시-08시','08시-09시', '09시-10시']].sum(axis=1).copy()
df_gasan['퇴근인원수'] = df_gasan[['17시-18시','18시-19시', '19시-20시']].sum(axis=1).copy()

df_commute = pd.DataFrame(
    {'datetime': pd.to_datetime(df_gasan['날짜'][df_gasan['구분']=='승차'].tolist()),
     '출근인원수': df_gasan['출근인원수'][df_gasan['구분']=='하차'].tolist(),
     '퇴근인원수': df_gasan['퇴근인원수'][df_gasan['구분']=='승차'].tolist(),
     }
)

"""
간단히 출근인원수 시계열을 그림
"""
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(10, 3))
ax = fig.add_subplot()
xx = df_commute['datetime']
ax.plot(xx, df_commute['출근인원수'])

 

출근인원수 시계열(x축: 일)

이상하게도 2023년 7월부터 9월 값이 특히 작은데 제 생각에 이건 데이터 정리한 사람이 실수한 것 같습니다.

확실히 주말마다 출근인원수가 줄어들고 설날, 추석 즈음에도 적습니다.

2022년 3~4월은 코로나가 유행한 시기로 코로나 확진 혹은 재택근무로 출근인원수가 줄어들었습니다.

전 코로나라는 특수 상황을 고려하고 싶지 않기 때문에 2022년 5월 데이터부터 사용하겠습니다.

 

앞으로는 2022년 5월~2024년 5월 기간을 분석하되 2023년 7월~9월은 분석기간에서 제외하겠습니다.