<모의문제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 -> 이것보다 큰 값이 이상치
- line1 = q1 - 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())
'빅데이터분석기사 > 작업형1' 카테고리의 다른 글
| [작업형1] 데이터마님 전처리 100 헷갈리는 것 정리 (5) | 2025.06.19 |
|---|---|
| [작업형1] 시계열 데이터 코드 정리 (0) | 2025.06.15 |
| [작업형1] 섹션3 판다스 코드 정리 (3) | 2025.06.15 |