03단계 · 1유형 — 전처리와 계산
이상치 세고 빼고 다시 계산하기
경계 밖 행을 세고, 빼고, 평균이 얼마나 달라지는지 확인한다.
먼저 알아볼게요
코드로 이동 ↓경계를 구했으면 조건으로 거른다. 이상치는 (값 < 아래) | (값 > 위), 남길 것은 (값 >= 아래) & (값 <= 위) 다. 부등호 방향과 |/& 를 헷갈리면 정반대 답이 나온다.
발문이 "이상치를 제거하고" 라고 하면 제거한 데이터로 그 다음 계산을 한다. 제거 전 값으로 계산하면 오류 없이 틀린 답이 나온다.
이상치를 제거하는 것과 경계값으로 자르는 것(clip)은 다르다. 제거는 행이 사라지고, clip 은 행 수가 그대로다. 발문의 동사를 그대로 따라야 한다.
제거 전후 평균을 나란히 찍어 보면, 이 데이터에서는 거의 움직이지 않는다. 이상치가 위아래에 고르게 있었기 때문이다. 평균이 안 변했으니 제거가 의미 없다는 뜻이 아니다 — 발문이 제거를 시켰으면 제거한 데이터가 다음 계산의 입력이고, 표준편차나 최댓값 같은 다른 값은 크게 달라진다.
여기서도 자리수를 고정해 출력한다. 소수 넷째 자리까지 요구하는 발문이 흔하다.
이렇게 써요
import pandas as pd
df = pd.read_csv("health.csv")
w = df["몸무게"]
q1, q3 = w.quantile(0.25), w.quantile(0.75)
iqr = q3 - q1
print(int(((w < q1 - 1.5 * iqr) | (w > q3 + 1.5 * iqr)).sum()))기억할 한 가지
"제거하고 계산" 은 제거한 데이터로 계산한다는 뜻이다. 제거와 clip 은 다른 동사다.
직접 해보기
health.csv 의 콜레스테롤 에서 ① 이상치 행 수 ② 이상치를 뺀 행 수 ③ 제거 전 평균(소수 4) ④ 제거 후 평균(소수 4)을 출력하세요.
제공 파일 1개 · 내용 보기
파일은 준비되어 있어요. 코드에서 이름으로 불러오세요.
health.csv
성별,나이,키,몸무게,콜레스테롤,식단,운동,진단 여,27,167,79,203.3,C,예,0 남,73,176,77,235.1,A,아니오,0 남,74,168,57,229.0,B,아니오,1 여,50,159,60,251.0,C,아니오,0 여,71,161,46,201.6,C,예,0 남,70,182,82,189.1,C,예,0 여,47,161,59,240.0,C,아니오,1 남,52,179,73,197.5,A,예,0 남,57,176,74,207.0,A,예,0 남,65,167,51,185.8,A,예,0 여,25,165,49,202.1,B,아니오,0 남,59,169,59,205.3,B,아니오,0 여,26,164,58,201.2,B,아니오,0 남,38,166,65,193.3,C,아니오,0 남,58,170,60,199.0,A,아니오,1 여,55,160,66,191.8,C,아니오,0 여,37,160,69,234.6,C,아니오,0 여,50,161,65,204.2,B,예,0 남,59,172,50,228.9,C,예,0 남,64,168,61,196.7,A,아니오,1 남,60,178,73,208.7,B,예,0 남,38,168,71,183.0,A,예,0 여,42,159,53,204.0,A,예,0 여,45,164,55,183.2,A,예,0 여,37,157,72,212.6,B,아니오,0 남,38,171,66,200.9,A,아니오,0 남,25,164,55,213.1,C,아니오,0 여,37,166,64,178.7,A,아니오,0 남,37,173,79,197.4,C,예,0 남,42,177,75,262.3,C,아니오,1 남,49,173,64,161.1,C,예,0 여,39,158,64,187.9,A,아니오,0 남,58,171,68,225.6,A,아니오,0 여,29,167,71,176.7,A,예,0 남,46,179,71,222.7,B,아니오,0 여,39,161,48,158.9,C,예,0 남,60,168,60,175.7,B,아니오,0 여,42,169,58,181.6,B,예,0 여,49,155,50,221.8,C,예,0 여,60,156,51,252.5,A,아니오,0 남,29,174,74,213.5,C,아니오,0 여,34,164,57,172.4,A,아니오,0 여,69,155,40,188.8,A,아니오,0 여,59,165,56,211.3,B,아니오,0 여,71,161,46,188.6,A,아니오,1 남,25,174,66,168.0,A,예,0 여,35,147,31,180.7,C,예,0 여,73,155,54,211.2,C,아니오,0 여,48,159,63,191.7,A,예,0 남,30,167,69,166.0,A,아니오,0 여,36,168,58,158.9,A,아니오,0 남,25,162,68,202.5,B,예,0 여,52,166,60,155.4,C,예,0 여,51,161,62,196.7,A,예,0 여,33,163,57,169.2,A,아니오,0 남,52,177,68,217.5,A,아니오,0 남,51,172,65,204.7,C,예,0 남,38,172,79,201.2,B,예,0 남,67,181,79,238.9,C,아니오,0 남,50,170,62,186.9,C,예,0 여,55,155,67,214.7,B,예,0 여,38,166,63,188.7,B,예,0 남,35,177,80,149.7,A,예,0 여,73,167,60,220.7,C,예,0 남,37,173,57,157.1,B,아니오,0 여,42,157,51,190.2,A,예,0 여,60,160,61,180.4,A,아니오,0 남,49,176,71,208.3,C,예,0 남,27,168,64,198.4,B,예,0 여,47,165,53,183.3,A,예,0 여,38,147,37,210.2,B,예,0 남,34,171,63,207.8,C,예,0 여,74,166,59,190.5,C,예,1 여,61,160,52,190.7,C,아니오,0 여,57,162,70,195.5,C,아니오,0 여,37,166,63,164.6,A,예,0 여,32,153,53,202.9,B,아니오,0 남,74,169,66,219.7,C,아니오,0 남,62,178,67,207.1,A,아니오,0 남,56,175,75,177.0,A,아니오,0 남,46,170,57,139.4,B,예,0 남,32,180,84,191.4,B,아니오,0 남,26,172,61,177.9,A,예,0 남,53,171,76,195.3,A,예,0 남,51,167,53,188.8,C,예,0 남,39,178,75,204.0,A,예,0 여,73,158,53,189.1,B,아니오,0 남,59,171,53,193.8,C,예,0 남,46,167,77,200.4,C,예,0 여,42,159,63,205.1,C,아니오,0 남,53,175,62,138.0,C,예,0 남,71,176,66,210.3,B,예,1 남,35,175,73,196.1,A,아니오,0 남,32,158,48,199.7,B,예,0 여,73,155,61,182.1,B,예,0 남,69,180,72,192.8,B,예,0 남,56,161,59,168.3,A,예,0 남,57,190,75,193.9,C,예,0 여,63,162,56,192.5,B,아니오,0 남,74,175,76,211.0,A,예,0 남,39,178,89,210.9,A,아니오,0 여,67,160,55,202.4,C,예,0 남,64,172,55,206.3,B,예,0 여,52,165,75,209.5,B,아니오,0 남,66,172,70,215.0,C,아니오,0 남,67,177,84,187.1,A,예,0 남,39,183,75,180.3,C,예,0 여,71,162,61,199.0,B,예,0 남,56,168,72,210.1,A,아니오,0 여,25,158,42,172.7,C,예,0 여,64,147,50,177.1,B,예,0 남,26,180,74,201.2,A,아니오,0 여,36,162,55,215.4,C,아니오,0 남,70,175,73,212.7,B,아니오,1 여,73,164,53,197.3,A,예,0 여,31,154,45,192.5,B,아니오,0 여,29,159,51,147.9,A,아니오,0 여,66,162,46,202.9,C,아니오,0 남,51,181,95,179.2,A,예,0 남,50,174,59,181.2,A,아니오,0 남,50,160,65,187.8,B,예,0 여,72,175,65,216.2,A,아니오,1 남,69,171,68,192.1,B,아니오,0 남,52,177,78,185.5,C,예,0 남,70,169,83,206.2,A,예,0 여,37,159,50,177.4,C,예,0 남,67,162,60,235.3,C,아니오,0 여,42,158,56,224.3,B,예,0 여,59,154,36,214.2,B,예,0 남,30,170,68,163.8,B,예,0 남,73,168,61,218.5,C,예,0 남,57,157,57,191.5,B,예,0 남,52,166,59,225.2,C,아니오,0 여,26,159,63,181.1,A,아니오,1 남,35,177,75,200.6,A,아니오,0 여,29,155,41,132.1,A,예,0 여,60,162,64,244.1,C,예,0 여,55,159,55,222.1,B,아니오,1 남,62,181,67,214.9,C,예,0 남,64,171,64,215.4,B,아니오,0 남,56,176,72,227.0,C,아니오,0 여,36,163,46,183.5,C,아니오,0 여,48,155,46,201.9,C,예,0 여,67,163,44,156.1,A,예,0 남,27,176,71,167.5,A,예,0 여,64,158,48,198.1,C,아니오,0 남,46,167,66,170.4,B,아니오,0 여,39,159,65,208.6,C,아니오,0 남,52,167,55,191.7,B,예,0 여,45,155,60,205.7,B,예,0
내 코드 Python
Python 준비 중… 처음 한 번만 내려받아요
들여쓰기: Tab · 편집기에서 나가기: Esc 다음 Tab
실행 결과
실행하면 코드가 출력한 내용이 여기에 나타나요.
막혔을 때
풀이와 비교하기
내 코드와 한 줄씩 비교해 보세요. 풀이를 보는 것만으로 완료되지는 않아요.
import pandas as pd
df = pd.read_csv("health.csv")
chol = df["콜레스테롤"]
q1, q3 = chol.quantile(0.25), chol.quantile(0.75)
iqr = q3 - q1
low = q1 - 1.5 * iqr
high = q3 + 1.5 * iqr
outlier = df[(chol < low) | (chol > high)]
keep = df[(chol >= low) & (chol <= high)]
print(outlier.shape[0])
print(keep.shape[0])
print(round(chol.mean(), 4))
print(round(keep["콜레스테롤"].mean(), 4))