머신러닝과 데이터 분석 A-Z 올인원 패키지 - 데이터 분석을 위한 Python(Pandas) – (2)

2020. 9. 30. 15:44·AI Study/ML_Basic
반응형

* 위 강의노트는 패스트캠퍼스에서 주관하는 강의를 수강하고 작성한 노트입니다.

1. Dataframe data 살펴보기¶

 

DataFrame¶

  • Series가 1차원이라면 DataFrame은 2차원으로 확대된 버젼
  • Excel spreadsheet이라고 생각하면 이해하기 쉬움
  • 2차원이기 때문에 인덱스가 row, column로 구성됨
    • row는 각 개별 데이터를, column은 개별 속성을 의미
  • Data Analysis, Machine Learning에서 data 변형을 위해 가장 많이 사용
In [1]:
import pandas as pd
import numpy as np
In [2]:
# data 출처: https://www.kaggle.com/hesh97/titanicdataset-traincsv/data
train_data = pd.read_csv('./train.csv')
 

head, tail 함수¶

  • 데이터 전체가 아닌, 일부(처음부터, 혹은 마지막부터)를 간단히 보기 위한 함수
In [3]:
train_data.head() ## 상위 n개의 행 추출해서 확인
Out[3]:
  PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C
2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S
4 5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S
In [4]:
train_data.tail() ## 하위 n개의 행 추출해서 확인
Out[4]:
  PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
886 887 0 2 Montvila, Rev. Juozas male 27.0 0 0 211536 13.00 NaN S
887 888 1 1 Graham, Miss. Margaret Edith female 19.0 0 0 112053 30.00 B42 S
888 889 0 3 Johnston, Miss. Catherine Helen "Carrie" female NaN 1 2 W./C. 6607 23.45 NaN S
889 890 1 1 Behr, Mr. Karl Howell male 26.0 0 0 111369 30.00 C148 C
890 891 0 3 Dooley, Mr. Patrick male 32.0 0 0 370376 7.75 NaN Q
 

dataframe 데이터 파악하기¶

  • shape 속성 (row, column)
  • describe 함수 - 숫자형 데이터의 통계치 계산
  • info 함수 - 데이터 타입, 각 아이템의 개수 등 출력
In [5]:
train_data.shape # 데이터의 크기 파악하기(891 rows, 12 cols)
Out[5]:
(891, 12)
In [7]:
train_data.describe() # 숫자형 데이터의 기초통계 보여주기
Out[7]:
  PassengerId Survived Pclass Age SibSp Parch Fare
count 891.000000 891.000000 891.000000 714.000000 891.000000 891.000000 891.000000
mean 446.000000 0.383838 2.308642 29.699118 0.523008 0.381594 32.204208
std 257.353842 0.486592 0.836071 14.526497 1.102743 0.806057 49.693429
min 1.000000 0.000000 1.000000 0.420000 0.000000 0.000000 0.000000
25% 223.500000 0.000000 2.000000 20.125000 0.000000 0.000000 7.910400
50% 446.000000 0.000000 3.000000 28.000000 0.000000 0.000000 14.454200
75% 668.500000 1.000000 3.000000 38.000000 1.000000 0.000000 31.000000
max 891.000000 1.000000 3.000000 80.000000 8.000000 6.000000 512.329200
In [8]:
train_data.info() # 데이터의 타입 및 간단 정보 출력
 
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
PassengerId    891 non-null int64
Survived       891 non-null int64
Pclass         891 non-null int64
Name           891 non-null object
Sex            891 non-null object
Age            714 non-null float64
SibSp          891 non-null int64
Parch          891 non-null int64
Ticket         891 non-null object
Fare           891 non-null float64
Cabin          204 non-null object
Embarked       889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.7+ KB
 

2. DataFrame의 구조 이해하기¶

 

인덱스(index)¶

  • index 속성
  • 각 아이템을 특정할 수 있는 고유의 값을 저장
  • 복잡한 데이터의 경우, 멀티 인덱스로 표현 가능
In [9]:
train_data.index # 가장 기본 index는 range index
Out[9]:
RangeIndex(start=0, stop=891, step=1)
 

