본문 바로가기
공부해볼갱/데이터 배워볼갱

[데이터 배워볼갱] 코멘토 청년취업사관학교 전Z전능 데이터 분석가 DAY20

by 갱ㄷ 2025. 2. 2.
🗓️ 2025-01-20(월) 파이썬 기초6

 

 

 


데이터 정제 1. 결측치 정제하기

 

결측치 : 누락된 값, 비어있는 값. NaN 있는 상태로 연산시 출력 결과도 NaN

 * pd.mean(), pd.sum(), groupby(), agg()는 결측치 무시하고 연산함 

# 결측치 만들기 (numpy)
np.nan  

# 결측치 빈도 확인
pd.isna(df).sum()

# 결측치 있는 행 제거
df = df.dropna(subset = ['score'])  # score 결측치 제거 
df = df.dropna( )  # 모든 칼럼의 결측치 제거
# 결측치 대체하기

# 1. 평균값
df['math'].mean() # 55.23
df['math'] = df['math'].fillna(55)

데이터 정제 2. 이상치 정제하기

 

존재할 수 없는 값이 있다면, NaN으로 변환 후 dropna

# 성별 1남, 2여, 3?
df['sex'] = np.where(df['sex'] == 3, np.nan, df['sex'])

df.dropna(subset = ['sex', 'score'])
		.groupby('sex')
        .agg(mean_score = ('score', 'mean'))

    
np.where()은   NaN + 숫자 가능,   NaN + 문자 불가능

# 1이 아닐 때 NaN이 아니라 'nan' 반환하게 되므로 주의할 것
df['x'] = np.where(df['x1'] == 1, 'a', np.nan)

# np.nan이 아니라, 다른 문자로 대체후 -> 그 문자를 np.nan으로 변경
df['x'] = np.where(df['x1'] == 1, 'a', 'etc')
df['x'] = df['x'].replace('etc', np.nan)

 

극단치 확인 후 제거

극단치 : 하한 (Q1 - 1.5*IQR), 상한 (Q3 + 1.5*IQR), IQR = Q3-Q1

pct25 = df['hwy'].quantile(.25)  # Q1 = 18
pct75 = df['hwy'].quantile(.75)  # Q3 = 27
iqr = pct75 - pct25  # IQR = 27 - 18 = 9

pct25 - 1.5 * iqr  # 하한 4.5
pct75 + 1.5 * iqr  # 상한 40.5

# 하한 미만이거나 상한 초과이면 NaN
df['hwy'] = np.where( (df['hwy'] < 4.5) | (df['hwy'] > 40.5), np.nan, df['hwy'] )
df['hwy'].isna().sum() # 3 = 이상치 개수