본문 바로가기
빅데이터분석기사/작업형1

[작업형1] 모의문제 정리

by nemonemonemo 2025. 6. 16.

<모의문제1>

문제1

  • f1컬럼의 결측치는 중앙 값으로 대체하고
  • 나머지 결측치가 있는 데이터(행)을 모두 제거하고,
  • 앞에서부터 70% 데이터 중 views 컬럼의 3사분위 수에서 1사분위 수를 뺀 값을 구하시오
  • (단, 데이터 70% 지점은 정수형(int) 변환)
import pandas as pd
df = pd.read_csv("members.csv")

#-----------------------------------------------------------------------------
#f1컬럼의 결측치는 중앙 값으로 대체하고
df['f1'] = df['f1'].fillna(df['f1'].median())

#나머지 결측치가 있는 데이터(행)을 모두 제거하고,
df = df.dropna()

#앞에서부터 70% 데이터 중 views 컬럼의 3사분위 수에서 1사분위 수를 뺀 값을 구하시오
#(단, 데이터 70% 지점은 정수형(int) 변환)
##앞에서부터 70% 데이터 중
df = df[:int(len(df)*0.7)]
##views 컬럼의 3사분위 수에서 1사분위 수를 뺀 값을 구하시오
r1 = df['views'].quantile(.75)
r2 = df['views'].quantile(.25)

print(r1 -r2)
  • .dropna() : 결측치가 있는 행 모두 제거
  • 주어진 데이터프레임의 70%만 선택하기 
    -> len() 활용 : int(len(df) * 70)

 

문제2

(변경 후) 변경 전과 동일한 문제입니다. 좀 더 명확하게 수정하였음

  • 주어진 데이터에서 결측치가 30% 이상인 컬럼을 A, 결측치가 30% 미만, 20% 이상인 컬럼을 B라고 가정하자.
  • A에 해당하는 컬럼은 결측치가 있는 데이터(행)를 삭제하시오.
  • B에 해당하는 컬럼은 결측치를 최빈값으로 대체하시오.
  • 'f3'컬럼의 'gold' 값을 가진 데이터 수를 구하시오
#주어진 데이터에서 결측치가 30% 이상인 컬럼을 A, 결측치가 30% 미만, 20% 이상인 컬럼을 B라고 가정하자.
print(df.isnull().sum()) #결측치 몇개인지 확인
print(len(df)*0.3) #30% 지점 확인

#A에 해당하는 컬럼은 결측치가 있는 데이터(행)를 삭제하시오.
df = df.dropna(subset=['f1']) ##dropna에서 특정 행을 선택하려면 이런 형태로 넣어줘야함 

#B에 해당하는 컬럼은 결측치를 최빈값으로 대체하시오.
df['f3'] = df['f3'].fillna(df['f3'].mode()[0]) ##최빈값 .mode()[0]

#'f3'컬럼의 'gold' 값을 가진 데이터 수를 구하시오
print(sum(df['f3']=='gold'))
  • .dropna(subset = [' ']) : dropna에서 특정 열을 지정하려면 이런 형태로 넣어야함
    • df['f1'].dropna() <- 이거 백날 해봐야 결측치 삭제 안 된다. 이러지마 제발 
  • .mode()[0] : 최빈값 구하는 법!!!

 

문제3

  • views 컬럼에 결측치가 있는 데이터(행)을 삭제하고,
  • f3 컬럼의 결측치는 0, silver는 1, gold는 2, vip는 3 으로 변환한 후 f3 컬럼의 총 합을 정수형으로 출력하시오
#views 컬럼에 결측치가 있는 데이터(행)을 삭제하고,
df = df.dropna(subset=['views'])

#f3 컬럼의 결측치는 0, silver는 1, gold는 2, vip는 3 으로 변환한 후 
#f3 컬럼의 총 합을 정수형으로 출력하시오
import numpy as np ###결측치 넘파이 써서 파악해야함