컬럼(column)¶

  • columns 속성
  • 각각의 특성(feature)을 나타냄
  • 복잡한 데이터의 경우, 멀티 컬럼으로 표현 가능
In [10]:
train_data.columns # dataframge의 컬럼 출력
Out[10]:
Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',
       'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],
      dtype='object')
 

3. DataFrame데이터 생성하기¶

 

DataFrame 생성하기¶

  • 일반적으로 분석을 위한 데이터는 다른 데이터 소스(database, 외부 파일)을 통해 dataframe을 생성
  • 여기서는 실습을 통해, dummy 데이터를 생성하는 방법을 다룰 예정
 

dictionary로 부터 생성하기¶

  • dict의 key -> column
In [12]:
data = {'a' : 100, 'b' : 200, 'c' : 300} # key는 columns 개념
pd.DataFrame(data, index = ['x', 'y', 'z'])
Out[12]:
  a b c
x 100 200 300
y 100 200 300
z 100 200 300
In [13]:
data = {'a' : [1, 2, 3], 'b' : [4, 5, 6], 'c' : [10, 11, 12]} # key는 columns 개념
pd.DataFrame(data, index = ['0', '1', '2'])
Out[13]:
  a b c
0 1 4 10
1 2 5 11
2 3 6 12
 

Series로 부터 생성하기¶

  • 각 Series의 인덱스 -> column
In [14]:
a = pd.Series([100, 200, 300], ['a', 'b', 'c'])
b = pd.Series([101, 201, 301], ['a', 'b', 'c'])
c = pd.Series([110, 210, 310], ['a', 'b', 'c'])

pd.DataFrame([a, b, c]) # Series의 인덱스들이 columns으로 들어감
Out[14]:
  a b c
0 100 200 300
1 101 201 301
2 110 210 310
 

4. 샘플 csv 데이터로 DataFrame 데이터 생성하기¶

 

csv 데이터로 부터 Dataframe 생성¶

  • 데이터 분석을 위해, dataframe을 생성하는 가장 일반적인 방법
  • 데이터 소스로부터 추출된 csv(comma separated values) 파일로부터 생성
  • pandas.read_csv 함수 사용
In [15]:
# data 출처: https://www.kaggle.com/hesh97/titanicdataset-traincsv/data
train_data = pd.read_csv('./train.csv')
train_data.head()
Out[15]:
  PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C
2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S
4 5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S
 

read_csv 함수 파라미터¶

  • sep - 각 데이터 값을 구별하기 위한 구분자(separator) 설정
  • header - header를 무시할 경우, None 설정
  • index_col - index로 사용할 column 설정
  • usecols - 실제로 dataframe에 로딩할 columns만 설정
In [17]:
train_data = pd.read_csv('./train.csv', 
                         sep = ',', # 구분자 : csv를 쪼개는 기준에 대해 말함
                         header = 'infer', # 헤더가 없을 경우 None으로 대체
                         index_col = None, # 인덱스로 사용할 컬럼이 어떤 것인지 명시
                         usecols = ['PassengerId', 'Survived'] # 필요한 컬럼만 불러오기
                        )
train_data
Out[17]:
  PassengerId Survived
0 1 0
1 2 1
2 3 1
3 4 1
4 5 0
... ... ...
886 887 0
887 888 1
888 889 0
889 890 1
890 891 0

891 rows × 2 columns

 

5. DataFrame 원하는 column(컬럼)만 선택하기¶

 

column 선택하기¶

  • 기본적으로 [ ]는 column을 추출
  • 컬럼 인덱스일 경우 인덱스의 리스트 사용 가능
    • 리스트를 전달할 경우 결과는 Dataframe
    • 하나의 컬럼명을 전달할 경우 결과는 Series
In [18]:
# data 출처: https://www.kaggle.com/hesh97/titanicdataset-traincsv/data
train_data = pd.read_csv('./train.csv')
 

하나의 컬럼 선택하기¶

In [20]:
train_data[0] # dataframe의 값이 한개만 존재한다면, columns을 의미하는 것임
 
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
~\Anaconda3\lib\site-packages\pandas\core\indexes\base.py in get_loc(self, key, method, tolerance)
   2896             try:
-> 2897                 return self._engine.get_loc(key)
   2898             except KeyError:

pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

KeyError: 0

