데이터 전처리 - 누락 데이터 처리

2022. 11. 6. 21:35·Pandas
반응형

데이터 분석의 정확도는 분석 데이터의 품질에 의해 좌우된다. 데이터의 품질을 높이기 위해 누락 데이터, 중복 데이터, 오류 등을 수정하고 분석 목적에 맞게 데이터 셋을 변화시키는 것을 데이터 전처리 라고 한다.

 

### 누락 데이터 확인 ###

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import seaborn as sns
 
##### 누락 데이터 처리 #####
### 누락 데이터 확인 ###
df = sns.load_dataset('titanic')
 
print(df.head()) # NaN으로 표시된 데이터가 누락 데이터이다.
'''
   survived  pclass     sex   age  sibsp  parch     fare embarked  class    who  adult_male deck  embark_town alive  alone
0         0       3    male  22.0      1      0   7.2500        S  Third    man        True  NaN  Southampton    no  False
1         1       1  female  38.0      1      0  71.2833        C  First  woman       False    C    Cherbourg   yes  False
2         1       3  female  26.0      0      0   7.9250        S  Third  woman       False  NaN  Southampton   yes   True
3         1       1  female  35.0      1      0  53.1000        S  First  woman       False    C  Southampton   yes  False
4         0       3    male  35.0      0      0   8.0500        S  Third    man        True  NaN  Southampton    no   True
'''
 
df.info() # 데이터의 요약 정보 표시, non-null의 개수 즉 결측값이 아닌 데이터의 개수만 세기 때문에 deck의 개수는 203 이므로
          # deck 데이터의 NaN 의 개수는 891 - 203 = 688개이다.
'''
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 15 columns):
 #   Column       Non-Null Count  Dtype
---  ------       --------------  -----
 0   survived     891 non-null    int64
 1   pclass       891 non-null    int64
 2   sex          891 non-null    object
 3   age          714 non-null    float64
 4   sibsp        891 non-null    int64
 5   parch        891 non-null    int64
 6   fare         891 non-null    float64
 7   embarked     889 non-null    object
 8   class        891 non-null    category
 9   who          891 non-null    object
 10  adult_male   891 non-null    bool
 11  deck         203 non-null    category
 12  embark_town  889 non-null    object
 13  alive        891 non-null    object
 14  alone        891 non-null    bool
dtypes: bool(2), category(2), float64(2), int64(4), object(5)
memory usage: 80.7+ KB
'''
 
# 열의 NaN의 개수 직접 계산하기 #
 
nan_deck = df['deck'].value_counts(dropna=False)
print(nan_deck) # deck 열에서 데이터 개수가 각각 몇 개 인지 출력하고 있다.
'''
NaN    688
C       59
B       47
D       33
E       32
A       15
F       13
G        4
Name: deck, dtype: int64
'''
 
# notnull() 메소드로 누락 데이터 확인 #
print(df.head().notnull()) # isnull() 메소드로 NaN를 True로 출력할 수 있다.
'''
   survived  pclass   sex   age  sibsp  parch  fare  embarked  class   who  adult_male   deck  embark_town  alive  alone
0      True    True  True  True   True   True  True      True   True  True        True  False         True   True   True
1      True    True  True  True   True   True  True      True   True  True        True   True         True   True   True
2      True    True  True  True   True   True  True      True   True  True        True  False         True   True   True
3      True    True  True  True   True   True  True      True   True  True        True   True         True   True   True
4      True    True  True  True   True   True  True      True   True  True        True  False         True   True   True
'''
 
# 누락 데이터 개수 구하기 #
print(df.isnull().sum(axis=0)) # isnull(), sum() 메소드를 통해 NaN의 개수를 구할 수 있다.
                               # axis = 1 : 위에서 아래(행 방향)으로 동작, axis = 0 : 왼쪽에서 오른쪽(열 방향)으로 동작
