빅분기 준비 실전 예제 2

SeongGyun Hong·2024년 11월 20일

빅데이터 분석기사

목록 보기
9/16

빅분기 놀이터... 감사합니다.. 감사합니다...

1. 결측치 처리(map 활용)

import pandas as pd
df = pd.read_csv('../input/bigdatacertificationkr/basic1.csv')
#print(df.head())
#print(len(df))
#print(df.isnull().sum()/100)

df = df[['id', 'age', 'city', 'f1', 'f2', 'f4', 'f5']]

print(df.groupby('city')['f1'].median().reset_index()) # mean과 median 차이

k, d, b, s = df.groupby('city')['f1'].median()
print(k, d, b, s)

df['f1'] = df['f1'].fillna(df['city'].map({'경기': k, 
                                          '대구': d,
                                          '부산': b,
                                         '서울': s}))
print(df['f1'].mean())

2. 왜도와 첨도 log1p 변환

DataFrame.skew() 왜도
DataFrame.kurt() 첨도

  • kurt
    첨도가 3에 가까우면 산포는 정규분포에 가깝고
    3보다 작다면 정규분포 보다는 꼬리가 얇은 분포이다.
    첨도값이 3보다 큰 양수인 경우에는 정규분포보다 두꺼운 분포이다.

  • 자연로그 플러스 1 변환 (log1p 변환)
    주어진 값에 1을 더한 후 자연로그를 취하는 연산으로, 입력값이 0에 매우 가까울 때 일반적인 로그 함수 보다 더 정확한 결과를 제공하여 데이터 분석이나 ML에서 자주 사용됨.

import pandas as pd
import numpy as np

df = pd.read_csv("../input/house-prices-advanced-regression-techniques/train.csv")
print(df.head())

sale_skew = df.SalePrice.skew()
sale_kurt = df.SalePrice.kurt()
target = np.log1p(df.SalePrice)
target_skew = target.skew()
target_kurt = target.kurt()

print(np.round(sale_skew + sale_kurt + target_skew + target_kurt, 2))

3. 표준편차

  • 표준편차란?
    데이터가 평균을 중심으로 얼마나 퍼져있는지 측정하는 값이다.
    값이 클수록 데이터가 넓게 퍼져있으며, 작을수록 평균에 가까이 몰려 있다.
    공식적으로는 분산의 제곱근으로 계산되며, 단위는 원래 데이터와 동일하다.

    계산 과정

    1. 평균 계산 :
      모든 데이터를 더한 후 개수로 나눠 평균을 구한다.
    2. 편차 계산 :
      각 데이터 값에서 평균을 빼준다.
    3. 편차 제곱 :
      계산된 편차를 제곱하여 모두 더한다.
    4. 분산 계산 :
      제곱합을 데이터 개수로 나눈다 (모집단 일 때)
    5. 표준편차 계산
      분산의 제곱근을 구한다.
  • 표준편차의 의미
    표준편차가 2라는 뜻:
    데이터 값 대부분이 평균(5)에서 ±2 범위(3~7) 안에 있다는 뜻

    • 데이터 분포를 이해하고, 변동성을 파악하는 데 유용하다.
import pandas as pd
import numpy as np

df = pd.read_csv('../input/bigdatacertificationkr/basic1.csv')
print(df.head())
print('----------')
target_ENFJ = df[df.f4 == 'ENFJ']
target_INFP = df[df.f4 == 'INFP']

print(round(abs(target_ENFJ.f1.std() - target_INFP.f1.std()), 2))

4. dropna 열 설정

dropna() 그냥 쓰면 결측치 행 전부 떨구지만
특정 열을 지정하여 해당 열에서의 결측치를 가진 경우만 떨굴 수도 있다.
그게 바로 dropna(subset = [칼럼 이름])

import pandas as pd
import numpy as np

df = pd.read_csv('../input/bigdatacertificationkr/basic1.csv')
print(df.head())
print(df.info())
df = df.dropna(subset = ['f1'])

target = df.groupby(['city', 'f2']).sum().reset_index()
print(target)
answer = target[(target['city'] == '경기') & (target['f2'] == 0)]
print(answer['f1'])

5. replace, max

데이터프레임 뒤에 .replace(바꾸고싶은거, 바꿀거)

import pandas as pd
import numpy as np
df = pd.read_csv('../input/bigdatacertificationkr/basic1.csv')

print(df.head())
print('-------------------')

df['f4'] = df['f4'].replace('ESFJ', 'ISFJ')