During handling of the above exception, another exception occurred:

KeyError                                  Traceback (most recent call last)
<ipython-input-20-56422c87e166> in <module>
----> 1 train_data[0] # dataframe의 값이 한개만 존재한다면, columns을 의미하는 것임

~\Anaconda3\lib\site-packages\pandas\core\frame.py in __getitem__(self, key)
   2978             if self.columns.nlevels > 1:
   2979                 return self._getitem_multilevel(key)
-> 2980             indexer = self.columns.get_loc(key)
   2981             if is_integer(indexer):
   2982                 indexer = [indexer]

~\Anaconda3\lib\site-packages\pandas\core\indexes\base.py in get_loc(self, key, method, tolerance)
   2897                 return self._engine.get_loc(key)
   2898             except KeyError:
-> 2899                 return self._engine.get_loc(self._maybe_cast_indexer(key))
   2900         indexer = self.get_indexer([key], method=method, tolerance=tolerance)
   2901         if indexer.ndim > 1 or indexer.size > 1:

pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

KeyError: 0
In [21]:
train_data['Survived'] # 해당 컬럼만 추출
Out[21]:
0      0
1      1
2      1
3      1
4      0
      ..
886    0
887    1
888    0
889    1
890    0
Name: Survived, Length: 891, dtype: int64
 

복수개의 컬럼 선택하기¶

In [22]:
# 데이터 프레임으로 출력됨
train_data[['Survived', 'Age', 'Name']] # 여러개의 컬럼은 리스트 입력하기
Out[22]:
  Survived Age Name
