<jupyter_start><jupyter_text>■ 5장. 데이터 전처리    ※ 소목차        1. 누락 데이터 처리            - 평균값으로 치환            - 최빈값으로 치환            - 바로 이전행으로 치환                    2. 중복 데이터 처리            - 중복 데이터 검색            - 중복 데이터 제거                    3. 데이터 표준화            서로 다른 단위가 섞여있거나, 같은 대상을 다른 형식으로 표현하는 경우 표준화가 필요                - 단위환산 : 같은 단위로 맞춰주는 작업                - 자료형 변환 : 숫자로 변환을 해야 표준화가 가능(숫자로 변환)                4. 범주형 데이터 처리            머신러닝 알고리즘에 따라서 범주형을 숫자형으로 변환해줘야 알고리즘을 사용할 수 있는 경우가 존재                - 구간 분할                - 더미 변수 생성                5. 데이터 정규화            데이터 프레임 열에 들어가 있는 숫자를 0-1 사이의 숫자로 변환하는 것                    6. 시계열 데이터 생성 (시계열 -> 인공지능(LSTM, RNN))            일정한 시간 간격으로 배치된 데이터의 수열                - 시계열 데이터 만들기                - 시계열 데이터 예측   ■ 중복 데이터 처리        머신러닝 모델을 학습시키기 전 중복 데이터 처리를 해야하는 이유            하나의 데이터 셋에서 동일한 관측값이 2개 이상 중복되는 경우 제거 필요            동일한 대상이 중복으로 존재하는 것은 분석 겨로가를 왜곡시킬 수 있음                    중복 데이터 검색            문법 : df.duplicated()<jupyter_code>import pandas as pd
df = pd.DataFrame({'c1':['a','a','b','a','b'], 'c2':[1,1,1,2,2],'c3':[1,1,2,2,2]})
df
df.duplicated() # 처음행은 False, 두번째 행은 첫번째 행과 같아서 True
# 모든 행과 비교해서 중복된 행이면 True 반환, 처음 나오는 행은 False 반환<jupyter_output><empty_output><jupyter_text>중복 데이터 제거        df.drop_duplicates()<jupyter_code>import pandas as pd
df2 = pd.DataFrame({'c1':['a','a','b','a','b'], 'c2':[1,1,1,2,2],'c3':[1,1,2,2,2]})
df2 = df.drop_duplicates()
df2<jupyter_output><empty_output><jupyter_text>※ 문제156. 아래의 데이터프레임에서 c2 column에 중복된 데이터가 몇 개가 있는지 확인하시오<jupyter_code>import pandas as pd
df = pd.DataFrame({'c1':['a','a','b','a','b'], 'c2':[1,1,1,2,2],'c3':[1,1,2,2,2]})
df[['c2']].duplicated()
df[['c2']].duplicated().sum()<jupyter_output><empty_output><jupyter_text>※ 문제157. seaborn의 타이타닉 데이터에 중복된 데이터가 있는지 확인하시오<jupyter_code>import seaborn as sns
tit = sns.load_dataset('titanic')
tit.duplicated().sum(), tit.duplicated().value_counts()<jupyter_output><empty_output><jupyter_text>※ 문제158. 어제 만든 타이타닉 kNN 모델에 중복된 데이터를 제거하면 정확도가 어떻게 되는지 확인하시오<jupyter_code>import  pandas  as  pd
import  seaborn  as  sns 

df = sns.load_dataset('titanic')

pd.set_option('display.max_columns', 15 ) 

rdf = df

## 값 치환
rdf['age'].fillna(rdf['age'].value_counts(dropna=True).idxmax(), inplace=True) # 최빈값으로 치환
rdf.drop_duplicates(inplace=True)

rdf['deck'].fillna(rdf['deck'].value_counts(dropna=True).idxmax(), inplace=True) # 최빈값으로 치환
rdf['embark_town'].fillna(rdf['embark_town'].value_counts(dropna=True).idxmax(),inplace=True) # 최빈값으로 치환
rdf['embarked'].fillna(rdf['embarked'].value_counts(dropna=True).idxmax() , inplace=True ) 
# rdf.isnull().sum()

## dummies
deck_dummies = pd.get_dummies(rdf['deck'], prefix='deck')
rdf = pd.concat([rdf, deck_dummies], axis=1)

gender = pd.get_dummies( rdf['sex'] ) 
rdf = pd.concat( [rdf, gender], axis=1 ) 

onehot_embarked = pd.get_dummies( rdf['embarked'], prefix='town') 
rdf = pd.concat([ rdf, onehot_embarked], axis=1)

class_dummies = pd.get_dummies(rdf['class'])
rdf = pd.concat([rdf, class_dummies], axis=1)

et_dummies = pd.get_dummies(rdf['embark_town'], prefix='embarked')
rdf = pd.concat([rdf, et_dummies], axis=1)

