데이터분석

빅데이터분석기사 작업형 유형 1 문제 모음

환성 2022. 8. 9. 21:43
728x90
# 작업형 유형 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라는 변수를 통해 범위를 설정하여 이상치를 제거한다.