0 0 22.0 Braund, Mr. Owen Harris
1 1 38.0 Cumings, Mrs. John Bradley (Florence Briggs Th...
2 1 26.0 Heikkinen, Miss. Laina
3 1 35.0 Futrelle, Mrs. Jacques Heath (Lily May Peel)
4 0 35.0 Allen, Mr. William Henry
... ... ... ...
886 0 27.0 Montvila, Rev. Juozas
887 1 19.0 Graham, Miss. Margaret Edith
888 0 NaN Johnston, Miss. Catherine Helen "Carrie"
889 1 26.0 Behr, Mr. Karl Howell
890 0 32.0 Dooley, Mr. Patrick

891 rows × 3 columns

 

6. DataFrame 원하는 row(데이터)만 선택하기¶

 

dataframe slicing¶

  • dataframe의 경우 기본적으로 [] 연산자가 column 선택에 사용
  • 하지만, slicing은 row 레벨로 지원
In [24]:
train_data[:3] # slicing은 row 지원
Out[24]:
  PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C
2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S
 

row 선택하기¶

  • Seires의 경우 []로 row 선택이 가능하나, DataFrame의 경우는 기본적으로 column을 선택하도록 설계
  • .loc, .iloc함수로 row 선택 가능
    • loc - 인덱스 자체를 사용
    • iloc - 0 based index로 사용
    • 이 두 함수는 ,를 사용하여 column 선택도 가능
In [27]:
train_data.info()
 
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
PassengerId    891 non-null int64
Survived       891 non-null int64
Pclass         891 non-null int64
Name           891 non-null object
Sex            891 non-null object
Age            714 non-null float64
SibSp          891 non-null int64
Parch          891 non-null int64
Ticket         891 non-null object
Fare           891 non-null float64
Cabin          204 non-null object
Embarked       889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.7+ KB
In [31]:
train_data.index = np.arange(100, 991) # index 변경
train_data.head()
Out[31]:
  PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
100 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S
101 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C
102 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S
103 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S
104 5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S
In [32]:
# loc : 인덱스의 값을 가지고 추출
train_data.loc[986]
Out[32]:
PassengerId                      887
Survived                           0
Pclass                             2
Name           Montvila, Rev. Juozas
Sex                             male
Age                               27
SibSp                              0
Parch                              0
Ticket                        211536
Fare                              13
Cabin                            NaN
Embarked                           S
Name: 986, dtype: object
In [34]:
train_data.loc[[986, 100, 102]] # 여러개의 row 추출
Out[34]:
  PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
986 887 0 2 Montvila, Rev. Juozas male 27.0 0 0 211536 13.000 NaN S
100 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.250 NaN S
102 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.925 NaN S
In [36]:
# iloc : 0 based index를 기준으로 가져오기
train_data.iloc[[0, 1, 2]]
Out[36]:
  PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
100 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S
101 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C
102 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S
 

row, column 동시에 선택하기¶

  • loc, iloc 속성을 이용할 때, 콤마를 이용하여 둘 다 명시 가능
In [37]:
train_data.loc[[986, 100, 110], ['Survived', 'Name', 'Sex', 'Age']]
Out[37]:
  Survived Name Sex Age
986 0 Montvila, Rev. Juozas male 27.0
100 0 Braund, Mr. Owen Harris male 22.0
110 1 Sandstrom, Miss. Marguerite Rut female 4.0
In [39]:
train_data.iloc[[101, 102], [1, 4, 5]] # column 도 인덱스로 출력
Out[39]:
  Survived Sex Age
201 0 male NaN
202 0 male 21.0
 

7. DataFrame Boolean Selection으로 데이터 선택하기¶

 

boolean selection으로 row 선택하기¶

  • numpy에서와 동일한 방식으로 해당 조건에 맞는 row만 선택
 

30대이면서 1등석에 탄 사람 선택하기¶

In [42]:
class_ = train_data['Pclass'] == 1 # 1등석에 탄사람
sex_ = train_data['Age'] < 40 # 40대 미만인 사람

train_data[class_ & sex_].head()
Out[42]:
  PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
101 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C
103 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S
123 24 1 1 Sloper, Mr. William Thompson male 28.0 0 0 113788 35.5000 A6 S
127 28 0 1 Fortune, Mr. Charles Alexander male 19.0 3 2 19950 263.0000 C23 C25 C27 S
134 35 0 1 Meyer, Mr. Edgar Joseph male 28.0 1 0 PC 17604 82.1708 NaN C
In [40]:
train_data[(train_data['Pclass'] == 1) & (train_data['Age'] < 40)]
Out[40]:
  PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
101 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C
103 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S
123 24 1 1 Sloper, Mr. William Thompson male 28.0 0 0 113788 35.5000 A6 S
127 28 0 1 Fortune, Mr. Charles Alexander male 19.0 3 2 19950 263.0000 C23 C25 C27 S
134 35 0 1 Meyer, Mr. Edgar Joseph male 28.0 1 0 PC 17604 82.1708 NaN C
... ... ... ... ... ... ... ... ... ... ... ... ...
953 854 1 1 Lines, Miss. Mary Conover female 16.0 0 1 PC 17592 39.4000 D28 S
967 868 0 1 Roebling, Mr. Washington Augustus II male 31.0 0 0 PC 17590 50.4958 A24 S
972 873 0 1 Carlsson, Mr. Frans Olof male 33.0 0 0 695 5.0000 B51 B53 B55 S
987 888 1 1 Graham, Miss. Margaret Edith female 19.0 0 0 112053 30.0000 B42 S
989 890 1 1 Behr, Mr. Karl Howell male 26.0 0 0 111369 30.0000 C148 C

105 rows × 12 columns

 

8. DataFrame에 새 column(컬럼) 추가하기¶

 

새 column 추가하기¶

  • [] 사용하여 추가하기
  • insert 함수 사용하여 원하는 위치에 추가하기
In [3]:
train_data.head()
Out[3]:
  PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C
2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S
4 5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S
In [5]:
## []를 사용하여 변수 추가
train_data['Age_double'] = train_data['Age']*2
train_data.head()
Out[5]:
  PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked Age_double
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S 44.0
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C 76.0
2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S 52.0
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S 70.0
4 5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S 70.0
In [6]:
#insert를 이용하여 원하는 위치에 변수 삽입
train_data.insert(3, 'Fare10', train_data['Fare']/10)
train_data.head()
Out[6]:
  PassengerId Survived Pclass Fare10 Name Sex Age SibSp Parch Ticket Fare Cabin Embarked Age_double
0 1 0 3 0.72500 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S 44.0
1 2 1 1 7.12833 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C 76.0
2 3 1 3 0.79250 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S 52.0
3 4 1 1 5.31000 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S 70.0
4 5 0 3 0.80500 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S 70.0
 

column 삭제하기¶

  • drop 함수 사용하여 삭제
    • 리스트를 사용하여 멀티플 삭제 가능
In [ ]:
## drop을 이용해서 데이터 삭제
train_data = train_data.drop('Age_double', axis = 1) # axis = 1이면 컬럼 삭제
train_data.head()
 

변수(columns) 사이의 상관계수(correlation)¶

  • corr함수를 통해 상관계수 연산(-1, 1사이의 결과)
    • 연속성(숫자형 데이터)에 대해서만 연산
    • 인과관계를 의미하진 않음
In [7]:
train_data.corr()
Out[7]:
  PassengerId Survived Pclass Fare10 Age SibSp Parch Fare Age_double
PassengerId 1.000000 -0.005007 -0.035144 0.012658 0.036847 -0.057527 -0.001652 0.012658 0.036847
Survived -0.005007 1.000000 -0.338481 0.257307 -0.077221 -0.035322 0.081629 0.257307 -0.077221
Pclass -0.035144 -0.338481 1.000000 -0.549500 -0.369226 0.083081 0.018443 -0.549500 -0.369226
Fare10 0.012658 0.257307 -0.549500 1.000000 0.096067 0.159651 0.216225 1.000000 0.096067
Age 0.036847 -0.077221 -0.369226 0.096067 1.000000 -0.308247 -0.189119 0.096067 1.000000
SibSp -0.057527 -0.035322 0.083081 0.159651 -0.308247 1.000000 0.414838 0.159651 -0.308247
Parch -0.001652 0.081629 0.018443 0.216225 -0.189119 0.414838 1.000000 0.216225 -0.189119
Fare 0.012658 0.257307 -0.549500 1.000000 0.096067 0.159651 0.216225 1.000000 0.096067
Age_double 0.036847 -0.077221 -0.369226 0.096067 1.000000 -0.308247 -0.189119 0.096067 1.000000
In [10]:
import matplotlib.pyplot as plt
%matplotlib inline
In [13]:
plt.matshow(train_data.corr())
Out[13]:
<matplotlib.image.AxesImage at 0x1b2be39d708>
 
 

10. DataFrame NaN 데이터 처리¶

 

NaN 값 확인¶

  • info함수를 통하여 개수 확인
  • isna함수를 통해 boolean 타입으로 확인
In [14]:
# info()를 통해 개수 확인
train_data.info()
 
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 14 columns):
PassengerId    891 non-null int64
Survived       891 non-null int64
Pclass         891 non-null int64
Fare10         891 non-null float64
Name           891 non-null object
Sex            891 non-null object
Age            714 non-null float64
SibSp          891 non-null int64
Parch          891 non-null int64
Ticket         891 non-null object
Fare           891 non-null float64
Cabin          204 non-null object
Embarked       889 non-null object
Age_double     714 non-null float64
dtypes: float64(4), int64(5), object(5)
memory usage: 97.6+ KB
In [16]:
train_data.isna() # 해당 값이 null인지 아닌지 츨략
Out[16]:
  PassengerId Survived Pclass Fare10 Name Sex Age SibSp Parch Ticket Fare Cabin Embarked Age_double
