수영장의 수영_데이터 분석 블로그

[빅분기 실기] 작업형 1유형 - 종합정리 본문

자격증/빅데이터분석기사

[빅분기 실기] 작업형 1유형 - 종합정리

슈빔멘 2021. 12. 3. 16:56

1. Scaling

1) min-max scaling

# min-max scaling

import pandas as pd
from sklearn.preprocessing import minmax_scale

df = pd.read_csv('./dataset.csv')

# 변환 원하는 열 선택
df['열이름'] = minmax_scale(df['열이름'])

# 조건에 맞는 행 걸러내기
sum(df['열이름']>0.5) # true를 더하는 방식
len(df[df['열이름']>0.5]) # 데이터 수의 길이를 구하는 방식

 

2) standard scaling

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
df['열'] = scaler.fit_transform(df[['열']]) # 여기서는 왜 [[ 두개지??

 

2. 이상치

1) IQR

import pandas as pd
import numpy as np

df = pd.read_csv('./train.csv')

q1 = np.percentile(df['열이름'], 25)
q3 = np.percentile(df['열이름'], 75)

IQR = q3 - q1

outdata1 = df[df['열이름'] < (q1 - 1.5 * IQR)
outdata2 = df[df['열이름'] > (q3 + 1.5 * IQR)
len(outdata1), len(outdata2)

# 이상치 중에서 특정 조건 행만 걸러내기
sum(outdata1['열이름2'] == 'female'))
sum(outdata2['열이름2'] == 'female'))

2) 음수, 소수

basic1 데이터 중 'age'컬럼 이상치를 제거하라

import pandas as pd
import numpy as np
df = pd.read_csv('./train.csv')
# 이제 이 위에는 생략

# 음수 제거하기
df = df[~df['age'] <=0]
# 소수 제거하기
df = df[(df['age'] == round(df['age'],0))]

 

3. 결측치

1. 제거하기

# 결측치가 있는 행 제거
df = df[~df['f1'].isnull()]

# 그룹화한 합계
df1 = df.groupby(['인덱스로 들어갈 열1','인덱스로 들어갈 열2']).sum()

# 조건 값만 출력
df1.iloc[0]['열이름'] # => 0번째 행에서 '열이름' 열의 값만 출력한다

2. 대체하기 - 최빈값

# 조건 데이터행만 추출
df = df[df['열'] > 조건숫자]

# 최빈값으로 채우기
df['열'] = df['열'].fillna(df['열'].mode())

3. 대체하기 - 뒤의 값

df = df.fillna(method = 'bfill')

 

 

4. 조건

1) 조건에 맞는 데이터로만 계산하기

# 내림차순 정렬
df = df.sort_values('기준 열', ascending = False).reset_index(drop=True)

# 상위 몇개만 가져오기
df = df[:20] # 위의 20행만 가져옴

# 결측처리
df['열이름'] = df['열이름'].fillna(df['열이름'].median()) # 중앙값으로 채우기 .mean() 평균 fillna(0) 0

# 조건 만들기
cond = (df['열'] == '조건 문자열') & (df['열2'] > 조건 숫자)

# 조건 적용된 행의 평균
df[cond]['income'].mean() # 조건 만족하는 행들의 income(수입) 평균 계산

 

2) 조건에 맞게 replace하기

# 조건 데이터 추려내기
df[df['열이름'] == '조건문자열']

# replace
df['열이름'] = df['열이름'].replace('원래문자열', '바꿀문자열')


# 두 가지 이상의 조건 적용해 대체하기
df[(df['열1'] == '조건문자열') & (df['열2'] < 조건숫자)] # 조건 만듦
df[(df['열1'] == '조건문자열') & (df['열2'] < 조건숫자)]['age'].max() # 조건 충족 데이터 중 최대 age값 출력

 

3) 조건에 맞게 병합하기

df1 = pd.read_csv('~~.csv')
df2 = pd.read_csv('~~.csv')

# 병합하기
df = pd.merge(left=df1, right=df2) # 조건 달 수도 있음 how ='left', on ='공통열' 

# 결측치 제거
df = df.dropna(subset=['열이름']) #'열이름' 열에서 빈 값인 행 삭제하기
df = df.reset_index() #인덱스 리셋

df.iloc[:20]['열이름'].sum() # => 상위 20개 행만 선택한 후 -> '열이름'의 값들 합계 구하기

 

4) 여러 개의 조건 적용

city와 f4를 기준으로 f5의 평균값을 구한 다음, f5를 기준으로 상위 7개 값을 모두 더해 출력하시오

# groupby 해서 평균 구하기 => city, f4가 각각 왼쪽에 인덱스로 들어가서 그룹화
# ex. 경기-20대, 경기-30대, 서울-40대 등등
df = df.groupby(['city', 'f4'])[['f5']].mean()

# 상위 7개
df = df.sort_values('f5', ascending=False).reset_index()
df = df.head(7)

# 합계
df['f5'].sum()

 

5. 통계

1. 상관계수

# 상관계수
df_corr = df.corr()
mask = df_corr.isin([1]) # 자기자신과의 상관계수는 1임 -> 삭제 필요
df_corr = df_corr[~mask]

# 상관계수의 최대 최소 구하기
df_corr_max = abs(df_corr['열이름']).max()
df_corr_min = abs(df_corr['열이름']).min()

 

2. 분산

# 주어진 데이터 셋에서 f2가 0값인 데이터를 age를 기준으로 오름차순 정렬하고
# 앞에서 부터 20개의 데이터를 추출한 후 
# f1 결측치(최소값)를 채우기 전과 후의 분산 차이를 계산하시오 (소수점 둘째 자리까지)

cond = (df['열'] == 0) # '열'에서 0값인 데이터를 찾는다
# 오름차순으로 정렬한 뒤 인덱스 재조정
df = df[cond].sort_values('age', ascending=True).reset_index(drop=True)

df = df[:20]

# 결측치를 채우기 전과 후 - 분산 비교
var1 = df['f1'].var()
df['f1'] = df['f1'].fillna(df['f1'].min())
var2 = df['f1'].var()

# 둘 차이 계산
round(var1 - var2, 2) # 2는 소수점 둘째자리까지 나타내겠다~

 

3. 왜도와 첨도

'SalePrice'컬럼의 왜도와 첨도를 구한 값과, 
'SalePrice'컬럼을 스케일링(log1p)로 변환한 이후 
왜도와 첨도를 구해 모두 더한 다음 소수점 2째자리까지 출력하시오

# 왜도와 첨도 구하기
s1 = df['SalePrice'].skew()
k1 = df['SalePrice'].kurt()

# 로그 변환 후 왜도와 첨도
df['SalePrice'] = np.log1p(df['SalePrice'])
s2 = df['SalePrice'].skew()
k2 = df['SalePrice'].kurt()

# 모두 더해 2자리까지
round(s1+s2+k1+k2, 2)

 

4. 기타 계산 함수

df.sum()
df.cumsum()
df.std()

np.abs(A - B)