10 분 소요

import warnings
warnings.filterwarnings('ignore')
from IPython.display import Image
import numpy as np
import pandas as pd
#데이터에 누락값이 없으면 좋켔지만 누락값은 대부분의
#데이터에 존재하곡 깔끔한 데이터를 위해 누락값을 
#처리하는 것이 매우 중요하다.
#누락값은 NaN으로 표기되며 누락값을 파이썬에서 사용하려면
#넘파이 라이브러리가 필요하다.
#누락값을 사용하기 위해 넘파이 누락값을 불러온다.
from numpy import NaN, NAN, nan
#누락값은 0,''과 같은 값과는 다른 개념으로 데이터 
#자체가 없다는 것을 의미한다.
#=>NULL=>'같다'라는 개념도 존재하지 않는다.
print(NaN == True)
print(NaN == False)
print(NaN == 0)
print(NaN == '')
False
False
False
False
#누락값은 값 자체가 없기 때문에 자기 자신과 
#비교해도 False가 출력된다.
print(NaN == NaN)
print(NAN == NAN)
print(nan == nan)
False
False
False
#판다스에는 누락값을 확인하는 isnull(), isna() 함수가 있고
#누락값이면 True, 그렇지 않으면  False가 리턴된다.
print(pd.isnull(NaN))
print(pd.isna(nan))

print(pd.isnull(0))
print(pd.isna(0))

print(pd.isnull(''))
print(pd.isna(''))
True
True
False
False
False
False
#Cases_* => 발병자 수, Death_* => 사망자 수
ebola = pd.read_csv('./data/country_timeseries.csv')
ebola
Date Day Cases_Guinea Cases_Liberia Cases_SierraLeone Cases_Nigeria Cases_Senegal Cases_UnitedStates Cases_Spain Cases_Mali Deaths_Guinea Deaths_Liberia Deaths_SierraLeone Deaths_Nigeria Deaths_Senegal Deaths_UnitedStates Deaths_Spain Deaths_Mali
0 1/5/2015 289 2776.0 NaN 10030.0 NaN NaN NaN NaN NaN 1786.0 NaN 2977.0 NaN NaN NaN NaN NaN
1 1/4/2015 288 2775.0 NaN 9780.0 NaN NaN NaN NaN NaN 1781.0 NaN 2943.0 NaN NaN NaN NaN NaN
2 1/3/2015 287 2769.0 8166.0 9722.0 NaN NaN NaN NaN NaN 1767.0 3496.0 2915.0 NaN NaN NaN NaN NaN
3 1/2/2015 286 NaN 8157.0 NaN NaN NaN NaN NaN NaN NaN 3496.0 NaN NaN NaN NaN NaN NaN
4 12/31/2014 284 2730.0 8115.0 9633.0 NaN NaN NaN NaN NaN 1739.0 3471.0 2827.0 NaN NaN NaN NaN NaN
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
117 3/27/2014 5 103.0 8.0 6.0 NaN NaN NaN NaN NaN 66.0 6.0 5.0 NaN NaN NaN NaN NaN
118 3/26/2014 4 86.0 NaN NaN NaN NaN NaN NaN NaN 62.0 NaN NaN NaN NaN NaN NaN NaN
119 3/25/2014 3 86.0 NaN NaN NaN NaN NaN NaN NaN 60.0 NaN NaN NaN NaN NaN NaN NaN
120 3/24/2014 2 86.0 NaN NaN NaN NaN NaN NaN NaN 59.0 NaN NaN NaN NaN NaN NaN NaN
121 3/22/2014 0 49.0 NaN NaN NaN NaN NaN NaN NaN 29.0 NaN NaN NaN NaN NaN NaN NaN

122 rows × 18 columns

#넘파이의 count_nonzero() 함수는 배열에서 0이나 False가 아닌
#데이터의 개수를 센다.
print(np.count_nonzero([False, 0]))
print(np.count_nonzero([False, 0, True]))
print(np.count_nonzero([False, 0, True, 1, 999,NaN]))
print()
#isnull() 함수는 누락값이면 True, 그렇지 않으면 False를
#리턴한다.

