[비정제 데이터] Data Transformation w.car

jul ee·2025년 4월 16일

데이터 성장기

목록 보기
52/139

📋 Car 데이터 정제 프로젝트 (Data Transformation)

본 프로젝트는 영국 중고차 시장 데이터를 기반으로

데이터 손실은 줄이고 정보량은 최대한 보존한다는 방향을 세우고, "중고차 가격 예측 모델링" 및 "특성 기반 클러스터링"에 사용될 수 있는 데이터로 정제하는 것을 목표로 진행하였다.

자세한 프로젝트 진행 과정은 GitHub repository에서 확인할 수 있다.

🛠️ 사용 환경: Python, Pandas, Jupyter Notebook


📂 사용 데이터셋

cars.csv

  • 중고차의 스펙 및 가격 정보를 담은 메인 데이터셋
  • 차량 모델, 연식, 주행 거리, 연료 타입, 엔진 크기, 등록 연도, 판매 가격 등의 정보를 포함

brand.csv

  • 차량 모델명에 해당하는 브랜드명을 매핑해주는 보조 데이터셋으로, 각 모델의 브랜드 대분류 정보를 병합하는 데 활용

분석 프로세스

내용주요 메서드/기법
1데이터 로드 및 브랜드 병합read_csv(), merge(), str.split()
2파생변수 생성 및 타입 정리str.split(), to_numeric()
3결측치 처리isna(), fillna(), median(), drop()
4이상치 제거조건 필터링, 도메인 기반 삭제
5원-핫 인코딩pd.get_dummies
6스케일링RobustScaler(), .fit_transform()
7PCA (주성분 분석)PCA(), explained_variance_ratio_
8컬럼별 상관관계 확인corr()


주요 처리 내용

[1]  데이터 병합 및 브랜드 정보 추가

  • car_df['title']에서 브랜드 추출 후, brand_df와 병합하여 brand 컬럼 추가

[2]  문자열 숫자형 컬럼 처리

  • Engine, Emission Class의 문자열에서 숫자만 추출 후 float형으로 변환

[3]  결측치 처리 전략

  • Service history: 'Unknown'으로 채움
  • 다중 결측치가 있는 행은 4개 이상이면 삭제, 그 외는 median으로 대체

[4]  이상치 제거

  • 마일리지 1000 미만, 등록 연도 2025 이상 데이터 제거

[5]  원-핫 인코딩

  • 범주형 컬럼들에 원-핫 인코딩 적용

[6]  스케일링

  • RobustScaler로 전체 데이터프레임 스케일 조정

[7]  PCA 적용

  • PCA(2~10)까지 설명력 확인 후, PCA(7) 최종 선택
  • 7개의 주성분으로 원본 데이터의 70% 이상 설명
pca = PCA(7)
pca_df = pd.DataFrame(pca.fit_transform(car_df), columns = [f'PC{i}' for i in range(1, 8)])

[8]  컬럼별 상관관계 확인

  • 종속변수인 Price와의 상관관계가 Registration_Year에서 0.7로 가장 높게 나타난 것을 확인


💡 인사이트 및 결론

  • 파이썬은 대소문자에 민감하게 반응한다.

    →  따라서 테이블 병합 시 사용된 키 title 컬럼에 저장된 값들을 대문자로 변환하는 과정이 필요했다.

  • describe()는 기본적으로 숫자형 변수에 대한 통계치를 제공하므로, 카테고리형 변수를 숫자로 인코딩하면 요약 통계에 포함시킬 수 있다.

  • 일반적으로 결측치의 비율이 크다면 제거하지만 남겨두는 것이 유의미한 역할을 하는 경우도 있다.

    → Service history는 결측 여부가 차량 가격에 명확한 영향을 주기 때문에 'Unknown'으로 처리하고 분석에 반영하였다.

  • 한 행에 여러 컬럼에서 결측치가 존재한다면, 결측치 비율이 낮더라도 mean이나 median으로 채우기보다 drop시키는 방향으로 가야 한다.

  • 가격과 마일리지의 분포를 확인했을 때 로그 변환이 고려될 수 있으나, Price는 종속변수로 해석 및 예측에 영향을 줄 수 있어 최종적으로 로그 변환을 적용하지 않았다.

  • 원-핫 인코딩을 수행하기 전, 고윳값이 448개로 많은 title 컬럼에서 "해당 컬럼이 없어도 데이터에 큰 영향이 없을까?" 를 고려해 보았을 때, 다른 특성으로 모델의 차이를 충분히 설명할 수 있다는 판단 하에 drop하였다.

  • PCA 적용 시 주성분 수에 따른 설명 분산 비율을 확인하며 7개의 주성분이 약 70%의 분산을 설명한다는 점에서 해당 수치를 기준으로 차원 축소를 수행하였다.

  • 변수 간의 상관관계가 높으면 다중공선성 문제가 발생할 수 있다.

    →  그런데 주의할 점은, 이는 독립변수 간의 상관관계인 경우라는 것이다.

    →  만약 이 데이터를 "중고차 가격을 예측"하는 모델을 만들기 위해 사용한다면 Price는 예측 대상이 되는 종속변수이기 때문에 Price와 Registration_Year의 상관관계가 높다고 해서 문제가 되는 것은 아니라, 오히려 연식이 가격을 예측하는 데에 유용한 도구로 작용한다는 것을 생각해 볼 수 있다. 이와 관련해서 다중공선성, 종속변수와의 상관관계가 높다면?이라는 주제로 정리해 보았다.


전처리의 각 단계마다 "왜 이렇게 하는가"를 고민하면서 데이터를 바라보는 시야를 조금 더 넓힐 수 있는 프로젝트였다.

profile
AI에 관심을 가지고, 데이터로 가치를 만들어 나가는 과정을 기록합니다.

0개의 댓글