target = df[(df['city'] == '경기') & (df['f4'] == 'ISFJ')]

print(target.age.max())

6. 누적합과 결측치 처리

  • df.fillna(method = )
    bfill의 경우에 결측값을 바로 뒤에 있는 값으로 채우고
    ffill의 경우에는 결측값을 바로 앞에 있는 값으로 채운다.

  • df.cumsum()
    누적합을 의미하며 실행하는 순간 pandas.core.series.Series 객체가 하나 생김.
    시리즈 객체가 생기므로 변수에 담을 수가 있음.

import pandas as pd
import numpy as np
df = pd.read_csv('../input/bigdatacertificationkr/basic1.csv')

target = df[df['f2'] == 1]

answer = target['f1'].cumsum()
print(type(answer))
answer = answer.fillna(method = 'bfill')

print(round(answer.mean(), 2))

7. 수치형 변수 표준화(z표준화)

import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()

df = pd.read_csv('../input/bigdatacertificationkr/basic1.csv')

print(df.head())

print(scaler.fit(df[['f5']]))
# print(round(np.median(scaler.transform(df[['f5']])), 2)) 이렇게도 된다.

df['f5'] = scaler.transform(df[['f5']])

print(df['f5'].median())

8. 여-존슨과 box-cox 변환, 최빈값

  • 최빈값
    `df['f1'].mode()[0]

  • 주의: from skleran.preprocessing import power_transform에서 나온
    powr_transform의 경우에 들어오는 것도 2차원 배열인데 내뱉는 반환도 numpy.ndarray 객체로 2차원이다.
    즉 2D 배열에 맞는 연산을 해줘야 한다.

import pandas as pd
import numpy as np
from sklearn.preprocessing import power_transform

df = pd.read_csv('../input/bigdatacertificationkr/basic1.csv')
print(df.head(1))

target = df[df['age'] >= 20]

print(target['f1'].mode()[0])

target['f1'] = target['f1'].fillna(50)

box_cox = power_transform(target[['f1']], method = 'box-cox', standardize = False)
print(box_cox)
yeo_johnson = power_transform(target[['f1']], standardize = False)

print(np.round(sum(abs(box_cox - yeo_johnson)), 2))

참고로 power_transform 안에 인자로 들어가는 standardize는 말 그대로 표준화 여부 (평균 0, 표준편차 1)을 만들어줄지 결정하는 인자로, 본 문제에서는 별도의 표준화는 없었기에 적용하지 않았다. 기본값 = 적용)

9. min-max scaler, 상하위 5%값

import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler

df = pd.read_csv('../input/bigdatacertificationkr/basic1.csv')

print(df.head())

scaler = MinMaxScaler()

df['scale_f5'] = scaler.fit_transform(df[['f5']])

print(df['scale_f5'])

answer_95 = df['scale_f5'].quantile(0.95)
print(answer_95)
answer_05 = df['scale_f5'].quantile(0.05)
print(answer_05)

answer = answer_95 + answer_05

print(round(answer, 2))

10. groupby, head, tail, max

import pandas as pd
import numpy as np

df = pd.read_csv("../input/covid-vaccination-vs-death/covid-vaccination-vs-death_ratio.csv")

print(df.head())
print(df.info())

df = df[df['ratio'] <= 100]

target = df.groupby('country')['ratio'].max().reset_index()
print(target)
print('-------')
answer = target.sort_values(by = 'ratio', ascending = False).reset_index()
print(answer)

top_10 = answer.head(10)['ratio'].mean()
down_10 = answer.tail(10)['ratio'].mean()

print(top_10 - down_10)
  • groupby 를 하고 max를 붙여주게 되면
    해당 그룹화된 인덱스에 해당하는 각 칼럼의 최대값이 행으로 들어오게 된다.

  • 이부분 관련해서 filtering을 언제 진행하느냐에 따라 값이 달라질 수도 있다. 먼저 ratio를 100 날리고 시작하면 전체 데이터셋에서 전처리가 진행된 후에 max가 붙게되는거라 어느 나라의 접종률 통계가 다 100이 넘는 경우 외에는 groupby에 의하여 해당 나라가 group화 되지만,

  • groupby max 콤보로 붙여줘 놓고서 나중에 필터링하게 되면 해당 나라의 최대 접종률이 100을 넘긴 경우에 해당 나라 그룹값이 필터링에 의해 사라져버려서
    나중에 총계로 잡히는 나라의 갯수에 차이가 생겨버린다.

profile
헤매는 만큼 자기 땅이다.

0개의 댓글