주제 : 2023년 상반기 서울 따릉이 신규 가입자 분석하기

서울 공유자전거 따릉이가 나온지 8년 정도 되어가는데, 이미 가입할 사람은 다 가입했다고 생각하여 과연 신규 가입자가 더 있을까 하는 궁금증에 알아보게 되었습니다. 어떤 달에 가입이 많았는지, 성별 간 가입자의 차이, 연령대 별 가입자의 차이 r 코딩을 통해 분석했습니다.

필요 데이터

분석

library(readr)
## Warning: 패키지 'readr'는 R 버전 4.3.2에서 작성되었습니다
library(dplyr)
## 
## 다음의 패키지를 부착합니다: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ggplot2)
## Warning: 패키지 'ggplot2'는 R 버전 4.3.2에서 작성되었습니다
file_path <- "C:/Users/home/Desktop/서울특별시 공공자전거 신규가입자 정보(월별)_23.1-6.csv"
bycycle <- read_csv(file_path, locale = locale(encoding="CP949"))
## Rows: 96 Columns: 5
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (3): 사용자코드, 연령대코드, 성별
## dbl (1): 가입일시
## num (1): 가입 수
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
bycycle
## # A tibble: 96 × 5
##    가입일시 사용자코드  연령대코드 성별  `가입 수`
##       <dbl> <chr>       <chr>      <chr>     <dbl>
##  1   202301 회원-내국인 ~10대      F          1096
##  2   202301 회원-내국인 20대       F          2006
##  3   202301 회원-내국인 30대       F           961
##  4   202301 회원-내국인 40대       F           794
##  5   202301 회원-내국인 50대       F           479
##  6   202301 회원-내국인 60대       F           133
##  7   202301 회원-내국인 70대이상   F            20
##  8   202301 회원-내국인 기타       F             3
##  9   202301 회원-내국인 ~10대      M          1286
## 10   202301 회원-내국인 20대       M          2177
## # ℹ 86 more rows
bycycle <- rename(bycycle, player="가입 수", sex="성별", age="연령대코드", date="가입일시", usercode="사용자코드", agecode="연령대코드")
bycycle
## # A tibble: 96 × 5
##      date usercode    agecode  sex   player
##     <dbl> <chr>       <chr>    <chr>  <dbl>
##  1 202301 회원-내국인 ~10대    F       1096
##  2 202301 회원-내국인 20대     F       2006
##  3 202301 회원-내국인 30대     F        961
##  4 202301 회원-내국인 40대     F        794
##  5 202301 회원-내국인 50대     F        479
##  6 202301 회원-내국인 60대     F        133
##  7 202301 회원-내국인 70대이상 F         20
##  8 202301 회원-내국인 기타     F          3
##  9 202301 회원-내국인 ~10대    M       1286
## 10 202301 회원-내국인 20대     M       2177
## # ℹ 86 more rows
bycycle$player <- as.integer(gsub(",", "", bycycle$player))
bycycle
## # A tibble: 96 × 5
##      date usercode    agecode  sex   player
##     <dbl> <chr>       <chr>    <chr>  <int>
##  1 202301 회원-내국인 ~10대    F       1096
##  2 202301 회원-내국인 20대     F       2006
##  3 202301 회원-내국인 30대     F        961
##  4 202301 회원-내국인 40대     F        794
##  5 202301 회원-내국인 50대     F        479
##  6 202301 회원-내국인 60대     F        133
##  7 202301 회원-내국인 70대이상 F         20
##  8 202301 회원-내국인 기타     F          3
##  9 202301 회원-내국인 ~10대    M       1286
## 10 202301 회원-내국인 20대     M       2177
## # ℹ 86 more rows
monthly_signup <- bycycle %>%
  group_by(date) %>%
  summarise(total_player = sum(player))
bycycle
## # A tibble: 96 × 5
##      date usercode    agecode  sex   player
##     <dbl> <chr>       <chr>    <chr>  <int>
##  1 202301 회원-내국인 ~10대    F       1096
##  2 202301 회원-내국인 20대     F       2006
##  3 202301 회원-내국인 30대     F        961
##  4 202301 회원-내국인 40대     F        794
##  5 202301 회원-내국인 50대     F        479
##  6 202301 회원-내국인 60대     F        133
##  7 202301 회원-내국인 70대이상 F         20
##  8 202301 회원-내국인 기타     F          3
##  9 202301 회원-내국인 ~10대    M       1286
## 10 202301 회원-내국인 20대     M       2177
## # ℹ 86 more rows
monthly_signup
## # A tibble: 6 × 2
##     date total_player
##    <dbl>        <int>
## 1 202301        12942
## 2 202302        27969
## 3 202303        62456
## 4 202304        72028
## 5 202305        74856
## 6 202306        65473
most_signups <- monthly_signup[which.max(monthly_signup$total_player), ]
most_signups
## # A tibble: 1 × 2
##     date total_player
##    <dbl>        <int>
## 1 202305        74856
print(most_signups)
## # A tibble: 1 × 2
##     date total_player
##    <dbl>        <int>
## 1 202305        74856
ggplot(monthly_signup, aes(x = date, y = total_player, fill = date)) +
  geom_bar(stat = "identity") +
  theme_minimal() + 
  labs(title = "월별 가입자 수",
       x = "가입일시",
       y = "총 가입자 수")