'''                      
survived         0
pclass           0
sex              0
age            177
sibsp            0
parch            0
fare             0
embarked         2
class            0
who              0
adult_male       0
deck           688
embark_town      2
alive            0
alone            0
dtype: int64
'''
Colored by Color Scripter
cs

 

 

### 누락 데이터 제거 ###

1
2
3
4
5
6
7
8
9
10
11
12
### 누락 데이터 제거 ###
# dropna() 메소드 사용 #
# axis = 1 을 통해 누락된 데이터가 있는 열 전체르 삭제할 수 있고, 
# axis = 0 을 통해 누락된 데이터가 있는 행을 삭제할 수 있다. -> 타이타닉 데이터 셋에서는 승객 한명에 대한 레코드를 삭제.
 
df1 = df.dropna(axis=1, thresh=500) # NaN의 값이 500 이상인 열 (axis=1)을 삭제한다.
                                    # 타이타닉 데이터 셋에서 deck 열이 삭제된다.
                                    
                                    
df2 = df1.dropna(subset=['age'], how='any', axis=0) # subset=['age'] : 'age'열의 행 중에서 NaN를 찾는다.
                                                    # how = 'any' : NaN의 값이 하나라도 존재하면 삭제한다.
                                                    # how = 'all' 일 경우 모든 값이 NaN 이어야 삭제한다.
cs

 

 

### 누락 데이터 치환 ###

누락 데이터를 무작정 삭제한다면 데이터의 양에 상당한 영향을 미친다. 누락된 데이터를 평균값, 최빈값, 중앙값 등으로 치환해서 사용할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
### 누락 데이터 치환 ###
# fillna() 메소드 사용 #
# NaN를 괄호 안의 값으로 치환한다 #
 
mean_age = df['age'].mean(axis=0) # 나이의 평균을 계산한다. 
 
df['age'].fillna(mean_age, inplace = True) # NaN를 나이의 평균으로 치환한다.
 
# 가장 많이 나온 데이터로 치환하기 #
# idxmax() 메소드 사용#
# 최대값을 가지는 인덱스 레이블을 출력한다 #
 
most_freq = df['embark_town'].value_counts(dropna=True).idxmax()
# 'embark_town' 열에서 NaN을 제외하고 데이터의 개수를 센 후 개수가 최대값인 레이블을 저장한다. -> Southampton
'''
Southampton    644
Cherbourg      168
Queenstown      77
'''
 
df['embark_town'].fillna(most_freq, inplace = True) # NaN을 최빈값으로 치환한다.
 
# 직전의 데이터로 치환하기 #
# fillna( method = 'ffill') #
 
df['embark_town'].fillna(method='ffill', inplace = True)
cs

데이터는 seaborn 라이브러리가 제공하는 titanic 데이터셋을 사용했습니다.

반응형

'Pandas' 카테고리의 다른 글

데이터 전처리 - 데이터 표준화  (0) 2022.11.08
데이터 전처리 - 중복 데이터 처리  (1) 2022.11.06
Matplotlib 파이 차트 그리기  (0) 2022.11.05
Matplotlib 산점도, 버블차트 그리기  (0) 2022.11.05
Matplotlib 히스토그램 그리기  (1) 2022.11.05
'Pandas' 카테고리의 다른 글
  • 데이터 전처리 - 데이터 표준화
  • 데이터 전처리 - 중복 데이터 처리
  • Matplotlib 파이 차트 그리기
  • Matplotlib 산점도, 버블차트 그리기
김천종
김천종
  • 김천종
    김천종
    김천종
  • 전체
    오늘
    어제
    • 분류 전체보기 (88)
      • 파이썬 (6)
      • Pandas (24)
      • 자료구조 (14)
      • 알고리즘 (4)
      • 아무거나 (16)
      • 머신러닝 (20)
      • ML 실습 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
김천종
데이터 전처리 - 누락 데이터 처리
상단으로

티스토리툴바