결측값이 다른 원인 찾기
이전에 발견한 Tableau와 Python 간의 자전거 대여 수 차이에 대해 원인을 찾아보았습니다.
일요일의 총 자전거 대여 수가 Tableau에서는 780,194대, Python에서는 798,295대로 집계되어 약 18,000대의 차이가 발생했는데요. 이 차이의 원인을 찾기 위해 여러 가능성을 검토해보았습니다.
처음에는 결측치나 데이터 필터링의 차이를 의심했지만, 조사 결과 이는 원인이 아니었습니다. 데이터 그룹화 방식이나 정렬 방식, 시간대 설정의 차이도 검토해보았지만 이 역시 문제의 원인은 아니었죠.
결국 핵심적인 차이점은 날짜 형식의 해석에 있다고 생각했습니다.
Excel에서의 표현방식은 다음과 같았습니다. dd-mm-yy 즉 일-월-년 형식의 날짜 데이터였습니다.
하지만 Tableau에서는 원본 데이터에서 직접 yy-mm-dd로 변환하여 집계한 것을 알 수 있었습니다.
그렇다면 날짜 또한 문제가 없었다고 생각했지만 python 총 요일 자전거 대여 수의 합이랑 Tableau 합이랑 모두 같아 단순하게 요일 수 만 차이 있음을 알게 되었습니다.
Tableau에서 집계된 요일 수 입니다.
일~목 (1248갸) 금 (1276)임을 알 수 있었습니다.
아래 행에 있는 관측값은 excel에 있던 것이 아닌 실제 excel에서 변환 함수를 가지고 와 비교한 것입니다.
함수는 다음과 같습니다.
COUNT([WeekDay_Number])
다음은 Matplotlib에서 집계된 요일 수 입니다.
1248로 고르게 분포 되었던 Tableau와 달리 데이터의 수가 Tableau에 비해 균형이 안잡혀있다고 생각했습니다.
따라서 원본데이터에 문제가 있음을 깨달았습니다. 왜냐하면 Tableau에서는 날짜를 자동으로 변환해줬습니다. 굳이 dd-mm-yy형식을 yy-mm-dd형식으로 변환한것은 어떤 데이터가 와도 모두 yy-mm-dd로 통일하여 올바른 집계를 하기 위함이였습니다.
원본 데이터에서는 dd-mm-yy 형식임을 알 수 있었습니다. 하지만 원본 데이터를 더 스크롤 하여 내리다가 알게되었습니다.
다른 형식으로 작성되어 있기 때문에 직접 함수를 만들어서 매핑해주고 data를 변환해줬습니다.
오류 코드
data['Date'] = pd.to_datetime(data['Date'])
data['Weekday'] = data['Date'].dt.weekday
weekday_names = ['월', '화', '수', '목', '금', '토', '일']
data['Weekday_Name'] = data['Weekday'].map(lambda x: weekday_names[x])
weekday_avg = data.groupby('Weekday_Name')['Rented Bike Count'].sum()
weekday_avg = weekday_avg.reindex(weekday_names)
weekday_avg
적용 전 (pd.to_datetime(data['Date'])만 사용) → 오류 발생 가능
pd.to_datetime()는 기본적으로 "YYYY-MM-DD" 형식으로 인식하려고 시도합니다.
하지만 데이터에 "DD-MM-YYYY" 가 섞여 있으면 일부 날짜를 잘못 변환할 수도 있습니다.
잘못 변환된 날짜 때문에 요일이 다르게 나올 가능성이 크다고 생각합니다.
예시
01-12-2017 | 1st Dec 2017 | 1st Dec 2017 (OK) |
31-12-2017 | 31st Dec 2017 | 31st Dec 2017 (OK) |
01-01-2018 | 1st Jan 2018 | 1st Jan 2018 (OK) |
12-01-2017 | 12th Jan 2017 | 1st Dec 2017 (잘못 해석) ❌ |
15-02-2018 | 15th Feb 2018 | Feb 15, 2018 (OK) |
10-03-2019 | 10th Mar 2019 | Mar 10, 2019 (OK) |
02-05-2020 | 2nd May 2020 | May 2, 2020 (OK) |
2017-12-01 | 1st Dec 2017 | Dec 1, 2017 (OK) |
다음은 직접 작성 한 함수로 이 함수로 매핑하여 해결되었습니다.
import pandas as pd
from dateutil import parser
# 날짜 변환 함수
def parse_date(value):
try:
return parser.parse(str(value), dayfirst=True) # 자동으로 날짜 포맷 인식
except Exception:
return pd.NaT # 변환 실패 시 NaT (결측값) 반환
data['Date'] = data['Date'].apply(parse_date)
print(data.head())
결국 모든 날짜 형식을 동일한 형식으로 변환해줬습니다.
이후 집계된 요일의 총 자전거 대여 수를 확인한 결과 Tableau와 동일한 관측값을 가지고 있습니다.
이를 바탕으로 분석한 저의 생각은 다음과 같습니다.
요일별 자전거 대여량을 분석한 결과, 평일(월금)의 대여량이 주말(토일)보다 높은 경향을 보였습니다. 특히 금요일(950,334)의 대여량이 가장 많았으며, 이는 출퇴근 수요와 함께 주말 대비 대여가 증가했을 가능성이 있습니다. 반면, 일요일(780,194)의 대여량이 가장 적었으며, 이는 출퇴근 수요가 사라지고 전반적인 이동량이 감소한 영향으로 해석됩니다. 이러한 패턴은 출퇴근 중심의 이용 형태를 반영하며, 도심 지역에서 더욱 두드러질 수 있습니다. 계절과 날씨, 공휴일 여부도 추가적으로 분석하면 요일별 대여량 변화의 원인을 더욱 명확히 규명할 수 있을 것입니다.
'Matplotlib → Tableau' 카테고리의 다른 글
Seoul Cycle Dataset Analyze IlI (1) | 2025.02.06 |
---|---|
Seoul Cycle Dataset Analyze Il (0) | 2025.02.04 |
Seoul Cycle Dataset Analyze I (2) | 2025.02.04 |
Matplotlib에서 Tableau로: 데이터 시각화의 새로운 차원 (0) | 2025.02.02 |