빅데이터분석기사/코드

[빅데이터분석기사] 데이터탐색과 데이터정제 실습 (2)

EveningPrimrose 2022. 6. 7. 01:18
반응형

4. 변수 변환

4-1. log 변환

import numpy as np
data['log_salary'] = np.log(data['salary'])
data['log_sales'] = np.log(data['sales'])
data['log_roe'] = np.log(data['roe'])
data.head()

data.hist(bins=50, figsize=(20, 15))

data.corr()

 

4-2. 제곱근 변환

data['sqrt_salary'] = np.sqrt(data['salary'])
data['sqrt_sales'] = np.sqrt(data['sales'])
data['sqrt_roe'] = np.sqrt(data['roe'])
data.head()

data.hist(bins=50, figsize=(20, 15))

data.corr()

 

5. 결측치 처리

import pandas as pd
data = pd.read_csv('Ex_Missing.csv')
data

 

5-1. 결측치 확인

가. 전체 및 변수별 결측 확인

# isnull() : 결측이면 True, 결측이 아니면 False 값 반환
pd.isnull(data)
data.isnull()

# notnull() : 결측이면 False, 결측이 아니면 True 값 반환
pd.notnull(data)
data.notnull()

# 변수(컬럼)별로 결측값 개수 확인 : df.isnull().sum()
data.isnull().sum()

salary 2

sales 2

roe 1

industry 0

dtype: int64

# 특정 변수(컬럼)의 결측값 개수 확인: df.isnull().sum()
data['salary'].isnull().sum()

2

# 변수(컬럼)별로 결측 아닌 값의 개수 확인: df.notnull().sum()
data.notnull().sum()

salary 8

sales 8

roe 9

industry 10

dtype: int64

# 특정 변수(컬럼)의 결측 아닌 값의 개수 확인: df.notnull().sum()
data['salary'].notnull().sum()

8

 

나. 행별 결측 확인 및 저장

# 행(row) 단위로 결측값 개수 구하기: df.isnull().sum(1)
data.isnull().sum(1)

0 0

1 1

2 1

3 0

4 1

5 1 

6 0

7 0

8 0

9 1

dtype: int64

# 행(row) 단위로 결측값 개수 구해서 새변수 생성하기
data['missing'] = data.isnull().sum(1)
data

# 행(row) 단위로 실측값 개수 구하기: df.notnull().sum(1)
del data['missing']
data['valid'] = data.notnull().sum(1)
data

 

5-2. 결측값 제거: dropna()

 - 결측값이 있는 행 제거: delete row with missing values

 - 결측값이 있는 열 제거 : delete column with missing values

 - 결측값이 있는 특정 행 또는 열 제거 : delete specific row or column with missing values

 

가. 결측값 있는 행(row/case) 제거

data_del_row = data.dropna(axis=0)
data_del_row

 

나. 결측값 있는 열(column/variable) 제거

data_del_col = data.dropna(axis=1)
data_del_col

 

다. 결측값 있는 특정 행/열 제거

data[['salary']].dropna()

data[['salary', 'sales', 'roe', 'industry']].dropna()

data[['salary', 'sales', 'roe', 'industry']].dropna(axis=0)

data[['salary', 'sales', 'roe', 'industry']].dropna(axis=1)

 

5-3. 결측값 대체

 - 결측값을 특정 값으로 대체: replace missing values with scalar value

 - 결측값을 변수별 평균으로 대체: filling missing values with mean value per columns

 - 결측값을 다른 변수의 값으로 대체: filling missing values with another columns' values

 - 결측값을 그룹 평균값으로 대체: fill missing values by Group means

import pandas as pd
data = pd.read_csv('Ex_Missing.csv')
data

 

가. 특정값으로 대체: df.fillna(value/string)

# 결측값을 0으로 대체
data_0 = data.fillna(0)
data_0

# 결측값을 'missing' 문자로 대체
data_missing = data.fillna('missing')
data_missing

# 결측값을 앞 방향으로 채우기: df.fillna(method='ffill' or 'pad')
data_ffill = data.fillna(method='ffill')
data_ffill

# 결측값을 앞 방향으로 채우기: df.fillna(method='ffill' or 'pad')
data_pad = data.fillna(method='pad')
data_pad

# 결측값을 뒷 방향으로 채우기: df.fillna(method='bfill' or 'backfill')
data_bfill = data.fillna(method='bfill')
data_bfill

# 결측값을 뒷 방향으로 채우기: df.fillna(method='bfill' or 'backfill')
data_backfill = data.fillna(method='backfill')
data_backfill

 

 

나. 평균 대체:

 - df.fillna(df.mean())

 - df.where(pd.notnull(df), df.mean(), axis='columns')

# 평균으로 대체
data_mean = data.fillna(data.mean())
data_mean

# 중위수로 대체
data_median = data.fillna(data.median())
data_median

# 최대/최소로 대체
data_max = data.fillna(data.max())
data_max

# 다른 변수 평균으로 대체
# salary 변수의 평균값으로 모든 결측값 대체
data_other_mean = data.fillna(data.mean()['salary'])
data_other_mean

 

다. 다른 변수 값으로 대체

# sales의 결측값을 salary 값으로 대체
import numpy as np
data2 = data.copy()
data2['sales_new'] = np.where(pd.notnull(data2['sales']) == True, data2['sales'], data2['salary'])
data2

 

라. 집단 평균값으로 대체

# 산업(industry)별 평균 확인
data.groupby('industry').mean()

# lamda 함수
fill_mean_func = lambda g: g.fillna(g.mean())
# lamda 함수의 apply() 적용
data_group_mean = data.groupby('industry').apply(fill_mean_func)
data_group_mean

 - 집단별 특정 값으로 대체

# 집단별로 변경할 값 설정
fill_values = {1: 1000, 2: 2000}
# lamda 함수 적용
fill_func = lambda d: d.fillna(fill_values[d.name])
# 집단별 apply
data_group_value = data.groupby('industry').apply(fill_func)
data_group_value

 - 변수별 다른 대체방법을 한번에 적용

missing_fill_val = {'salary': data.salary.interpolate(),
                    'sales': data.sales.mean(),
                    'roe': 'missing'}
print(missing_fill_val)

data_multi = data.fillna(missing_fill_val)
data_multi

 

 

반응형