🐼 판다스(Pandas) 기초 살펴보기 : 전기차 데이터 실습
안녕하세요! 데이터 분석의 가장 강력한 도구 중 하나인 **판다스(Pandas)**를 활용하여 실제 데이터를 분석하는 방법을 단계별로 자세히 알아보겠습니다. 이번 강의는 데이터 분석의 전 과정을 한 번에 따라 할 수 있도록 구성되었습니다.
구글 코랩(Colab) 환경을 기준으로 작성되었습니다.
1. 데이터 분석의 첫 단계: 데이터 다운로드 및 로딩
가장 먼저, 분석에 사용할 데이터를 준비해야 합니다. 캐글(Kaggle)에서 데이터를 다운로드하고, 판다스의 핵심 객체인 데이터프레임(DataFrame)으로 불러오는 과정을 진행합니다. 아래 코드를 그대로 복사하여 코랩에 붙여넣어 주세요.
import kagglehub
import shutil
import os
# 최신 버전 다운로드
path = kagglehub.dataset_download("yanghu583/electric-vehicle-population-data-2025")
# 코랩 현재 작업 폴더
target_dir = "/content"
# 파일/폴더를 현재 경로로 복사
if os.path.isdir(path):
# 디렉토리라면 안의 파일 전체를 복사
for filename in os.listdir(path):
src = os.path.join(path, filename)
dst = os.path.join(target_dir, filename)
shutil.copy2(src, dst)
else:
# 단일 파일이라면 바로 복사
shutil.copy2(path, target_dir)
위 코드를 실행하여 데이터가 성공적으로 로드되면, 이제 본격적으로 판다스를 활용한 데이터 분석을 시작할 수 있습니다.
2. 데이터 탐색 (EDA): 데이터와 친해지기
데이터 분석을 시작하기 전에, 데이터가 어떤 모습이고 어떤 특징을 가지고 있는지 파악하는 과정이 매우 중요합니다. 이를 탐색적 데이터 분석(Exploratory Data Analysis, EDA)이라고 부릅니다.
- df.head(): 데이터프레임의 첫 5개 행을 출력합니다. 데이터의 각 열이 어떤 값을 가지고 있는지 빠르게 훑어볼 수 있습니다.
- df.shape: 데이터프레임의 크기(행과 열의 개수)를 튜플 형태로 알려줍니다. (행 개수, 열 개수) 형식으로 반환됩니다.
- df.info(): 각 열의 데이터 타입(Dtype)과 비어있지 않은 값(Non-Null Count)의 개수를 보여줍니다. 이 정보를 통해 결측치(NaN)의 존재 여부를 파악할 수 있습니다.
- df.describe(): 숫자형 데이터에 대한 요약 통계량을 계산합니다. 평균, 표준편차, 최솟값, 최댓값 등 주요 통계 지표를 한눈에 볼 수 있어 데이터의 분포를 이해하는 데 도움이 됩니다.
# 데이터프레임의 첫 5개 행 확인
print("--- 데이터 미리보기 ---")
print(df.head())
# 데이터프레임의 크기(행, 열) 확인
print("\n--- 데이터프레임 크기 ---")
print(df.shape)
# 각 열의 정보 및 결측치 확인
print("\n--- 데이터프레임 기본 정보 ---")
print(df.info())
# 숫자형 데이터의 요약 통계량 확인
print("\n--- 요약 통계량 ---")
print(df.describe())
3. 데이터 전처리 (Data Preprocessing): 분석을 위한 데이터 정제
실제 데이터는 대부분 완벽하지 않아 결측치, 잘못된 데이터 타입, 이상치 등이 포함되어 있습니다. 이를 분석에 적합한 형태로 다듬는 과정을 데이터 전처리라고 합니다.
3-1. 결측치 처리: 다양한 방법
결측치(NaN)는 분석 결과에 오류를 발생시키므로 반드시 처리해야 합니다. 결측치를 처리하는 방법은 다양하며, 데이터의 특성과 분석 목적에 맞게 선택해야 합니다.
- dropna(): 결측치가 포함된 행(row)이나 열(column)을 삭제하는 방법입니다. 데이터 손실이 크므로 결측치가 일부 행에만 존재하거나 해당 열이 분석에 중요하지 않을 때 사용합니다.
- fillna(): 결측치를 특정 값으로 채우는 방법입니다. 이 방법은 데이터 손실을 방지하면서 분석을 이어갈 수 있어 자주 사용됩니다. 평균, 중앙값, 최빈값, 또는 0과 같은 값으로 채울 수 있습니다.
- 보간법(Interpolation): 시계열 데이터와 같이 순서가 중요한 경우, 앞뒤 값의 경향성을 고려하여 중간값을 예측해 채워 넣는 방법입니다.
이번 예제에서는 Electric Range와 Base MSRP 열의 결측치를 0으로 채우는 fillna() 방법을 사용하겠습니다.
# 각 열의 결측치 개수 확인
print("--- 결측치 개수 ---")
print(df.isnull().sum())
# 'Electric Range'와 'Base MSRP' 열의 결측치를 0으로 채우기
# inplace=True 옵션은 원본 DataFrame을 직접 수정합니다.
df['Electric Range'].fillna(0, inplace=True)
df['Base MSRP'].fillna(0, inplace=True)
# 결측치 처리 후 다시 확인
print("\n--- 결측치 처리 후 결측치 개수 ---")
print(df.isnull().sum())
4. 데이터 분석 및 인사이트 도출
전처리가 완료된 데이터를 바탕으로, 의미 있는 분석을 시작합니다.
4-1. 데이터 그룹화: groupby()와 value_counts()
groupby() 함수는 특정 기준(예: 제조사, 도시)에 따라 데이터를 묶어 통계량을 계산할 수 있게 해줍니다. value_counts()는 각 값의 개수를 세어주는 아주 유용한 함수입니다.
# 'Make' 열을 기준으로 차량 등록 대수를 계산하고 상위 10개 출력
print("--- 제조사별 차량 등록 대수 (상위 10개) ---")
print(df['Make'].value_counts().head(10))
# 'Electric Vehicle Type'별로 차량 개수 계산
print("\n--- 전기차 유형별 차량 개수 ---")
print(df['Electric Vehicle Type'].value_counts())