rdf.drop( ['sex', 'embarked', 'class', 'embark_town', 'deck'],  axis=1, inplace=True ) # 명목형 column 삭제

X = rdf[ [ 'pclass' ,'age', 'sibsp','parch', 'female', 'male', 'town_C', 'town_Q',  'town_S','embarked_Cherbourg','embarked_Queenstown','embarked_Southampton','First','Second','Third']]
y = rdf['survived']   

from  sklearn   import   preprocessing
X = preprocessing.StandardScaler().fit(X).transform(X)

from  sklearn.model_selection  import   train_test_split
X_train, X_test, y_train, y_test =train_test_split( X, y, test_size=0.3, random_state = 4 ) # random_state값 변경

from  sklearn.neighbors  import   KNeighborsClassifier 

knn = KNeighborsClassifier( n_neighbors=5 ) 
knn.fit ( X_train, y_train )

y_hat = knn.predict( X_test ) 

from  sklearn   import   metrics 
knn_matrix  =  metrics.confusion_matrix( y_test,  y_hat )
print(knn_matrix)

from sklearn.metrics import accuracy_score

accuracy = accuracy_score( y_test, y_hat)
print(accuracy)<jupyter_output>[[125  17]
 [ 28  64]]
0.8076923076923077<jupyter_text>■ 데이터 표준화    실무에서 접하는 데이터 셋은 다양한 사람들의 손에 거쳐서 만들어 진다.    여러곳에 수집한 자료들은 대소문자 구분, 약칭 활용 등 여러가지 원인에 의해서 다양한 형태로 표현된다.    잘 정리된 것으로 보이는 자료를 자세히 들여다보면 서로 다른 단위가 섞여있거나 같은 대상을 다른 형식으로 표현한 경우가 의외로 많다.    그래서 단위환산을 통해서 같은 단위 형식으로 변환해 줄 필요가 있다.        예제    모제품의 판매대수를 미리 예측하여 생산라인에 다음달에 몇 대가 판대될 것이라는 것을 예측해야하는 머신러닝 모델을 만들어야 하는 경우    전세계에서 엑셀 파일을 보내오는데 나라마다 단위 형식이 다르다<jupyter_code>import pandas as pd
df = pd.read_csv('prac/auto-mpg.csv')
df
df.columns = ['mpg','cylinders','displacement','horsepower','weight','acceleration','medel year','origin','name']
df.head()<jupyter_output><empty_output><jupyter_text>mpg열은 mile per gallon, 한국과 다른 단위로 표시. mpg열을 한국에서 사용하는 km/L로 변환 필요  ※ 문제159. 1갤런: 3.78541. 1마일: 1.60934km. 1mpg는?<jupyter_code>1.60934/3.78541<jupyter_output><empty_output><jupyter_text>※ 문제160. 아래의 uci 자동차 연비를 가지고 있는 df 데이터프레임에서 mpg column을 가지고 kpl이라는 한국식 연비단위를 생성하시오<jupyter_code>import pandas as pd
df = pd.read_csv('prac/auto-mpg.csv')
df.columns = ['mpg','cylinders','displacement','horsepower','weight','acceleration','medel year','origin','name']

df['kpl']=df['mpg']*0.425
df<jupyter_output><empty_output><jupyter_text>※ 문제161. 위의 결과 kpl을 소수 두번째 자리까지 나타내시오<jupyter_code>import pandas as pd
df = pd.read_csv('prac/auto-mpg.csv')
df.columns = ['mpg','cylinders','displacement','horsepower','weight','acceleration','medel year','origin','name']

df['kpl']=df['mpg']*0.425
df['kpl']=df['kpl'].round(2)
df<jupyter_output><empty_output><jupyter_text>※ 문제162. uci 자동차 연비 데이터프레임에서 마력에 해당하는 'horsepower; 데이터 중복 제거해서 출력하시오<jupyter_code>df.horsepower.unique()<jupyter_output><empty_output><jupyter_text>※ 문제163. 위의 데이터에서 ?를 결측치(NaN)으로 변경하시오<jupyter_code>import numpy as np
import pandas as pd

df = pd.read_csv('prac/auto-mpg.csv')
df.columns = ['mpg','cylinders','displacement','horsepower','weight','acceleration','medel year','origin','name']

df.horsepower.replace('?',np.nan, inplace=True)
df.horsepower.unique()<jupyter_output><empty_output><jupyter_text>※ 문제164. dropna(axis=0) 메소드를 이용해서 NaN 값이 들어있는 모든 행을 삭제하시오<jupyter_code>import numpy as np
import pandas as pd

df = pd.read_csv('prac/auto-mpg.csv')
df.columns = ['mpg','cylinders','displacement','horsepower','weight','acceleration','medel year','origin','name']