print(np.count_nonzero(ebola.isnull()))
print(np.count_nonzero(ebola.isna()))
print()
print(np.count_nonzero(ebola['Cases_Guinea'].isnull()))
print(np.count_nonzero(ebola['Cases_Guinea'].isna()))
print(np.count_nonzero(ebola.Cases_Guinea.isna()))
print()

#count() 함수는 NaN이 아닌 데이터의 개수(122-29=93)를 센다.
print(ebola['Cases_Guinea'].count())
print()
#count()함수로 누락값(NaN)이 아닌 데이터의 개수를 알 수 있다.
print(ebola.count())
0
1
4

1214
1214

29
29
29

93

Date                   122
Day                    122
Cases_Guinea            93
Cases_Liberia           83
Cases_SierraLeone       87
Cases_Nigeria           38
Cases_Senegal           25
Cases_UnitedStates      18
Cases_Spain             16
Cases_Mali              12
Deaths_Guinea           92
Deaths_Liberia          81
Deaths_SierraLeone      87
Deaths_Nigeria          38
Deaths_Senegal          22
Deaths_UnitedStates     18
Deaths_Spain            16
Deaths_Mali             12
dtype: int64
ebola.isnull()
Date Day Cases_Guinea Cases_Liberia Cases_SierraLeone Cases_Nigeria Cases_Senegal Cases_UnitedStates Cases_Spain Cases_Mali Deaths_Guinea Deaths_Liberia Deaths_SierraLeone Deaths_Nigeria Deaths_Senegal Deaths_UnitedStates Deaths_Spain Deaths_Mali
0 False False False True False True True True True True False True False True True True True True
1 False False False True False True True True True True False True False True True True True True
2 False False False False False True True True True True False False False True True True True True
3 False False True False True True True True True True True False True True True True True True
4 False False False False False True True True True True False False False True True True True True
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
117 False False False False False True True True True True False False False True True True True True
118 False False False True True True True True True True False True True True True True True True
119 False False False True True True True True True True False True True True True True True True
120 False False False True True True True True True True False True True True True True True True
121 False False False True True True True True True True False True True True True True True True

122 rows × 18 columns

print(ebola.shape)
print('ebola 데이터는 {}행 {}열 입니다.'.format(ebola.shape[0], ebola.shape[1]))
num_row = ebola.shape[0]
num_missing = num_row-ebola.count()
num_missing
(122, 18)
ebola 데이터는 122행 18열 입니다.

Date                     0
Day                      0
Cases_Guinea            29
Cases_Liberia           39
Cases_SierraLeone       35
Cases_Nigeria           84
Cases_Senegal           97
Cases_UnitedStates     104
Cases_Spain            106
Cases_Mali             110
Deaths_Guinea           30
Deaths_Liberia          41
Deaths_SierraLeone      35
Deaths_Nigeria          84
Deaths_Senegal         100
Deaths_UnitedStates    104
Deaths_Spain           106
Deaths_Mali            110
dtype: int64
#value_counts() 함수는 지정한 열의 데이터
#출현 빈도수를 얻어온다.
#=>기본값으로 NaN은 무시하고 출현 빈도수를
#  계산한다.
print(ebola['Cases_Guinea'].value_counts())
print()

print(ebola.Cases_Guinea.value_counts())
86.0      3
112.0     2
390.0     2
495.0     2
2597.0    1
         ..
235.0     1
231.0     1
226.0     1
224.0     1
2776.0    1
Name: Cases_Guinea, Length: 88, dtype: int64

86.0      3
112.0     2
390.0     2
495.0     2
2597.0    1
         ..
235.0     1
231.0     1
226.0     1
224.0     1
2776.0    1
Name: Cases_Guinea, Length: 88, dtype: int64
#value_counts() 함수에 dropna 옵션을 False로 
#지정하면 NaN 출현 빈도수를 계산한다.
print(ebola.Cases_Guinea.value_counts(dropna = False))
NaN       29
86.0       3
495.0      2
112.0      2
390.0      2
          ..
