- 파이썬 프로젝트 마무리 및 발표DAY
귀무가설: 출퇴근 시간대의 대여량과 반납량은 차이가 없을 것이다.
대립가설: 출퇴근 시간대의 대여량과 반납량은 차이가 있을 것이다.
- 출퇴근 시간 대여 반납량 분석
rent_detail['return_date']=pd.to_datetime(rent_detail['return_date'])
rent_detail['rent_hour']=rent_detail['rent_date_detail'].dt.hour
rent_detail['return_hour']=rent_detail['return_date'].dt.hour
rent_detail['day']=rent_detail['rent_date_detail'].dt.day
rent_detail_weekday=rent_detail.query('day not in [3,4,6,10,11]')
rent=rent_detail_weekday[['rent_hour','place_number','place_name']]
return_=rent_detail_weekday[['return_hour','return_place_num','return_place_name']]
rent=pd.merge(rent,place,how='left',on='place_number').rename(columns={'address_district':'district','place_name_x':'place_name'}).drop('place_name_y',axis=1)
return_=pd.merge(return_,place,how='left',left_on='return_place_name',right_on='place_name').rename(columns={'address_district':'district'}).drop('return_place_num',axis=1).drop('return_place_name',axis=1)
return_=pd.merge(return_,place,on='place_name').rename(columns={'place_number_y':'place_number'}).drop('place_number_x',axis=1).drop('address_district',axis=1)
rent_go_to_work=rent.query('6<=rent_hour<=9')
rent_back_to_home=rent.query('17<=rent_hour<=20')
return_go_to_work=return_.query('6<=return_hour<=9')
return_back_to_home=return_.query('17<=return_hour<=20')
rent_morning=rent_go_to_work.groupby(['place_name','district','address_lat','address_long'],as_index=False)\
.agg(n=('place_name','count'))
rent_night=rent_back_to_home.groupby(['place_name','district','address_lat','address_long'],as_index=False)\
.agg(n=('place_name','count'))
return_morning=return_go_to_work.groupby(['place_name','district','address_lat','address_long'],as_index=False)\
.agg(n=('place_name','count'))
return_night=return_back_to_home.groupby(['place_name','district','address_lat','address_long'],as_index=False)\
.agg(n=('place_name','count'))
morning=pd.merge(rent_morning,return_morning,how='inner',on='place_name').rename(columns={'n_x':'rent','n_y':'return'}).sort_values('place_name')
morning=morning.drop(columns=['address_lat_x','address_long_x','district_x']).rename(columns={'district_y':'district','address_lat_y':'address_lat','address_long_y':'address_long'})
morning['difference']=morning['rent']-morning['return']
night=pd.merge(rent_night,return_night,how='inner',on='place_name').rename(columns={'n_x':'rent','n_y':'return'}).sort_values('place_name')
night=night.drop(columns=['district_x','address_lat_x','address_long_x']).rename(columns={'district_y':'district','address_lat_y':'address_lat','address_long_y':'address_long'})
night['difference']=night['rent']-night['return']
morning['difference_per_day']=round(morning['difference']/21,1)
night['difference_per_day']=round(night['difference']/21,1)
#테이블
morning.sort_values('difference_per_day',ascending=False).head(5)
morning.sort_values('difference_per_day').head(5)
night.sort_values('difference_per_day',ascending=False).head(5)
night.sort_values('difference_per_day').head(5)
- LG유플러스의 마곡사옥은 오전에 대여-반납이 -1790으로 반납이 훨씬 많은 것을 알 수 있다. 출근할 때 쓰고 회사 앞에 반납하는 사람이 많은 것으로 보이며 오후에는 이와 반대로 1256으로 대여가 더 많은 것을 알 수 있다.
- 위와 같은 결과로 귀무가설은 기각되고 출퇴근 시간의 대여량과 반납량이 차이가 있다는 것을 볼 수 있으며 자전거의 재배치가 이루어질 경우 출근 시간에는 업무 단지 주변에서 빠르게 수거하는 것이 필요하다는 것을 알 수 있다.
귀무가설: 따릉이의 외국인 이용량은 증가하지 않았을 것이다.
대립가설: 따릉이의 외국인 이용량은 증가하였을 것이다.
- 외국인 이용자 추세 확인(22.07~23.06)
import pandas as pd
import matplotlib.pyplot as plt
# rent_date_detail 컬럼을 datetime 형식으로 변환
rent_detail_1year['rent_date_detail'] = pd.to_datetime(rent_detail_1year['rent_date_detail'])
# rent_date_detail에서 월을 추출하여 새로운 컬럼 추가
rent_detail_1year['rent_month'] = rent_detail_1year['rent_date_detail'].dt.to_period('M')
# 월별 대여 건수 계산
monthly_rent_counts = rent_detail_1year['rent_month'].value_counts().sort_index()
# 막대 그래프 그리기
plt.figure(figsize=(10, 6))
plt.bar(monthly_rent_counts.index.astype(str), monthly_rent_counts.values, color='skyblue')
# 선 그래프 그리기
plt.plot(monthly_rent_counts.index.astype(str), monthly_rent_counts.values, marker='o', color='orange')
plt.title('따릉이 외국인 이용자 월별 대여량 추이')
plt.xlabel('연월')
plt.ylabel('대여 횟수')
plt.xticks(rotation=45, ha='right')
plt.legend()
# 레이블 값 추가
for i, txt in enumerate(monthly_rent_counts.values):
plt.annotate(txt, (monthly_rent_counts.index.astype(str)[i], txt), ha='center', va='bottom')
plt.tight_layout()
plt.show()
- 여의나루역 대여 반납 분석
- 외국인들의 따릉이 이용을 전년도와 비교하여 분석하고 싶었지만 외국인 이용자의 정보를 수집한게 얼마되지 않아 어려운 점이 있었다. 7월만 보았을 때 전년도 대비 증가하였고 추운 겨울을 제외하고 지속적으로 증가하는 모습을 보이고 있다. 또한 한강공원이 근처에 있는 여의나루역의 대여와 반납을 비교했을 때 대부분의 외국인 이용자들이 근처에서 여의나루역 근처에서 따릉이를 이용하는 것으로 확인할 수 있었다.
rent_detail_foreigner=pd.read_csv('rent_detail_foreigner2.csv')
rent_detail_foreigner=pd.merge(rent_detail_foreigner,place_list[['place_number','place_name']],how='left',left_on='place_number',right_on='place_number').rename(columns={'place_name':'rent_place'})
rent_detail_foreigner=pd.merge(rent_detail_foreigner,place_list[['place_number','place_name']],how='left',left_on='return_place_num',right_on='place_number').drop(['place_number_y'],axis=1).rename(columns={'place_number_x':'place_number','place_name':'return_place'})
foreigner=rent_detail_foreigner.query('return_place=="여의나루역 1번출구 앞"')
df=foreigner.groupby(['rent_place'],as_index=False)\
.agg(count=('Unnamed: 0','count')).sort_values('count',ascending=False).head(10)
plt.title('어디서 여의나루 1번출구로 오는가')
plt.xticks(rotation=45,fontsize=8)
sns.barplot(data=df,x='rent_place',y='count');
df2=rent_detail_foreigner.query('rent_place=="여의나루역 1번출구 앞"')
df2=df2.groupby(['return_place'],as_index=False)\
.agg(count=('Unnamed: 0','count')).sort_values('count',ascending=False).head(10)
plt.title('여의나루 1번출구에서 어디로 가는가')
plt.xticks(rotation=45,fontsize=8)
sns.barplot(data=df2,x='return_place',y='count');
'Data > [SeSAC 성동1기 전Z전능 데이터 분석가]' 카테고리의 다른 글
[성동1기 전Z전능 데이터 분석가] Day 42 (1) | 2023.12.12 |
---|---|
[성동1기 전Z전능 데이터 분석가] Day 41 (0) | 2023.12.12 |
[성동1기 전Z전능 데이터 분석가] Day 37 (2) | 2023.12.05 |
[성동1기 전Z전능 데이터 분석가] Day 36 (0) | 2023.12.04 |
[성동1기 전Z전능 데이터 분석가] Day 35 (0) | 2023.12.01 |