df.dropna(subset=['horsepower'],axis=0,inplace=True)
df.horsepower.unique()<jupyter_output><empty_output><jupyter_text>※ 문제165. 위의 horsepower 데이터 유형을 float로 변환하시오<jupyter_code>import numpy as np
import pandas as pd

df = pd.read_csv('prac/auto-mpg.csv')
df.columns = ['mpg','cylinders','displacement','horsepower','weight','acceleration','medel year','origin','name']

df.horsepower.replace('?',np.nan, inplace=True)
df.dropna(subset=['horsepower'],axis=0,inplace=True)
df['horsepower'] = df['horsepower'].astype('float')
df.dtypes
import numpy as np
import pandas as pd
df = pd.read_csv("prac/auto-mpg.csv")
df.columns= ['mpg','cylinders','displacement','horsepower','weight','acceleration','medel year','origin','name']
df.horsepower.replace('?', np.nan, inplace=True)
df.dropna(subset=['horsepower'], axis=0, inplace=True)
df['horsepower'] = df['horsepower'].astype('float')
count, bin_dividers = np.histogram(df.horsepower, bins=3)
count # 각 구간에 속하는 값의 개수
bin_dividers # 경계값 리스트
bin_names = ['저출력', '보통출력', '고출력']
df['hp_bin'] = pd.cut(x = df.horsepower, bins = bin_dividers, labels = bin_names )
df<jupyter_output><empty_output><jupyter_text>■ 범주형 데이터 처리    1. 구간 분할 : 일정한 구간으로 나눔        예 : 미세먼지의 농도에 따라서 좋음, 보통, 나쁨, 매우 나쁨        2. 더미변수 생성 : 숫자 0과 1로 표현        예 : 악성(M)은 1이라고 하고 나머지는 0        예제 : horsepower를 3개의 분할로 나눈다        (저출력 / 보통출력 / 고출력)            설명 : 연속변수를 일정한 구간으로 나눈 각 구간의 범주형 이산변수로 변환하는 과정을 구간분할(binning)    Pandas의 cut() 함수를 이용하면 연속 데이터를 여러 구간으로 나누고 범주형 데이터로 변환 가능  ※ 문제166. emp.csv를 Pandas로 불러와서 이름, 월급, 구간분할 한 결과를 출력    월급을 3개 구간으로 분할하는데 고소득, 중간소득, 저소득으로 나눠서 출력<jupyter_code>import pandas as pd

emp = pd.read_csv('emp.csv')

count, bin_dividers = np.histogram(emp.sal, bins=3)
bin_names = ['저소득','중간소득','고소득']
emp['sal_2'] = pd.cut(x = emp.sal, bins=bin_dividers, labels = bin_names, include_lowest = True)
emp<jupyter_output><empty_output><jupyter_text>머신러닝 알고리즘에 따라 범주형 데이터를 바로 사용할 수 없는 알고리즘이 존재    컴퓨터가 인식 가능한 입력값으로 변환할 필요가 있다    숫자 0 또는 1로 표현되는 더미변수를 사용        여기서 숫자 0과 1은 크고 작음을 나타내지 않고 어떤 특성이 있는지 없는지 여부만 표시    1은 특성이 있는 것이고 0은 없는 것<jupyter_code># 예제
horsepower_dummies = pd.get_dummies(df.hp_bin)
horsepower_dummies.head()<jupyter_output><empty_output><jupyter_text>※ 문제167. 위의 더미변수 중 고출력만 df 데이터프레임에 추가하시오<jupyter_code>df['고출력'] = horsepower_dummies.고출력
df<jupyter_output><empty_output><jupyter_text>※ 문제168. emp.csv를 로드해서 만든 명목형 column중에 고소득을 더미변수로 생성하고, emp 데이터프레임에 고소득 더미변수를 추가하시오<jupyter_code>import pandas as pd

emp = pd.read_csv('emp.csv')

count, bin_dividers = np.histogram(emp.sal, bins=3)
bin_names = ['저소득','중간소득','고소득']

emp['sal_2'] = pd.cut(x = emp.sal, bins=bin_dividers, labels=bin_names, include_lowest = True)
sal_dummies = pd.get_dummies(emp.sal_2)
emp['고소득'] = sal_dummies.고소득
emp<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.1479903888160769, 'fraction_numerical': 0.020969855832241154, 'mean_word_length': 4.386470588235294, 'pattern_counts': {'":': 0, '<': 68, '<?xml version=': 0, '>': 69, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 7, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '17', 'dir': 'jupyter-structured-clean-dedup', 'id': '268885', 'license': 'MIT', 'n_tokens_mistral': 5102, 'n_tokens_neox': 6053, 'n_words': 867, 'path': '06-1. Pandas DA (200716).ipynb', 'repo_name': 'Adrian123K/pandas_ml', 'size': '9156'}