공모전/서울시 따릉이 관광 활성화

공모전 | 서울시 공공자전거 데이터셋, 분석 방향, EDA

ANNASENA 2024. 7. 14. 16:26
728x90

 

 

▶ 2024 문화디지털 혁신 및 문화데이터 활용 공모전 요강

https://www.culture.go.kr/digicon/pages/contest_1

 

2024 문화디지털혁신 및 문화데이터 활용 공모전

2024 문화디지털혁신 및 문화데이터 활용 공모전입니다.

www.culture.go.kr

 

▶ EDA 및 전처리 코드_주피터 노트북

(EDA_1) 따릉이 대여이력(23.12).ipynb
1.03MB
(전처리) 따릉이 대여이력(23.08~12).ipynb
1.01MB
(전처리_외) 따릉이 대여이력(23.08~12).ipynb
0.40MB


1. 데이터셋 

서울시 공공자전거 대여이력 정보 (2023.08~2023.12)

https://data.seoul.go.kr/dataList/OA-15182/F/1/datasetView.do

 

열린데이터광장 메인

데이터분류,데이터검색,데이터활용

data.seoul.go.kr

 

자전거번호 대여일시 대여 대여소번호 대여 대여소명 대여거치대 반납일시 반납대여소번호 반납대여소명 반납거치대 이용시간(분) 이용거리(M) 생년 성별 이용자종류 대여대여소ID 반납대여소ID 자전거구분

 

 

서울시 공공자전거 이용정보(월별) (2022.05~2023.12)

https://data.seoul.go.kr/dataList/OA-15248/F/1/datasetView.do

 

열린데이터광장 메인

데이터분류,데이터검색,데이터활용

data.seoul.go.kr

 

대여년월 대여소번호 대여소명 대여구분코드 성별 연령대코드 이용건수 운동량 탄소량 이용거리(M) 이용시간(분)

 

 

서울시 따릉이 마스터 정보

https://www.data.go.kr/data/15099365/fileData.do

 

서울특별시_따릉이대여소 마스터 정보_20220112

서울특별시 따릉이대여소 마스터 정보입니다.<br/>서울특별시 따릉이대여소에 대한 대여소 ID, 역 주소, 좌표 정보를 확인할 수 있습니다.<br/><br/>부서 : 교통정보과 (02-2133-4958)

www.data.go.kr

대여소_ID 주소1 주소2 위도 경도

2. 분석 방향

(분석flow 참고)

LG_전국 졸음쉼터 방문고객 데이터를 활용한 졸음쉼터 유형화 분석.pdf
0.85MB


3. EDA 초안

3-1) 서울시 공공자전거 대여이력정보 (23.12) 자료 분석

▶ 외국인 / 내국인 분류 후 분석

  외국인 내국인  비고
TOP10 대여-반납대여소명
(외국인)
* 대여장소와 반납장소가 같은 경우가 많음
(내국인)
* 대여장소와 반납 장소가 불일치
대여대여소명 = 반납대여소명
(외국인)
* 대여장소 = 반납장소
* 주로 관광지라고 불리는 곳의 대여소를 많이 찾음
ex) 뚝섬, 여의나루, 서울숲, 명동, 동역사 등

(내국인)
* 대여장소와 = 반납장소가 같은 경우는 주로 여가시간(친구만남, 데이트 등)을 보내기 좋은 장소
* 특히 한강 둔치가 많음
이용시간 별 이용거리
(외국인)
* 대체로 짧은 시간 안에 짧은 거리 이동할 때 사용

(내국인)
* 이용시간도, 이용거리도 다양
* 외국인에 비해 폭넓게 이용

대여일자 별 대여건수
* 대여일자 별 대여건수는 날씨 등 외부요인의 작용이 클 것 같아서 주의깊게 보지 않아도 될 듯
 
대여시간 별 대여건수
(외국인)
* 주로 점심 먹은 이후 오후시간대에 이용