0 False False False False False False False False False False False True False False
1 False False False False False False False False False False False False False False
2 False False False False False False False False False False False True False False
3 False False False False False False False False False False False False False False
4 False False False False False False False False False False False True False False
... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
886 False False False False False False False False False False False True False False
887 False False False False False False False False False False False False False False
888 False False False False False False True False False False False True False True
889 False False False False False False False False False False False False False False
890 False False False False False False False False False False False True False False

891 rows × 14 columns

 

NaN 처리 방법¶

  • 데이터에서 삭제
    • dropna 함수
  • 다른 값으로 치환
    • fillna 함수
In [17]:
# 한개라도 na가 있으면 그 row 지우기
train_data.dropna()
Out[17]:
  PassengerId Survived Pclass Fare10 Name Sex Age SibSp Parch Ticket Fare Cabin Embarked Age_double
1 2 1 1 7.12833 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C 76.0
3 4 1 1 5.31000 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S 70.0
6 7 0 1 5.18625 McCarthy, Mr. Timothy J male 54.0 0 0 17463 51.8625 E46 S 108.0
10 11 1 3 1.67000 Sandstrom, Miss. Marguerite Rut female 4.0 1 1 PP 9549 16.7000 G6 S 8.0
11 12 1 1 2.65500 Bonnell, Miss. Elizabeth female 58.0 0 0 113783 26.5500 C103 S 116.0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
871 872 1 1 5.25542 Beckwith, Mrs. Richard Leonard (Sallie Monypeny) female 47.0 1 1 11751 52.5542 D35 S 94.0
872 873 0 1 0.50000 Carlsson, Mr. Frans Olof male 33.0 0 0 695 5.0000 B51 B53 B55 S 66.0
879 880 1 1 8.31583 Potter, Mrs. Thomas Jr (Lily Alexenia Wilson) female 56.0 0 1 11767 83.1583 C50 C 112.0
887 888 1 1 3.00000 Graham, Miss. Margaret Edith female 19.0 0 0 112053 30.0000 B42 S 38.0
889 890 1 1 3.00000 Behr, Mr. Karl Howell male 26.0 0 0 111369 30.0000 C148 C 52.0

