본문 바로가기

코딩/머신러닝&데이터 분석 강의

[머신러닝 인강] 12-2주차: Pandas DataFrame 새 컬럼 추가/삭제, 상관관계 계산, NaN 데이터 처리

<12-2주차 수강 클립>

04. 데이터 분석을 위한 Python (Pandas)

14. DataFrame 타입이해 - 08. DataFrame에 새 column(컬럼) 추가_삭제하기

15. DataFrame 타입이해 - 09. DataFrame column(컬럼)간 상관관계 계산하기

16. DataFrame 타입이해 - 10. DataFrame NaN 데이터 처리

 


지난 시간에 이어 DataFrame 타입에 대한 이해 파트를

학습하고 있습니다.

이번 주차에는 DataFrame에 새 column을 추가 또는 삭제하는 법을 배우고

각 column 사이의 상관관계 계산, NaN 데이터를 처리하는 법까지

배웠습니다.

>>수강 인증샷<<

 

 


 

 

14. DataFrame 타입이해 - 08. DataFrame에 새 column(컬럼) 추가_삭제하기

 

- 새 column 추가하기

1. [] 사용하여 추가하기

2. insert 함수 사용하여 원하는 위치에 추가하기

 

import pandas as pd

# data 출처: https://www.kaggle.com/hesh97/titanicdataset-traincsv/data
train_data = pd.read_csv('csv데이터가 있는 경로')
train_data.head()

: head()함수로 데이터 로딩 확인은 습관화 하기!

 

 

train_data['Age_double'] = train_data['Age'] * 2
train_data['Age_triple'] = train_data['Age'] + train_data['Age_double']

: []안에 새로운 column명

 

 

train_data.insert(3, 'Fare10', train_data['Fare'] / 10)

: .insert(위치, 새로운 column명, column에 들어갈 데이터)

 

 

- column 삭제하기

drop 함수 사용하여 삭제

리스트를 사용해 복수 개의 column 삭제 가능

train_data.drop('Age_triple', axis=1) # 원본 데이터에 행해지는 게 아님!

: 원본 데이터를 수정하지 x, 새로운 복사본을 만들어 가공 후 반환

 

 

train_data.drop(['Age_double', 'Age_triple'], axis=1)

: drop함수에 리스트 전달

 

 

train_data.drop(['Age_double', 'Age_triple'], axis=1, inplace=True)

: inplace값 True → 복사본에 연산하지 않고 원본 데이터에 연산 (복사본 만들지 x 반환값 없음)

 

 


 

15. DataFrame 타입이해 - 09. DataFrame column(컬럼)간 상관관계 계산하기

 

- 변수(column) 사이의 상관계수(correlation)

*) correlation: 두 변수 사이의 covariance(공분산) 값을 단위화 시킨 것 / 절댓값이 클 수록 두 변수는 선형적인 관계에 놓여있음

corr 함수를 통해 상관계수 연산 (-1, 1 사이의 결과)

  • 연속성(숫자형)데이터에 대해서만 연산
  • 인과관계를 의미하진 않음
  • 1에 가까울수록 증가/증가의 관계
  • -1에 가까울수록 증가/감소의 관계
  • 0에 가까울수록 상관관계 없음
train_data.corr()

: 대각선 값은 항상 1 (자기자신과의 correlation 값은 항상 1)

: 주대각선이 1인 대칭행렬

 

 

import matplotlib.pyplot as plt
%matplotlib inline 

plt.matshow(train_data.corr())

: matrix의 색이 밝을 수록 관계가 깊음

 

 


 

16. DataFrame 타입이해 - 10. DataFrame NaN 데이터 처리

 

- NaN 값 확인

info 함수의 리턴값에서 NaN 개수를 확인할 수 있음

isna() 함수를 통해 boolean 타입으로 확인 (NaN인 경우 True)

train_data.info()
train_data.isna()
train_data['Age'].isna()

: 특정 column에 대해서도 NaN값을 가지는 데이터 확인 가능

: Series로 반환

 

 

- NaN 처리 방법 (크게 두 가지)

1. 데이터에서 삭제 → dropna 함수

2. 다른 값으로 치환 → fillna 함수

 

 

- NaN 데이터 삭제

train_data.dropna()

: row level로 동작, NaN이 하나라도 있으면 해당 row를 지움(drop)

: 마찬가지로 복사본에 대해서 수행, inplace값 True로 줄 경우 원본 데이터에 대해서 수행 

 

 

train_data.dropna(subset=['Age'])

: subset 파라미터에 전달한 column의 값이 NaN인 행(데이터)만 삭제

 

 

train_data.dropna(axis=1)

: default는 axis=0 (뜻: row level_가로 방향)

: axis=1이면 col level (하나라도 NaN이 있는 col은 삭제)

 

 

 

- NaN 값 대체

평균으로 대체하기

생존자/사망자 별 평균으로 대체하기

train_data['Age'].mean() # 나이 평균

train_data['Age'].fillna(train_data['Age'].mean())

: 'Age' column의 NaN값에 'Age' 평균 집어넣기

: 결과는 'Age' column의 NaN값이 수정된 Series 반환 (복사본)

 

 

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

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

train_data[train_data['Survived']==1]['Age'].fillna(mean1)
train_data[train_data['Survived']==0]['Age'].fillna(mean0)

: 생존자 / 사망자 구분을 위해 Boolean Selection 사용

: train_data['Survived'] == 1 의 결과: 해당 조건을 판단 후 Boolean으로 이루어진 Series

: train_data[train_data['Survived']==1]의 결과: [조건]이 True인 인덱스들만 추출한 DataFrame (부분집합)

: train_data[train_data['Survived']==1]['Age']의 결과: 해당 DataFrame에서의 'Age' column

 

: 결과는 'Age' column의 NaN값이 수정된 Series 반환 (복사본)

 

 

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(mean0)

: loc함수는 ',' 사용해서 row, col 둘 다 선택 가능 (row 중에서도 해당되는 col에만 값 집어넣기)

: 기존 DataFrame에 NaN값 대체하기 (원본 데이터 수정)

 

 

train_data['Survived'][train_data['Age']==mean1]

: NaN값이 모두 대체됐는지 확인

 

 


 

강의 링크: https://bit.ly/3cB3C8y

반응형