(내국인)
* 주로 오전 8~9시, 오후 6~7시에 이용하는 것으로 보아 출,퇴근용으로 보임 (통학용)
대여 요일 별 대여건수
(외국인)
* 금토일이 많음
_주말이 많음

(내국인)
* 화, 금이 많음
_평일이 많음
성별 비율  
*내국인 남녀 비율
: 남 > 여
2배 차이
연령대 별
이용시간 
 
20-30-40대
* 80대 이상 다시 전처리 필요
연령대 별
이용거리
 
 
연령대 별
대여일자 별 대여건수
 
(연령대)
20, 30대 이용이 많음
40, 50대 순
연령대 별
대여시간 별
대여건수
 
(이용시간대)
출-퇴근 시간
늦은 오전~오후시간

(연령대)
30대 > 20대 > 40대
연령대 별
대여요일 별
대여건수
 
(이용 요일)
화 > 금

(연령대)
20대 > 30대

 

 

3-2) 서울시 공공자전거 대여이력정보 (23.08~12) 자료 전처리 후 합치기

▶ 전처리 함수 및 데이터

(1) 내국인(비회원)

# 0. 라이브러리 임포트
import datetime as dt

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.pyplot as ticker
import seaborn as sns

#지수표현식 없애기 
pd.options.display.float_format = '{:.5f}'.format
#되돌리기
#pd.reset_option('display.float_format')

# 한글 깨짐 해결
plt.rcParams['font.family'] ='Malgun Gothic'
plt.rcParams['axes.unicode_minus'] =False

# 연령대 전처리 함수  
def age_gen(row):
    if row['생년'] >= 2005:
        return '10대'
    elif 1995 <= row['생년'] < 2005:
        return '20대'
    elif 1985 <= row['생년'] < 1995:
        return '30대'
    elif 1975 <= row['생년'] < 1985:
        return '40대'
    elif 1965 <= row['생년'] < 1975:
        return '50대'
    elif 1955 <= row['생년'] < 1965:
        return '60대'
    elif 1945 <= row['생년'] < 1955:
        return '70대'
    else:
        return '기타'

# df 전처리 함수
def pre_drop_func(file_path):
    ## 1. 데이터 로드
    df = pd.read_csv(file_path, encoding='cp949')
    
    ## 2. 필요없는 컬럼 drop
    # 대여거치대, 반납거치대 없애기
    df = df.drop(columns=['자전거번호', '대여거치대', '반납거치대'], axis=1)

    ## 3. 필요없는 행 drop (\N 값이 있는 행 제거)
    df.replace('\\N', np.nan, inplace=True)
    df.dropna(inplace=True)
    
    ## 4. 수치형 데이터 전처리
    # 반납대여소번호 int32 형식으로 바꾸기
    df['반납대여소번호'] = df['반납대여소번호'].astype('int32')
    
    # 생년 데이터 int32 형식으로 바꾸기
    df['생년'] = df['생년'].astype('int32')
    
    # 생년이 2011년 이후이거나 1939년 이전인 경우 제거
    df = df[(df['생년'] < 2011) & (df['생년'] > 1939)]
    
    # 이용시간이 0이거나 이용거리가 0인 행 제거
    df = df[(df['이용시간(분)'] != 0) & (df['이용거리(M)'] != 0)]

    ## 5. 범주형 데이터 전처리
    # 성별 전처리
    df['성별'] = df['성별'].replace({'f': 'F', 'm': 'M'})
    
    ## 6. 날짜 데이터 전처리
    # 날짜 데이터 datetime 형식으로 바꾸기
    df['대여일시'] = pd.to_datetime(df['대여일시'])
    df['반납일시'] = pd.to_datetime(df['반납일시'])
    
    # 대여일시, 반납일시 >> 대여/반납날짜 컬럼, 대여/반납시간 컬럼 생성
    # 대여날짜, 반납날짜 컬럼 만들기
    df = df.assign(대여날짜 = df['대여일시'].dt.date)
    df = df.assign(반납날짜 = df['반납일시'].dt.date)

    # 대여시간, 반납시간 컬럼 만들기
    df = df.assign(대여시간 = df['대여일시'].dt.hour)
    df = df.assign(반납시간 = df['반납일시'].dt.hour)
    
    # 대여날짜, 반납날짜 datetime 형식으로 바꾸기
    df['대여날짜'] = pd.to_datetime(df['대여날짜'])
    df['반납날짜'] = pd.to_datetime(df['반납날짜'])
    
    # 대여일자, 대여요일
    df = df.assign(대여일자 = df['대여날짜'].dt.day)
    df = df.assign(대여요일 = df['대여날짜'].dt.day_name())
    
    # 연령대 컬럼 만들기
    df['연령대'] = df.apply(age_gen, axis=1)
    
    return pd.DataFrame(df)

 

