03-04) Mini-project

slow_starter·2025년 7월 13일
0

모두의연구소-DS4기

목록 보기
25/30
post-thumbnail

"영국 시장의 중고 자동차 데이터 다루기"
사실 여기서 나온 데이터 전처리는 기초적인 편이고,
DBMS가 체계적으로 갖춰지지 않은 회사일수록 전처리 난도는
급격하게 올라간다.
기초적인 Python 활용에 대해 복습한 것에 더 큰 의의가 있었다.

01. 데이터 불러오기 살펴보기

  • 데이터 불러오고, head()로 데이터 살펴보기
  • 사실 shape를 통해 데이터 크기도 살펴보는 습관도 중요할 듯
# 당시 교육받을 때의 LMS 폴더 경로
import pandas as pd
import numpy as np
import seaborn as sns
car_df = pd.read_csv('data/cars.csv')
brand_df = pd.read_csv('data/brand.csv)'
# 데이터 크기 확인하기
print(car_df.shape) # car_df의 크기
print(brand_df.shape) # brand_df의 크기
# 데이터 살펴보기
car_df.head(n=10) # 원래 기본값은 n=5 임

02. 자동차, 브랜드 데이터 합치기

# Q. car_df와 brand_df를 합치기 위해, car_df에 brand 컬럼을 추가합니다. 
# title 값의 첫 번째 단어만 추출하여 brand 컬럼에 저장해주세요.
# [[YOUR CODE]]
car_df['brand'] = car_df['title'].str.split(expand=True)[0]
# Q. brand_df의 title 컬럼에 저장된 값들을 대문자로 변환합니다. 
# [[YOUR CODE]]
brand_df['title'] = brand_df['title'].str.upper()
# Q. car_df의 brand 컬럼과 brand_df의 title 컬럼을 기준으로 데이터를 합칩니다.
# (힌트: car_df에서 left merge를 수행합니다.)
# [[YOUR CODE]]
car_df = car_df.merge(brand_df, left_on='brand', right_on='title', how='left')
# Q. car_df에서 중복되는 컬럼 title_y를 제거합니다.
# [[YOUR CODE]]
car_df = car_df.drop(columns = ['title_y']) # title_y 제거
# Q. car_df에서 title_x 컬럼의 이름을 title로 변경합니다.
car_df = car_df.rename(columns = {'title_x': 'title'})

03. 카데고리변수 숫자로 변형

# car_df의 컬럼 각각에 대해 자료형(data type)을 살펴봅니다.
car_df.info()
# Q. Engine 컬럼의 데이터에서 L 문자를 제거하여 숫자 부분만 저장합니다.
# [[YOUR CODE]]
car_df['Engine'] = car_df['Engine'].str.replace('L','')
# Q. Emission Class 컬럼에서도 숫자 부분만 추출하여 저장합니다.
# [[YOUR CODE]]
car_df['Emission Class'] = car_df['Emission Class'].str.replace('Euro','')
# Q. to_numeric 메서드를 사용하여 Engine, Emission Class 컬럼의 자료형을 숫자 형태로 변환합니다.
# [[YOUR CODE]]
car_df['Engine'] = pd.to_numeric(car_df['Engine'])
car_df['Emission Class'] = pd.to_numeric(car_df['Emission Class'])

04. 결측치 제거

  • 사실 현실에서 데이터 다룰 때는 여기 예시보다는 많이 복잡하다.
  • 그래도 학습 노드가 python 기본기 복습하기에 좋았음.
# Q. Service history 값에 따라 그룹으로 묶어 Price의 평균을 계산합니다.
# [[YOUR CODE]]
car_df.groupby('Service history')['Price'].mean()
# Q. Service history 컬럼의 결측치를 'Unknown' 문자열로 채웁니다.
# [[YOUR CODE]]
car_df['Service history'] = car_df['Service history'].fillna('Unknown')
car_df.groupby('Service history')['Price'].mean()
# 결측치가 포함된 컬럼의 개수를 데이터마다 계산하여 na_values 컬럼에 저장합니다.
car_df['na_values'] = car_df.isna().sum(axis = 1)
print(len(car_df[car_df['na_values'] >= 4]))
# Q. na_values 컬럼의 값이 4 이상인 데이터는 제거합니다.
# [[YOUR CODE]]
car_df = car_df[car_df['na_values'] < 4] # 4이상인 데이터 제거하므로 4보다 작아야함
# na_values 컬럼을 제거합니다.
car_df.drop('na_values', axis = 1, inplace = True)
# Q. 해당 컬럼들의 중앙값으로 결측치를 채웁니다.
# [[YOUR CODE]]
car_df['Previous Owners'] = car_df['Previous Owners'].fillna(car_df['Previous Owners'].median())
car_df['Engine'] = car_df['Engine'].fillna(car_df['Engine'].median())
car_df['Doors'] = car_df['Doors'].fillna(car_df['Doors'].median())
car_df['Seats'] = car_df['Seats'].fillna(car_df['Seats'].median())
car_df['Emission Class']= car_df['Emission Class'].fillna(car_df['Emission Class'].median())

05. 이상치 제거

  • 결국 컬럼별로 확인하면서 이상치를 얼마나 제거할 지
    정해야 함
  • 데이터 분석가, 데이터 사이언티스트의 주관이 많이 들어가는
    부분이라고 볼 수 있음
# Q. Mileage(miles) 컬럼의 값이 1000 이하인 데이터를 제거합니다.
# [[YOUR CODE]]
car_df = car_df[car_df['Mileage(miles)'] > 1000 ]
# Registration_Year 컬럼의 값이 2025 미만인 데이터만 추출합니다.
car_df = car_df[car_df['Registration_Year'] < 2025]
# Q. brand 컬럼의 값에 따라 데이터를 그룹화하여 Price의 평균, 표준편차를 계산합니다.
# (agg() 함수를 사용해주세요.)
# [[YOUR CODE]]
car_df('brand')['price'].agg(['mean','std']).head()
# Q. brand와 Fuel type 컬럼을 기준으로 Price 값의 피벗 테이블을 생성합니다.
# [[YOUR CODE]]
car_df.pivot_table(index = 'brand', columns ='Fuel type', values = 'Price').head()
# Previous Owners와 Price 사이의 scatter plot을 그립니다.
sns.scatterplot( x= car_df['Previous Owners'], y = car_df['Price'])

06. Scaler활용하기

  • StandardScaler()
  • RobustScaler()
  • MinmaxScaler()
# 컬럼별 cardinality 확인
car_df[['title','Fuel type','Body type','Gearbox','Emission Class','Service history','brand','country']].nunique()
# cardinality(범주 가짓 수)가 400이상, 너무 많아서 제거!
car_df.drop('title', axis = 1, inplace = True)
# 자동차의 브랜드별로 평균 가격을 계산합니다.
car_df.groupby('brand')['Price'].mean().head()
# Q. 자동차의 브랜드별로 데이터 개수와 평균 가격을 출력합니다. 
# (위에서 출력했던 데이터 두 가지를 join 메서드로 합쳐주세요.)
dd1 = car_df['brand'].value_counts()
dd2 = car_df.groupby('brand')['Price'].mean()
result = dd1.to_frame('Count').join(dd2.to_frame(name = 'Average Price'))
# 범주형 컬럼들에 원-핫 인코딩을 적용합니다.
car_df = pd.get_dummies(car_df, drop_first = True)
from sklearn.decomposition import RobustScaler
# RobustScaler 호출
rs = RobustScaler()
# Q. robust scaling을 적용한 데이터프레임을 car_df 변수에 다시 저장합니다.
# [[YOUR CODE]]
rs.fit(car_df)
car_df_scaled = pd.DataFrame(rs.transform(car_df))
# car_df = pd.DataFrame(rs.transform(car_df)) # 뒤에보니 PCA 할거라서 컬럼명 지정 필요없을 듯?
car_df_scaled.shape
  • Scaling한 데이터로 주성분 분석하기
    • 사실 PCA 적용시에 꼭 scaling을 해야 하는 것은 아니나,
      대체로 하는 것이 좋은 습관
    • PCA는 SVD(Singular Value Decomposition)으로 구현되는데,
      교육 마치고 재취업 하고 회고하는 지금 입장에서 돌이켜보면
      짧은 기간(KDT, 6개월)에 많은 것을 다뤄야 하니 SVD자체를
      깊게 다루지는 않음.(나중에 텍스트 마이닝이나, 추천시스템
      배울 때 관련 블로그 링크 등을 공유되긴 하였다.)
    • 생각해보면, 학부 때 선형 대수를 썩 잘하는 편은 아니었는데
      그때 기초가 부족했던게 대학원 때도 날 괴롭혔던 것으로 기억난다.
from sklearn.decomposition import PCA
# Q. 주성분이 5개인 PCA 모델을 정의합니다.
# [[YOUR CODE]]
pca = PCA(n_components= 5)
# Q. car_df 데이터에 PCA를 적용합니다.
# [[YOUR CODE]]
pca_df = pca.fit_transform(car_df_scaled)
# pca_df를 data_frame으로 변환해 줘야 함 (여기서 실수함!)
pca_df = pd.DataFrame(pca_df, columns = ['PC1','PC2','PC3','PC4','PC5'])
profile
2025화이팅!

0개의 댓글