Including Plots

You can also embed plots, for example:

bysex_signup <- bycycle %>%
  group_by(sex) %>%
  summarise(total_player = sum(player))
bycycle
## # A tibble: 96 × 5
##      date usercode    agecode  sex   player
##     <dbl> <chr>       <chr>    <chr>  <int>
##  1 202301 회원-내국인 ~10대    F       1096
##  2 202301 회원-내국인 20대     F       2006
##  3 202301 회원-내국인 30대     F        961
##  4 202301 회원-내국인 40대     F        794
##  5 202301 회원-내국인 50대     F        479
##  6 202301 회원-내국인 60대     F        133
##  7 202301 회원-내국인 70대이상 F         20
##  8 202301 회원-내국인 기타     F          3
##  9 202301 회원-내국인 ~10대    M       1286
## 10 202301 회원-내국인 20대     M       2177
## # ℹ 86 more rows
bysex_signup
## # A tibble: 2 × 2
##   sex   total_player
##   <chr>        <int>
## 1 F           147277
## 2 M           168447
most_signups <- bysex_signup[which.max(monthly_signup$total_player), ]
most_signups
## # A tibble: 1 × 2
##   sex   total_player
##   <chr>        <int>
## 1 <NA>            NA
print(most_signups)
## # A tibble: 1 × 2
##   sex   total_player
##   <chr>        <int>
## 1 <NA>            NA
ggplot(bysex_signup, aes(x = sex, y = total_player, fill = sex)) +
  geom_bar(stat = "identity") +
  theme_minimal() + 
  labs(title = "성별간 가입자 수",
       x = "성별",
       y = "총 가입자 수")

Note that the echo = FALSE parameter was added to the code chunk to prevent printing of the R code that generated the plot.

aged_signup <- bycycle %>%
  group_by(agecode) %>%
  summarise(total_player = sum(player))
bycycle
## # A tibble: 96 × 5
##      date usercode    agecode  sex   player
##     <dbl> <chr>       <chr>    <chr>  <int>
##  1 202301 회원-내국인 ~10대    F       1096
##  2 202301 회원-내국인 20대     F       2006
##  3 202301 회원-내국인 30대     F        961
##  4 202301 회원-내국인 40대     F        794
##  5 202301 회원-내국인 50대     F        479
##  6 202301 회원-내국인 60대     F        133
##  7 202301 회원-내국인 70대이상 F         20
##  8 202301 회원-내국인 기타     F          3
##  9 202301 회원-내국인 ~10대    M       1286
## 10 202301 회원-내국인 20대     M       2177
## # ℹ 86 more rows
aged_signup
## # A tibble: 8 × 2
##   agecode  total_player
##   <chr>           <int>
## 1 20대           120085
## 2 30대            66875
## 3 40대            45778
## 4 50대            26640
## 5 60대             8643
## 6 70대이상         1495
## 7 ~10대           45741
## 8 기타              467
most_signups <- aged_signup[which.max(aged_signup$total_player), ]
most_signups
## # A tibble: 1 × 2
##   agecode total_player
##   <chr>          <int>
## 1 20대          120085
print(most_signups)
## # A tibble: 1 × 2
##   agecode total_player
##   <chr>          <int>
## 1 20대          120085
ggplot(aged_signup, aes(x = agecode, y = total_player, fill = agecode)) +
  geom_bar(stat = "identity") +
  theme_minimal() + 
  labs(title = "연령대별 가입자 수",
       x = "연령대",
       y = "총 가입자 수")

해석

첫 번째로 월에 따른 가입자 분석 결과를 보면, 5월이 가장 많고 그 다음으로는 4월, 6월, 3월, 2월, 1월 순이었습니다. 이는 계절에 영향을 받은 것으로 해석할 수 있습니다. 1월 2월에는 날씨가 추워 가입자 수가 적었고, 이후 날씨가 점점 따뜻해짐에 따라 가입자 수가 폭발적으로 증가한 것이 근거입니다.

두 번째로 성별 간 가입자 분석 결과를 보면, 남성이 여성보다 더 많은 신규 가입을 했습니다. 이는 여성과 남성의 의복 차이를 통해 설명할 수 있습니다. 서울에서 출퇴근 시간에 따릉이 이용률이 가장 높은데, 여성복이 남성복에 비해 자전거를 타는데 있어 불편할 수 있습니다. 이로 인해 자전거 이용이 제한되어 가입자 수가 적은 걸로 해석할 수 있습니다.

세 번째로 연령대 별 가입자 분석 결과를 보면, 20대가 가장 많았고 이후에는 30대, 40대, 10대, 50대, 60대, 70대, 기타 순입니다. 이는 20대가 대학교나 직장으로 이동할 때 교통수단으로 자전거를 많이 사용하기 때문입니다. 20대는 학생이거나 사회초년생인 경우가 대부분이기 때문에 상대적으로 비용이 적게 드는 교통수단을 선호합니다. 따릉이는 월 1~2천원 정도 밖에 안하기 때문에 그들에게 안성맞춤 교통수단인 것입니다.