인공지능

데이터 정리하기

존카터 2025. 6. 30. 12:07

📊 NaN값이 포함된 CSV와 Excel 파일 처리하기 – 피벗 테이블 시각화까지

데이터 분석을 하다 보면 누락된 값(NaN) 이 포함된 파일을 자주 접하게 됩니다. 이 포스팅에서는 pandas를 이용해 NaN값이 있는 데이터로부터 월별 상품 매출 합계를 계산하는 피벗 테이블을 생성하는 과정을 정리해보겠습니다.


✅ 1. 실습 데이터 구성

  • 2장/uriage.csv: 거래 정보 (상품명, 가격, 구매일 포함)
  • 2장/kokyaku_daicho.xlsx: 고객 명부

uriage.csv에는 NaN값이 다수 포함되어 있으며, item_name이나 item_price가 누락된 경우도 존재합니다.

 


✅ 2. 데이터 불러오기 및 전처리

import pandas as pd

# CSV, Excel 데이터 불러오기
dirty_data = pd.read_csv('2장/uriage.csv')
dirty_data2 = pd.read_excel('2장/kokyaku_daicho.xlsx')

# 날짜 컬럼 변환 및 월 단위 컬럼 생성
dirty_data["purchase_date"] = pd.to_datetime(dirty_data["purchase_date"])
dirty_data["purchase_month"] = dirty_data["purchase_date"].dt.strftime("%Y%m")
  • purchase_date 컬럼을 datetime 형식으로 변환하고, 월 단위로 분리(purchase_month)해줍니다.
  • 이 작업은 나중에 피벗 테이블 생성 시 월별로 그룹화하기 위해 꼭 필요합니다.

✅ 3. 피벗 테이블 만들기

res = pd.pivot_table(
    dirty_data,
    index="purchase_month",          # 행 기준: 월
    columns="item_name",             # 열 기준: 상품명
    values="item_price",             # 값 기준: 상품 가격
    aggfunc='sum'                    # 집계 방식: 합계
)

print(res.head())

출력 결과 (예시):

item_name        상품 A   상품 B   상품 C   상품 D   상품 E
purchase_month                                    
201901         1400.0     NaN     NaN     NaN     NaN
201902            NaN     NaN  2400.0     NaN  1900.0
201903            NaN   500.0  1300.0  1600.0     NaN

✅ 4. NaN 값이 왜 생기는 걸까?

피벗 테이블 결과에 NaN 값이 들어가는 이유는 다음과 같습니다:

원인설명
🔸 데이터 누락 특정 item_name 또는 item_price가 비어 있음
🔸 해당 월에 거래 없음 특정 상품이 해당 월에 판매되지 않음
🔸 오탈자/불일치 상품명이 미묘하게 다른 경우(예: 상품A, 상 품 A)

✅ 5. 해결 방법 

NaN 자체는 문제가 아닐 수 있습니다. 분석 목적에 따라 아래처럼 처리할 수 있습니다:

방법코드 예시설명

 

1. 0으로 대체 res.fillna(0) 없는 값은 0으로 간주할 경우
2. 제거 res.dropna(axis=1) NaN이 포함된 열 제거
3. 보간 res.interpolate() 선형적으로 NaN 보간
import pandas as pd
dirty_data=pd.read_csv(r'2장/uriage.csv')
dirty_data2=pd.read_excel(r'2장/kokyaku_daicho.xlsx')

dirty_data["purchase_date"]=pd.to_datetime(dirty_data["purchase_date"])
dirty_data["purchase_month"]=dirty_data["purchase_date"].dt.strftime("%Y%m")

res=pd.pivot_table(dirty_data,index="purchase_month",columns="item_name",values="item_price",aggfunc='sum',fill_value=0)

print(res.head())

결과

item_name        상 품 n   상품 E    상품 M    상품 P    상품 S   상품 W    상품 X  ...  상품p  상품r     상품s     상품t     상품v  상품x     상품y
purchase_month                                                        ...
201901          1400.0    0.0     0.0     0.0     0.0    0.0     0.0  ...  0.0  0.0     0.0     0.0     0.0  0.0     0.0
201902             0.0    0.0     0.0     0.0     0.0    0.0  2400.0  ...  0.0  0.0  1900.0  2000.0  2200.0  0.0     0.0
201903             0.0  500.0  1300.0  1600.0     0.0    0.0     0.0  ...  0.0  0.0     0.0     0.0     0.0  0.0     0.0
201904             0.0    0.0     0.0     0.0     0.0    0.0     0.0  ...  0.0  0.0  1900.0     0.0     0.0  0.0     0.0
201905             0.0    0.0     0.0     0.0  1900.0    0.0     0.0  ...  0.0  0.0     0.0     0.0     0.0  0.0  2500.0

📌 7. 상품명 정제 후 고유값 수 확인하기

실무 데이터 분석을 하다 보면, 동일한 의미의 데이터가 다른 형태로 기록되어 있는 경우를 자주 만납니다.
예를 들어, "상품 A", "상 품A", "상품a", "상품 A " 등은 모두 같은 상품을 의미하지만, 데이터상으로는 다른 문자열로 인식되어 집계에 혼란을 줍니다.

🧼 Step 1: 상품명 대문자 통일 + 공백 제거

item_name 열을 통일된 형식으로 정제합니다.

  • str.upper(): 소문자를 대문자로 변환
  • str.replace(" ", ""): 문자열 내 모든 공백 제거
dirty_data["item_name"] = dirty_data["item_name"].str.upper().str.replace(" ", "")

str.replace() 앞에 str.을 붙이는 것이 중요합니다.
단순 .replace()는 Series 전체에 적용되는 반면, .str.replace()는 각 셀의 문자열에 적용됩니다.

📊 Step 2: 정렬 후 확인

dirty_data = dirty_data.sort_values(by=["item_name"], ascending=True)

📌 Pandas에서 빠르고 효율적인 결측값(null) 처리 방법

1. 문제 상황

데이터를 분석하거나 시각화하기 전에 가장 먼저 부딪히는 문제 중 하나는 결측값(null)입니다.
예를 들어, 구매 데이터를 정리할 때 가격(item_price)이나 날짜(purchase_date)에 누락된 값이 있으면 분석 결과에 심각한 영향을 줄 수 있습니다.


2. 일반적인 결측값 처리 방식

(1) isnull()과 fillna() 기본 사용

df['item_price'].isnull().sum()  # 결측값 개수 확인
df['item_price'] = df['item_price'].fillna(0)  # 0으로 채우기

(2) 평균값이나 중앙값으로 채우기

mean_price = df['item_price'].mean()
df['item_price'] = df['item_price'].fillna(mean_price)

(3) loc을 이용한 조건부 채우기

df.loc[df['item_price'].isnull(), 'item_price'] = df['item_price'].mean()

3. 성능 개선을 위한 고급 방식

💡 Pandas는 기본적으로 벡터 연산 기반으로 동작할 때 가장 빠릅니다.

가능하면 반복문보다는 apply, fillna, transform 등을 활용해야 속도가 빨라집니다.

예: 그룹별 평균으로 결측값 채우기

# 고객별 평균 가격으로 item_price 채우기
df['item_price'] = df.groupby('customer_name')['item_price'].transform(lambda x: x.fillna(x.mean()))

 

'인공지능' 카테고리의 다른 글

데이터 전처리 및 집계 분석  (0) 2025.07.01
데이터 정리 후 출력  (0) 2025.07.01
데이터 가시화  (1) 2025.06.29
데이터 분석을 위한 파이썬2  (0) 2025.06.29
데이터 분석을 위한 파이썬  (0) 2025.06.29