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