Pandas & NumPy Academy · 강의

판매 데이터 세트 불러오기와 감사

주문 레코드가 담긴 CSV를 가져와 dtypes와 결측값을 점검하고 날짜 파싱 및 음수 수량 이상값을 수정합니다.

레슨 1/413개 단계

판매 데이터 세트 불러오기와 감사은(는) CoddyKit의 무료 Pandas & NumPy Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Pandas & NumPy Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Pandas & NumPy Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

판매 데이터세트 소개

일반적인 판매 데이터세트에는 order_id, order_date, customer_id, product, category, quantity, unit_price, region과 같은 열이 포함됩니다. 분석을 시작하기 전에 이 파일을 로드하고 구조를 먼저 살펴봐야 합니다. 이 첫 단계의 목표는 수식을 하나 작성하기 전에 어떤 데이터가 있는지 파악하는 것입니다.

import pandas as pd

df = pd.read_csv('sales.csv')
print(df.shape)       # (rows, columns)
print(df.head())

형태와 열 이름 확인

로드한 후 즉시 df.shape를 확인하여 데이터세트의 차원을 파악하고, df.columns를 확인하여 모든 열 이름을 살펴봅니다. 이렇게 하면 파일이 올바르게 로드되었는지 확인할 수 있으며, 정리해야 할 예기치 않은 공백이나 대문자 표기가 열 이름에 포함되어 있는지도 알 수 있습니다. 예상한 열 개수와 실제 열 개수가 다르면 파일 손상의 초기 경고 신호일 수 있습니다.

print('Rows, Cols:', df.shape)
print('Columns:', df.columns.tolist())
print('Index:', df.index[:5].tolist())

dtypes로 데이터 형식 검사

df.dtypes 또는 df.info()를 사용하여 모든 열에 대해 추론된 데이터 형식을 확인합니다. 흔한 문제로는 날짜 열이 object(문자열)로 로드되거나, 숫자 열에 불필요한 쉼표나 통화 기호가 포함되어 object로 로드되는 경우가 있습니다. 데이터 형식 문제를 일찍 발견하면 이후 산술 연산에서 조용히 잘못된 결과가 발생하는 일을 방지할 수 있습니다.

print(df.dtypes)

# More detail including non-null counts
df.info()

결측값 개수 세기

df.isna().sum()을 실행하여 열마다 NaN 값의 개수를 셉니다. df.isna().mean() * 100을 사용하면 각 열에서 결측값이 차지하는 비율을 백분율로 확인할 수 있습니다. 결측값이 30~40%를 넘는 열은 일반적으로 열을 삭제할지, 대치할지, 별도의 지시자 변수로 표시할지 결정해야 합니다.

missing = df.isna().sum()
missing_pct = df.isna().mean() * 100

print(pd.DataFrame({'count': missing, 'pct': missing_pct}))

중복 행 감지

중복된 주문 기록은 매출 합계를 부풀리고 고객별 분석을 왜곡합니다. df.duplicated().sum()을 사용하여 완전히 동일한 중복 행의 개수를 세고, df.duplicated(subset=['order_id']).sum()을 사용하여 고유해야 하는 주문 ID가 반복되는지 확인합니다. 로드 시점에 중복을 식별하면 나중에 디버깅하는 데 드는 시간을 줄일 수 있습니다.

print('Exact duplicates:', df.duplicated().sum())
print('Duplicate order_ids:', df.duplicated(subset=['order_id']).sum())

# Preview the duplicated rows
print(df[df.duplicated(subset=['order_id'], keep=False)].head())

날짜 열 파싱 수정

object로 로드된 날짜 열은 날짜 간 연산을 수행할 수 있도록 pd.to_datetime()으로 변환해야 합니다. 형식을 알고 있다면 format='%Y-%m-%d'를 전달하고, 형식이 섞여 있다면 infer_datetime_format=True를 사용합니다. 변환한 후에는 .dt 접근자를 사용하여 시간 기반 그룹화를 위한 연도와 월을 추출합니다.

df['order_date'] = pd.to_datetime(df['order_date'], format='%Y-%m-%d')

df['year'] = df['order_date'].dt.year
df['month'] = df['order_date'].dt.month

print(df[['order_date', 'year', 'month']].head())

음수 수량 찾기

음수인 quantity 값은 일반적으로 반품이나 데이터 입력 오류를 나타냅니다. 불리언 인덱싱을 사용하여 다음과 같이 찾을 수 있습니다: df[df['quantity'] < 0]. 이를 정상적인 반품으로 처리하여 표시를 남길지, 오류로 처리하여 삭제하거나 수정할지 결정합니다. 파이프라인을 재현할 수 있도록 결정 사항을 항상 문서화합니다.

