코딩뿌셔
[01] 데이터 수집 및 분석 준비 본문
1. 데이터 다운로드
2. 데이터 파일 확인
3. 데이터 컬럼명 변경 ( 영문 → 한글 )
1. 데이터 다운로드
포항시 버스사용자 교통카드 내역 데이터를 가져와 데이터 분석 연습을 해보겠습니다.
데이터는 국가교통 데이터 오픈마켓에서 '포항시'를 검색하면
포항시 BIS 교통카드 사용내역 데이터를 확인할 수 있습니다.
사이트 로그인 후 무료 구매 가능하니 구매 후 다운로드 해줍니다.
전체 선택 후 다운로드 하시면 80개 파일이 다운로드 됩니다.
2. 데이터 파일 확인
파일 이름에 공백이 있으므로 전체 선택 후 파일명을 변경해봅시다.
전체 선택 후 첫번째 파일 이름을 공백 제거한 trfcard(0)으로 변경하고 엔터해줍니다.
이후는 자동으로 변경됩니다.
파일을 열어보면 보두 동일한 이름의 데이터 파일과 데이터 정의서가 존재합니다.
데이터 파일은 csv, 데이터 정의서 파일은 xlsx 형식임을 확인할 수 있습니다.
나머지 파일들도 동일한 형식임을 확인합니다.
데이터를 확인해보면 컬럼명이 영어로 되어있어 어떤 내용의 데이터인지 확인하기 어렵습니다.
데이터 정의서 파일에서 한글 컬럼명을 확인할 수 있습니다.
3. 데이터 컬럼명 변경 ( 영문 → 한글 )
원활한 데이터 분석을 위해 80개의 데이터 파일을 합친 후 컬럼명을 한글로 변경해줍니다.
우선 한개의 데이터로 먼저 연습을 해보겠습니다.
import pandas as pd
# 데이터 파일 불러오기
file_path1 = './data/trfcard(0)/trfcard.csv'
df_ex = pd.read_csv(file_path1)
df_ex
# 데이터 정의서 파일 불러오기
file_path2 = './data/trfcard(0)/trfcard_columns.xlsx'
df_col_ex = pd.read_excel(file_path2, skiprows=[0,1], usecols='B:C')
df_col_ex
컬럼명 (영문) | 컬럼명 (한글) | |
---|---|---|
0 | on_date | 승차시각 |
1 | off_date | 하차시각 |
2 | route_name | 노선명 |
3 | descr | 노선설명 |
4 | age_type | 승객연령 |
5 | trans_yn | 환승여부 |
6 | addfee_yn | 추가운임여부 |
7 | start_bstop | 승차정류장 |
8 | start_gps_x | 승차정류장 GPS X |
9 | start_gps_y | 승차정류장 GPS Y |
10 | end_bstop | 하차정류장 |
11 | end_gps_x | 하차정류장 GPS X |
12 | end_gps_y | 하차정류장 GPS Y |
우선 데이터 파일과 데이터 정의서 파일을 불러온 후 컬럼명을 변경해봅시다.
먼저 전역변수로 빈 데이터 프레임과 딕셔너리를 생성하고,
인덱스를 이용한 반복문으로 빈 딕셔너리에 영어 컬럼명(키)과 한글 컬럼명(값)을 넣어줍니다.
rename 함수를 이용하여 columns에 생성한 딕셔너리를 입력하여 빈 데이터 프레임에 넣어줍니다.
# 컬럼명 변경
df_kor_ex = pd.DataFrame()
n_dict = {}
for i in range(len(df_col_ex)) :
n_dict[df_ex.columns[i]] = df_col_ex['컬럼명 (한글)'][i]
df_kor_ex = df_ex.rename(columns = n_dict)
df_kor_ex
승차시각 | 하차시각 | 노선명 | 노선설명 | 승객연령 | 환승여부 | 추가운임여부 | 승차정류장 | 승차정류장 GPS X | 승차정류장 GPS Y | 하차정류장 | 하차정류장 GPS X | 하차정류장 GPS Y | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 20200102051049 | 20200102051844 | 131 | 양덕-송도-시청-양학-양덕 | 일반 | N | N | 양덕차고지 | 129.401693 | 36.077258 | 동부초등학교 | 129.380866 | 36.062209 |
1 | 20200102051338 | 20200102054549 | 175 | 문덕-고속터미널-선린병원-달전 | 일반 | N | N | 문덕사거리 | 129.403178 | 35.962298 | 새마을금고해도지점 | 129.370626 | 36.015468 |
2 | 20200102051549 | 20200102051930 | 160 | 문덕-대송-송도-죽도-용흥 | 일반 | N | N | 문덕사거리 | 129.403442 | 35.962846 | 성우오토모티브 | 129.384492 | 35.972675 |
3 | 20200102051617 | 20200102055046 | 175 | 문덕-고속터미널-선린병원-달전 | 일반 | N | N | 부영사랑3차 | 129.402520 | 35.973038 | 오거리 | 129.366312 | 36.031816 |
4 | 20200102051841 | 20200102052310 | 102 | 문덕-남구청-고속터미널-북구보건소-양덕 | 일반 | N | N | 문덕온천 | 129.406532 | 35.961964 | 용덕사거리 | 129.415174 | 35.972826 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
16180 | 20200102232423 | 20200102233802 | 102 | 문덕-남구청-고속터미널-북구보건소-양덕 | 일반 | Y | N | 죽도시장 | 129.365486 | 36.034110 | 문화예술회관 | 129.365551 | 36.010599 |
16181 | 20200102232449 | 20200102232657 | 200 | 양덕-남구청(야구장)-구룡포 | 일반 | N | N | 형산로터리 | 129.368470 | 36.011630 | 뱃머리 평생학습원 | 129.354538 | 36.009020 |
16182 | 20200102232849 | 20200102233230 | 500 | 문덕-시외터미널-흥해-청하-월포 | 일반 | N | N | 남부경찰서 | 129.344637 | 36.005408 | 연일전통시장 | 129.349210 | 35.997120 |
16183 | 20200102233518 | 20200102235624 | 107 | 문덕-시외(고속)터미널-흥해 | 일반 | N | N | 쌍용사거리 | 129.354637 | 36.015728 | 화이트빌라 | 129.406610 | 35.957090 |
16184 | 20200102235936 | 20200103000017 | 108 | 양덕-죽도-양학-시청-유강-지곡 | 일반 | N | N | 장량휴먼시아 | 129.384057 | 36.090840 | 법원검찰청 | 129.387075 | 36.090211 |
16185 rows × 13 columns
그럼 이제 80개의 각 파일에 있는 데이터를 모두 합친 후 컬럼명을 변경해주도록 하겠습니다.
우선 각 데이터를 하나하나 추가하여 합치기 위해 빈 데이터 프레임(df_e)을 생성하고,
trfcard(0)부터 trfcard(79)까지 총 80개의 파일이 있기 때문에 반복문 범위를 range(0, 80)으로 지정해줍니다.
포맷팅을 이용하여 80개 파일 안에 있는 trfcard.csv 데이터를 불러온 후,
pd.concat 함수를 이용하여 빈 데이터 프레임에 가져온 데이터(bus)를 하나하나 넣어줍니다.
그 후에 위에서 연습했던 방식으로 컬럼명을 변경해주면 됩니다.
# 데이터 합치기
df_e = pd.DataFrame()
for i in range(0, 80) :
bus = pd.read_csv('./data/trfcard({})/trfcard.csv'.format(i))
df_e = pd.concat([df_e, bus], ignore_index=True)
# 컬럼명 변경
df = pd.DataFrame()
n_dict = {}
df_col = pd.read_excel('./data/trfcard(0)/trfcard_columns.xlsx',
skiprows=[0,1], usecols='B:C')
for j in range(len(df_col)) :
n_dict[df_e.columns[j]] = df_col['컬럼명 (한글)'][j]
df = df_e.rename(columns = n_dict)
df
승차시각 | 하차시각 | 노선명 | 노선설명 | 승객연령 | 환승여부 | 추가운임여부 | 승차정류장 | 승차정류장 GPS X | 승차정류장 GPS Y | 하차정류장 | 하차정류장 GPS X | 하차정류장 GPS Y | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 20200102051049 | 20200102051844 | 131 | 양덕-송도-시청-양학-양덕 | 일반 | N | N | 양덕차고지 | 129.401693 | 36.077258 | 동부초등학교 | 129.380866 | 36.062209 |
1 | 20200102051338 | 20200102054549 | 175 | 문덕-고속터미널-선린병원-달전 | 일반 | N | N | 문덕사거리 | 129.403178 | 35.962298 | 새마을금고해도지점 | 129.370626 | 36.015468 |
2 | 20200102051549 | 20200102051930 | 160 | 문덕-대송-송도-죽도-용흥 | 일반 | N | N | 문덕사거리 | 129.403442 | 35.962846 | 성우오토모티브 | 129.384492 | 35.972675 |
3 | 20200102051617 | 20200102055046 | 175 | 문덕-고속터미널-선린병원-달전 | 일반 | N | N | 부영사랑3차 | 129.402520 | 35.973038 | 오거리 | 129.366312 | 36.031816 |
4 | 20200102051841 | 20200102052310 | 102 | 문덕-남구청-고속터미널-북구보건소-양덕 | 일반 | N | N | 문덕온천 | 129.406532 | 35.961964 | 용덕사거리 | 129.415174 | 35.972826 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
842603 | 20200331231529 | 20200331232033 | 109 | 양덕-우현-시외터미널-유강(위덕대)-자명-양덕 | 일반 | N | N | 법원사거리 | 129.387740 | 36.089380 | 농협하나로클럽 | 129.398558 | 36.081653 |
842604 | 20200331231651 | 20200331232054 | 108 | 양덕-죽도-양학-시청-유강-지곡 | 일반 | N | N | LG빌라입구 | 129.317277 | 36.027317 | 대잠중앙하이츠 | 129.338901 | 36.021808 |
842605 | 20200331233806 | 20200331234546 | 107 | 문덕-시외(고속)터미널-흥해 | 일반 | N | N | 대동우방아파트 | 129.360209 | 36.050494 | 상대시장 | 129.361983 | 36.019438 |
842606 | 20200331234833 | 20200331235954 | 175 | 문덕-고속터미널-선린병원-달전 | 일반 | N | N | 해병대서문 | 129.413196 | 35.977037 | 부영사랑3차 | 129.402238 | 35.973022 |
842607 | 20200331235643 | 20200401000408 | 102 | 문덕-남구청-고속터미널-북구보건소-양덕 | 일반 | N | N | 해병대서문 | 129.413196 | 35.977037 | 문덕사거리 | 129.402914 | 35.962293 |
842608 rows × 13 columns
컬럼명을 한글로 변경한 데이터는 df_kor.csv로 따로 저장하겠습니다.
df.to_csv('./data/df_kor.csv', index=False)
'Data Analysis > 포항시 버스사용자 교통카드 내역 분석' 카테고리의 다른 글
[03] 시간대별 버스 이용량 분석 (0) | 2022.06.26 |
---|---|
[02] 데이터 확인 및 분석 주제 도출 (0) | 2022.06.21 |