반응형
데이터 분석의 정확도는 분석 데이터의 품질에 의해 좌우된다. 데이터의 품질을 높이기 위해 누락 데이터, 중복 데이터, 오류 등을 수정하고 분석 목적에 맞게 데이터 셋을 변화시키는 것을 데이터 전처리 라고 한다.
### 누락 데이터 확인 ###
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
'''
|
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 |
---|---|
데이터 전처리 - 중복 데이터 처리 (0) | 2022.11.06 |
Matplotlib 파이 차트 그리기 (0) | 2022.11.05 |
Matplotlib 산점도, 버블차트 그리기 (0) | 2022.11.05 |
Matplotlib 히스토그램 그리기 (0) | 2022.11.05 |