#-----------------------------------------------------------------------------------------------
##replace 활용
df['f3'] = df['f3'].replace(np.nan, 0).replace('silver', 1).replace('gold', 2).replace('vip', 3)
# df['f3'] = df['f3'].replace('silver',1)
# df['f3'] = df['f3'].replace('gold',2)
# df['f3'] = df['f3'].replace('vip',3)
# print(df.head(7)) ##정상적으로 바꼈는지 확인 
print(df['f3'].sum())

#-----------------------------------------------------------------------------------------------
##map 활용
dict_list = {np.nan:0, 'silver':1, 'gold':2, 'vip':3}
df['f3'] = df['f3'].map(dict_list)
print(df['f3'].sum())

#-----------------------------------------------------------------------------------------------
##둘 다 모를 때
r1 = sum(df['f3'] == 'silver') * 1
r2 = sum(df['f3'] == 'gold') * 2
r3 = sum(df['f3'] == 'vip') * 3
print(r1 + r2 + r3)
  • 결측치는 넘파이 써서 확인해야한다!
    • import numpy as np로 임포트 한 뒤 np.nan으로 확인

<모의문제2>

 

문제4

  • 주어진 데이터에서 자료형(type)이 object인 컬럼은 삭제하고, 결측치는 0으로 대체한다.
  • 행 단위로 합한 다음 그 값이 3000보다 큰 값의 데이터 수를 구하시오 ('age', 'f1', 'f2', 'f5', 'views'의 각 행별 합)
#주어진 데이터에서 자료형(type)이 object인 컬럼은 삭제하고
##include
cols = df.select_dtypes(include='object').columns
df = df.drop(cols, axis=1)

##exclude
cols = df.select_dtypes(exclude='object').columns
df = df[cols]

#결측치는 0으로 대체한다.
df = df.fillna(0)

#행 단위로 합한 다음 그 값이 3000보다 큰 값의 데이터 수를 구하시오 ('age', 'f1', 'f2', 'f5', 'views'의 각 행별 합)
df = df.T ###df.T 대신 sum(axis=1)했음
df.head()
print(sum(df.sum() > 3000))
  • df.select_dtypes()
    • dtypes에서 s 빼먹지 않기
    • df.select_dtypes(include='object') 와 df.select_dtypes(exclude='object') 가 있다.
  • df.select_dtypes(include='object').columns
    • 위의 조건에 해당하는 컬럼만 선택하고 싶을 때 . columns를 쓴다. 

 

문제5

  • 데이터에서 IQR을 활용해 views 컬럼의 이상치를 찾고, 이상치 데이터의 수를 구하시오
#데이터에서 IQR을 활용해 views 컬럼의 이상치를 찾고
q3 = df['views'].quantile(.75)
q1 = df['views'].quantile(.25)

IQR = q3 - q1 ####이게 뭔지 알아둬야하는 것인가...**IQR = 3사분위수 - 1사분위수**
# print(IQR)

line1 = q1 - 1.5 * IQR ##이것보다 작은 값이 이상치
line2 = q3 + 1.5 * IQR ##이것보다 큰 값이 이상치

#이상치 데이터의 수를 구하시오
print(sum(df['views'] < line1) + sum(df['views'] > line2))
  • IQR
    • IQR = 3사분위수 - 1사분위수
    • IQR을 통해 이상치 구하는 법 
      • line1 = q1 - 1.5 * IQR -> 이것보다 작은 값이 이상치
        line2 = q3 + 1.5 * IQR -> 이것보다 큰 값이 이상치

 

문제6

  • 'age' 컬럼의 이상치(소수점 나이와 음수나이, 0포함)를 제거하고
  • 제거 전 후의 views 컬럼 표준편차를 더하시오 (최종 결과 값은 소수 둘째자리까지 출력, 셋째자리에서 반올림)
r1 = df['views'].std() #제거 전 표준편차

#'age' 컬럼의 이상치(소수점 나이와 음수나이, 0포함)를 제거하고
##음수 나이 제거
cond = df['age'] <= 0
df = df[~cond]
##소수점 나이 제거
cond = df['age'] == round(df['age'],0) ###원래 값과 반올림했을 때의 값이 다르면 소수점 나이라고 생각 
df = df[cond]

