728x90
SMALL
- 이번에는 국내 항공기들을 대상으로 운항했던 기록 데이터를 가지고 분석했던 내용들을 정리해보고자 합니다.
✈️ 항공기 운항 실태 조사
- 오후부터는 강사님께서 제공해주신 국내노선 여객 이용률 데이터를 가지고 분석해보며, 시각화까지 해보는 시간을 가져보았습니다.
- 중간에는 MySQL에 해당 데이터를 저장하는 실습도 포함되어 있으니 차근차근 정리해보겠습니다.
✨ 항공기 운항에 어떤 실태가 드러나있을까?
- 어떤 국내 노선이 가장 많은 여객을 수송할까?
- 여객 수 기준으로 가장 인기 있는 노선을 파악한 다음, 해당 노선의 특징을 분석해보자!
- 반대로 수요가 낮아 좌석이 많이 남는 비효율적인 노선은 어디일까?
- 여객 수가 낮거나 이용률이 떨어지는 노선을 식별해보자!
- 특정 노선에서의 탑승률(좌석 대비 실제 이용률)은 어떤 식으로 변동될까?
- 노선별 평균 이용률을 분석해서 운영적인 측면의 효율성을 평가하고, 항공사별로 차이를 비교해보자!
- 출발 공항과 도착 공항의 조합별로 탑승률이 어떻게 분포할까?
- 특정 공항(출발지 또는 도착지)에서 출발하거나 도착하는 노선 전체의 탑승률이 상대적으로 높거나 낮은지를 파악해보자!
✨ 어떤 식으로 분석하면 좋을까?
- 여객 수 및 이용률 분석
- 노선별로 총 여객 수를 집계한 뒤, 가장 많이 이용되는 노선과 적게 이용되는 노선을 도출해보자!
- 노선별 평균 이용률을 계산해서 효율적인 노선과 비효율적인 노선을 식별해보자!
- 시각적 분석을 통한 패턴 탐색
- 막대 그래프: 상위 및 하위 10개 노선의 여객 수 비교
- 파이 차트: 상위 5개 노선이 전체 국내선 여객 수에서 차지하는 비율 분석
- 히트맵: 월별 이용률 변화를 시각화해서 계절성 확인 / 출발-도착 공항 조합별 평균 탑승률을 시각적으로 확인
- 라인 차트(노선별): 인기 노선의 월별 여객 수 변화를 분석하여 트렌드 파악
- 라인 차트(항공사별): 계절성에 따른 탑승률 변동 폭이 큰 항공사와 상대적으로 안정적인 항공사를 식별
- 산점도: 노선별 총 여객 수와 평균 이용률 간의 관계를 비교
✨ 어떻게 구현할까?
💡 데이터 통합 과정
import pandas as pd
# 1월부터 8월까지의 데이터를 통합
dfs = []
for i in range(1, 9):
df = pd.read_csv(f'./data/2024년 {i}월 국내노선 여객 이용률.csv')
# 이용율 컬럼을 하나로 보기 위해
if '이용율' in df.columns:
df = df.rename(columns={'이용율': '이용률'})
df['월'] = i
dfs.append(df)
total_df = pd.concat(dfs, ignore_index=True)
total_df.head()
total_df.to_csv('./data/merged_data.csv', index=False)
- 2024년 1월부터 8월까지의 데이터가 제공되어서 각 csv 파일들을 리스트 하나에 append 시켜뒀습니다.
- 1월, 2월 데이터는 이용률 컬럼이 '이용율'이라고 표기되어 있었기에 이를 수정하는 작업도 거쳤습니다.
💡 전처리 과정
- 통합된 데이터를 로드하고 결측치들을 확인하여 제거 및 대체 작업을 수행했습니다.
# 결측치 확인
df.isna().sum()
'''
항공사 1
유아 2
'''
# 포항경주-인천 노선은 존재 X, 이용률도 0.0이기 때문에 삭제 조치
df[df['노선'].str.contains('포항경주', na=False)]
df = df[df['노선'] != '포항경주-인천'].reset_index(drop=True)
# 유아 수 = 여객수 - 성인으로 확인되는데,
# 해당 행에서는 성인 = 여객수이므로 유아에는 fillna(0) 처리
df['유아'] = df['유아'].fillna(0).astype(int)
- 항공사에 한 건의 결측치가 발생했는데, 포항경주-인천 노선으로 되어있었습니다.
- 확인해보니 해당 노선은 없는 것으로 판단되었고, 이용률도 0.0%로 되어있었기에 제거하게 되었습니다.
- 유아 컬럼에도 2건의 결측치가 발견되었는데, 해당 데이터에서 성인 = 여객수 였기에 유아는 0명인 것으로 대체해 처리하였습니다.
- 그리고 노선 정보를 기반으로 출발지와 도착지를 분리 후, 컬럼 순서를 재배치하였습니다.
# 노선을 분리해서 출발과 도착 컬럼 생성
df[['출발', '도착']] = df['노선'].str.split('-', expand=True)
# 컬럼 순서 재배치
columns = ['월', '출발', '도착', '노선', '항공사',
'좌석수', '성인', '유아', '여객수', '이용률']
df = df[columns]
- 곧바로 뒤이어서, 항공사 코드를 실제 항공사명(JNA → 진에어 등)으로 변환하였습니다.
airline = {
'JNA': '진에어', 'KAL': '대한항공',
'AAR': '아시아나', 'JJA': '제주항공',
'TWB': '티웨이항공', 'ESR': '이스타항공',
'ABL': '에어부산', 'ASV': '에어서울',
'EOK': '에어로케이'
}
# 항공사 코드 -> 항공사명으로 변경
df['항공사'] = df['항공사'].replace(airline)
df['항공사'].value_counts()
'''
항공사
진에어 249 대한항공 197
아시아나 118 제주항공 115
티웨이항공 80 이스타항공 66
에어부산 50 에어서울 17
에어로케이 16
'''
- 마지막으로 좌석수 및 유아 수의 이상치를 boxplot으로 확인 후, 좌석수가 비정상적으로 큰 경우에 실제 성인 수와 이용률을 바탕으로 재계산하였습니다.
- 또한, 탑승률(여객수/좌석수 * 100)이라는 파생 변수를 생성하고, 이에 따른 이상치도 점검 후에 성인과 유아 수의 합을 기준으로 다시 여객수를 계산해서 보정하였습니다.
# 좌석수가 비정상적으로 큰 값 탐색
outliers = df[df['좌석수'] > 800000]
# 이상치 데이터 확인
outliers[['노선', '항공사', '좌석수', '성인', '이용률']]
index = df[df['좌석수'] > 800000].index
df.loc[index, '좌석수'] = df.loc[index, '성인'] / (df.loc[index, '이용률'] / 100)
plt.figure(figsize=(6, 5))
sns.boxplot(y=df['좌석수'])
plt.title('좌석수 이상치 확인')
plt.ylabel('좌석수')
plt.show()
# 이용률은 이용한 성인 수 대비 좌석수이므로
# 실제 여객수 대비 좌석수인 탑승률 계산
df['탑승률'] = round((df['여객수'] / df['좌석수']) * 100, 1)
df.info()
df['탑승률'].describe()
# 이상치 데이터 확인
outliers = df[df['탑승률'] > 200]
outliers
# 여객수가 왜 좌석수보다 많지? 다시 계산!
df.loc[df['탑승률'] > 200, '여객수'] = df['성인'] + df['유아']
df['탑승률'] = round((df['여객수'] / df['좌석수']) * 100, 1)
💡 시각화 과정
- 노선별 총 여객 수 분석 (막대 그래프)
- 여객 수 비율 분석 (파이 차트)
- 전체 국내선 중 주요 노선이 차지하는 비율을 파악했고, 김포-제주, 김해-제주 노선이 인기 노선임을 확인했습니다.
- 노선별 월별 이용률 변화 (히트맵)
- 월별 여객 수 변화 (라인 차트)
- 노선별 여객 수와 평균 이용률 관계 (산점도)
- 출발 & 도착 공항별 평균 탑승률 (히트맵)
- 운항이 존재하지 않는 노선(데이터 미존재)은 빈 칸으로 표시되어, 실제 운항 노선 대비 추가 확장 가능성 여부 판단에 도움을 줄 수도 있을 것 같습니다.
- 월별 항공사별 평균 탑승률 (라인 차트)
✨ 그래서 결론이 뭔데?
- 항공사 운영 최적화에 도움을 줄 수 있겠다!
- 인기 노선(김포-제주, 김해-제주 등)에는 추가 항공편 투입을 검토해서 수익성을 극대화할 수도 있겠고,
- 저이용률 노선(김포-인천, 김포-대구, 대구-인천 등)의 경우에는 비용 절감을 위해서 감편하거나 소형 항공기 운영을 검토해볼 수 있겠고,
- 월별 항공사별 평균 탑승률 분석을 통해서는 계절별 혹은 특정 시점에 탑승률이 급락하는 항공사(3월의 에어부산, 4월의 에어로케이, 7월의 제주항공 등)에 대해 운항 스케줄 조정한다든지, 서비스 개선을 하는 등의 세분화된 운영 전략을 수립할 수 있게 됩니다.
- 공항이나 관련 정책을 수립하는 데 도움을 줄 수 있겠다!
- 주요 공항의 노선 수요를 파악해서 시설 개선이나 확장 여부를 판단할 수도 있고,
- 지방 공항 활성화를 위한 정책 수립의 근거가 될 수도 있겠고,
- 출발 & 도착 공항별 평균 탑승률 히트맵을 통해서는 특정 공항 조합의 탑승률 현황을 파악하여, 미개척 노선이나 저효율 노선에 대해 신규 노선을 개설한다거나 노선을 재조정하는 등의 정책 지원을 해줄 수 있게 됩니다.
- 소비자 혜택 증대
- 수요 예측을 기반으로 항공권 가격의 최적화가 가능해지는데... 이는 추후에 머신러닝을 배우면 가능할 것 같습니다.
- 성수기/비수기에는 요금 전략을 어떻게 세워야하는지, 관련 프로모션은 어떤 게 있는지 파악할 수 있습니다.
- 세분화된 탑승률 분석을 통해서 소비자 수요에 따른 좌석 배치, 할인 및 이벤트 전략을 수립해 소비자 만족도나 혜택을 더욱 증대시킬 수 있을 것입니다.
728x90
LIST
'Projects > LG U+' 카테고리의 다른 글
[Data Analysis] 병원 No-Show 데이터 (0) | 2025.03.10 |
---|---|
[Data Analysis] 심부전 데이터 (8) | 2025.03.09 |
[Data Analysis] 한국복지패널 데이터 (13) | 2025.03.09 |
[Data Analysis] 야후 파이낸스 주식 데이터 (4) | 2025.03.05 |
[Data Analysis] 미국 항공기 운항 데이터 (4) | 2025.03.02 |