실기
연습 화면을 불러오는 중…
연습 화면을 불러오는 중…
Python으로 준비하는 실기
코딩이 처음이라면 한 줄 실행부터.
설명 옆에서 직접 써 보고, 결과를 확인하며 배웁니다.
설치·가입 없이 이 화면에서 실행
코드를 실행해 안녕하세요를 출력해요.
처음 보는 코드를 읽고, 오류 메시지를 읽고, 짧은 코드를 스스로 고칠 수 있다.
표에서 원하는 숫자 하나를 뽑아내는 길을 스스로 찾을 수 있다.
전처리 조건을 그대로 코드로 옮겨, 문제가 요구한 자리수로 값을 낼 수 있다.
학습 데이터로 모델을 만들고 평가 데이터의 예측을 규격에 맞는 CSV 로 낼 수 있다.
검정통계량과 p-value 를 구하고 그 결과를 과장 없이 문장으로 옮길 수 있다.
도움말과 파일을 확인하며 혼자 문제를 풀고 제출할 수 있다.
배운 내용을 실전으로
adult-export.csv 는 인구조사 표본 4,000행이다. 내보낸 쪽에 버그가 있어, 값이 없는 필드를 아예 쓰지 않은 행이 섞여 있다.
그런 행은 workclass 부터 뒤의 값이 한 칸씩 왼쪽으로 밀리고 마지막 칸인 income 이 비어 있다. 밀린 행의 hours_per_week 자리에는 <=50K 같은 소득 구분이 들어가 있다.
(1) 값이 밀린 행이 몇 개인지 정수로 답안에 적는다.
(2) 밀린 행을 제자리로 돌린 뒤, 4,000행 전체의 hours_per_week 평균을 소수점 둘째 자리까지 반올림해 답안에 적는다.
밀린 행의 workclass 는 내보낼 때 통째로 빠진 값이다. 지어내지 말고 결측으로 둔다 — 그 행들은 원래 workclass 가 비어 있던 행이다.
df.dtypes 로 숫자여야 할 열이 문자열로 읽혔는지 본다. hours_per_week 가 문자열이면 그 열에 숫자가 아닌 값이 섞여 있다는 뜻이고, 밀림은 그런 식으로 드러난다.income 이 비었는지로 찾는다. 원자료에서 소득 구분은 모든 행에 있으므로 빈칸은 곧 밀림이다. workclass 가 비었는지로 찾으면 안 된다 — 밀린 행의 그 칸에는 뒤에서 당겨온 값이 들어가 있다.pd.read_csv(..., dtype=str). 숫자 열로 잡힌 칸에 문자열을 옮기려 하면 pandas 가 막는다. 자리를 맞추는 동안에는 모든 칸이 그냥 글자다.shift(periods=1, axis=1) 은 값을 오른쪽 열로 한 칸 민다. axis=1 을 빼면 행 방향으로 밀려서 엉뚱한 행의 값이 섞인다. 되돌린 뒤 맨 앞 칸은 결측이 되는데, 그것이 내보낼 때 빠진 workclass 다.pd.to_numeric 은 자리를 맞춘 뒤에 부른다. 먼저 부르면 밀린 값이 결측으로 바뀌어 사라지고, 그 뒤에는 무엇이 사라졌는지 알 길이 없다.import pandas as pd
# 밀린 파일은 먼저 **전부 문자열로** 읽는다. 기본값으로 읽으면
# education_num 이 int64 로 잡혀서, 그 칸에 밀려 있던 '40' 을 옮길 때
# pandas 가 dtype 을 이유로 막는다.
df = pd.read_csv('adult-export.csv', dtype=str)
# 마지막 칸이 비었다는 것이 밀림의 흔적이다. income 은 원자료에 결측이 없다.
broken = df['income'].isna()
print(int(broken.sum()))
cols = ['workclass', 'education_num', 'hours_per_week', 'income']
# 한 칸 오른쪽으로 되돌린다. 앞이 비는데, 그 자리가 원래 비어 있던 workclass 다.
df.loc[broken, cols] = df.loc[broken, cols].shift(periods=1, axis=1).values
print(round(pd.to_numeric(df['hours_per_week']).mean(), 2))밀림은 income 이 비었는지로 찾는다 — 원자료에서 소득 구분은 모든 행에 있으므로, 비어 있다면 그 행은 한 칸 밀린 것이다. shift(periods=1, axis=1) 은 행 방향이 아니라 열 방향으로 한 칸 민다. 맨 앞이 결측으로 비는데, 그 자리가 바로 내보낼 때 빠진 workclass 라 정확히 맞아떨어진다. dtype=str 로 읽는 것이 핵심이다. 기본값으로 읽으면 education_num 이 정수 열이 되고, 거기에 밀려 있던 문자열을 옮기려는 순간 pandas 가 거절한다. 복구하지 않고 pd.to_numeric(..., errors='coerce') 로 숫자가 아닌 값만 버리면 평균이 41.1 이 된다 — 밀린 218행이 통째로 빠지고, 그 행들의 실제 근로시간은 평균보다 낮기 때문이다.
pd.to_numeric(..., errors='coerce') 는 밀린 행의 hours_per_week 를 결측으로 바꾸고, mean() 은 결측을 빼고 센다. 그래서 형식 오류도 경고도 없이 218행이 통째로 집계에서 빠진다. 빠진 행들의 실제 근로시간이 평균보다 낮아서 결과가 40.56 이 아니라 41.1 로 높아진다.workclass 가 비었는지로 찾았다"값이 없어서 밀렸으니 그 열이 비어 있겠지" 라는 생각이 정확히 거꾸로다. 밀린 행에서는 그 칸에 뒤에서 당겨온 값이 들어가 있어 비어 있지 않고, 반대로 비어 있는 칸은 맨 끝으로 옮겨가 있다. 이 기준으로는 한 행도 찾지 못해 복구가 아예 일어나지 않는다.