데이터 분석과 머신러닝 모델 구축의 성공을 위해 핵심적인 단계이며, 데이터를 가공하고 정리하는 과정
데이터의 결측치 및 이상치를 확인하거나 제거하고, 불일치 되는 부분을 일관성 있는 데이터의 형태로 전환하는 과정
왜곡된 분석을 방지하기 위해서 분석에 적합하게 데이터를 가공해 품질을 올리는 과정
기본 전처리 과정
import pandas as pd
# 결측치 여부 확인
df.isna()
df.isnull()
len(df) - df.count()
#데이터 프레임의에서 결측치가 있는지 확인
dataframe_name.isnull().any(axis=0) #기본값은 0(열), axis는 행
# 위의 코드는 결측치가 있을경우 TRUE로 반환이 된다
#데이터프레임으로 출력
##열 출력
trade.loc[:, trade.columns[trade.isnull().any()]]
#행으로 바꾸려면
dataframe_name[dataframe_name.isnull().any(axis=1)]
#1 dropna
dataframe_name.dropna(axis = '' (default 0, #제거할 대상을 지정 0은 행)
how ='' (default any), #행또는 열중 어느 부분을 제거할지 지정 any는 결측값이 하나라도 있으면 제거 all은 모든 값이 결측값일시 제거
thresh ='' #결측값이 아닌 값의 개수가 이 값보다 작은 행 또는 열을 제거
subset ='column_name' # 특정부분 지정
inplace ='' # True인 경우, 데이터프레임이나 시리즈 자체에서 결측값이 제거된 상태로 갱신.
)
#2 notna
df_cleaned = df[df['column_name'].notna()] # 열의 na가 없는 행만 추출
notna_selected = df[df['column'].notna()]
## 1. 원하는 값으로 대체 fillna
df_cleaned = df.fillna(value) #value 값으로 대체
## 2. 평균 값으로 대체
mean_value = df['column_name'].mean()
df['column_name'].fillna(mean_value, inplace=True
## 3. 선형 보간
df['column_name'].interpolate(method='linear', inplace=True)
dataframe_name.duplicated() # 데이터프레임에서 중복된 내용을 bool값으로 반환
dataframe_name[dataframe_name.duplicated()] #행 출력
datafrmae_name.drop_duplicates(subset ='column_name' # 중복 여부를 확인할 열 또는 열 리스트 반환되는 것은 시리즈
keep ='first/last/false' # 어떤 행을 유지할지 선택 false는 다 지움
inplace=True) #데이터프레임 내에서 변경을 수행할지 여부를 설정
### 이상치 데이터 인덱스 반환
def outlier(df, col, z):
return df[abs(df[col] - np.mean(df[col]))/np.std(df[col])>z].index
#위 코드는 인덱스를 반환하기 때문에 출력을 할때 dataframe_name.loc[outlier()]로 출력
#### 이상치 반환
# z-score 계산
z_scores = np.abs((df['Value'] - df['Value'].mean()) / df['Value'].std())
print(z_scores)
# 임계값 설정
threshold = 2
# z-score가 임계값을 넘는 데이터 포인트는 이상치로 간주
outliers = df[z_scores > threshold]
print("Detected outliers:")
print(outliers)
##위 코드에서 z_score는 df에서 이상치를 반환한 시리즈이고 인덱스가 df의 인덱스와 같기 때문에 밑에서 매칭이된다.
import numpy as np
def outliers_modified_z_score(ys):
threshold = 3.5
median_y = np.median(ys)
median_absolute_deviation_y = np.median([np.abs(y - median_y) for y in ys])
modified_z_scores = [0.6745 * (y - median_y) / median_absolute_deviation_y
for y in ys]
return np.where(np.abs(modified_z_scores) > threshold)
#기본
import numpy
q3, q1 = np.percentile(data, [75 ,25])
iqr = q3 - q1
out_data = data[(q1-iqr*1.5< data)|(data>q3 + 1.5 * iqr)]
out_data
###데이터 프레임, 열을 받아 처리
def outlier2(df, col):
q1,q3 = np.percentile(df[col],[25,75])
iqr = q3-q1
out_data = df[(q1-iqr*0.5>df[col])|(q3+iqr*0.5<df[col])]
return out_data
# 등간격 구간화 : 전체 데이터를 일정한 구간으로 나눈다
df['height_bins_equal_width'] = pd.cut(df['height'], bins=3)
# 등빈도 구간화 : 데이터 포인트를 구간 수에 따라 일정한 개수로 넣도록 한다
df['height_bins_equal_freq'] = pd.qcut(df['height'], q=3)
# 사전 지정 구간화 : 설정해둔 구간으로 나눈다
data = {'scores': [85, 92, 78, 95, 88, 60, 73, 85, 90, 82]}
df = pd.DataFrame(data)
bins = [0, 70, 80, 90, 100]
labels = ['D', 'C', 'B', 'A']
df['grade'] = pd.cut(df['scores'], bins=bins, labels=labels)
위에 bins는 간격이므로 label보다 1개 많다.
##기본
data = {'색깔': ['빨강', '파랑', '녹색', '빨강']}
df = pd.DataFrame(data)
# 원핫 인코딩 수행
df_encoded = pd.get_dummies(df, columns=['색깔'])
> 색깔_녹색 색깔_빨강 색깔_파랑
0 0 1 0
1 0 0 1
2 1 0 0
3 0 1 0
## 각 색깔을 나타내는 열로 변화하고, 0 과 1로 표현
from sklearn.preprocessing import LabelEncoder
# 범주형 데이터
weather = ["맑음", "흐림", "비", "맑음", "흐림", "비"]
# LabelEncoder 객체 생성
label_encoder = LabelEncoder()
# 라벨 인코딩 적용
encoded_weather = label_encoder.fit_transform(weather)
print("Original Weather Data:", weather)
print("Encoded Weather Data:", encoded_weather)
from gensim.models import Word2Vec
from nltk.tokenize import word_tokenize
# 예시 텍스트 데이터
corpus = [
"I love natural language processing.",
"Word embeddings are important for NLP.",
"Machine learning is fascinating.",
"NLP deals with text data."
]
# 텍스트 데이터 토큰화
tokenized_corpus = [word_tokenize(sentence.lower()) for sentence in corpus]
# Word2Vec 모델 학습
model = Word2Vec(sentences=tokenized_corpus, vector_size=100, window=5, min_count=1, sg=0)
# 단어 벡터 출력
print("Vector for 'natural':", model.wv['natural'])
print("Vector for 'processing':", model.wv['processing'])
print("Vector for 'machine':", model.wv['machine'])
###간단하게 라이브러리를 사용할 수 있지만 일반 코드. 열값에 중복된 단어가 많이 들어간다면 제거도 할수 있다.
import re # 정규식을 표현하기 위한 정규식
def tokenize(name):
tokens = []
name_split = name.split(" ") #split로 name의 인자들을 공백 간격으로 자른다 반환되는 값들은 리스트
for part_name in name_split:
a = re.findall('[A-Z][a-z]*', part_name) #반환되는 값들은 리스트
tokens.extend(a)
return tokens
all_tokens = list(df_name["col_name"].apply(tokenize).values) #배열 값들을 리스트로반환
token_set = []
for token in all_tokens:
token_set.extend(set(token))
기본
x_standardization = (x-x.mean())/x.std()
x_standardization
## 해당 데이터의 모든 값들이 수치일때는 가능하지만 아닐때에는 col을 지정해줘야됨
cols = ['col_name', 'col_name1', 'col_name2', 'col_name3']
df_name1 = (df_name[cols]-df_name[cols].mean())/df_name[cols].std()
##기본
x_min_max = (x-x.min())/(x.max()-x.min())
## 해당 데이터의 모든 값들이 수치일때는 가능하지만 아닐때에는 col을 지정해줘야됨
cols = ['col_name', 'col_name1', 'col_name2', 'col_name3']
df[cols] = (df[cols]-df[cols].min())/(df[cols].max()-df[cols].min())
trade.head()
import numpy as np
def max_abs(data):
max_abs = np.max(np.abs(data),axis = 0 )
scaled_data = data / max_abs_values
return scaled_data