235.0      1
231.0      1
226.0      1
224.0      1
2776.0     1
Name: Cases_Guinea, Length: 89, dtype: int64
#기초 통게 계산 함수의 skipna 옵션의 기본값은
#True이고 NaN값을 무시한다. NaN도 취급하게 하려면
#skipna옵션을 False로 설정하면 된다.
#일반 데이터와 nan을 계산하면 결과는 nan이다.
print(ebola.Cases_Guinea.sum())
print(ebola.Cases_Guinea.sum(skipna=True))
print(ebola.Cases_Guinea.sum(skipna=False))
print(ebola.Cases_Guinea.mean())
print(ebola.Cases_Guinea.max())
print(ebola.Cases_Guinea.min())

#단 count함수는 skipna라는 옵션을 사용할 수 없다.
print(ebola.Cases_Guinea.count())
84729.0
84729.0
nan
911.0645161290323
2776.0
49.0
93

---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-41-00b17816ecb7> in <module>
     10 print(ebola.Cases_Guinea.min())
     11 print(ebola.Cases_Guinea.count())
---> 12 print(ebola.Cases_Guinea.count(skipna=False))
     13 #단 count함수는 skipna라는 옵션을 사용할 수 없다.


TypeError: count() got an unexpected keyword argument 'skipna'

누락값 처리하기

