datamanim Type1. 서울시 따릉이 이용정보 데이터
서울시 따릉이 이용정보 데이터
Q33. 각 요일별 가장 많이 이용한 대여소의 이용횟수와 대여소 번호를 데이터 프레임으로 출력하라
df.head()
| 대여일자 | 대여시간 | 대여소번호 | 대여구분코드 | 성별 | 연령대코드 | 이용건수 | 운동량 | 탄소량 | 이동거리 | 사용시간 | day_name | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2021-06-01 | 0 | 3541 | 정기권 | F | ~10대 | 1 | 0.00 | 0.00 | 0.00 | 8 | Tuesday | 
| 1 | 2021-06-01 | 0 | 765 | 정기권 | F | ~10대 | 1 | 27.21 | 0.35 | 1526.81 | 19 | Tuesday | 
| 2 | 2021-06-01 | 0 | 2637 | 정기권 | F | ~10대 | 1 | 41.40 | 0.37 | 1608.56 | 18 | Tuesday | 
| 3 | 2021-06-01 | 0 | 2919 | 정기권 | F | ~10대 | 1 | 0.00 | 0.00 | 0.00 | 75 | Tuesday | 
| 4 | 2021-06-01 | 0 | 549 | 정기권 | F | ~10대 | 1 | 13.04 | 0.17 | 731.55 | 6 | Tuesday | 
# idea : day_name, 대여소번호로 grouping 한 후 내립차순으로 정렬하고, day_name 의 중복을 첫번째만 남기고 없앤다.
# to_frame 한 상태에서는 day_name 이 index로 들어가 있기 때문에, drop_duplicates를 할 수가 없다.
df2 = df.groupby(['day_name','대여소번호']).size().sort_values(ascending = False).to_frame('size')
df2
| size | ||
|---|---|---|
| day_name | 대여소번호 | |
| Saturday | 502 | 378 | 
| Sunday | 502 | 372 | 
| 152 | 338 | |
| Saturday | 207 | 323 | 
| Sunday | 207 | 318 | 
| ... | ... | ... | 
| Saturday | 2659 | 1 | 
| Friday | 2094 | 1 | 
| Sunday | 2425 | 1 | 
| Tuesday | 2094 | 1 | 
| Wednesday | 2288 | 1 | 
16874 rows × 1 columns
# reset_index() 에서 drop=True 옵션이 index를 col으로 빼고 없애는건데, 지금의 경우에는 없애면 안된다.
df2.reset_index().drop_duplicates('day_name', keep = 'first')
| day_name | 대여소번호 | size | |
|---|---|---|---|
| 0 | Saturday | 502 | 378 | 
| 1 | Sunday | 502 | 372 | 
| 8 | Wednesday | 502 | 282 | 
| 9 | Friday | 502 | 277 | 
| 10 | Tuesday | 502 | 267 | 
| 19 | Monday | 502 | 242 | 
| 298 | Thursday | 2715 | 137 | 
df.head()
| 대여일자 | 대여시간 | 대여소번호 | 대여구분코드 | 성별 | 연령대코드 | 이용건수 | 운동량 | 탄소량 | 이동거리 | 사용시간 | day_name | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2021-06-01 | 0 | 3541 | 정기권 | F | ~10대 | 1 | 0.00 | 0.00 | 0.00 | 8 | Tuesday | 
| 1 | 2021-06-01 | 0 | 765 | 정기권 | F | ~10대 | 1 | 27.21 | 0.35 | 1526.81 | 19 | Tuesday | 
| 2 | 2021-06-01 | 0 | 2637 | 정기권 | F | ~10대 | 1 | 41.40 | 0.37 | 1608.56 | 18 | Tuesday | 
| 3 | 2021-06-01 | 0 | 2919 | 정기권 | F | ~10대 | 1 | 0.00 | 0.00 | 0.00 | 75 | Tuesday | 
| 4 | 2021-06-01 | 0 | 549 | 정기권 | F | ~10대 | 1 | 13.04 | 0.17 | 731.55 | 6 | Tuesday | 
df.대여구분코드.unique()
array(['정기권', '일일권', '단체권', '일일권(비회원)'], dtype=object)
Q34. 나이대별 대여구분 코드의 (일일권/전체횟수) 비율을 구한 후 가장 높은 비율을 가지는 나이대를 확인하라. 일일권의 경우 일일권 과 일일권(비회원)을 모두 포함하라
df.head(3)
| 대여일자 | 대여시간 | 대여소번호 | 대여구분코드 | 성별 | 연령대코드 | 이용건수 | 운동량 | 탄소량 | 이동거리 | 사용시간 | day_name | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2021-06-01 | 0 | 3541 | 정기권 | F | ~10대 | 1 | 0.00 | 0.00 | 0.00 | 8 | Tuesday | 
| 1 | 2021-06-01 | 0 | 765 | 정기권 | F | ~10대 | 1 | 27.21 | 0.35 | 1526.81 | 19 | Tuesday | 
| 2 | 2021-06-01 | 0 | 2637 | 정기권 | F | ~10대 | 1 | 41.40 | 0.37 | 1608.56 | 18 | Tuesday | 
daily = df[df.대여구분코드.isin(['일일권','일일권(비회원)'])].groupby('연령대코드').size().sort_index()
daily
연령대코드
20대     59393
30대     31127
40대     12695
50대      4607
60대       819
70대~      158
~10대    11540
dtype: int64
total = df.연령대코드.value_counts().sort_index()
total  # pandas series type
연령대코드
20대     247561
30대     186722
40대     114799
50대      70428
60대      19288
70대~      3227
~10대     36925
Name: count, dtype: int64
# series type 끼리 서로 연산이 가능함
(daily/total).sort_values(ascending = False)
연령대코드
~10대    0.312525
20대     0.239913
30대     0.166702
40대     0.110585
50대     0.065414
70대~    0.048962
60대     0.042462
dtype: float64
Q38. 평일 (월~금) 출근 시간대(오전 6,7,8시)의 대여소별 이용 횟수를 구해서 데이터 프레임 형태로 표현한 후 각 대여시간별 이용 횟수의 상위 3개 대여소와 이용횟수를 출력하라
con1 = df.day_name.isin(['Saturday','Sunday'])
con2 = df.대여시간.isin([6,7,8])
df_cond = df[~con1 & con2]
df_tg = df_cond.groupby(['대여시간','대여소번호']).size().to_frame('이용 횟수')
df_tg
| 이용 횟수 | ||
|---|---|---|
| 대여시간 | 대여소번호 | |
| 6 | 102 | 5 | 
| 103 | 8 | |
| 106 | 1 | |
| 109 | 4 | |
| 111 | 5 | |
| ... | ... | ... | 
| 8 | 4864 | 4 | 
| 4865 | 12 | |
| 4867 | 3 | |
| 4868 | 3 | |
| 9980 | 1 | 
6236 rows × 1 columns
# sort_values 에 값을 이용횟수만 넣으면 index가 꼬여서 대여시간까지 같이 넣어줘야함
display(df_tg.sort_values(['대여시간','이용 횟수'], ascending = False),df_tg.sort_values(['이용 횟수'], ascending = False))
| 이용 횟수 | ||
|---|---|---|
| 대여시간 | 대여소번호 | |
| 8 | 2701 | 119 | 
| 646 | 115 | |
| 1152 | 92 | |
| 1906 | 91 | |
| 247 | 89 | |
| ... | ... | ... | 
| 6 | 4804 | 1 | 
| 4811 | 1 | |
| 4852 | 1 | |
| 4860 | 1 | |
| 4861 | 1 | 
6236 rows × 1 columns
| 이용 횟수 | ||
|---|---|---|
| 대여시간 | 대여소번호 | |
| 8 | 2701 | 119 | 
| 646 | 115 | |
| 7 | 259 | 104 | 
| 8 | 1152 | 92 | 
| 1906 | 91 | |
| ... | ... | ... | 
| 6 | 1929 | 1 | 
| 7 | 1652 | 1 | 
| 6 | 1920 | 1 | 
| 7 | 1657 | 1 | 
| 8 | 9980 | 1 | 
6236 rows × 1 columns
# df_tg로 한번 grouping 된 dataframe을 다시 grouping 하면서 head()로 집계함
df_tg.sort_values(['대여시간','이용 횟수'], ascending = False).groupby(['대여시간']).head(3)
| 이용 횟수 | ||
|---|---|---|
| 대여시간 | 대여소번호 | |
| 8 | 2701 | 119 | 
| 646 | 115 | |
| 1152 | 92 | |
| 7 | 259 | 104 | 
| 230 | 77 | |
| 726 | 77 | |
| 6 | 2744 | 45 | 
| 1125 | 40 | |
| 1028 | 36 | 
Q40. 남성(‘M’ or ‘m’)과 여성(‘F’ or ‘f’)의 이동거리값의 평균값을 구하여라
# map 을 통해 컬럼 값 넣기
df['sex'] = df.성별.map(lambda x : '남' if x.lower() == 'm' else '여')
df.groupby('sex').이동거리.mean().to_frame('이동거리')
| 이동거리 | |
|---|---|
| sex | |
| 남 | 3209.110871 | 
| 여 | 3468.575025 | 
Leave a comment