1차 진행 : 날씨 관련 데이터 활용하기
요약
- 추가할 데이터 : 최고기온, 최저기온, 습도, 강수량
- 생성할 데이터 : 불쾌지수
- 데이터 출처 : https://data.kma.go.kr/climate/RankState/selectRankStatisticsDivisionList.do?pgmNo=179
기상자료개방포털[기후통계분석:통계분석:조건별통계]
중부(26) 서울경기: 서울(108), 인천(112), 수원(119), 강화(201), 양평(202), 이천(203) 강원영동: 속초(90), 강릉(105), 태백(216) 강원영서: 철원(95), 대관령(100), 춘천(101), 원주(114), 인제(211), 홍천(212) 충북:
data.kma.go.kr
컬럼 수정하기
- 컬럼 생성
- [식사가능인원] 컬럼 : '본사정원수' - (본사휴가자수 + 본사출장자수 + 현본사소속재택근무자수)
- [일자] 컬럼 => [연도], [월], [일]로 나누기
- [계절] 컬럼 생성하기
- 컬럼 삭제
- [조식메뉴] 컬럼 삭제
- 컬럼(데이터) 추가
- '기온' 데이터 : 최고기온(℃), 최저기온(℃) 추가
- '기온' & '습도'데이터 : [불쾌지수] 컬럼 추가
- '강수량' 데이터 : 강수량(rain) 추가
- 컬럼명 변경
- [본사정원수] → [정원수]
- [본사휴가자수] → [휴가자수]
- [본사출장자수] → [출장자수]
- [본사시간외근무명령서승인건수] → [야근수]
- [현본사소속재택근무자수] → [재택근무자수]
날씨 관련 데이터와 상관계수 확인하기
→ 수치 상으로는 날씨데이터와 중식계, 석식계의 상관관계가 낮은 것으로 나타남.
가설) "기온이 식사 수에 영향을 미칠까?"
방법 1. 여름(6,7,8월) 중 가장 더운 날/ 덜 더운날 top15 비교하기
→ 이렇게는 큰 차이를 찾아내기 어렵다고 판단. 적당한 기준점과 범주화가 필요할 것으로 보임.
방법 2. 날씨를 범주화하여 비교하기
→ 계절이 '여름' 인 행의 수 307개.
- 날씨를 세 개의 범주로 나누기 : '무더위', '보통', '선선한 날'
- 범주의 기준 : 최고온도 상위 100일의 평균온도와 최고온도 하위 100일의 평균온도
→ 범주로 나눈 후 각 범주의 개수는 위와 같음.
→ 석식에서는 큰 차이를 보이지 않지만, 중식의 경우 무더운 날일 수록 중식계의 수가 적은 모습을 보임.
같은 방법으로 '불쾌지수'로 결과를 확인했을 경우
→ 불쾌지수가 높을 수록 중식계와 석식계의 수가 적은 것을 확인할 수 있었음.
구내식당 에어컨이 잘 안나오나..?
강수량 데이터로도 확인해보기
- 기상청에서는 강수 표현을 약한 비, (보통) 비, 강한 비, 매우 강한 비로 나누어 표현한다.
- 약한 비는 1시간에 3mm 미만
- 보통 비는 1시간에 3~15mm 미만
- 강한 비는 1시간에 15mm 이상
- 매우 강한 비는 1시간에 30mm 이상을 의미합니다.
- 약한 비(0), 보통 비(1), 강한 비(2), 매우 강한 비(3)으로 표현
# 강수량 함수 만들기
# 약한 비(0), 보통 비(1), 강한 비(2), 매우 강한 비(3)으로 표현
def get_rain(rain):
if rain >= 30:
return 3
elif rain >= 15:
return 2
elif rain >= 3:
return 1
else :
return 0
train_weather['강수량정도'] = train_weather['rain'].apply(get_rain)
plt.figure(figsize=(5,5))
sns.barplot(train_weather, x='강수량정도', y = '중식계')
plt.title('강수량 정도별 중식계 평균 수')
→ 비가 강하게 오는 날일수록 구내식당 이용률이 높다는 것이 확인됨.
조원들과 피드백 이후
방법 3. 여름과 겨울의 기온예측도 기상청 기준으로 해보면 어떨까?
여름 데이터
- 일반적으로 일 최고기온이 33℃ 이상일 때를 폭염이라고 합니다.
- '폭염주의보' : 33℃ 이상이 2일 이상 지속일 경우
- '폭염경보' : 35℃ 이상이 2일 이상 지속일 경우
def heat_alert(a):
if a >= 35:
return '폭염경보'
elif a >= 33:
return '폭염'
else:
return '안전'
여름['날씨경보'] = 여름['최고기온(℃)'].apply(heat_alert)
# 폭염경보와 폭염주의보를 구분할 때, 2일 이상의 조건을 위한 함수를 제작하고자 하였으나 실패함.
겨울 데이터
- 한파는 10월~4월 사이의 기간을 기준으로 합니다.
- '한파주의보'
- 아침 최저기온이 전날보다 10℃이상 하강하여 3℃ 이하인 경우,
- 아침 최저기온이 -12℃이하가 2일 이상 지속일 경우
- '한파경보'
- 아침 최저기온이 전날보다 15℃이상 하강하여 3℃ 이하인 경우,
- 아침 최저기온이 -15℃이하가 2일 이상 지속일 경우
b = '최저기온(℃)'
def cold_wave(b):
if b <= -15:
return '한파경보'
elif b <= -12:
return '한파'
else:
return '안전'
겨울['날씨경보'] = 겨울['최저기온(℃)'].apply(cold_wave)
→ 겨울 또한, 조건을 '2일 이상 지속'으로 넣지 못하였는데
그럼에도 불구하고 한파경보는 1일, 한파는 5일이라는 매우 적은 수를 보였다.
비교를 하기에 너무 데이터 수가 적다고 판단된다.
만약 '2일 이상 지속' 조건까지 넣었다면 데이터가 더 적어지지 않았을까.
→ 그래서 결과도 이런 식으로 나왔다..