데이터 확인
1. import
import pandas as pd
import numpy as np
2. 데이터 불러오기
copy() 해서 사용
df = pd.read_csv("titanic.csv")
df1 = df.copy() # deep copy 깊은 복사
df2 = pd.DataFrame(df) # shallow copy 얕은 복사
3. info() head() shape dtypes 확인
df1.head()
df1.info()
df1.shape # 행, 열
df1.dtypes
4. 데이터 형변환
df1.astype({"cyl":"int", "gear":"object"})
print(df1.dtypes)
5. 데이터 개수 확인
df1["cyl"].value_counts()
기초통계량
1. 중심측도(평균, 중앙값, 최빈값)
print(df["mpg"].mean()) # 평균
print(df["mpg"].median()) # 중앙값
print(df["cyl"].mode()[0] # 최빈값
df["cyl"].value_counts()
2. 산포도(분산, 표준편차, IQR, 범위(최대-최소))
df["mpg"].var() # 분산
df["mpg"].std() # 표준편차
# IQR = Q3 - Q1
Q1 = df["mpg"].quantile(.25)
Q3 = df["mpg"].quantile(.75)
IQR = Q3 - Q1
pirnt(IQR)
# 2분위수 = median과 같음
Q2 = df["mpg"].quantile(.50)
# Q2 = df["mpg"].median()
print(Q2)
# 범위(Range) = 최대값 - 최소값
mpg_range = df["mpg"].max() - df["mpg"].min()
print(mpg_range)
3. 분포의 비대칭도(왜도, 첨도)
# 왜도
df["mpg"].skew()
# 첨도
df["mpg"].kurt()
4. 합계, 절대값, 데이터 수
# 합계
df["mpg"].sum()
# 절대값
IQR2 = Q1-Q3
abs(IQR2)
# 데이터수
len(df["mpg"])
5. 그룹화(groupby 활용) + aggfunc()
데이터 인덱싱, 필터링, 정렬, 변경 등
1. 데이터 인덱싱
# 행, 열 인덱싱
df.loc[3, "mpg"]
df.loc[0:3, ["mpg","cyl","disp"]]
df.loc[0:3, "mpg":"disp"]
# 열만 인덱싱
df.loc[:, "mpg"]
# 앞에서 n행 인덱싱
df.head(5)
# 뒤에서 n행 인덱싱
df.tail(5)
.loc 는 python index가 0부터 시작하는 성질을 따르지 않고 index 번호 그대로 가져옴.
2. 열(Columns) 추가, 제거
# 열 선택
df["mpg"] # or df.mpg
# 두개 이상의 열 선택
df[["mpg","cyl"]]
# 열 제거
df.drop(columns=["car", "mpg", "cyl"])
# 열 추가
df2 = df.copy()
df2["원하는변수명"] = df["mpg"] + 10
df2["원하는변수명"].head()
3. 데이터 필터링
# 조건 1개 필터링
# cyl이 4인 데이터 수
print(len(df[df["cyl"]==4])) # df["cyl"]==4 만 해주면 bool타입으로 출력
# 조건 2개 필터링
print(df[cond1 & cond2]) # and
print(df[cond1 | cond2]) # or
한번에 코딩하기 보다는 조건별로 변수명 다르게 해서 cond1, cond2처럼 저장한 뒤에 계산해야 실수를 줄일 수 있음
4. 데이터 정렬
# 오름차순 정렬
df.sort_values("mpg", ascending=True)
# 내림차순 정렬
df.sort_values("mpg", ascending=False)
5. 데이터 변경(조건문)
np.where 활용, 이상치 처리하는 문제에서 Max값이나 Min값으로 대체할 때 조건문 활용
# hp 변수 값 중에서 205가 넘는 값은 205로 나머지는 그대로 처리
df["hp"] = np.where(df["hp"]>=205, 205, df["hp"])
결측치, 이상치, 중복값 처리(제거 or 대체)
1. 결측치 확인 .isnull().sum() .fillna()
# 결측치 제거(삭제)
print(df.dropna(axis=0).shape) # 행 기준
print(df.dropna(axis=1).shape) # 열 기준
# 결측치 대체 (.fillna())
# 1. 중앙값/ 평균값으로 대체
# 중앙값
median_age = df2["age"].median()
print(median_age)
# 평균값
mean_age = df2["age"].mean()
print(mean_age)
# 결측치 대체
df2["age"] = df["age"].fillna(median_age) # 중앙값 대체
df2["age"] = df["age"].fillna(mean_age) # 평균값 대체
# 결측치 확인
df2.isnull().sum()
2. 이상치 확인 및 처리
🔽 상자그림 활용(이상치: Q1, Q3로부터 1.5 * IQR을 초과하는 값)
# Q1, Q3, IQR 구하기
Q1 = df["age"].quantile(.25)
Q3 = df["age"].quantile(.75)
IQR = Q3-Q1
print(Q1, Q3, IQR)
# 이상치 구하기
upper = Q3 + 1.5*IQR
lower = Q1 + 1.5*IQR
print(upper, lower)
🔽 표준정규분포 활용(이상치: ±3Z 값을 넘어가는 값)
Z = (개별값-평균)/표준편차
# 데이터 표준화, Z = (개별값-평균)/표준편차
mean_age = df["age"].mean()
std_age = df["age"].std()
znorm = (df["age"]-mean_age)/std_age
print(znorm)
# Q. 이상치의 개수는 몇개인가?
cond1 = (znorm > 3)
len(df[cond1])
cond2 = (znorm < -3)
len(df[cond2])
print(len(df[cond1])+len(df[cond2]))
3. 중복값 제거
# 중복값 제거
df1 = df1.drop_duplicates()
print(df1.shape)
데이터 scaling(데이터 표준화, 정규화)
1. 데이터 표준화(Z-score normalization)
StandardScaler: z-score로 변환하면 평균이 0이고 표준편차가 1인 표준정규분포가 된다.
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
df["mpg"] = scaler.fit_transform(df[["mpg"]]) #[[ ]]
# 확인
print(df["mpg"].mean(), df["mpg"].std()) # 평균이 0, 표준편차가 1
2. 데이터 정규화(min-max normalization)
MinMaxScaler: 최소가 0, 최대가 1인 값으로 scaling
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
df["mpg"] = scaler.fit_transform(df[["mpg"]])
# 확인
print(df["mpg"].min(), df["mpg"].max())
데이터 합치기
df_sum = pd.concat([df1, df2], axis=0) # 행 방향을 결합(위-아래), axis=1 열 방향(좌-우)
날짜/시간 데이터, index 다루기
날짜는 데이터 타입을 datetime으로 변경 필요
pandas.to_datetime()
# 데이터 타입 변경
import pandas as pd
df["날짜"]=pd.to_datetime(df["날짜"])
df.info()
# 년, 월, 일 변수(열) 추가하기
df["year"] = df["날짜"].dt.year
df["month"] = df["날짜"].dt.month
df["day"] = df["날짜"].dt.day
print(df)
날짜/시간이 변수로 있을 때 필터링 df.between()
날짜/ 시간이 인덱스로 주어진 경우 필터링 df.loc(), df.between_time(start_time="00:00:00", end_time="00:00:00")
# 날짜 구간 필터링(시작일 마지막일 모두 포함)
df[df["날짜"].between("2024-01-01 12:00:00", "2024-11-26 12:00:00")] # 원본데이터와 날짜 형식이 같아야 함
# 날짜가 인덱스로 주어진 경우 필터링
df = df.set_index("날짜") # drop=True가 디폴트, 기준열 삭제
df.loc["2024-01-01":"2024-11-11"] # 기간 포함
print(df.loc[(df.index>="2024-01-01") & (df.index<="2024-02-01")])
참고
'데브코스 데이터엔지니어링' 카테고리의 다른 글
[AWS] AWS 회원가입하기 (프리티어 사용) (1) | 2024.12.04 |
---|---|
[Spark] Local Standalone Spark 설치 with 코랩, MAC (0) | 2024.12.03 |
라이브러리 import (0) | 2024.11.26 |
Docker Hello World 프로그램 실습 (2) | 2024.11.21 |
hangman 프로젝트 workflow로 실행 (0) | 2024.11.21 |