데이터 분석/판다스

[Pandas] 서울시 공공자전거 대여소 정보 분석 1

eunnys 2023. 11. 14. 14:41

서울특별시 공공자전거 대여소 정보(19.12.9).xlsx
0.31MB

 

- 대여소 정보 읽기
- 대여소 정보 확인
- NA 값이 몇개인지 확인 ==> NA 값이 들어있는 데이터 삭제
- 타입 변환 (대여소ID ==> int32, 기준시작일자 ==> 날짜타입) 
>- 기준시작일에 '개통'이라는 단어를 포함하고 있는 경우 '개통' 단어 삭제
- 대여소_구의 목록, 개수 출력
- 대여소_구별 거치대 수
- 구별 거치대수의 합계, 평균, 최대, 최소 출력하고 거치대가 많은 순으로 합계별 내림차순으로 10개 출력


대여소 정보 읽기

 

import pandas as pd
import numpy as np
df = pd.read_excel('서울특별시 공공자전거 대여소 정보(19.12.9).xlsx', engine='openpyxl')
df.head()


NA 값이 몇 개인지 확인
- NA값이 들어있는 데이터 삭제

 

df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1541 entries, 0 to 1540
Data columns (total 8 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   대여소_구   1541 non-null   object 
 1   대여소ID   1540 non-null   float64
 2   대여소명    1541 non-null   object 
 3   대여소주소   1540 non-null   object 
 4   위도      1540 non-null   float64
 5   경도      1540 non-null   float64
 6   기준시작일자  1540 non-null   object 
 7   거치대수    1541 non-null   int64  
dtypes: float64(3), int64(1), object(4)
memory usage: 96.4+ KB

df.isna().sum()
대여소_구     0
대여소ID     1
대여소명      0
대여소주소     1
위도        1
경도        1
기준시작일자    1
거치대수      0
dtype: int64

df[df['대여소ID'].isna()]


df = df.dropna()
df.tail()


타입 변환
- 대여소ID ==> int32
- 기준시작일자 ==> 날짜타입

 

# 타입 조회
df.dtypes
대여소_구      object
대여소ID     float64
대여소명       object
대여소주소      object
위도        float64
경도        float64
기준시작일자     object
거치대수        int64
dtype: object

# 대여소ID 타입 변환
df['대여소ID'] = df['대여소ID'].astype(np.int32)

 

# 기준시작일자에 '개통'이 포함된 데이터의 개수
df['기준시작일자'].str.contains('개통').sum() # 5개
# 기준시작일자에 2가지 타입이 존재하기 때문에 str을 사용할 수 없음 (문자열이 아닌 데이터는 결측치 처리)
df['기준시작일자'].str.replace('개통','')
0              NaN
1              NaN
2              NaN
3              NaN
4              NaN
           ...    
1535    2019.08.16
1536    2019.09.26
1537           NaN
1538    2019.11.20
1539    2019.11.20
Name: 기준시작일자, Length: 1540, dtype: object

 

df['기준시작일자'].replace('개통','',regex=True, inplace=True)
df['기준시작일자'] = pd.to_datetime(df['기준시작일자'])
# 변경 후 타입 조회
df.dtypes
대여소_구             object
대여소ID              int32
대여소명              object
대여소주소             object
위도               float64
경도               float64
기준시작일자    datetime64[ns]
거치대수               int64
dtype: object

 

대여소_구의 목록, 개수 출력

 

# 대여수_구의 목록
df['대여소_구'].unique()
array(['마포구', '서대문구', '영등포구', '중구', '종로구', '광진구', '성동구', '동대문구', '양천구',
       '용산구', '은평구', '강동구', '강서구', '송파구', '성북구', '중랑구', '강북구', '노원구',
       '도봉구', '금천구', '구로구', '동작구', '관악구', '서초구', '강남구'], dtype=object)

 

# 총 대여수_구의 수
len(df['대여소_구'].unique()) # 25개

대여소_구별 거치대 수

 

df.groupby('대여소_구')['거치대수'].sum().sort_values(ascending=False)
대여소_구
송파구     1298
영등포구    1250
서초구     1227
강남구     1218
마포구     1075
강서구     1002
노원구      879
광진구      841
구로구      788
종로구      784
성동구      780
강동구      763
성북구      726
은평구      716
양천구      677
서대문구     667
동대문구     659
관악구      640
중랑구      616
금천구      560
용산구      538
동작구      501
중구       493
강북구      451
도봉구      396
Name: 거치대수, dtype: int64

구별 거치대수의 합계, 평균, 최대, 최소 출력하고 거치대가 많은 순으로 합계별 내림차순으로 10개 출력

 

df.groupby('대여소_구')['거치대수'].agg(['sum','mean','max','min']).sort_values('sum', ascending=False).head(10).round(2)