#ebola.loc[:10, ['Date', 'Day', 'Cases_Guinea','Cases_Liberia','Cases_SierraLeone']]
ebola.iloc[:10, :5]
Date Day Cases_Guinea Cases_Liberia Cases_SierraLeone
0 1/5/2015 289 2776.0 NaN 10030.0
1 1/4/2015 288 2775.0 NaN 9780.0
2 1/3/2015 287 2769.0 8166.0 9722.0
3 1/2/2015 286 NaN 8157.0 NaN
4 12/31/2014 284 2730.0 8115.0 9633.0
5 12/28/2014 281 2706.0 8018.0 9446.0
6 12/27/2014 280 2695.0 NaN 9409.0
7 12/24/2014 277 2630.0 7977.0 9203.0
8 12/21/2014 273 2597.0 NaN 9004.0
9 12/20/2014 272 2571.0 7862.0 8939.0
#fillna()함수의 인수로 특정 데이터를 지정하면
#누락값을 지정한 값으로 변경한다.
ebola.iloc[:10, :5].fillna(0)
Date Day Cases_Guinea Cases_Liberia Cases_SierraLeone
0 1/5/2015 289 2776.0 0.0 10030.0
1 1/4/2015 288 2775.0 0.0 9780.0
2 1/3/2015 287 2769.0 8166.0 9722.0
3 1/2/2015 286 0.0 8157.0 0.0
4 12/31/2014 284 2730.0 8115.0 9633.0
5 12/28/2014 281 2706.0 8018.0 9446.0
6 12/27/2014 280 2695.0 0.0 9409.0
7 12/24/2014 277 2630.0 7977.0 9203.0
8 12/21/2014 273 2597.0 0.0 9004.0
9 12/20/2014 272 2571.0 7862.0 8939.0
#fillna()함수의 method옵션을 'ffill'로 지정하면
#누락값이 나타나기 바로 전의 값으로 변경한다.
#이전 값이 존재하지 않으면 nan를 변경하지 못한다.
ebola.iloc[:10, :5].fillna(method='ffill')
Date Day Cases_Guinea Cases_Liberia Cases_SierraLeone
0 1/5/2015 289 2776.0 NaN 10030.0
1 1/4/2015 288 2775.0 NaN 9780.0
2 1/3/2015 287 2769.0 8166.0 9722.0
3 1/2/2015 286 2769.0 8157.0 9722.0
4 12/31/2014 284 2730.0 8115.0 9633.0
5 12/28/2014 281 2706.0 8018.0 9446.0
6 12/27/2014 280 2695.0 8018.0 9409.0
7 12/24/2014 277 2630.0 7977.0 9203.0
8 12/21/2014 273 2597.0 7977.0 9004.0
9 12/20/2014 272 2571.0 7862.0 8939.0
#fillna()함수의 method옵션을 'bfill'로 지정하면
#누락값이 나타난 바로 다음 값으로 변경한다.
#마찬가지로 다음값이 없으면 nan를 변경하지 못한다.
ebola.iloc[:10, :5].fillna(method='bfill')
Date Day Cases_Guinea Cases_Liberia Cases_SierraLeone
0 1/5/2015 289 2776.0 8166.0 10030.0
1 1/4/2015 288 2775.0 8166.0 9780.0
2 1/3/2015 287 2769.0 8166.0 9722.0
3 1/2/2015 286 2730.0 8157.0 9633.0
4 12/31/2014 284 2730.0 8115.0 9633.0
5 12/28/2014 281 2706.0 8018.0 9446.0
6 12/27/2014 280 2695.0 7977.0 9409.0
7 12/24/2014 277 2630.0 7977.0 9203.0
8 12/21/2014 273 2597.0 7862.0 9004.0
9 12/20/2014 272 2571.0 7862.0 8939.0
#interpolate()함수는 누락값 앞, 뒤에 데이터를 이용해서
#중간값(평균값)으로 누락값을 변경한다.
#이전 값이 존재하지 않으면 nan를 변경하지 못한다.
ebola.iloc[:10, :5].interpolate()
Date Day Cases_Guinea Cases_Liberia Cases_SierraLeone
0 1/5/2015 289 2776.0 NaN 10030.0
1 1/4/2015 288 2775.0 NaN 9780.0
2 1/3/2015 287 2769.0 8166.0 9722.0
3 1/2/2015 286 2749.5 8157.0 9677.5
4 12/31/2014 284 2730.0 8115.0 9633.0
5 12/28/2014 281 2706.0 8018.0 9446.0
6 12/27/2014 280 2695.0 7997.5 9409.0
7 12/24/2014 277 2630.0 7977.0 9203.0
8 12/21/2014 273 2597.0 7919.5 9004.0
9 12/20/2014 272 2571.0 7862.0 8939.0
#dropna() 함수로 누락값이 포함된 행을 삭제할 수 있다.
ebola.dropna()
Date Day Cases_Guinea Cases_Liberia Cases_SierraLeone Cases_Nigeria Cases_Senegal Cases_UnitedStates Cases_Spain Cases_Mali Deaths_Guinea Deaths_Liberia Deaths_SierraLeone Deaths_Nigeria Deaths_Senegal Deaths_UnitedStates Deaths_Spain Deaths_Mali
19 11/18/2014 241 2047.0 7082.0 6190.0 20.0 1.0 4.0 1.0 6.0 1214.0 2963.0 1267.0 8.0 0.0 1.0 0.0 6.0
ebola['Cases_Multi'] = ebola.Cases_Guinea + ebola.Cases_Liberia + ebola.Cases_SierraLeone
ebola
Date Day Cases_Guinea Cases_Liberia Cases_SierraLeone Cases_Nigeria Cases_Senegal Cases_UnitedStates Cases_Spain Cases_Mali Deaths_Guinea Deaths_Liberia Deaths_SierraLeone Deaths_Nigeria Deaths_Senegal Deaths_UnitedStates Deaths_Spain Deaths_Mali Cases_Multi
0 1/5/2015 289 2776.0 NaN 10030.0 NaN NaN NaN NaN NaN 1786.0 NaN 2977.0 NaN NaN NaN NaN NaN NaN
1 1/4/2015 288 2775.0 NaN 9780.0 NaN NaN NaN NaN NaN 1781.0 NaN 2943.0 NaN NaN NaN NaN NaN NaN
2 1/3/2015 287 2769.0 8166.0 9722.0 NaN NaN NaN NaN NaN 1767.0 3496.0 2915.0 NaN NaN NaN NaN NaN 20657.0
3 1/2/2015 286 NaN 8157.0 NaN NaN NaN NaN NaN NaN NaN 3496.0 NaN NaN NaN NaN NaN NaN NaN
4 12/31/2014 284 2730.0 8115.0 9633.0 NaN NaN NaN NaN NaN 1739.0 3471.0 2827.0 NaN NaN NaN NaN NaN 20478.0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
117 3/27/2014 5 103.0 8.0 6.0 NaN NaN NaN NaN NaN 66.0 6.0 5.0 NaN NaN NaN NaN NaN 117.0
118 3/26/2014 4 86.0 NaN NaN NaN NaN NaN NaN NaN 62.0 NaN NaN NaN NaN NaN NaN NaN NaN
119 3/25/2014 3 86.0 NaN NaN NaN NaN NaN NaN NaN 60.0 NaN NaN NaN NaN NaN NaN NaN NaN
120 3/24/2014 2 86.0 NaN NaN NaN NaN NaN NaN NaN 59.0 NaN NaN NaN NaN NaN NaN NaN NaN
121 3/22/2014 0 49.0 NaN NaN NaN NaN NaN NaN NaN 29.0 NaN NaN NaN NaN NaN NaN NaN NaN