183 rows × 14 columns

In [18]:
# 해당 컬럼만 na 처리하기
train_data.dropna(subset = ['Fare10'])
Out[18]:
  PassengerId Survived Pclass Fare10 Name Sex Age SibSp Parch Ticket Fare Cabin Embarked Age_double
0 1 0 3 0.72500 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S 44.0
1 2 1 1 7.12833 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C 76.0
2 3 1 3 0.79250 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S 52.0
3 4 1 1 5.31000 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S 70.0
4 5 0 3 0.80500 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S 70.0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
886 887 0 2 1.30000 Montvila, Rev. Juozas male 27.0 0 0 211536 13.0000 NaN S 54.0
887 888 1 1 3.00000 Graham, Miss. Margaret Edith female 19.0 0 0 112053 30.0000 B42 S 38.0
888 889 0 3 2.34500 Johnston, Miss. Catherine Helen "Carrie" female NaN 1 2 W./C. 6607 23.4500 NaN S NaN
889 890 1 1 3.00000 Behr, Mr. Karl Howell male 26.0 0 0 111369 30.0000 C148 C 52.0
890 891 0 3 0.77500 Dooley, Mr. Patrick male 32.0 0 0 370376 7.7500 NaN Q 64.0

891 rows × 14 columns

 
  • NaN값 대체하기
    • 평균으로 대체하기
    • 생존자/사망자 별 평균으로 대체하기
In [20]:
# 평균으로 대체
train_data.fillna(train_data['Age'].mean())
Out[20]:
  PassengerId Survived Pclass Fare10 Name Sex Age SibSp Parch Ticket Fare Cabin Embarked Age_double
0 1 0 3 0.72500 Braund, Mr. Owen Harris male 22.000000 1 0 A/5 21171 7.2500 29.6991 S 44.000000
1 2 1 1 7.12833 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.000000 1 0 PC 17599 71.2833 C85 C 76.000000
2 3 1 3 0.79250 Heikkinen, Miss. Laina female 26.000000 0 0 STON/O2. 3101282 7.9250 29.6991 S 52.000000
3 4 1 1 5.31000 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.000000 1 0 113803 53.1000 C123 S 70.000000
4 5 0 3 0.80500 Allen, Mr. William Henry male 35.000000 0 0 373450 8.0500 29.6991 S 70.000000
... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
886 887 0 2 1.30000 Montvila, Rev. Juozas male 27.000000 0 0 211536 13.0000 29.6991 S 54.000000
887 888 1 1 3.00000 Graham, Miss. Margaret Edith female 19.000000 0 0 112053 30.0000 B42 S 38.000000
888 889 0 3 2.34500 Johnston, Miss. Catherine Helen "Carrie" female 29.699118 1 2 W./C. 6607 23.4500 29.6991 S 29.699118
889 890 1 1 3.00000 Behr, Mr. Karl Howell male 26.000000 0 0 111369 30.0000 C148 C 52.000000
890 891 0 3 0.77500 Dooley, Mr. Patrick male 32.000000 0 0 370376 7.7500 29.6991 Q 64.000000

891 rows × 14 columns