#제거 전 후의 views 컬럼 표준편차를 더하시오 (최종 결과 값은 소수 둘째자리까지 출력, 셋째자리에서 반올림)
r2 = df['views'].std() #제거 후 표준편차

print(round(r1 + r2, 2))
 
  • 소수점 나이 제거
    • 원래 값과 반올림 했을 때의 값이 다르면 소수점 나이라고 생각
    • cond = df['age'] == round(df['age'],0) 이 조건을 만족시키는 값만 해당 열에 남김

 

<모의문제3>

문제8

  • 결측 값을 가진 데이터는 바로 뒤에 있는 값으로 대체한 후 (바로 뒤가 결측값이라면 뒤에 있는 데이터 중 가장 가까운 값)
  • city와 f2 컬럼 기준으로 그룹합을 계산한 뒤
  • views가 세번째로 큰 city(도시) 이름은?
#결측 값을 가진 데이터는 바로 뒤에 있는 값으로 대체한 후 (바로 뒤가 결측값이라면 뒤에 있는 데이터 중 가장 가까운 값)
df = df.fillna(method='bfill') ## 뒤에있는 값으로 채우는 건 bfil, 앞에있는 값으로 채우는 것 ffill

#city와 f2 컬럼 기준으로 그룹합을 계산한 뒤
df = df.groupby(['city','f2']).sum().reset_index()

#views가 세번째로 큰 city(도시) 이름은?
df = df.sort_values('views', ascending=False)
print(df.iloc[2,0])
  • df.fillna(method='bfill')
    • 뒤에있는 값으로 채우는 건 bfil, 앞에있는 값으로 채우는 건 ffill
  • groupby().sum() : 그룹바이 뒤에 바로 .sum() 붙임 
  • sort_values : s 빼먹지말 것, 정렬 

 

문제9

  • 구독(subscribed) 월별로 데이터 개수를 구한 뒤
  • 가장 작은 구독 수가 있는 월을 구하시오
df['subscribed'] = pd.to_datetime(df['subscribed'])
df['month'] = df['subscribed'].dt.month

#구독(subscribed) 월별로 데이터 갯수를 구한 뒤
df = df.groupby('month').count() ##~별로 하면 일단 그룹바이 하면 되겠다 

#가장 작은 구독 수가 있는 월을 구하시오
df.sort_values('subscribed').index[0] #뭔가 순서, 순위를 물어볼 때는 정렬하자
  • ~별로 : 일단 groupby() 해라
  • 순서, 순위 물어봄 : 정렬해라

 

<모의고사>

작업형1-1

  • 앞에서 부터 50%까지의 데이터에서 'target'컬럼이 0 값을 가진 데이터만 활용해 'proline'컬럼의 평균을 구하시오 (소수점 절사(버림), 정수형 출력)
import pandas as pd
a = pd.read_csv("data1-1.csv")

# 사용자 코딩################################################################################
df = df.loc[:len(df)*0.5]

cond = df['target']==0
df = df[cond]

print(int(df['proline'].mean())) ##소수점 버림은 어케 하는 거람, 정수형 출력은 int() 이걸로 감싸면 되는 거 아니었냐 
##-> 뒤에 ) 괄호 안 닫아서 오류 났던 거였음!!!!!! 너무 충격 이런 경우 종종 있으니 유의할 것
###소수점 버릴 때는 쉽게 int형으로 감싸주면 된대 아까는 왜 오류났지

# 답안은 직접 작성함
#1115
  • 소수점 버림
    • int() 이거로 감싸는 거 맞음 -> 괄호 나중에 치는 과정에서 괄호 안 닫아서 오류 생기는 경우 종종 있으니 유의 

 

작업형1-3

  • 고유한 값이 가장 많은 컬럼의 이름은?
# 데이터 파일 읽기 예제
import pandas as pd
a = pd.read_csv("data1-3.csv")

# 사용자 코딩#################################################
a = a.nunique() ############그냥 nunique()가 생각 안 나서 틀림
print(a.sort_values(ascending=False), index[0])
  • .nunique() : 항목의 종류 수 알려줌
  • + . value_counts() : 항목별 개수를 알려줌
    ex) print(df_car['car'].value_counts())