(2) 외국인 (성별, 생년이 nan임 >> drop하지 말고, 이용자종류 = 외국인 데이터 추출하기)

서울특별시 공공자전거 대여이력 정보_23하반기(전처리완_외).csv
4.62MB

# 0. 라이브러리 임포트
import datetime as dt

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.pyplot as ticker
import seaborn as sns

# 한글 깨짐 해결
plt.rcParams['font.family'] ='Malgun Gothic'
plt.rcParams['axes.unicode_minus'] =False

# df 전처리 함수
def pre_out_func(file_path):
    ## 1. 데이터 로드
    df = pd.read_csv(file_path, encoding='cp949')
    df = df[df['이용자종류']=='외국인']
    
    ## 2. 필요없는 컬럼 drop
    # 대여거치대, 반납거치대 없애기
    df = df.drop(columns=['자전거번호', '대여거치대', '반납거치대', '자전거구분', '성별', '생년'], axis=1)

    ## 3. 필요없는 행 drop (\N 값이 있는 행 제거)
    df.replace('\\N', np.nan, inplace=True)
    df = df.dropna(subset=['반납대여소번호'])
    
    ## 4. 수치형 데이터 전처리
    # 반납대여소번호 int32 형식으로 바꾸기
    df['반납대여소번호'] = df['반납대여소번호'].astype('int32')
    
    # 이용시간이 0이거나 이용거리가 0인 행 제거
    df = df[(df['이용시간(분)'] != 0) & (df['이용거리(M)'] != 0)]
    
    ## 5. 날짜 데이터 전처리
    # 날짜 데이터 datetime 형식으로 바꾸기
    df['대여일시'] = pd.to_datetime(df['대여일시'])
    df['반납일시'] = pd.to_datetime(df['반납일시'])
    
    # 대여일시, 반납일시 >> 대여/반납날짜 컬럼, 대여/반납시간 컬럼 생성
    # 대여날짜, 반납날짜 컬럼 만들기
    df = df.assign(대여날짜 = df['대여일시'].dt.date)
    df = df.assign(반납날짜 = df['반납일시'].dt.date)

    # 대여시간, 반납시간 컬럼 만들기
    df = df.assign(대여시간 = df['대여일시'].dt.hour)
    df = df.assign(반납시간 = df['반납일시'].dt.hour)
    
    # 대여날짜, 반납날짜 datetime 형식으로 바꾸기
    df['대여날짜'] = pd.to_datetime(df['대여날짜'])
    df['반납날짜'] = pd.to_datetime(df['반납날짜'])
    
    # 대여일자, 대여요일
    df = df.assign(대여일자 = df['대여날짜'].dt.day)
    df = df.assign(대여요일 = df['대여날짜'].dt.day_name())
    
    # 대여월 
    df = df.assign(대여월 = df['대여날짜'].dt.month)
    
    # 필요없는 컬럼 다시 버리기
    df = df.drop(columns=['대여일시', '반납일시'], axis=1)
    
    return pd.DataFrame(df)

 

