연습을 실기 체험 환경에서 해봐야 함!
실기 체험 환경에서 문제를 그대로 풀어볼 수 있음!
한 줄 씩 출력되는 것이 아니기 때문에 중간 중간 확인해봐야 함
파일 경로의 경우 주어짐
# 문제 1
# mpg 변수의 제 1사분위스를 구하고 정수값으로 출력하시오
df = pd.read_csv('mtcars.csv')
# 풀이
Q1 = df['mpg'].quantile(0.25)
print(round(Q1)) # 소수점 둘째 자리까지 출력 -> round(Q1, 2)
# 정답 : 15
###########################################################
# 문제 2
# mpg 값이 19이상, 21 이하인 데이터의 수를 구하시오
df = pd.read_csv("mtcars.csv")
# 풀이
cond1 = (df['mpg'] >= 19)
cond2 = (df['mpg'] <= 21)
print(len(df[cond1 & cond2]))
# 정답 : 5
###################################################
# 문제 3
# hp 변수의 IQR 값을 구하시오
df = pd.read_csv("mtcars.csv")
# 풀이
Q1 = df['hp'].quantile(0.25)
Q3 = df['hp'].quantile(0.75
IQR = Q3 - Q1
print(IQR)
# 정답 : 83.5
###################################
# 문제 4
# wt 변수의 상위 10개 값의 총합을 구하여 소수점을 버리고 정수로 출력하시오
df = pd.read_csv("mtcars.csv")
# 풀이
top10 = df.sort_values('wt', ascending=False)
sub_top10 = sum(top10['wt'].head(10))
print(int(sum_top10))
# 주의! : 소수점 반올림이 아니라 버리는 문제!
# 정답 42
###################
# 문제 5
# 전체 자동차에서 cyl가 6인 비율이 얼마인지 소수점 첫째자리까지 출력하시오
df = pd.read_csv("mtcars.csv")
# 풀이
len_6 = len(df[df['cyl'] == 6](
len_total = len(df)
print(round(len_6/len_total, 1))
# 정답 : 0.2
##########################333
# 문제6
# 첫번째 행 부터 순서대로 10개 뽑은 후 mpg 열의 평균값을 반올림하여 정수로 출력
df = pd.read_csv("mtcars.csv")
# 풀이
df10 = df[:10] # df.loc[:9], df.head(10)
mean10 = df10['mpg'].mean()
print(round(mean10))
# 정답 : 20
#############################
# 문제 7
# 첫번째 행부터 순서대로 50%까지 데이터를 뽑아 wt 변수의 중앙값을 구하시오
df = pd.read_csv("mtcars.csv")
# 풀이
p50 = int(len(df) * 0.5)
df50 = df[:p50]
print(df50['wt'].median())
# 정답 : 3.44
#########################
# 문제 8
# 결측값이 있는 데이터의 수를 구하시오
df = pd.DataFrame({
'날짜': ['20220103', '20220105', None, '20230127', '20220203',
'20220205','20230210','20230223','20230312','20230422','20220505'.'20230511'],
'제품':['A', 'B', None,'B','A',None,'A','B','A','B','A','A'],
'판매수':[3,None,5,10,10,10,15,15,20,None,30,40],
'개당수익':[300,400,500,600,400,500,500,600,600,700,600,600]})
# 풀이
missing = df.isnull().sum()
print(missing)
# 정답 : 5
##########################################
# 문제 9
# '판매수' 컬럼의 결측값을 판매수의 중앙값으로 대체하고 판매수의 평균값을 정수로 출력
# 위랑 똑값은 데이터
# 풀이
Q2 = df['판매수'].median()
df['판매수'] = df['판매수'].fillna(Q2)
mean = df['판매수'].mean()
print(round(mean))
# 정답 : 15
# 문제 10
# 판매수 컬럼에 결측치가 있는 행을 제거하고,
# 첫번째 행부터 순서대로 50%까지의 데이터를 추출하여
# 판매 변수의 Q1(제1사분위수) 값을 정수로 출력하시오
# 위와 똑같은 df
# 풀이
df = df['판매수'].dropna()
# 50% 데이터 추출
per50 = int(len(df)*0.5)
df = df[:per50]
print(round(df.quantile(0.25)))
# 정답 : 5
df = pd.raed_csv("mtcars.csv")
df.head()
# 문제 11
# cyl이 4인 자동차와 6인 자동차 그룹의 mpg 평균값 차이를 절대값으로 정수로 출력하시오
# 풀이
cond1 = (df['cyl'] == 4)
cond1 = (df['cyl'] == 6)
cyl4 = df[cond1]['mpg'].mean()
cyl6 = df[cond2]['mpg'].mean()
print(round(abs(cyl4 - cyl6)))
# 정답 : 7
################################
# 문제 12
# hp 변수에 대해 데이터 표준화(Z-score)를 진행하고 이상치의 수를 구하시오
# 단, 이상치는 Z값이 1.5를 초과하거나 -1.5 미만인 값이다
df = pd.read_csv('mtcars.csv')
# 풀이
# X = (X-평균)/표준편차
std = df['hp'].std()
mean_hp = df['hp'].mean()
df['zscore'] = (df['hp']-mean_hp) / std
cond1 = (df['zscore'] > 1.5)
cond2 = (df['zscore'] < -1.5)
print(len(df[cond1]) + len(df[cond2]))
# 정답 : 2
##############################
# 문제 13
# mpg 컬럼을 최소최대 scaling을 진행한 후 0.7보다 큰 값을 가지는 레코드 수를 구하라
df = pd.read_csv('mtcars.csv')
# 풀이
# 공식 : (x-min) / (max-min)
min_mpg = df['mpg'].min()
max_mpg = df['mpg'].max()
df['mpg'] = (df['mpg'] - min_mpg) / (max_mpg - min_mpg)
cond1 = (df['mpg'] > 0.7)
print(len(df[cond1]))
# 정답 : 5
################################
# 문제 14
# wt 컬럼에 대해 상자그림 기준으로 이상치의 개수를 구하시오
df = pd.read_csv('mtcars.csv')
# 풀이
# 이상치 : Q1, Q3로 부터 1.5IQR을 넘어가는 값
Q1 = df['wt'].quantile(0.25)
Q3 = df['wt'].quantile(0.75)
IQR = Q3-Q1
upper = Q3 + 1.5*IQR
lower = Q1 - 1.5*IQR
cond1 = (df['wt'] > upper)
cond2 = (df['wt] < lower)
print(len(df[cond1]) + len(df[cond2]))
# 정답 : 3
########################################
# 문제 15
# 판매수 컬럼의 결측치를 최소값으로 대체하고
# 결측치가 있을 때와 최소값으로 대체했을 때 평균값의 차이를 절대값으로 정수로 출력하시오
df = pd.DataFrame({
'날짜': ['20220103', '20220105', None, '20230127', '20220203',
'20220205','20230210','20230223','20230312','20230422','20220505'.'20230511'],
'제품':['A', 'B', None,'B','A',None,'A','B','A','B','A','A'],
'판매수':[3,None,5,10,10,10,15,15,20,None,30,40],
'개당수익':[300,400,500,600,400,500,500,600,600,700,600,600]})
# 풀이
df2 = df.copy()
min_ea = df['판매수'].min()
df2['판매수'] = df2['판매수'].fillna(min_ea)
with_m = df['판매수'].mean() # 결측치 있음
without_m = df2['판매수'].mean() # 결측치 없음
print(round(abs(with_m - without_m)))
# 정답 : 2
############################
# 문제 16
# vs 변수가 0이 아닌 차량 중에 mpg 값이 가장 큰 차랑의 hp 값을 출력
df = pd.read_csv('mtcars.csv')
# 풀이
df = df[df['vs'] != 0]
# 내림차순
df = df.sort_values('mpg', ascending=False)
print(df['hp'].iloc[0]) # iloc -> 행 단위?, loc는 인덱스로 가버림?
# 정답 : 65
##############################################
# 문제 17
# gear 변수값이 3,4인 두 그룹의 hp표준편차값의 차이를 절대값으로 소수점 첫째자리까지 출력
df = pd.read_csv('mtcars.csv')
# 풀이
gear3 = df[df['gear'] == 3]
gear4 = df[df['gear'] == 4]
std3 = gear3.std()
std4 = gear4.std()
print(round(abs(std3 - std4), 1)
# 정답 : 21.8
#######################################
# 문제 18
# gear 변수의 값별로 그룹화하여 mpg 평균값을 산출하고
# 평균값이 높은 그룹의 mpg 제3사분위수 값을 구하시오
df = pd.read_csv('mtcars.csv')
# 풀이
df = df.loc[:, ['gear', 'mpg']]
# gear 변수로 그룹화하여 mpg 평균값 보기
print(df.groupby('gear').mean()) # 그룹4가 가장 높음 -> 확인 후 주석처리
# gear=4인 그룹의 mpg Q3 구하기
gear4 = df[df['gear'] == 4]
print(gear4['mpg'].quantile(0.75)
# 정답 : 28.075
######################################
# 문제 19
# hp 항목의 상위 7번째 값으로 상위 7개 값을 변환한 후
# hp가 150 이상인 데이터를 추출하여 hp의 평균값을 반올림하여 정수로 출력하시오
df = pd.read_csv('mtcars.csv')
# 풀이
# hp 열 기준으로 내림차순 정렬
df = df.sort_values('hp', ascending=False)
df = df.reset_index(drop=True) # 기존 index 삭제
# hp 상위 7번째 값 확인
top7 = df['hp'].loc[6]
# np.where 활용
df['hp'] = np.where(df['hp'] > top7, top7, df['hp'])
cond1 = (df['hp'] >= 150)
df = df[cond1]
print(round(df['hp'].mean()))
# 정답 : 187
################################
# 문제 20
# car 변수에 Merc 문구가 포함된 자동차의 mpg 평균값을 정수로 출력하시오
df = pd.read_csv('mtcars.csv')
# 풀이
df2 = df[df['car'].str.contains("Merc")] # 문자열 추출 알아두기
print(round(df2['mpg'].mean()))
# 시험환경에서 답구하는 방법(reset_index() 사용후)
# df = df.reset_index() # inplace=True로 사용해도 됨
# df2 = df[df['index'].str.contains("Merc") ]
# 정답 19
# 문제 21
# 22년 1분기 A제품의 매출액을 구하시오
#(매출액 = 판매수*개당수익)
df = pd.DataFrame({
'날짜': ['20220103', '20220105', '20230105, '20230127', '20220203',
'20220205','20230210','20230223','20230312','20230422',
'20220505'.'20230511'],
'제품':['A', 'B', 'A','B','A','B','A','B','A','B','A','A'],
'판매수':[3,5,5,10,10,10,15,15,20,25,30,40],
'개당수익':[300,400,500,600,400,500,500,600,600,700,600,600]})
# 풀이1
# 데이터 타입 datetime으로 변경
df['날짜'] = pd.to_datatime(df['날짜'])
# 년, 월, 일 변수(열) 추가하기
df['year'] = df['날짜'].dt.year
df['month'] = df['날짜'].dt.month
df['day'] = df['날짜'].dt.day
# 매출액 변수 추가히기
df['매출액'] = df['판매수'] * df['개당수익']
# 22년으로 필터링
df = df[df['year'] == 2022]
df.head()
# 1,2,3월 매출액 계산
m1 = df[df['month']==1]['매출액'].sum()
m2 = df[df['month']==2]['매출액'].sum()
m3 = df[df['month']==3]['매출액'].sum()
print(m1+m2+m3)
# 풀이2
df['날짜'] = pd.to_datetime(df['날짜'])
# 매출액 변수 추가하기(위와 동일)
df['매출액'] = df['판매수'] * df['개당수익']
df_after = df[df['날짜'].between('2022-01-01', '2022-04-01')] # 4월1일 포함x
print(df_after['매출액'].sum())
# 정답 : 11900
# 풀이3
df['날짜'] = pd.to_datetime(df['날짜'])
df['매출액'] = df['판매수'] * df['개당수익']
# 날짜를 인덱스로 설정후 loc 함수 사용
df = df.set_index('날짜')
df_after = df.loc[(df.index<='2022-03-31') & (df.index>=2022-01-01')]
print(df_after['매출액'].sum())
#####################################
# 문제 22
# 22년과 23년의 총 매출액 차이를 절대값으로 구하시오
df = pd.DataFrame({
'날짜': ['20220103', '20220105', '20230105, '20230127', '20220203',
'20220205','20230210','20230223','20230312','20230422',
'20220505'.'20230511'],
'제품':['A', 'B', 'A','B','A','B','A','B','A','B','A','A'],
'판매수':[3,5,5,10,10,10,15,15,20,25,30,40],
'개당수익':[300,400,500,600,400,500,500,600,600,700,600,600]})
# 풀이
df['날짜'] = pd.to_datetime(df['날짜'])
df['year'] = df['날짜'].dt.year
df['매출액'] = df['판매수']*df['개당수익']
df22 = df[df['year'] == 2022]
df22_sum = df22['매출액'].sum()
df23 = df[df['year'] == 2023]
df23_sum = df23['매출액'].sum()
print(abs(df22_sum - df23_sum))
# 정답 : 48600
####################################
# 문제 23
# 23년 총 매출액이 큰 제품의 23년 판매수를 구하시오
df = pd.DataFrame({
'날짜': ['20220103', '20220105', '20230105, '20230127', '20220203',
'20220205','20230210','20230223','20230312','20230422',
'20220505'.'20230511'],
'제품':['A', 'B', 'A','B','A','B','A','B','A','B','A','A'],
'판매수':[3,5,5,10,10,10,15,15,20,25,30,40],
'개당수익':[300,400,500,600,400,500,500,600,600,700,600,600]})
# 풀이
df['날짜'] = pd.to_datetime(df['날짜'])
df['매출액'] = df['판매수'] * df['개당수익']
df = df[df['year'] == 2023]
# A매출액
df_a = df[df['제품']=='A']
A_sales=df_a['매출액'].sum()
# B 매출액
df_b = df[df['제품'] == 'B']
B_sales = df_b['매출액'].sum()
A_sum = df_a['판매수'].sum()
print(A_sum)
# 정답 : 46000
##################################
# 문제 24
# 매출액이 4천원 초과, 1만원 미만인 데이터 수를 출력하시오
# 풀이
df['매출액'] = df['판매수'] * df['개당수익']
cond1 = (df['매출액'] > 4000)
cond2 = (df['매출액'] < 10000)
print(len(df[cond1 & cond1]))
# 정답 : 4
#####################################
# 문제 25
# 23년 9월 24일 16:00~22:00사이에 전체 제품의 판매수를 구하시오
df = pd.DataFrame({
'제품':['A', 'B', 'A','B','A','B','A'],
'판매수':[5,10,15,15,20,25,40],
'개당수익':[500,600,500,600,600,700,600]})
time = pd.date_range('2023-09-24 12:25:00', '2023-09-25 14:45:30', periods=7)
df['time'] = time
df = df[ ['time', '물품', '판매수', '개당수익']]
# 풀이1
df['time'] = pd.to_datetime(df['time'])
df = df.set_index('time', drop=False) # 디폴트 true
# 24일 필터링
df_after = df[df['time'].between('2023-09-24', '2023-09-25')] # 25일 미포함
# 시간 필터링
df = df_after.between_time(start_time='16:00', end_time='22:00') # 포함 기준
# 전체 판매수 구하기
print(df['판매수'].sum())
# 풀이 2
df['time'] = pd.to_datetime(df['time'])
df = df.set_index('time')
df = df.loc[(df.index>='2023-09-24 16:00:00') & (df.index <= '2023-09-24 22:00:00')]
print(df['판매수'].sum())
# 정답 25
####################################
# 문제 26
# 9월 25일 00:00~12:00까지의 B물품의 매출액 총합을 구하시오
df = pd.DataFrame({
'제품':['A', 'B', 'A','B','A','B','A'],
'판매수':[5,10,15,15,20,25,40],
'개당수익':[500,600,500,600,600,700,600]})
time = pd.date_range('2023-09-24 12:25:00', '2023-09-25 14:45:30', periods=7)
df['time'] = time
df = df[ ['time', '물품', '판매수', '개당수익']]
df = df.set_index('time', drop=True)
# 풀이 1
df['매출액'] = df['판매수'] * df['개당수익']
df = df.reset_index()
df = df.set_index('time', drop=False
df['time'] = pd.to_datetime(df['time'])
# between은 변수에 있어야함
df_after = df[df['time'].between('2023-09-25', '2023-09-26')] # 미포함
# 시간 필터링, 주의:시간이 index에 위치해야 함
df = df_after.between_time(start_time='00:00', end_time='12:00') # 포함
df = df[df['물품'] == 'B']
print(df['매출액'].sum())
# 풀이 2
df['매출액'] = df['판매수'] * df['개당수익']
df = df.loc[(df.index >= '2023-09-25 00:00:00') & (df.index <= '2023-09-25 12:00:00)]
df = df[df['물품'] == 'B']
print(df['매출액'].sum())
# 정답 : 26500
####################################
# 문제 27
# 9월 24일 12:00~24:00까지의 A물품의 매출액 총합을 구하시오
df = pd.DataFrame({
'제품':['A', 'B', 'A','B','A','B','A'],
'판매수':[5,10,15,15,20,25,40],
'개당수익':[500,600,500,600,600,700,600]})
time = pd.date_range('2023-09-24 12:25:00', '2023-09-25 14:45:30', periods=7)
df['time'] = time
df = df[ ['time', '물품', '판매수', '개당수익']]
df = df.set_index('time', drop=True)
# 풀이 1
df['매출액'] = df['판매액'] * df['개당수익']
df = df.reset_index()
df = set_index('time', drop=False)
df['time'] = pd.to_datetime(df['time'])
df_after = df[df['time'].between('2023-09-24', '2029-09-25')]
df = df_after.between_time(start_time='12:00', end_time='23:59') # 24:00은 에러남
df = df[df['물품'] == 'A']
print(df['매출액'].sum())
# 풀이 2
df['time'] = pd.to_datetime(df['time'])
df = df.set_index('time')
df['매출액'] = df['판매액'] * df['개당수익']
df = df.loc[(df.index>='2023-09-24 12:00:00') & (df.index<='2023-09-24 23:59:59)]
df = df[df['물품'] == 'A']
print(df['매출액'].sum())
# 정답 : 10000