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

    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

    댓글