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())
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))
표준편차란?
데이터가 평균을 중심으로 얼마나 퍼져있는지 측정하는 값이다.
값이 클수록 데이터가 넓게 퍼져있으며, 작을수록 평균에 가까이 몰려 있다.
공식적으로는 분산의 제곱근으로 계산되며, 단위는 원래 데이터와 동일하다.
계산 과정
- 평균 계산 :
모든 데이터를 더한 후 개수로 나눠 평균을 구한다.- 편차 계산 :
각 데이터 값에서 평균을 빼준다.- 편차 제곱 :
계산된 편차를 제곱하여 모두 더한다.- 분산 계산 :
제곱합을 데이터 개수로 나눈다 (모집단 일 때)- 표준편차 계산
분산의 제곱근을 구한다.
표준편차의 의미
표준편차가 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))
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'])
데이터프레임 뒤에 .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())
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))
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())
최빈값
`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)을 만들어줄지 결정하는 인자로, 본 문제에서는 별도의 표준화는 없었기에 적용하지 않았다. 기본값 = 적용)
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))
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을 넘긴 경우에 해당 나라 그룹값이 필터링에 의해 사라져버려서
나중에 총계로 잡히는 나라의 갯수에 차이가 생겨버린다.