본문 바로가기

Data Analysis/공공 데이터

[공공 데이터] 따릉이 데이터 분석 2 (데이터 전처리)

728x90

이전 내용은 아래 글에서 확인 하실 수 있습니다.

[Data Analysis/공공 데이터] - [공공 데이터] 따릉이 데이터 분석 1 (데이터 확인 / 질문하기)

 

[공공 데이터] 따릉이 데이터 분석 1 (데이터 확인 / 질문하기)

따릉이 데이터 분석 데이터 출처 : https://data.seoul.go.kr/dataList/datasetList.do 서울 열린데이터 광장에서 제공하는 서울시 공공자전거 이용현황 데이터 - Data 1 : 서울특별시 공공자전거 대..

sks8410.tistory.com

3. 데이터 전처리

3-1 컬럼명 바꾸기

# bike_1 데이터 컬럼명 바꾸기

bike_1.columns = ['대여소번호', '대여소명', '자치구', '상세주소', '위도', '경도', '설치시기', '거치대수lcd',
       '거치대수qr', '운영방식']

bike_1.head(1)

 

 

# bike_2 데이터 컬럼명 바꾸기

bike_2.columns = ['대여소명', '대여일자/월', '대여건수']

bike_2.head(1)

3-2 필요없는 컬럼 삭제하기

# bike_1 데이터의 상세주소, 위도, 경도 컬럼 삭제

bike_1 = bike_1.drop(["상세주소", "위도", "경도"], axis = 1)

print(bike_1.shape)
bike_1.head()

3-3 결측치 처리하기

# bike_1 데이터에서 설치시기가 NaN 인 데이터는 수가 매우 적으므로 삭제

dp = bike_1[bike_1["설치시기"].isnull()]
bike_1 = bike_1.drop(dp.index)

bike_1.isnull().sum()

 

 

# bike_1 데이터에서 운영방식에 따라 LCD 또는 QR 거치대의 수가 결정되기 때문에
# 거치대수lcd, 거치대수qr 컬럼의 NaN 값은 0 으로 처리

bike_1 = bike_1.fillna(0)

bike_1.isnull().sum()

 

 

# 성별 컬럼 분류 확인

bike_3["성별"].unique()

  • 성별이 대소문자가 섞여 있기 때문에 대문자로 통일하도록 하겠습니다.
  • nan 값은 의미있는 다른 값으로 변경하기 어렵기 때문에 그대로 사용하겠습니다.
# bike_3 데이터의 성별 값 통일

bike_3[bike_3["성별"] == "f"] = "F"
bike_3[bike_3["성별"] == "m"] = "M"

bike_3["성별"].unique()

  • bike_2 데이터의 대여소명 앞자리 숫자가 대여소번호와 동일하기 때문에 숫자를 분리해서 대여소번호라는 컬럼 값으로 지정하도록 하겠습니다.
# bike_2 데이터의 대여소명 앞 숫자 분리

bike_2["대여소번호"] = bike_2["대여소명"].str.split(".", expand = True)[0]

# 대여소명은 숫자를 땐 값으로 새로운 컬럼 값으로 지정

bike_2["대여소명_new"] = bike_2["대여소명"].str.split(".", expand = True)[1]

print(bike_2.shape)
print(bike_2.isnull().sum())

bike_2.head()

 

 

bike_2[bike_2["대여소명_new"].isnull()].head()

  • 대여소명_new 값이 None 인 데이터는 센터, 정비실 등이므로 데이터에서 삭제하도록 하겠습니다.
# bike_2 데이터의 대여소명_new 값이 None 인 데이터 삭제

bike_2 = bike_2.dropna(subset = ["대여소명_new"])

print(bike_2.shape)
print(bike_2.isnull().sum())

bike_2.head()

 

 

# bike_3 데이터의 대여소명 앞의 숫자가 삭제된 새로운 대여소명 컬럼 생성

bike_3["대여소명_new"] = bike_3["대여소명"].str.split(".", expand = True)[1]

print(bike_3.shape)
print(bike_3.isnull().sum())

bike_3.head()

 

 

# bike_3 데이터의 대여소명_new 값이 None 인 데이터 삭제

bike_3 = bike_3.dropna(subset = ["대여소명_new"])

print(bike_3.shape)
print(bike_3.isnull().sum())

bike_3.head()

3-4 컬럼 타입 변경

# bike_1 데이터의 대여소번호를 object 타입으로 변경

bike_1["대여소번호"] = bike_1["대여소번호"].astype("object")

bike_1.info()

 

 

# bike_3 데이터의 이용건수, 이동거리, 사용시간을 수치형 데이터로 변경

bike_3["이용건수"] = pd.to_numeric(bike_3["이용건수"])
bike_3["이동거리"] = pd.to_numeric(bike_3["이동거리"])
bike_3["사용시간"] = pd.to_numeric(bike_3["사용시간"])

bike_3.info()

 

 

# bike_3 데이터의 운동량과 탄소량을 수치형으로 변경하려고 하면 "\N" 이라는 값 때문에 변경이 안됨
# (Unable to parse string "\N" at position 57)
# 따라서, "\N" 값을 -1 로 변경 후 수치형으로 변경 (-1 인 이유는 실제로 0인 데이터와 구분짓기 위함)

# bike_3 데이터의 운동량, 탄소량 컬럼의 "\N" 값을 -1 로 변경

bike_3["운동량"][bike_3["운동량"] == r"\N"] = -1
bike_3["탄소량"][bike_3["탄소량"] == r"\N"] = -1

# bike_3 데이터의 운동량, 탄소량 컬럼을 수치형으로 변경

bike_3["운동량"] = pd.to_numeric(bike_3["운동량"])
bike_3["탄소량"] = pd.to_numeric(bike_3["탄소량"])

bike_3.info()

 

 

# bike_1 데이터의 설치시기, bike_3 데이터의 대여일자를 날짜 타입으로 변경


bike_1["설치시기"] = pd.to_datetime(bike_1["설치시기"])
bike_3["대여일자"] = pd.to_datetime(bike_3["대여일자"])

bike_1.info()
#bike_3.info()

 

728x90