실기
연습 화면을 불러오는 중…
연습 화면을 불러오는 중…
Python으로 준비하는 실기
코딩이 처음이라면 한 줄 실행부터.
설명 옆에서 직접 써 보고, 결과를 확인하며 배웁니다.
설치·가입 없이 이 화면에서 실행
코드를 실행해 안녕하세요를 출력해요.
처음 보는 코드를 읽고, 오류 메시지를 읽고, 짧은 코드를 스스로 고칠 수 있다.
표에서 원하는 숫자 하나를 뽑아내는 길을 스스로 찾을 수 있다.
전처리 조건을 그대로 코드로 옮겨, 문제가 요구한 자리수로 값을 낼 수 있다.
학습 데이터로 모델을 만들고 평가 데이터의 예측을 규격에 맞는 CSV 로 낼 수 있다.
검정통계량과 p-value 를 구하고 그 결과를 과장 없이 문장으로 옮길 수 있다.
도움말과 파일을 확인하며 혼자 문제를 풀고 제출할 수 있다.
배운 내용을 실전으로
adult-titles.csv 는 인구조사 표본 4,000행이다. title 은 직업명인데 내보낸 시스템마다 표기가 달라, 같은 직업이 Exec-managerial·EXEC-MANAGERIAL·exec-managerial 처럼 대소문자만 다른 여러 형태로 섞여 있다.
title 의 빈칸은 원자료에 실제로 비어 있던 값이다.
(1) title 에 exec 가 대소문자를 구분하지 않고 들어 있는 행이 몇 개인지 정수로 답안에 적는다.
(2) 그 행들의 hours_per_week 평균을 소수점 둘째 자리까지 반올림해 답안에 적는다.
value_counts(dropna=False) 로 같은 직업이 몇 가지 형태로 나뉘어 있는지, 결측이 몇 개인지 한 번에 본다. 결측을 빼고 세면 나중에 .str 에서 걸린다.str.contains('exec', case=False) 는 찾는 문자열과 열의 값을 같은 눈으로 본다. 한쪽만 .str.upper() 로 바꾸는 방식은 나머지 한쪽을 같이 바꾸지 않으면 조용히 0행이 된다.na=False 는 "값이 없으면 조건에 맞지 않은 것으로 본다" 는 선언이다. 빼면 결과에 결측이 섞이고, 그 값으로 행을 고르는 순간 코드가 멈춘다.df.loc[hit, 'hours_per_week'].mean() — 평균의 대상은 조건에 맞는 행이다. df['hours_per_week'].mean() 을 쓰면 4,000행 전체의 평균이라 전혀 다른 값이 된다.contains 는 값 안에 있는지를 보고 == 는 값 전체가 같은지를 본다. Exec-managerial 은 exec 를 포함하지만 exec 와 같지는 않으므로, 일치로 바꾸면 한 행도 걸리지 않는다.import pandas as pd
df = pd.read_csv('adult-titles.csv')
# case=False 가 대소문자를 무시하고, na=False 가 빈칸을 "일치하지 않음" 으로 둔다.
hit = df['title'].str.contains('exec', case=False, na=False)
print(int(hit.sum()))
print(round(df.loc[hit, 'hours_per_week'].mean(), 2))str.contains 는 기본이 대소문자 구분이다. case=False 없이 exec 로 찾으면 소문자로 적힌 122행만 걸리고 나머지 406행을 놓친다. na=False 도 빼놓을 수 없다. 빈칸은 read_csv 가 결측으로 읽고, 결측에 str.contains 를 걸면 결과가 True/False 가 아니라 결측이 된다. 그 값으로 행을 고르려 하면 pandas 가 "결측이 섞인 배열로는 고를 수 없다" 며 멈춘다 — 답이 틀리는 것이 아니라 코드가 아예 서지 않는다. case=False 는 대소문자만 무시할 뿐 글자는 그대로 본다. 찾는 문자열과 열의 값 중 한쪽만 대소문자를 바꿔 놓으면 아무것도 걸리지 않는다.
case=False 를 빼먹고 그대로 찾았다str.contains 의 기본은 대소문자 구분이다. 소문자 exec 로 찾으면 소문자로 적힌 122행만 걸리고 Exec-managerial·EXEC-MANAGERIAL 로 적힌 406행이 빠진다. 형식 오류가 나지 않고 그냥 더 적은 행이 나오므로, 답을 맞춰 보기 전에는 무엇이 빠졌는지 알 수 없다..str.upper() 까지는 갔는데 찾는 문자열을 같이 바꾸지 않은 경우다. EXEC-MANAGERIAL 안에 소문자 exec 는 없으므로 한 행도 걸리지 않는다. 0행이라 평균도 나오지 않는데, 에러가 아니라 조용히 비어 있어서 조건을 의심하기 어렵다.