3-3) 서울시 공공자전거 대여이력정보 (23.08~12) 자료 분석

▶ 외국인 / 내국인 분류 후 분석

  외국인 내국인  비고
TOP10 대여-반납대여소명
(외국인)
* 대여장소와 반납장소가 같은 경우가 많음
_주로 관광지

(내국인)
* 대여장소와 반납 장소가 불일치
_주로 생활권
대여대여소명 = 반납대여소명
(외국인)
* 대여장소 = 반납장소
* 주로 관광지라고 불리는 곳의 대여소를 많이 찾음
ex) 뚝섬, 여의나루, 서울숲, 명동, 동역사 등

(내국인)
* 대여장소와 = 반납장소가 같은 경우는 주로 여가시간(친구만남, 데이트 등)을 보내기 좋은 장소
* 특히 한강 둔치가 많음
이용시간 별 이용거리
(외국인)
* 이용시간과 이용거리가 비교적 비례관계
_자전거를 타고 돌아다니며 둘러보는 느낌

(내국인)
* 비교적 짧은 거리 이동에 많이 쓰임
_생활 속에서 이용하는 느낌

대여월 별
대여건수
(10월)
날씨가 좋은 가을에 수요가 높음

(그 외)
여름(8~9)이나
겨울(11~12)은 줄어듦
대여일자 별 대여건수
* 대여일자 별 대여건수는 날씨 등 외부요인의 작용이 클 것 같아서 주의깊게 보지 않아도 될 듯
 
(외국인)
* 관광하기 좋은 계절에 특히 수요가 높음

(내국인)
* 외국인에 비해 월마다 수요의 변동성이 크지 않음 
대여시간 별 대여건수
(외국인)
* 주로 점심 먹은 이후 오후시간대에 이용

(내국인)
* 주로 오전 8~9시, 오후 6~7시에 이용하는 것으로 보아 출,퇴근용으로 보임 (통학용)
* 저녁시간 여가생활
대여요일 별 대여건수
(외국인)
* 금토일이 많음
_주말이 많음

(내국인)
* 화, 금이 많음
_평일이 많음
성별 비율  
*내국인 남녀 비율
: 남 > 여
2배 차이
연령대 별
이용시간 
 
(따릉이 주 이용고객)
20-30-40대
연령대 별
이용거리
 
(따릉이 주 이용고객)
20-30-40대
연령대 별
대여월 별
대여건수
 
20-30대 > 40-50대
연령대 별
대여일자 별 대여건수
 
(연령대)
20, 30대 이용이 많음
40, 50대 순
연령대 별
대여시간 별
대여건수
 
(이용시간대)
출-퇴근 시간
늦은 오전~오후시간

(연령대)
30대 > 20대 > 40대
연령대 별
대여요일 별
대여건수
 
(이용 요일)
화 > 금

(연령대)
20대 > 30대

 


▶ 이어지는 다음 게시글 보기

2024.07.13 - [분류 전체보기] - 공모전 | 서울시 공공자전거 군집분석 모델링(k-means)

 

공모전 | 서울시 공공자전거 군집분석 모델링(k-means)

군집분석 코드_주피터 노트북4. k-means 군집분석 모델링4-1) 모델링 전 전처리▶ 내국인 데이터 샘플링내국인 데이터가 너무 커서 샘플링 진행 → 전체 데이터의 50% 추출 (절반)성별, 연령대, 대여

nasena.tistory.com

2024.07.14 - [분류 전체보기] - 공모전 | 서울시 공공자전거 관광지 및 문화시설 추천

 

공모전 | 서울시 공공자전거 관광지 및 문화시설 추천

(팀원1 코드_주피터 노트북) (팀원2 코드_주피터 노트북)5. 관광지 및 문화시설 추천5-1) 각 군집 별 지도 시각화▶ 외국인의 경우, k=2 데이터 사용군집 0 : 본격적으로 따릉이로 여행하려는 외국인

nasena.tistory.com

728x90