책 "파이썬 머신러닝 판다스 데이터 분석"을 바탕으로 정리한 게시글입니다.
데이터프레임의 요약 정보 출력
특정 열에 누락 데이터 갯수 확인
nan_deck=df['deck'].value_counts(dropna=False) #deck열의 누락 데이터 개수
#dropna를 false로 해줘야 누락 데이터 개수가 뜸
누락 데이터면 True, 데이터 존재시 False 반환
유효한 데이터가 존재하면 True, 누락이면 False 반환
#isnull() 메소드로 누락 데이터 개수 구하기
print(df.head().isnull().sum(axis=0)
실행 결과
결측값이 들어간 데이터 삭제
df_trash=df.dropna(axis=1,thresh=500) # 결측값이 500개 이상인 열 모두삭제
age열의 행 중에서 결측값이 있는 모든 행을 삭제
df_age+df.dropna(subset=['age'],how='any',axis=0)
#how는 기본적으로 any옵션 적용 -> 결측값이 하나라도 있으면 삭제
#how=all 이면 모든 데이터가 결측값일 경우에만 삭제됨
age의 결측값에 평균값 치환
mean_age =df['age'].mean(axis=0) #중간값은 median()사용
df['age'].fillna(mean_age,inplace=True)
NaN대신 0,'-','?'으로 입력되어 있을 경우
import numpy as np 로 numpy 라이브러리 임포트
df.replace('?',np.nan,inplace=True)
finllna()메소드 옵션중
행의 레코드가 중복되는지 여부 확인
중복되는 행이면 True, 처음 나오는 행이면 False 반환
col_dup=df['c2'].duplicated() #c2열의 데이터중 중복값 찾기
중복되는 행을 제거
df3=df.drop_duplicates(subset=['c2','c3'])
책 예제 코드
책 예제 코드
나누려는 구간 (bin)개수를 bins옵션에 입력하면 각 구간에 속하는 값의 개수(count)와 경게값 리스트(bin_dividers)를 반환
count, bin_dividers=np.histogram(df['horsepower'],bins=3)
print(bin_dividers) # [46. 107.3333 168.6667 230.] 출력
horsepower열을 저출력, 보통출력, 고출력으로 분할
# 3개의 bin에 이름 지정
bin_names = ['저출력', '보통출력', '고출력']
# pd.cut 함수로 각 데이터를 3개의 bin에 할당
df['hp_bin'] = pd.cut(x=df['horsepower'], # 데이터 배열
bins=bin_dividers, # 경계 값 리스트
labels=bin_names, # bin 이름
include_lowest=True) # 첫 경계값 포함
# horsepower 열, hp_bin 열의 첫 15행을 출력
print(df[['horsepower', 'hp_bin']].head(15))
실행 결과
컴퓨터가 인식 가능한 입력값인 더미 변수(0,1)로 변환
이때, 0과 1은 어떤 특성이 존재하면 1, 존재하지 않으면 0으로 구분
범주형 변수의 모든 고유값을 각각 새로운 더미 변수로 변환 -> 열의 고유값이 각각 새로운 더미 변수 열의 이름이 됨
horsepower_dummies=pd.get_dummies(df['hp_bin'])
실행 결과
hp_bin열에 들어있는 범주형 데이터를 원핫벡터로 변환하면 희소행렬로 정리된다.
예제의 경우 1차원 벡터를 2차원 행렬로 변환하고 희소행렬로 변환한다. 희소 행렬은 (행,열) 좌표와 값 형태로 정리
(0,1)은 0행의 1열의 위치를 말하고 데이터 값은 숫자 1.0입력
책 예제 코드
숫자의 상대적 크기 차이를 없애기 위해서 사용
정규화 : 열에 속하는 데이터 값을 동일한 크기 기준으로 나눈 비율로 나타내는것 (범위 : 0~1 / -1~1)
최소-최대 정규화는 데이터를 정규화하는 가장 일반적인 방법
각각의 최소값 0, 최대값 1로, 그리고 다른 값들은 0과 1 사이의 값으로 변환
(X - MIN) / (MAX-MIN)
이상치에 영향을 많이 받는다는 단점이 있음
최소-최대 정규화의 단점을 보완한 정규화방식 (정규분포)
값이 평균 0으로, 평균보다 작으면 음수, 평균보다 크면 양수
계산되는 음수와 양수의 크기는 그 feature의 표준편차에 의해 결정됨
-> 데이터의 표준편차가 크면(값이 넓게 퍼져있으면) 정규화되는 값이 0에 가까워짐.
(X - 평균) / 표준편차
Timestamp : 특정한 시점
Period : 두 시점 사이의 일정한 기간
문자열(등 다른 자료형) -> Timestamp(datetime64형) 변환
df['new_Date']=pd.to_datetime(df['Date'])
Timestamp -> period로 변환
ts_dates=pd.to_datetime(dates) # dates를 timestamp로 변환
pr_day= ts_dates.to_period(freq='D') #period로 변환
Timestamp 배열 생성
예제 - 한달 간격으로 각 달의 시작 날짜 6개를 생성
ts_ms = pd.date_range(start='2019-01-01', # 날짜 범위의 시작
end=None, # 날짜 범위의 끝
periods=6, # 생성할 Timestamp의 개수
freq='MS', # 시간 간격 (MS: 월의 시작일)
tz='Asia/Seoul') # 시간대(timezone)
Period 배열 생성
pr_m = pd.period_range(start='2019-01-01', # 날짜 범위의 시작
end=None, # 날짜 범위의 끝
periods=3, # 생성할 Period 개수
freq='M') # 기간의 길이 (M: 월)
책 예제
Timestamp로 구성된 열을 행 인덱스로 지정시 DatetimeIndex라는 고유 속성으로 변환(Period 동일)
책 예제