negatives = df[df['quantity'] < 0]
print(f'Negative quantity rows: {len(negatives)}')
print(negatives.head())

# Flag returns separately
df['is_return'] = df['quantity'] < 0

숫자 열 범위 확인

df.describe()를 사용하여 모든 숫자 열의 최솟값, 최댓값, 평균 및 사분위수를 확인합니다. 최솟값이 0이거나 음수인 unit_price는 의심해 보아야 합니다. quantity의 최댓값이 합리적인 주문 수량을 크게 넘는다면 데이터 입력 오류일 수 있습니다. 범위의 타당성을 확인하는 것은 이상치를 빠르게 발견하는 방법입니다.

print(df[['quantity', 'unit_price']].describe())

# Any price exactly 0?
print('Zero price rows:', (df['unit_price'] == 0).sum())

범주형 열 감사

region 및 category와 같은 열에서는 df['region'].value_counts()를 사용하여 모든 고유 값과 빈도를 확인합니다. 오타, 일관되지 않은 대소문자 표기(예: 'north'와 'North'), 또는 상위 데이터 처리 과정의 문제를 나타내는 예상치 못한 값을 찾아보세요. groupby 작업을 수행하기 전에 이러한 값을 표준화해야 합니다.

print(df['region'].value_counts())
print(df['category'].value_counts())

# Normalise capitalisation
df['region'] = df['region'].str.strip().str.title()

감사 요약 만들기

구조화된 감사 요약 DataFrame은 데이터 품질 문제를 이해관계자에게 전달하는 데 도움이 됩니다. 행 수, 열 수, 결측값 수, 중복값 수와 같은 지표를 사전에 모은 다음 DataFrame으로 변환하여 만드세요. 이 요약은 분석 보고서의 첫 번째 섹션이 되며, 수행하는 각 정제 단계의 근거를 제시합니다.

audit = {
    'rows': len(df),
    'columns': len(df.columns),
    'missing_cells': df.isna().sum().sum(),
    'duplicate_rows': df.duplicated().sum(),
    'date_range_start': df['order_date'].min(),
    'date_range_end': df['order_date'].max()
}

for k, v in audit.items():
    print(f'{k}: {v}')

정제된 스냅샷 저장하기

초기 감사와 기본 수정(dtype 수정, 중복 제거, 플래그 열 추가)을 마친 후에는 정제된 스냅샷을 저장하여 이후 단계가 항상 일관된 기준 상태에서 시작하도록 하세요. df.to_csv('sales_clean.csv', index=False)를 사용하거나, 더 빠르게 다시 불러오려면 df.to_parquet('sales_clean.parquet')을 사용하세요. CSV와 달리 Parquet은 datetime을 포함한 dtype을 보존합니다.

# Drop exact duplicates before saving
df = df.drop_duplicates(subset=['order_id'], keep='first')

# Save clean snapshot
df.to_parquet('sales_clean.parquet', index=False)
print('Saved', len(df), 'rows to sales_clean.parquet')

빠른 확인

이 단원에서 배운 데이터 분석 개념을 제대로 이해했는지 확인해 보세요.

단원 요약

이 단원에서는 CSV를 불러오고 형태와 열을 확인하는 방법, dtype, 결측값, 중복값 및 음수 수량을 감사하는 방법, 이후 단계를 위한 정제된 스냅샷을 저장하는 방법을 배웠습니다. 다음에는 정제된 데이터셋을 사용해 매출 계산과 특성 공학을 살펴봅니다.

무료로 시작

AI 튜터와 함께 Python을(를) 배우세요 — 무료

브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.

코스
30
레슨
120

자주 묻는 질문

“판매 데이터 세트 불러오기와 감사” 강의는 무료인가요?

네 — “판매 데이터 세트 불러오기와 감사” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Pandas & NumPy Academy 강의 전체를 잠금 해제할 수 있습니다. Pandas & NumPy Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“판매 데이터 세트 불러오기와 감사”에서 뭘 배우나요?

주문 레코드가 담긴 CSV를 가져와 dtypes와 결측값을 점검하고 날짜 파싱 및 음수 수량 이상값을 수정합니다. 브라우저에서 직접 실행하는 실습 코드로 Pandas & NumPy Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Pandas & NumPy Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Pandas & NumPy Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“판매 데이터 세트 불러오기와 감사” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Pandas & NumPy Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Pandas & NumPy Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 판매 데이터 세트 불러오기와 감사
  2. 매출 계산과 특성 공학
  3. 지역 및 범주별 GroupBy 분석
  4. 월별 추세 시각화
← Pandas & NumPy Academy(으)로 돌아가기