# 작업형 유형 1 문제(1)
# alcohol이 상위 10번째 값으로 1~10위의 범위 값으로 변경 후
# speeding가 7이상의 alcohol 데이터들의 평균 산출
# print만 출력
import numpy as np
import pandas as pd
import seaborn as sns
sns.get_dataset_names()
df = sns.load_dataset('car_crashes')
print(df.head())
# 결과
total speeding alcohol not_distracted no_previous ins_premium \
0 18.8 7.332 5.640 18.048 15.040 784.55
1 18.1 7.421 4.525 16.290 17.014 1053.48
2 18.6 6.510 5.208 15.624 17.856 899.47
3 22.4 4.032 5.824 21.056 21.280 827.34
4 12.0 4.200 3.360 10.920 10.680 878.41
ins_losses abbrev
0 145.08 AL
1 133.93 AK
2 110.35 AZ
3 142.39 AR
4 165.63 CA
필요한 모듈들을 불러온 뒤 seaborn 패키지를 이용해 car_crashes라는 파일을 불러온 후 df.head()를 통해 상위 n개의 데이터를 올바르게 불러 왔는지, 이상이 없는지 확인한다.
# 사용자 코드
data = df.sort_values(by=df.columns[2], ascending=False) # alcohol 정렬, 오름차순
ten = data.iloc[9,2] # 10행 3열의 data를 변수에 저장
data.iloc[:9,2] = ten # 0:10
result = data[(data['speeding'] >= 7)]
print('최종결과 : ', result['alcohol'].mean())
# 결과
최종결과 : 5.600099999999999
이후 조건에 맞게 columns[2]를 통해 alcohol열을 선택 한뒤 오름차순으로 선택 되게 하낟. 그 뒤 ten이라는 변수에 10행 3열의 data를 저장 한 뒤 .iloc을 통해 범위 값을 지정해 준다. result 변수에는 speeding이 7이상인 조건에 맞게 설정 한뒤 print문을 통해 원하는 결과를 도출한다.
# 작업형 유형 1 문제(2)
# 데이터 첫번째 행부터 70%까지의 데이터를 추출한 후
# distance의 결측값을 distance의 중앙값으로 대체하고
# 결측값 전처리 전과 후의 표준편차 비교
# 전/후 결과값 print 출력
import numpy as np
import pandas as pd
import seaborn as sns
sns.get_dataset_names
df = sns.load_dataset('planets')
print(df.head())
위의 문제와 똑같이 seaborn 패키지로 planets라는 파일을 불러오고 출력한다.
# 사용자 코드
len = int(len(df)*0.7) # 70%까지 데이터
df = df[:len]
df2 = df.copy()
df2['distance'] = df2['distance'].fillna(df2['distance'].median()) # 결측 -> 중앙
print('전처리 전', np.std(df['distance']))
print('전처리 후', np.std(df2['distance']))
# 결과
전처리 전 275.0161144074896
전처리 후 267.051384425976
조건에 맞게 첫번쨰 행부터 70%까지의 데이터를 len이라는 변수에 넣고 난 뒤 다시 df 변수에 넣고 df2라는 변수를 전처리 전과 후를 비교하기 위해 만든다. 이후 fillna를 통해 결측치 값을 데이터의 대부분을 차지하는 median(중앙값)으로 대체한다.
# 작업형 유형 1문제(3)
# orbital_period열의 이상치를 IQR기법으로 제거하여
# 이상치들의 합 계산
# print만 출력
import numpy as np
import pandas as pd
import seaborn as sns
df = sns.load_dataset('planets')
print(df.head())
# 결과
method number orbital_period mass distance year
0 Radial Velocity 1 269.300 7.10 77.40 2006
1 Radial Velocity 1 874.774 2.21 56.95 2008
2 Radial Velocity 1 763.000 2.60 19.84 2011
3 Radial Velocity 1 326.030 19.40 110.62 2007
4 Radial Velocity 1 516.220 10.50 119.47 2009
마찬가지로 파일을 불러오고 print문을 통해 이상이 없는지 확인한다.
# 사용자 코드
Q25 = df['orbital_period'].quantile(0.25)
Q75 = df['orbital_period'].quantile(0.75)
IQR = Q75 - Q25
min = Q25 - IQR * 1.5
max = Q75 + IQR * 1.5
df_outlier = df[(df['orbital_period'] <= min) | (df['orbital_period'] >= max)]
print(df_outlier['orbital_period'].sum())
# 결과
1818772.582
이번 문제는 이상치를 IQR기법을 제거하는 것인데 먼저 IQR이란 Interquartile range의 약자로써 Q3-Q1의 값을 의미한다.
노란줄은 Median(중앙값), 박스의 왼쪽과 오른쪽 변이 Q1(25%), Q3(75%)를 의미한다. 사진과 같이 Q1 - 1.5 * IQR을 최소 제한선, Q3 + 1.5 * IQR을 최대 제한선으로 둔다. 이 제한선들을 넘어가는 값들을 이상치라고 한다. 따라서 이러한 이상치들을 제거하기 위해 min, max변수를 통해 제한선을 설정한 뒤, df_outlier라는 변수를 통해 범위를 설정하여 이상치를 제거한다.
'데이터분석' 카테고리의 다른 글
티스토리에 GA연동(구글 애널리틱스) (0) | 2023.01.09 |
---|---|
빅데이터 분석기사 작업 유형 2 - 데이터 전처리 (0) | 2022.08.09 |