122 rows × 19 columns

#ebola_subset = ebola.loc[:, ['Cases_Guinea','Cases_Liberia','Cases_SierraLeone','Cases_Multi']]
ebola_subset = ebola.iloc[:, [2,3,4,-1]]
ebola_subset
Cases_Guinea Cases_Liberia Cases_SierraLeone Cases_Multi
0 2776.0 NaN 10030.0 NaN
1 2775.0 NaN 9780.0 NaN
2 2769.0 8166.0 9722.0 20657.0
3 NaN 8157.0 NaN NaN
4 2730.0 8115.0 9633.0 20478.0
... ... ... ... ...
117 103.0 8.0 6.0 117.0
118 86.0 NaN NaN NaN
119 86.0 NaN NaN NaN
120 86.0 NaN NaN NaN
121 49.0 NaN NaN NaN

122 rows × 4 columns

ebola_subset_dropna = ebola_subset.dropna()
ebola_subset_dropna
Cases_Guinea Cases_Liberia Cases_SierraLeone Cases_Multi
2 2769.0 8166.0 9722.0 20657.0
4 2730.0 8115.0 9633.0 20478.0
5 2706.0 8018.0 9446.0 20170.0
7 2630.0 7977.0 9203.0 19810.0
9 2571.0 7862.0 8939.0 19372.0
19 2047.0 7082.0 6190.0 15319.0
45 1199.0 3834.0 2437.0 7470.0
46 1157.0 3696.0 2304.0 7157.0
47 1074.0 3458.0 2021.0 6553.0
48 1022.0 3280.0 1940.0 6242.0
52 942.0 2710.0 1673.0 5325.0
56 861.0 2081.0 1424.0 4366.0
57 812.0 1871.0 1261.0 3944.0
58 771.0 1698.0 1216.0 3685.0
59 648.0 1378.0 1026.0 3052.0
60 607.0 1082.0 910.0 2599.0
61 579.0 972.0 907.0 2458.0
62 543.0 834.0 848.0 2225.0
63 519.0 786.0 810.0 2115.0
64 510.0 670.0 783.0 1963.0
65 506.0 599.0 730.0 1835.0
66 495.0 554.0 717.0 1766.0
67 495.0 516.0 691.0 1702.0
68 485.0 468.0 646.0 1599.0
69 472.0 391.0 574.0 1437.0
70 460.0 329.0 533.0 1322.0
71 427.0 249.0 525.0 1201.0
72 415.0 224.0 454.0 1093.0
73 410.0 196.0 442.0 1048.0
74 411.0 174.0 397.0 982.0
75 406.0 172.0 386.0 964.0
76 409.0 142.0 337.0 888.0
77 408.0 131.0 305.0 844.0
78 412.0 115.0 252.0 779.0
79 413.0 107.0 239.0 759.0
86 351.0 13.0 89.0 453.0
89 328.0 13.0 79.0 420.0
90 291.0 13.0 50.0 354.0
91 281.0 12.0 16.0 309.0
92 258.0 12.0 0.0 270.0
93 248.0 12.0 0.0 260.0
94 233.0 12.0 0.0 245.0
95 236.0 13.0 0.0 249.0
96 235.0 13.0 0.0 248.0
97 231.0 13.0 0.0 244.0
98 226.0 13.0 0.0 239.0
109 159.0 26.0 2.0 187.0
110 158.0 25.0 2.0 185.0
111 151.0 21.0 2.0 174.0
112 143.0 18.0 2.0 163.0
113 127.0 8.0 2.0 137.0
114 122.0 8.0 2.0 132.0
116 112.0 3.0 2.0 117.0
117 103.0 8.0 6.0 117.0

댓글남기기