실기
연습 화면을 불러오는 중…
연습 화면을 불러오는 중…
Python으로 준비하는 실기
코딩이 처음이라면 한 줄 실행부터.
설명 옆에서 직접 써 보고, 결과를 확인하며 배웁니다.
설치·가입 없이 이 화면에서 실행
코드를 실행해 안녕하세요를 출력해요.
처음 보는 코드를 읽고, 오류 메시지를 읽고, 짧은 코드를 스스로 고칠 수 있다.
표에서 원하는 숫자 하나를 뽑아내는 길을 스스로 찾을 수 있다.
전처리 조건을 그대로 코드로 옮겨, 문제가 요구한 자리수로 값을 낼 수 있다.
학습 데이터로 모델을 만들고 평가 데이터의 예측을 규격에 맞는 CSV 로 낼 수 있다.
검정통계량과 p-value 를 구하고 그 결과를 과장 없이 문장으로 옮길 수 있다.
도움말과 파일을 확인하며 혼자 문제를 풀고 제출할 수 있다.
배운 내용을 실전으로
adult-income.csv 는 인구조사 표본 5,000행이며 sex(Male/Female)와 income(<=50K / >50K) 두 범주가 있다.
두 변수가 독립인지 카이제곱 독립성 검정으로 확인한다. 교차표는 행을 sex, 열을 income 으로 만든다.
(1) Male 이면서 >50K 인 칸의 기대도수를 소수점 셋째 자리까지, (2) 연속성 보정을 적용하지 않은 카이제곱 검정통계량을 소수점 셋째 자리까지, (3) 연속성 보정을 적용한 카이제곱 검정통계량을 소수점 셋째 자리까지 반올림해 각각 답안에 적는다.
pd.crosstab(df['sex'], df['income']). 행과 열을 발문이 지정한 순서로 둔다 — 기대도수를 읽을 칸의 위치가 달라진다.stats.chi2_contingency(table) 은 통계량·p-value·자유도·기대도수를 한 번에 돌려준다.expected_freq 는 교차표와 같은 모양의 배열 이다. 행·열 이름으로 위치를 찾아 꺼내야 엉뚱한 칸을 읽지 않는다.correction=False 는 보정 없는 통계량, True 는 Yates 연속성 보정이다. 문항이 어느 쪽을 물었는지 확인한다.import pandas as pd
from scipy import stats
df = pd.read_csv('adult-income.csv')
table = pd.crosstab(df['sex'], df['income'])
plain = stats.chi2_contingency(table, correction=False)
corrected = stats.chi2_contingency(table, correction=True)
row = list(table.index).index('Male')
col = list(table.columns).index('>50K')
print(round(plain.expected_freq[row][col], 3))
print(round(plain.statistic, 3))
print(round(corrected.statistic, 3))기대도수는 "두 변수가 독립이라면 이 칸에 몇 명이 있어야 하는가" 이며 행합×열합÷전체로도 구할 수 있다. 관측도수 1,017 명에 기대도수 802.344 이므로 남성 고소득자가 독립 가정보다 훨씬 많다. scipy 의 `chi2_contingency` 는 2×2 표에서 `correction` 기본값이 `True` 라, 아무 인자도 주지 않으면 연속성 보정이 적용된 223.225 가 나온다. 두 값의 p-value 는 모두 1e-50 수준이라 어느 쪽이든 독립이라는 귀무가설은 기각된다.
correction 을 지정하지 않고 보정 없는 값이라고 생각했다scipy 는 2×2 표에 한해 correction=True 가 기본이다. 3×3 이상에서는 인자가 무시되므로 평소 연습에서는 차이가 드러나지 않다가, 2×2 문항에서만 조용히 다른 값(223.225 vs 224.269)이 나온다.expected_freq 로만 나온다 — 이 자료에서는 1,017(관측)과 802.344(기대)로 크게 다르다.