3 minute read

서울시 따릉이 이용정보 데이터

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