DataFrame 에서 샘플 추출과 결측치(미싱 데이터) 확인하기
***< 샘플 추출하기 >**************************************************
◆ Pandas에서 샘플을 추출하는 방법은 sample() 함수를 사용한다.
___ <예시> _______________________________________________________
import pandas as pd
# 예시 데이터프레임
df = pd.DataFrame({
'A': range(1, 11),
'B': range(11, 21)
})
# 임의의 3개 샘플 추출
sample_df = df.sample(n=3)
print(sample_df)
---------------------------------------------------------------------------
▶ n=3은 3개의 행을 임의로 추출한다는 의미이다.
▶ 이외에도 frac 매개변수를 사용하여 비율에 따라 샘플을 추출할 수 있다.
예) 전체 데이터의 50%를 추출하려면:
--------------------------------------------------------------
# 데이터프레임의 50%를 임의로 추출
sample_df = df.sample(frac=0.5)
print(sample_df)
--------------------------------------------------------------
▶ 추출할 때 데이터프레임을 다시 정렬하고 싶지 않다면 random_state 매개변수를 사용하여 시드를 고정할 수도 있다.
<< 초기치 지정 >>
◆ Pandas에서 sample() 함수를 사용할 때, 결과를 재현할 수 있도록 초기치를 지정하려면 random_state 매개변수를 사용한다.
◆ 이 값이 고정되면 동일한 코드 실행 시 항상 같은 샘플이 추출된다.
◆ 예를 들어, 다음과 같이 초기치를 지정할 수 있다.
__________예 : 초기치를 지정_______________________________________
import pandas as pd
# 예시 데이터프레임
df = pd.DataFrame({
'A': range(1, 11),
'B': range(11, 21)
})
# 초기치 지정하여 샘플 추출 (random_state=42)
sample_df = df.sample(n=3, random_state=42)
print(sample_df)
--------------------------------------------------------------------------
▶ 코드에서 random_state=42로 지정하면 항상 동일한 3개의 행을 샘플링하게 된다.
▶ random_state 값은 원하는 숫자로 설정할 수 있으며, 어떤 숫자를 사용하든 일관된 결과를 얻을 수 있다.
***< 결측치(미싱) 처리하기 >*************************************************
◆ 결측치는 데이터 분석 과정에서 자주 발생하며, 이를 적절히 처리하지 않으면 분석 결과에 부정적인 영향을 미칠 수 있다.
1. 결측치 확인하기
■ isnull() 및 notnull() 함수 사용
결측치를 확인하기 위해 isnull()과 notnull() 함수를 사용할 수 있다.
__________________________________________________________________________
import pandas as pd
# 예제 데이터프레임 생성
data = {
'A': [1, 2, None, 4],
'B': [5, None, None, 8],
'C': [9, 10, 11, 12]
}
df = pd.DataFrame(data)
# 결측치 확인
print(df.isnull())
# 결측치가 있는지 확인 (True/False)
print(df.isnull().values.any())
-----------------------------------------------------------------------------------
■ 결측치의 총 개수 확인
열별 또는 전체 데이터프레임의 결측치 개수를 확인할 수 있다.
__________________________________________________________________________
# 열별 결측치 개수
print(df.isnull().sum())
# 전체 결측치 개수
print(df.isnull().sum().sum())
----------------------------------------------------------------------------------
■ 결측치 비율 확인
각 열의 결측치 비율을 계산할 수 있다.
_______________________________________________________________________
# 열별 결측치 비율
missing_ratio = df.isnull().mean() * 100
print(missing_ratio)
-------------------------------------------------------------------------------
2.. 결측치 제거하기
■ dropna() 함수 사용
결측치를 제거할 때는 dropna() 함수를 사용한다.
___________________________________________________________________
# 결측치가 있는 행 전체 제거
df_dropped = df.dropna()
print(df_dropped)
# 특정 열에 결측치가 있는 행 제거
df_dropped_subset = df.dropna(subset=['A', 'B'])
print(df_dropped_subset)
# 결측치가 있는 열 제거
df_dropped_columns = df.dropna(axis=1)
print(df_dropped_columns)
-----------------------------------------------------------------------------
■ 기준 설정
특정 기준을 만족할 때만 결측치를 제거할 수도 있다.
_____________________________________________________________________
# 최소 2개의 non-NA 값을 가진 행만 유지
df_dropped_thresh = df.dropna(thresh=2)
print(df_dropped_thresh)
-----------------------------------------------------------------------------
3. 결측치 대체하기
■ fillna() 함수 사용
결측치를 특정 값으로 대체할 때는 fillna() 함수를 사용한다.
__________________________________________________________________
# 모든 결측치를 0으로 대체
df_filled_zero = df.fillna(0)
print(df_filled_zero)
# 특정 열의 결측치를 다른 값으로 대체
df['A'] = df['A'].fillna(df['A'].mean()) # 평균으로 대체
df['B'] = df['B'].fillna(method='ffill') # 앞의 값으로 대체
print(df)
-------------------------------------------------------------------------
■ 다양한 대체 방법
평균, 중앙값, 최빈값 등으로 대체할 수 있다.
__________________________________________________________________
# 평균으로 대체
df['A'] = df['A'].fillna(df['A'].mean())
# 중앙값으로 대체
df['B'] = df['B'].fillna(df['B'].median())
# 최빈값으로 대체
df['C'] = df['C'].fillna(df['C'].mode()[0])
-------------------------------------------------------------------------
■ 보간법(interpolation) 사용
연속적인 데이터의 경우 보간법을 사용할 수 있다.
__________________________________________________________________
# 선형 보간법
df_interpolated = df.interpolate(method='linear')
print(df_interpolated)
# 시간 기반 보간법 (날짜 인덱스가 있을 경우)
# df_interpolated_time = df.interpolate(method='time')
-------------------------------------------------------------------------
4. 고급 결측치 처리 방법
■ Forward Fill 및 Backward Fill
앞의 값이나 뒤의 값으로 결측치를 채울 수 있다.
__________________________________________________________________
# Forward Fill
df_ffill = df.fillna(method='ffill')
print(df_ffill)
# Backward Fill
df_bfill = df.fillna(method='bfill')
print(df_bfill)
-------------------------------------------------------------------------
■ 특정 열에 대해 다른 방법 적용
열마다 다른 대체 방법을 적용할 수 있다.
__________________________________________________________________
df_filled = df.fillna({
'A': df['A'].mean(),
'B': df['B'].median(),
'C': df['C'].mode()[0]
})
print(df_filled)
-------------------------------------------------------------------------
5. 결측치 시각화하기
결측치를 시각적으로 파악하기 위해 seaborn이나 missingno 같은 라이브러리를 사용할 수 있다.
■ seaborn 사용
__________________________________________________________________
import seaborn as sns
import matplotlib.pyplot as plt
sns.heatmap(df.isnull(), cbar=False, cmap='viridis')
plt.show()
-------------------------------------------------------------------------
■ missingno 사용
__________________________________________________________________
import missingno as msno
msno.matrix(df)
plt.show()
msno.bar(df)
plt.show()
-------------------------------------------------------------------------
6. 결측치 대체 시 주의사항
◆ 데이터의 특성 이해: 결측치를 단순히 제거하거나 대체하기 전에 데이터의 특성과 결측치가 발생한 이유를 이해하는 것이 중요하다.
◆ 정보 손실 최소화: 결측치를 제거하면 데이터 손실이 발생할 수 있으므로, 가능한 대체 방법을 사용하는 것이 좋다.
◆ 모델링에 미치는 영향 고려: 결측치 처리 방식이 머신러닝 모델의 성능에 영향을 미칠 수 있으므로, 다양한 방법을 시도해보고 성능을 비교해야 한다.
7. 예제 코드 종합
◆ 판다스를 활용하면 다양한 방법으로 결측치를 효과적으로 처리할 수 있다.
◆ 데이터의 특성과 분석 목적에 맞는 방법을 선택하여 결측치를 처리해야 한다.
__________________________________________________________________________
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import missingno as msno
# 예제 데이터프레임 생성
data = {
'A': [1, 2, None, 4, 5],
'B': [5, None, None, 8, 10],
'C': [9, 10, 11, 12, None]
}
df = pd.DataFrame(data)
# 결측치 확인
print("결측치 확인:")
print(df.isnull())
# 결측치 개수
print("\n결측치 개수:")
print(df.isnull().sum())
# 결측치 비율
print("\n결측치 비율(%):")
print(df.isnull().mean() * 100)
# 결측치 시각화
print("\n결측치 시각화:")
msno.matrix(df)
plt.show()
# 결측치 제거
df_dropped = df.dropna()
print("\n결측치가 있는 행 제거:")
print(df_dropped)
# 결측치 대체
df_filled = df.fillna({
'A': df['A'].mean(),
'B': df['B'].median(),
'C': df['C'].mode()[0]
})
print("\n결측치 대체:")
print(df_filled)
# 보간법 적용
df_interpolated = df.interpolate(method='linear')
print("\n보간법 적용:")
print(df_interpolated)
# Forward Fill 적용
df_ffill = df.fillna(method='ffill')
print("\nForward Fill 적용:")
print(df_ffill)
# Backward Fill 적용
df_bfill = df.fillna(method='bfill')
print("\nBackward Fill 적용:")
print(df_bfill)
-----------------------------------------------------------------------------