In [23]:
# 생존자 나이 평균
mean1 = train_data[train_data['Survived'] == 1]['Age'].mean()

# 사망자 나이 평균
mean2 = train_data[train_data['Survived'] == 0]['Age'].mean()

print(mean1, mean2)
 
28.343689655172415 30.62617924528302
In [27]:
train_data.loc[train_data['Survived'] == 1, 'Age'] = train_data[train_data['Survived'] == 1]['Age'].fillna(mean1)
train_data.loc[train_data['Survived'] == 0, 'Age'] = train_data[train_data['Survived'] == 0]['Age'].fillna(mean1)
 

11. 숫자 데이터와 범주형 데이터의 이해¶

In [30]:
# data 출처: https://www.kaggle.com/hesh97/titanicdataset-traincsv/data
train_data = pd.read_csv('./train.csv')
train_data.head()
Out[30]:
  PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C
2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S
4 5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S
 

info함수로 각 변수의 데이터 타입 확인¶

  • 타입 변경은 astype함수를 사용
In [31]:
train_data.info()
 
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
PassengerId    891 non-null int64
Survived       891 non-null int64
Pclass         891 non-null int64
Name           891 non-null object
Sex            891 non-null object
Age            714 non-null float64
SibSp          891 non-null int64
Parch          891 non-null int64
Ticket         891 non-null object
Fare           891 non-null float64
Cabin          204 non-null object
Embarked       889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.7+ KB
 

숫자형(Numerical Type) 데이터¶

  • 연속성을 띄는 숫자로 이루어진 데이터
    • 예) Age, Fare 등

범주형(Categorical Type) 데이터¶

  • 연속적이지 않은 값(대부분의 경우 숫자를 제외한 나머지 값)을 갖는 데이터를 의미
    • 예) Name, Sex, Ticket, Cabin, Embarked
  • 어떤 경우, 숫자형 타입이라 할지라도 개념적으로 범주형으로 처리해야할 경우가 있음
    • 예) Pclass
 

Pclass 변수 변환하기¶

  • astype 사용하여 간단히 타입만 변환
In [32]:
train_data['Pclass'] = train_data['Pclass'].astype(str)
train_data.info()
 
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
PassengerId    891 non-null int64
Survived       891 non-null int64
Pclass         891 non-null object
Name           891 non-null object
Sex            891 non-null object
Age            714 non-null float64
SibSp          891 non-null int64
Parch          891 non-null int64
Ticket         891 non-null object
Fare           891 non-null float64
Cabin          204 non-null object
Embarked       889 non-null object
dtypes: float64(2), int64(4), object(6)
memory usage: 83.7+ KB
 

Age 변수 변환하기¶

  • 변환 로직을 함수로 만든 후, apply 함수로 적용
In [36]:
import math

# apply를 위한 함수 생성
def age_categorize(age):
    if math.isnan(age):
        return -1
    else:
        return math.floor(age/10)*10
    
# apply로 변환
train_data['Age'].apply(age_categorize)
Out[36]:
0      20
1      30
2      20
3      30
4      30
       ..
886    20
887    10
888    -1
889    20
890    30
Name: Age, Length: 891, dtype: int64
 

12. 범주형 데이터 전처리하기¶

 

One-hot encoding¶

  • 범주형 데이터는 분석단계에서 계산이 어렵기 때문에 숫자형으로 변경이 필요함
  • 범주형 데이터의 각 범주(category)를 column레벨로 변경
  • 해당 범주에 해당하면 1, 아니면 0으로 채우는 인코딩 기법
  • pandas.get_dummies 함수 사용
    • drop_first : 첫번째 카테고리 값은 사용하지 않음
In [39]:
# 범주형 데이터를 모두 con_hot encoding
pd.get_dummies(train_data, 
               columns = ['Pclass', 'Sex', 'Embarked'], # 필요한 컬럼만
               drop_first = True  # 차원을 줄이기 위해 
              )
Out[39]:
  PassengerId Survived Name Age SibSp Parch Ticket Fare Cabin Pclass_2 Pclass_3 Sex_male Embarked_Q Embarked_S