4-2. 인사이트 도출: 데이터를 통한 의미 있는 결론 내기
분석의 최종 목표는 단순한 숫자 계산이 아니라, 데이터가 담고 있는 의미 있는 결론, 즉 **인사이트(Insight)**를 찾아내는 것입니다. 다음 코드를 통해 워싱턴 주에서 가장 많이 등록된 전기차 모델을 찾아봅시다.
# 'Model' 열의 등록 대수를 계산하고 상위 5개 출력
top_models = df['Model'].value_counts().head(5)
print("\n--- 워싱턴 주에서 가장 인기 있는 상위 5개 전기차 모델 ---")
print(top_models)

[결론 및 인사이트] 위 코드를 실행해 보면, 워싱턴 주 전기차 시장은 특정 제조사(Tesla)의 특정 모델(MODEL Y, MODEL 3)에 대한 선호도가 매우 높다는 것을 알 수 있습니다. 이는 해당 제조사가 시장을 주도하고 있으며, 이 모델들이 워싱턴 주 소비자의 니즈를 충족시키고 있다는 명확한 증거입니다. 이러한 인사이트는 새로운 비즈니스 전략을 수립하거나 마케팅 방향을 설정하는 데 큰 도움이 됩니다.
오늘 간단하게 데이터 처리하고 분석하는 방법에 대해 설명해드렸습니다.
더 심화로 들어갈 수 있지만, 간단하게 입문용으로 적어보았습니다.
다음에는 심화 혹은 다른 내용으로 돌아오겠습니다.
* tip.
- EDA 과정은 데이터 분석 및 ML/DL 과정에서 가장 중요합니다.
EDA가 제대로 이루어지지 않은 경우에는 분석 및 모델 성능에 부정적인 큰 영향을 줄 수 있습니다.