0 1 0 Braund, Mr. Owen Harris 22.0 1 0 A/5 21171 7.2500 NaN 0 1 1 0 1
1 2 1 Cumings, Mrs. John Bradley (Florence Briggs Th... 38.0 1 0 PC 17599 71.2833 C85 0 0 0 0 0
2 3 1 Heikkinen, Miss. Laina 26.0 0 0 STON/O2. 3101282 7.9250 NaN 0 1 0 0 1
3 4 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) 35.0 1 0 113803 53.1000 C123 0 0 0 0 1
4 5 0 Allen, Mr. William Henry 35.0 0 0 373450 8.0500 NaN 0 1 1 0 1
... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
886 887 0 Montvila, Rev. Juozas 27.0 0 0 211536 13.0000 NaN 1 0 1 0 1
887 888 1 Graham, Miss. Margaret Edith 19.0 0 0 112053 30.0000 B42 0 0 0 0 1
888 889 0 Johnston, Miss. Catherine Helen "Carrie" NaN 1 2 W./C. 6607 23.4500 NaN 0 1 0 0 1
889 890 1 Behr, Mr. Karl Howell 26.0 0 0 111369 30.0000 C148 0 0 1 0 0
890 891 0 Dooley, Mr. Patrick 32.0 0 0 370376 7.7500 NaN 0 1 1 1 0

891 rows × 14 columns

반응형

'AI Study > ML_Basic' 카테고리의 다른 글

머신러닝과 데이터 분석 A-Z 올인원 패키지 - 회귀분석_수학적 개념 이해(1) - 확률과 통계  (0) 2020.12.03
머신러닝과 데이터 분석 A-Z 올인원 패키지 - 데이터 분석을 위한 Python(Pandas) – (3)  (0) 2020.09.30
머신러닝과 데이터 분석 A-Z 올인원 패키지 - 데이터 분석을 위한 Python(Pandas) – (1)  (0) 2020.09.30
머신러닝과 데이터 분석 A-Z 올인원 패키지 - 데이터 처리를 위한 Python(Numpy)(2)  (0) 2020.09.30
머신러닝과 데이터 분석 A-Z 올인원 패키지-데이터 처리를 위한 Python(Numpy) – (1)  (0) 2020.09.30
'AI Study/ML_Basic' 카테고리의 다른 글
  • 머신러닝과 데이터 분석 A-Z 올인원 패키지 - 회귀분석_수학적 개념 이해(1) - 확률과 통계
  • 머신러닝과 데이터 분석 A-Z 올인원 패키지 - 데이터 분석을 위한 Python(Pandas) – (3)
  • 머신러닝과 데이터 분석 A-Z 올인원 패키지 - 데이터 분석을 위한 Python(Pandas) – (1)
  • 머신러닝과 데이터 분석 A-Z 올인원 패키지 - 데이터 처리를 위한 Python(Numpy)(2)
자동화먹
자동화먹
많은 사람들에게 도움이 되는 생산적인 기록하기
    반응형
  • 자동화먹
    자동화먹의 생산적인 기록
    자동화먹
  • 전체
    오늘
    어제
    • 분류 전체보기 (144)
      • 생산성 & 자동화 툴 (30)
        • Notion (24)
        • Obsidian (0)
        • Make.com (1)
        • tips (5)
      • Programming (37)
        • Python (18)
        • Oracle (6)
        • Git (13)
      • AI Study (65)
        • DL_Basic (14)
        • ML_Basic (14)
        • NLP (21)
        • Marketing&Recommend (4)
        • chatGPT (0)
        • etc (12)
      • 주인장의 생각서랍 (10)
        • 생각정리 (4)
        • 독서기록 (6)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    Github
    기초
    노션
    pytorch
    Python
    Jupyter notebook
    git
    nlp
    노션첫걸음
    파이토치로 시작하는 딥러닝 기초
    데이터베이스
    빅데이터분석
    ML
    cnn
    Transformer
    Google Cloud Platform
    dl
    GPT
    파이토치
    LSTM
    데이터분석
    notion
    seq2seq
    머신러닝
    git commit
    자연어처리
    gcp
    빅데이터
    python기초
    딥러닝
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
자동화먹
머신러닝과 데이터 분석 A-Z 올인원 패키지 - 데이터 분석을 위한 Python(Pandas) – (2)
상단으로

티스토리툴바