Similar documents
statistics

기술통계

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

데이터 시각화

(001~006)개념RPM3-2(부속)

확률 및 분포

Windows 8에서 BioStar 1 설치하기

<B3EDB9AEC0DBBCBAB9FD2E687770>

Vector Differential: 벡터 미분 Yonghee Lee October 17, 벡터미분의 표기 스칼라미분 벡터미분(Vector diffrential) 또는 행렬미분(Matrix differential)은 벡터와 행렬의 미분식에 대 한 표

아이콘의 정의 본 사용자 설명서에서는 다음 아이콘을 사용합니다. 참고 참고는 발생할 수 있는 상황에 대처하는 방법을 알려 주거나 다른 기능과 함께 작동하는 방법에 대한 요령을 제공합니다. 상표 Brother 로고는 Brother Industries, Ltd.의 등록 상

생존분석의 추정과 비교 : 보충자료 이용희 December 12, 2018 Contents 1 생존함수와 위험함수 생존함수와 위험함수 예제: 지수분포

Microsoft PowerPoint - chap04-연산자.pptx

untitled

untitled

Microsoft PowerPoint - chap01-C언어개요.pptx

adfasdfasfdasfasfadf

슬라이드 1

1 경영학을 위한 수학 Final Exam 2015/12/12(토) 13:00-15:00 풀이과정을 모두 명시하시오. 정리를 사용할 경우 명시하시오. 1. (각 6점) 다음 적분을 구하시오 Z 1 4 Z 1 (x + 1) dx (a) 1 (x 1)4 dx 1 Solut

PowerPoint 프레젠테이션

<3036C7E2BCF6C3D6C1BEBABB2E687770>

G Power

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

3 장기술통계 : 수치척도 Part B 분포형태, 상대적위치, 극단값 탐색적자료분석 두변수간의관련성측정 가중평균과그룹화자료

마지막 변경일 2018년 5월 7일 ** 이항분포와 정규분포의 관계 ** Geogebra와 수학의 시각화 책의 3.2소절 내용임. 가장 최근 파일은 링크를 누르면 받아 보실 수 있습니다.

공공기관임금프리미엄추계 연구책임자정진호 ( 한국노동연구원선임연구위원 ) 연구원오호영 ( 한국직업능력개발원연구위원 ) 연구보조원강승복 ( 한국노동연구원책임연구원 ) 이연구는국회예산정책처의정책연구용역사업으로 수행된것으로서, 본연구에서제시된의견이나대안등은

Microsoft Word - SAS_Data Manipulate.docx

와플-4년-2호-본문-15.ps

methods.hwp

R t-..

저작자표시 - 비영리 - 변경금지 2.0 대한민국 이용자는아래의조건을따르는경우에한하여자유롭게 이저작물을복제, 배포, 전송, 전시, 공연및방송할수있습니다. 다음과같은조건을따라야합니다 : 저작자표시. 귀하는원저작자를표시하여야합니다. 비영리. 귀하는이저작물을영리목적으로이용할

LaTeX. [width=1em]Rlogo.jpg Sublime Text. ..

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

<BFDCB1B9C0CE20C5F5C0DAB1E2BEF7C0C720B3EBBBE7B0FCB0E82E687770>

exp

PowerPoint Presentation

°æÁ¦Àü¸Á-µ¼º¸.PDF

= ``...(2011), , (.)''

09 강제근로의 금지 폭행의 금지 공민권 행사의 보장 중간착취의 금지 41 - 대판 , 2006도7660 [근로기준법위반] (쌍용자동차 취업알선 사례) 11 균등대우의 원칙 43 - 대판 , 2002도3883 [남녀고용평등법위

<5BB0EDB3ADB5B55D B3E2B4EBBAF12DB0ED312D312DC1DFB0A32DC0B6C7D5B0FAC7D02D28312E BAF2B9F0B0FA20BFF8C0DAC0C720C7FCBCBA2D D3135B9AEC7D72E687770>


Microsoft PowerPoint - chap03-변수와데이터형.pptx

PowerPoint Presentation

연구노트

(Exposure) Exposure (Exposure Assesment) EMF Unknown to mechanism Health Effect (Effect) Unknown to mechanism Behavior pattern (Micro- Environment) Re

저작자표시 - 비영리 - 변경금지 2.0 대한민국 이용자는아래의조건을따르는경우에한하여자유롭게 이저작물을복제, 배포, 전송, 전시, 공연및방송할수있습니다. 다음과같은조건을따라야합니다 : 저작자표시. 귀하는원저작자를표시하여야합니다. 비영리. 귀하는이저작물을영리목적으로이용할

슬라이드 1

슬라이드 1

PowerPoint 프레젠테이션

<BBE7B8B3B4EBC7D0B0A8BBE7B9E9BCAD28C1F8C2A5C3D6C1BE E687770>

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

1

Artificial Intelligence: Assignment 6 Seung-Hoon Na December 15, Sarsa와 Q-learning Windy Gridworld Windy Gridworld의 원문은 다음 Sutton 교재의 연습문제

쉽게 풀어쓴 C 프로그래밍

dist=dat[:,2] # 기초통계량구하기 len(speed) # 데이터의개수 np.mean(speed) # 평균 np.var(speed) # 분산 np.std(speed) # 표준편차 np.max(speed) # 최대값 np.min(speed) # 최소값 np.me

PathEye 공식 블로그 다운로드 받으세요!! 지속적으로 업그래이드 됩니다. 여러분의 의견을 주시면 개발에 반영하겠 습니다.


커알못의 커널 탐방기 이 세상의 모든 커알못을 위해서

금오공대 컴퓨터공학전공 강의자료

2013_1_14_GM작물실용화사업단_소식지_내지_인쇄_앙코르130.indd

13Åë°è¹é¼Ł

Jkafm093.hwp

Microsoft PowerPoint - e pptx

<B1DDC0B6B1E2B0FCB0FAC0CEC5CDB3DDB0B3C0CEC1A4BAB82E687770>

제 출 문 중소기업청장 귀하 본 보고서를 중소기업 원부자재 구매패턴 조사를 통한 구매방식 개선 방안 연구 의 최종보고서로 제출합니다 한국산업기술대학교 산학협력단 단 장 최 정 훈 연구책임자 : 이재광 (한국산업기술대학교 부교수) 공동연구자 : 노성호

2002년 2학기 자료구조

C++ Programming

untitled


<5B33B9F8B0FAC1A65D20B9E6BCDBBDC9C0C7BDC3BDBAC5DB20B0B3BCB1B9E6BEC8BFACB1B82DC3D6C3D6C1BE2E687770>

저작자표시 - 비영리 - 변경금지 2.0 대한민국 이용자는아래의조건을따르는경우에한하여자유롭게 이저작물을복제, 배포, 전송, 전시, 공연및방송할수있습니다. 다음과같은조건을따라야합니다 : 저작자표시. 귀하는원저작자를표시하여야합니다. 비영리. 귀하는이저작물을영리목적으로이용할

장애인건강관리사업

PowerPoint Presentation

* pb61۲õðÀÚÀ̳ʸ

조사연구 권 호 연구논문 한국노동패널조사자료의분석을위한패널가중치산출및사용방안사례연구 A Case Study on Construction and Use of Longitudinal Weights for Korea Labor Income Panel Survey 2)3) a

Microsoft PowerPoint - C++ 5 .pptx

Art & Technology #5: 3D 프린팅 - Art World | 현대자동차

View Licenses and Services (customer)

저작자표시 - 비영리 - 변경금지 2.0 대한민국 이용자는아래의조건을따르는경우에한하여자유롭게 이저작물을복제, 배포, 전송, 전시, 공연및방송할수있습니다. 다음과같은조건을따라야합니다 : 저작자표시. 귀하는원저작자를표시하여야합니다. 비영리. 귀하는이저작물을영리목적으로이용할

Microsoft PowerPoint - Java7.pptx

Microsoft PowerPoint - chap05-제어문.pptx

Microsoft 을 열면 깔끔한 사용자 중심의 메뉴 및 레이아웃이 제일 먼저 눈에 띕니다. 또한 은 스마트폰, 테블릿 및 클라우드는 물론 가 설치되어 있지 않은 PC 에서도 사용할 수 있습니다. 따라서 장소와 디바이스에 관계 없이 언제, 어디서나 문서를 확인하고 편집

SIGIL 완벽입문

Microsoft PowerPoint - IPYYUIHNPGFU

<5BC6EDC1FD5DBEEEBEF7C0CCC1D6B3EBB5BFC0DAC0CEB1C7BBF3C8B2BDC7C5C2C1B6BBE7C3D6C1BEBAB8B0EDBCAD28BAB8C0CCBDBABEC6C0CC292E687770>

피해자식별PDF용 0502

CR hwp

INDUS-8.HWP

CONTENTS.HWP


PowerPoint Template

DBPIA-NURIMEDIA

4-Ç×°ø¿ìÁÖÀ̾߱â¨ç(30-39)

Chapter ...

152*220

BY-FDP-4-70.hwp

- 1 -

DBPIA-NURIMEDIA

<C1A4C3A5BFACB1B D3420C1A4BDC5C1FAC8AFC0DAC0C720C6EDB0DFC7D8BCD220B9D720C0CEBDC4B0B3BCB1C0BB20C0A7C7D120B4EBBBF3BAB020C0CEB1C720B1B3C0B020C7C1B7CEB1D7B7A520B0B3B9DF20BAB8B0EDBCAD28C7A5C1F6C0AF292E687770>

기본소득문답2

저작자표시 - 비영리 2.0 대한민국 이용자는아래의조건을따르는경우에한하여자유롭게 이저작물을복제, 배포, 전송, 전시, 공연및방송할수있습니다. 이차적저작물을작성할수있습니다. 다음과같은조건을따라야합니다 : 저작자표시. 귀하는원저작자를표시하여야합니다. 비영리. 귀하는이저작물

Transcription:

exercise 통계적 사고 파이썬을 이용한 탐색적 자료 분석 Version 2.0.25

통계적 사고 파이썬을 이용한 탐색적 자료 분석 Version 2.0.25 번역: 이광춘 원저자: Allen B. Downey xwmooc http://www.xwmooc.net

한국어 저작권 2015 이광춘 Copyright 2014 Allen B. Downey. Green Tea Press 9 Washburn Ave Needham MA 02492 Permission is granted to copy, distribute, and/or modify this document under the terms of the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License, which is available at http://creativecommons.org/licenses/ by-nc-sa/4.0/. The original form of this book is L A TEX source code. Compiling this code has the effect of generating a device-independent representation of a textbook, which can be converted to other formats and printed. The L A TEX source for this book is available from http://thinkstats2.com.

서문 제 1 절 한국어판 서문 지금까지 경험한 것과 전혀 다른 미래가 오고 있습니다. 이런 변화 뒤에는 패러다 임의 전환, 즉 사고체계의 변화가 있었습니다. 산업혁명의 토대가 된 수학적 사고 (Logical Thinking), 20세기를 풍미한 통계적 사고(Experimental Thinking), 21 세기에는 컴퓨팅 사고력(Computational Thinking)이라고 합니다. 그리고, 세 상은 프로그래밍을 하는 사람과 프로그램 된 사람으로 나뉘어 양극화되어 가고 있습니다. 통계학과 컴퓨터 과학이 접목된 기계학습(Machine Learning)은 과학과 기술은 물론이고, 인문사회, 법, 예체능 등 거의 전분야에 영향을 미쳤으며 딥러닝(Deep Learning)으로 급격히 파급력을 높이고 있습니다. 나아가, 통계학과 전공자만 배울 줄만 알고서, 엑셀로만 어깨너머 배웠던 통계 처리가 누구나 이해하고 당연히 할 줄 아는 기본기로 불과 일 이년 만에 바뀌었 습니다. 이뿐 아니라 이제 컴퓨터는 3D 프린팅, 로봇, 사물인터넷, 인공지능과 결합하여 공장, 사무실, 가정 핸드폰 밖으로 걸어 나와 준비된 극소수 사람에게 는 부와 권력과 영예를, 준비하지 못한 99% 사람에게는 암울한 미래를 제시하고 있습니다. 이렇게 급격히 변화되어 가는 환경에 여러분이 주도권을 되찾고, 기계와의 경쟁 을 준비해야 합니다. 컴퓨팅 사고력을 갖추고 코딩 할 수 있는 능력, 데이터를 해독하고 활용하는 능력은 앞으로 읽기, 쓰기, 셈하기와 더불어 누구나 익혀야 되는 기본적인 기술입니다. 오픈 하드웨어, 리눅스 운영체제, 과학 컴퓨팅을 위한 오픈 소스 툴체인, 쉽고 생 산성 높은 컴퓨터 언어 (파이썬), 검증된 글로벌 커뮤니티(Software Carpentry,

제 0 장. 서문 vi OpenIntro Statistics)와 함께, 크리에이티브 커먼즈 라이선스와 오픈 소스 소프 트웨어 라이선스에 따라 원본소스와 함께 누구나 자유로이 활용할 수 있는 자유 가 주워져야 합니다. 기계와의 경쟁, 이제 주변친구, 동료, 가족과 함께 거인의 어깨 위에서 준비하세 요. 지금 이 순간 엑스더블유무크(xwMOOC)가 함께 합니다. 제 2 절 서문 이책은 탐색적 자료 분석에 대한 실용적인 도구를 소개하고 있다. 이 책의 구성은 저자가 데이터셋을 가지고 작업할 때 사용하는 과정을 준수하고 있다: 가져오기와 정제(importing and cleaning): 데이터가 어떤 형식이든지 관 계없이, 통상 데이터를 불러와서, 정제하고 변환하고, 변역 과적을 통해서 모든 것이 손상되지 않고 온전하다는 것을 점검하는 데는 시간과 노력이 투여된다. 단변량 탐색(Single variable explorations): 저자는 통상 한번 변수 하나 만 면밀히 조사하고, 변수 평균을 알아내고, 값들에 대한 분포를 살펴보고, 적절한 요약 통계량을 고르면서 자료분석에 착수한다. 짝지어 탐색(Pair-wise explorations): 변수 사이에 가능한 관계를 식별하 는데, 표와 산점도를 살펴보고, 상관관계와 선형적합을 계산한다. 다변량 분석(Multivariate analysis): 만약 변수 사이에 분명한 관계가 있 다면, 통제 변수(control variable)를 다중 회귀에 추가해서 좀더 복잡한 관계를 조사한다. 추정과 가설검정(Estimation and hypothesis testing): 통계 결과를 보고 할 때, 다음 세가지 질문에 대답하는 것이 중요하다: 효과가 얼마나 큰가? 다시 동일한 측정을 실시한다면, 얼마나 많은 변동성이 예상되는가? 분명 한 효과가 우연때문인지도 가능한가? 시각화(Visualization): 탐색동안에, 시각화는 가능한 관계와 효과를 찾아 내는데 있어 중요한 도구다. 그러면, 만약 분명한 효과가 면밀히 조사로 되면, 시각화는 결과를 의사소통하는 효과적인 방식이 된다.

2. 서문 vii 이 책은 컴퓨터적 접근법(computational approach)를 취하는데 수학적 접근법 에 대해서 몇가지 장점이 있다: 저자는 수학적 표기법 보다는 대부분의 아이디어를 파이썬 코드로 제시한 다. 일반적으로, 파이썬 코드는 좀더 가독성이 있다; 또한, 실행가능하기 때문에, 독자가 다운로드하고, 실행하고, 변형해 볼 수 있다. 각 장은 연습문제가 포함되어서 독자가 학습한 내용을 더 개발하고 강화할 수 있다. 프로그램을 작성할 때, 코드로 이해한 것을 표현한다; 프로그램을 디버깅하는 동안에, 이해한 것도 고칠 수 있다. 일부 연습문제는 실험과 연관되어 통계적 행동을 테스트할 수 있따. 예를 들 어, 임의 표본을 생성하고 합을 계산함으로써 중심극한정리(Central Limit Theorem, CTL)를 탐색할 수 있다. 결과를 시각화해서 왜 CLT이 동작하고, 언제 동작하지 않는지 시연한다. 수학적으로 이해하기 어려운 일부 아이디어를 모의시험을 통해서 이해하 기 쉽다. 예를 들어, P-값을 임의 모의시험을 실행해서 극사화하는데, 이것 이 P-값 의미를 이해하는데 보강하는 의미가 있다. 이 책이 범용 프로그래밍 언어(파이썬)에 기반하고 있어서, 독자는 데이터 를 거의 모든 곳에서 가져올 수 있다. 통계 도구에 맞춰 정제되고 형식을 맞춘 데이터셋에 제한을 받지 않는다. 이 책은 프로젝트에 기반한 접근법을 취하고 있다. 저자 수업에서, 학생들이 한학 기 프로젝트로 작업한다. 한학기 동안 통계적 질문을 제시하고, 질문을 다룰 수 있는 데이터셋을 찾고, 학습한 각기법을 본인 데이터에 적용한다. 저자의 접근법을 통계분석에 시연하기 위해서, 책 전체를 관통하는 사례가 이 책에 제시되어 있다. 두군데 자료출처에서 데이터를 사용한다: 미국 질병 통제 예방센터(Centers for Disease Control and Prevention, CDC)가 수행한 가족 생활, 결혼 및 이혼, 임신, 출산, 피임, 그리고 남녀 건 강에 대한 정보 를 수집한 가족성장 국가조사(National Survey of Family Growth, NSFG) 데이터. (http://cdc.gov/nchs/nsfg.htm 참조)

제 0 장. 서문 viii 미국 질병 통제 예방센터(Centers for Disease Control and Prevention, CDC)가 수행한 행동 위험 요인 감시 시스템 조사 자료(Behavioral Risk Factor Surveillance System Survey Data)로 미국에서 건강 조건과 위험 행동을 추적 한다. (http://cdc.gov/brfss/ 참조.) 다른 예제는 IRS(미국 국세청), 미국 인구통계, 보스톤 마라톤에서 나온 데이터를 사용한다. Think Stats 두번째 판은 첫번째 판에 나온 일부 장을 포함하고 있지만, 상당히 많이 개작되었고, 회귀분석, 시계열 분석, 생존분석, 해석적 방법에 대한 새로운 장이 추가되었다. 이전 판은 pandas, SciPy, StatsModels 를 사용하지 않는다. 그래서 이 모든 교재가 새 것이다. 제3절 저자가 이책을 저작한 방식 새책을 집필할 때, 보통 이전 교과서를 읽고 시작한다. 결과적으로, 대부분의 책은 거의 같은 순서로 같은 교재를 담게된다. 저자는 이전 방법을 택하지 않았다. 사실, 저자는 책을 집필할 때 거의 어떤 출력 된 교재를 사용하지 않았다: 저자의 목표는 이 교재에 새로운 접근법을 모색하고자 했다. 그래서, 기존 접근법에 상당히 노출되지 않길 원했다. 저자는 이 책을 자유 라이선스로 이용가능하게 만들려고, 저작권 제한에 의해서 지장을 받고 싶지 않도록 확실히 하고자 했다. 이책의 많은 독자는 출판된 교재를 갖춘 도서관에 접근할 수 없다. 그래서, 인터넷에 자유로이 이용가능한 자원에 대해 참조하려고 노력했다. 과거 매체를 지지하는 일부 사람은 전자정보만 전용으로 사용하는 것이 게으르고 신뢰가 떨어질 수 있다고 생각한다. 첫번째 점에서는 맞울 수 있 지만, 두번째 점에 관해서는 틀리다고 생각한다. 그래서 저자는 저자의 이 론을 테스트하고자 했다. 저자가 다른 어떤 것보다도 더 사용한 원천 자원은 위키피디아다. 일반적으로, 통계 주제에 관해서 저자가 읽은 기사는 매우 훌륭했다(저자는 줄곧 일부 작은

4. 코드 사용 ix 변경을 했지만). 저자는 이책 전반적으로 위키피디아 페이지 참조를 포함해서, 독자가 링크를 따라 가길 권장한다; 많은 경우에, 위키피디아 페이지가 저자 기 술이 멈춘 곳을 이어받는다. 이책에 사용된 용어와 표기법은 따르지 않을 합리적 사유가 없다면 위키피이아와 일관성을 맞췄다. 저자가 발견한 다른 유용한 교재 는 울프램 수학세상(Wolfram MathWorld)과 레딧 통계 포럼(Reddit statistics forum, http://www.reddit.com/r/statistics)이다. 제 4 절 코드 사용 이 책에서 사용되는 데이터와 코드는 https://github.com/allendowney/ ThinkStats2 사이트에서 이용가능하다. Git은 버젼제어시스템으로 프로젝트를 구성하는 파일을 추적할 수 있게 한다. Git 제어 아래있는 파일 모음을 저장소 (repository)라고 부른다. GitHub은 Git 저장소에 대한 저장공간과 편리한 웹인 터페이스를 제공하는 호스팅 서비스다. 저자 저장소의 GitHub 홈페이를 통해 코드를 작업하는 몇가지 방법이 제공된다: 포크(Fork) 버튼을 눌러 저자의 GitHub 저장소에 대한 사본을 생성한다. 만약 GitHub 계정이 없다면, 계정을 하나 생성한다. 포킹한 후에, 이 책으 로 작업하면서 작성한 코드를 추적할 수 있는 본인의 저장소를 GitHub에 갖게 된다. 그리고 나서, 저장소를 복제할 수 있는데, 이는 본인 로컬 컴퓨 터에 파일 사본을 생성할 수 있다는 것을 의미한다. 혹은 저자의 저장소를 복제할 수 있다. 복제하는데 GitHub 계정이 필요하 지는 않지만, GitHub에 변경사항을 다시 반영할 수는 없다. 만약 Git을 전혀 사용하고 싶지 않다면, GitHub 페이지 오른쪽 하단에 위 치한 버튼을 사용해서 압축된 Zip 파일을 다운로드할 수 있다. 모든 코드는 변환작업 없이 파이썬 2와 파이썬 3에 동작하도록 작성됐다. Continuum Analytics에서 개발된 아나콘다(Anaconda)를 사용해서 이 책을 개 발했는데, 아나콘다는 코드를 실행(그리고 그 이상)하는데 필요한 모든 팩키지를

제 0 장. 서문 x 포함하고 있는 무료 파이썬 배포판이다. 저자는 아나콘다가 설치하기 쉽다고 판 단한다. 기본설정으로 시스템 수준이 아닌 사용자 수준에서 설치할 수 있다. 그래 서 관리자 권한이 필요없다. 그리고 아나콘다는 파이썬 2와 파이썬 3를 모두 지원 한다. 아나콘다를 http://continuum.io/downloads 웹사이트에서 다운로드할 수 있다. 만약 아나콘다를 사용하기 원치 않는다면, 다음 팩키지가 필요하다: 데이터를 표현하고 분석하는 pandas, http://pandas.pydata.org/; 기본적인 수치 계산을 위한 NumPy, http://www.numpy.org/; 통계를 포함한 과학 계산을 위한 SciPy, http://www.scipy.org/; 회귀분석과 다른 통계적 분석을 위한 StatsModels, http: //statsmodels.sourceforge.net/; 시각화를 위한 matplotlib, http://matplotlib.org/. 이들 팩키지가 흔히 사용되고 있지만, 모든 파이썬 설치 배포판에 포함된 것은 아니다. 그리고 일부 환경에서는 설치하기 까다롭다. 만약 설치에 어려움을 겪는 다면, 저자는 강력하게 아나콘다 혹은 이들 팩키지가 포함된 다른 파이썬 배포판 사용을 추천한다. 저장소를 복제하거나 압축파일을 푼 다음에 ThinkStats2/code 폴더에 nsfg.py 파일이 있어야 된다. 만약 nsfg.py 파일을 실행시키면, 데이터 파일을 읽고, 테스 트를 실행하고 All tests passed. 같은 메시지를 화면에 출력한다. 만약 가져오 기 오류가 있다면, 아마도 설치될 필요가 있는 팩키지가 있음을 의미한다. 대부분의 연습은 파이썬 스크립트를 사용하지만, 일부는 IPython 노트북을 사 용한다. 만약 IPython 노트북을 이전에 사용하지 않았다면, http://ipython. org/ipython-doc/stable/notebook/notebook.html 나온 문서에서 시작해 보는 것을 제안한다. 객체지향 기능을 포함한 핵심 파이썬 언어에 친숙하지만, pandas, NumPy, SciPy 는 잘 모르는 독자를 가정하고 책을 저술했다. 만약 이런 모듈에 이미 친숙 하다면, 일부 절을 건너뛸 수도 있다.

4. 코드 사용 xi 독자가 예를 들어 합산과 알고리즘을 포함한 기본 수학을 알고 있다고 가정한다. 일부 장소에서 미적분학 개념을 저자가 언급하지만, 미적분학을 직접 할 필요는 없다. 만약 통계를 결코 공부한 적이 없다면, 이 책이 여정을 시작하는 좋은 시발점이 될 것으로 생각한다. 그리고 만약 전통적인 통계학 수업을 들었다면, 이 책이 손상된 부분을 수리하는데 도움이 되길 희망한다. Allen B. Downey 는 올린 공대 컴퓨터 과학과 교수다. 기여자 목록 만약 제안이나 수정사항이 있다면, 저자에게 전자우편을 downey@allendowney.com 주소로 보내주세요. 만약 보내주신 피드백에 수 정을 하게 되면, (빼달라는 요청이 특별히 없다면) 기여자 목록에 추가시켜드릴 것입니다. 만약 오류가 나타난 문장의 일부를 적어도 포함한다면, 저자가 검색하기 수월할 것이다. 페이지와 절 번호도 좋지만, 작업하기는 그다지 쉽지 않다. 감사합니다. Lisa Downey and June Downey read an early draft and made many corrections and suggestions. Steven Zhang found several errors. Andy Pethan and Molly Farison helped debug some of the solutions, and Molly spotted several typos. Andrew Heine found an error in my error function. Dr. Nikolas Akerblom knows how big a Hyracotherium is. Alex Morrow clarified one of the code examples. Jonathan Street caught an error in the nick of time. Gábor Lipták found a typo in the book and the relay race solution. Many thanks to Kevin Smith and Tim Arnold for their work on plastex, which I used to convert this book to DocBook.

xii 제 0 장. 서문 George Caplan sent several suggestions for improving clarity. Julian Ceipek found an error and a number of typos. Stijn Debrouwere, Leo Marihart III, Jonathan Hammler, and Kent Johnson found errors in the first print edition. Dan Kearney found a typo. Jeff Pickhardt found a broken link and a typo. Jörg Beyer found typos in the book and made many corrections in the docstrings of the accompanying code. Tommie Gannert sent a patch file with a number of corrections. Alexander Gryzlov suggested a clarification in an exercise. Martin Veillette reported an error in one of the formulas for Pearson s correlation. Christoph Lendenmann submitted several errata. Haitao Ma noticed a typo and and sent me a note. Michael Kearney sent me many excellent suggestions. Alex Birch made a number of helpful suggestions. Lindsey Vanderlyn, Griffin Tschurwald, and Ben Small read an early version of this book and found many errors. John Roth, Carol Willing, and Carol Novitsky performed technical reviews of the book. They found many errors and made many helpful suggestions. Rohit Deshpande found a typesetting error. David Palmer sent many helpful suggestions and corrections. Erik Kulyk found many typos. Nir Soffer sent several excellent pull requests for both the book and the supporting code. Joanne Pratt found a number that was off by a factor of 10.

차례 서문 v 제 1 절 한국어판 서문............................ v 제 2 절 서문................................. vi 제 3 절저자가 이책을 저작한 방식..................... viii 제 4 절 코드 사용.............................. 제1장 탐색적 자료 분석 ix 1 제 1 절 통계적 접근방법.......................... 2 제 2 절 가족 성장 국가 조사 (National Survey of Family Growth)... 3 제 3 절 데이터 가져오기.......................... 4 제 4 절 데이터프레임(DataFrames).................... 5 제 5 절 변수 (Variables).......................... 6 제 6 절 변환 (Transformation)....................... 7 제 7 절 타당성 검사(Validation)...................... 8 제 8 절 해석 (Interpretation)........................ 10 제 9 절 연습 문제 (Exercises)....................... 11 제 10 절용어사전.............................. 13

차례 xiv 제2장 분포 (Distribution) 15 제 1 절 히스토그램............................. 15 제 2 절 히스토그램 표현하기........................ 16 제 3 절 히스토그램 그리기 (Plotting histograms)............ 16 제 4 절 NSFG 변수............................. 17 제 5 절 특이점 (Outliers).......................... 19 제 6 절 첫번째 아이 (First babies)..................... 20 제 7 절 분포 요약하기............................ 22 제 8 절 분산 (Variance)........................... 23 제 9 절 효과 크기 (Effect size)....................... 24 제 10 절결과 보고하기............................ 24 제 11 절연습 문제.............................. 25 제 12 절용어사전.............................. 26 제3장 확률 질량 함수 27 제 1 절 Pmf................................. 27 제 2 절 PMF 플롯으로 그리기....................... 29 제 3 절 다른 시각화 방법.......................... 30 제 4 절 학급 크기 패러독스 (class size paradox)............. 31 제 5 절 데이터프레임 인덱싱 (DataFrame indexing).......... 34 제 6 절 연습 문제.............................. 36 제 7 절 용어사전.............................. 37 제4장 누적분포함수 39 제 1 절 PMF의 한계점........................... 39 제 2 절 백분위수 (Percentiles)....................... 40 제 3 절 CDF................................. 41

차례 xv 제 4 절 CDF 표현하기 (Representing CDFs)............... 42 제 5 절 CDF 비교하기........................... 43 제 6 절 백분위수 기반 통계량 (Percentile-based statistics)....... 44 제 7 절 난수 (Random numbers)..................... 45 제 8 절 백분위 순위 비교하기....................... 46 제 9 절 Exercises.............................. 47 제 10 절용어사전.............................. 48 제5장 분포 모형화 (Modeling distributions) 49 제 1 절 지수분포 (exponential distribution)............... 49 제 2 절정규 분포 (normal distribution)................. 52 제 3 절정규확률그림 (Normal probability plot)............. 53 제 4 절 로그 정규분포 (lognormal distribution)............. 56 제 5 절 파레토 분포 (Pareto distribution)................. 57 제 6 절 난수 생성하기 (Generating random numbers)......... 59 제 7 절 왜 모형인가?............................ 61 제 8 절 연습문제.............................. 61 제 9 절 용어 사전.............................. 63 제6장 확률밀도함수 65 제 1 절 PDF................................. 65 제 2 절 핵밀도추정 (Kernel density estimation)............. 67 제 3 절 분포 프레임워크 (distribution framework)........... 68 제 4 절 Hist 구현.............................. 69 제 5 절 Pmf 구현.............................. 70 제 6 절 Cdf 구현.............................. 71 제 7 절적률 (Moments).......................... 72

차례 xvi 제 8 절 왜도 (Skewness).......................... 73 제 9 절 연습문제.............................. 76 제 10 절용어 사전.............................. 77 제7장 변수간 관계 79 제 1 절 산점도 (Scatter plots)....................... 79 제 2 절 관계를 특징짓기.......................... 82 제 3 절 상관 (Correlation)......................... 83 제 4 절 공분산 (Covariance)........................ 84 제 5 절 피어슨 상관 (Pearson s correlation)............... 85 제 6 절 비선형 관계 (Nonlinear relationships).............. 86 제 7 절 스피어만 순위 상관 (Spearman s rank correlation)....... 87 제 8 절 상관과 인과 (Correlation and causation)............ 88 제 9 절 연습 문제.............................. 89 제 10 절용어 사전.............................. 90 제8장 추정 (Estimation) 91 제 1 절 추정 게임.............................. 91 제 2 절 분산 추정.............................. 93 제 3 절 표집 분포 (Sampling distributions)............... 95 제 4 절 표집 편의 (Sampling bias)..................... 97 제 5 절 지수분포 (Exponential distributions).............. 98 제 6 절 연습문제.............................. 99 제 7 절 용어 사전.............................. 100

차례 제9장 xvii 가설 검정 (Hypothesis testing) 103 제 1 절전통적 가설 검정 (Classical hypothesis testing)......... 103 제 2 절 HypothesisTest.......................... 104 제 3 절 평균 차이 검정 (Testing a difference in means)......... 106 제 4 절 다른 검정 통계량 (ther test statistics)............... 108 제 5 절 상관 검정 (Testing a correlation)................. 109 제 6 절 비율 검정 (Testing proportions)................. 110 제 7 절 카이제곱 검정 (Chi-squared tests)................ 112 제 8 절 다시 첫째 아이........................... 112 제 9 절 오류 (Errors)............................ 114 제 10 절검정력 (Power)........................... 115 제 11 절반복 (Replication)......................... 116 제 12 절연습 문제.............................. 117 제 13 절용어 사전.............................. 118 제 10 장 선형최소제곱 (Linear least squares) 119 제 1 절 최소제곱 적합 (Least squares fit)................. 119 제 2 절 구현 (Implementation)...................... 120 제 3 절 잔차 (Residuals).......................... 122 제 4 절 추정 (Estimation)......................... 123 제 5 절적합도 (Goodness of fit)...................... 124 제 6 절 선형 모형 검정 (Testing a linear model)............. 126 제 7 절 가중 재표본추출 (Weighted resampling)............ 128 제 8 절 연습문제.............................. 130 제 9 절 용어 사전.............................. 130

xviii 제 11 장 회귀 (Regression) 차례 131 제 1 절 StatsModels............................ 132 제 2 절 다중회귀 (Multiple regression).................. 133 제 3 절 비선형 관계 (Nonlinear relationships).............. 135 제 4 절 Data mining............................ 136 제 5 절 예측 (Prediction).......................... 138 제 6 절 로지스틱 회귀 (Logistic regression)............... 140 제 7 절 모수 추정 (Estimating parameters)................ 141 제 8 절 구현 (Implementation)...................... 142 제 9 절정밀도 (Accuracy)......................... 144 제 10 절연습 문제.............................. 144 제 11 절용어 사전.............................. 145 제 12 장 시계열 분석 147 제 1 절 가져오기(Importing)와 정제하기(cleaning)........... 147 제 2 절 플롯 그리기 (Plotting)....................... 149 제 3 절 선형 회귀 (Linear regression)................... 151 제 4 절 이동 평균 (Moving averages)................... 152 제 5 절 결측값 (Missing values)...................... 154 제 6 절 계열 상관 (Serial correlation)................... 155 제 7 절 자기상관 (Autocorrelation).................... 156 제 8 절 예측 (Prediction).......................... 158 제 9 절 추가 읽기.............................. 162 제 10 절연습문제.............................. 162 제 11 절용어 사전.............................. 163

차례 xix 제 13 장 생존분석 165 제 1 절 생존곡선 (Survival curves).................... 165 제 2 절 위험 함수 (Hazard function)................... 167 제 3 절 생존곡선 추정하기......................... 168 제 4 절 캐플란-마이어 추정 (Kaplan-Meier estimation)......... 169 제 5 절 결혼 곡선 (marriage curve).................... 170 제 6 절 생존함수 추정하기......................... 171 제 7 절 신뢰구간 (Confidence intervals)................. 173 제 8 절 코호트 효과 (Cohort effects)................... 174 제 9 절 외삽법 (Extrapolation)...................... 176 제 10 절기대 잔존 수명........................... 177 제 11 절연습문제.............................. 181 제 12 절용어 사전.............................. 181 제 14 장 해석적 방법 (Analytic methods) 183 제 1 절정규분포.............................. 183 제 2 절 표집분포.............................. 184 제 3 절정규분포 표현하기......................... 186 제 4 절 중심극한정리 (Central limit theorem).............. 187 제 5 절 CLT 검정.............................. 187 제 6 절 CLT 적용하기............................ 190 제 7 절 상관검정 (Correlation test).................... 192 제 8 절 카이제곱 검정 (Chi-squared test)................. 193 제 9 절 토의 (Discussion)......................... 194 제 10 절연습 문제.............................. 195

xx 차 례

제1장 탐색적 자료 분석 이 책의 주요 논지는 실용적인 방법과 결합된 데이터가 질문에 대답하고, 불확실 성하에서 의사결정을 안내하는 것이다. 한가지 사례로, 집사람과 함께 첫번째 아이를 기대할 때 전해들은 질문에 모디브 를 얻어 한가지 사례 연구를 제시한다: 첫째 애기는 늦게 낳는 경향이 있을까요? 만약 이 질문을 구글에 검색하면, 상당한 토론글을 볼 수 있다. 몇몇 사람은 사실 이라고하고, 다른 사람은 미신이라고 하고, 다른 사람은 첫째 얘들이 일찍 나온 다고 애둘러 말하곤 한다. 많은 토론글에서, 사람들은 자신의 주장을 뒷받침하기 위해서 데이터를 제공한 다. 다음과 같은 많은 사례를 찾아볼 수 있다. 최근에 첫째 아이를 출산한 내 친구 두명은 모두 자연분만 혹은 제 왕절개하기 전에 예정일에서 거의 2주나 지났다. 첫째는 2주 늦게 나왔고 이제 생각하기에 둘째는 2주 빨리 나올것 같다.!! 제 생각에는 사실이 아니라고 생각하는데 왜냐하면 언니가 엄마의 첫째인데 다른 많은 사촌과 마찬가지로 빨리 나왔기 때문이다. 이와 같은 보고를 일화적 증거(anecdotal evidence)라고 부르는데, 이유는 논문 으로 출판되지 않고 대체로 개인적인 데이터에 기반하고 있기 때문이다. 일상적 인 대화에서, 일화와 관련해서 잘못된 것은 없다. 그래서 인용한 사람을 콕 집어서 뭐라고 할 의도는 없다. 하지만, 좀더 설득적인 증거와, 좀더 신빙성있는 답을 원할지도 모른다. 이런 기 준으로 본다면, 일화적 증거는 대체로 성공적이지 못하다. 왜냐하면:

제 1 장. 탐색적 자료 분석 2 적은 관측치(Small number of observations): 만약 첫째 아기에 대해서 임신 기간이 좀더 길다면, 아마도 차이는 자연적인 변동과 비교하여 적을 것이다. 이 경우에, 차이가 존재한다는 것을 확실히 하기 위해서는 많은 임 신 사례를 비교해야할 것이다. 선택 편의(Selection bias): 임신기간에 관한 토론에 참가한 사람들은 첫째 아이가 늦게 태어났기 때문에 관심이 있을 수 있다. 이 경우에 데이터를 선택하는 과정이 결과를 왜곡할 수도 있다. 확증 편의(Confirmation bias): 주장을 믿는 사람들은 주장을 확증해주는 사례에 좀더 기여할 듯 하다. 주장에 의구심을 갖는 사람들은 반례를 좀더 들것 같다. 부정확(Inaccuracy): 일화는 종종 개인 이야기로, 기억이 부정확하고, 잘못 표현되며, 부정확하게 반복된다. 그렇다면, 어떻게 더 잘 할 수 있을까요? 제 1 절 통계적 접근방법 일화적 접근법의 한계를 극복하기 위해서 통계도구를 사용하는데 다음을 포함한 다: 자료 수집(Data collection): 대규모 국가적 조사에서 나온 자료를 사용한 다. 통상 국가적 조사는 명시적으로 U.S 모집단에 대한 통계적으로 타당한 추론을 도출하도록 설계된다. 기술통계(Descriptive statistics): 데이터를 간결하게 요약하는 통계량을 생성하고 다른 방식으로 평가하는데 데이터를 시각화한다. 탐색적 데이터 분석 (Exploratory data analysis): 관심있는 질문을 다룰 수 있는 패턴, 차이점, 다른 특징을 찾는다. 동시에 일관되지 못함을 점검하고 한계를 식별한다. 추정(Estimation): 일반적인 모집단의 특징을 추정하는데 샘플에서 추출된 데이터를 사용한다. 가설 검증 (Hypothesis testing): 두 그룹간에 차이처럼 명백한 효과를 확 인하는데 있어서 효과가 우연히 발생했는지 평가한다. 함정에 빠지는 것을 피하기 위해서 상기 단계를 조심스럽게 밟아서 좀더 당위성 을 가지고 좀더 옳을 것 같은 결론에 도달할 수 있다.

2. 가족 성장 국가 조사 (National Survey of Family Growth) 3 제 2 절 가족 성장 국가 조사 (National Survey of Family Growth) 1973년 이래로 미국 질병 통제예방 센터 (Disease Control and Prevention, CDC)에서 가족 성장 국가 조사 (National Survey of Family Growth, NSFG) 를 수행하고 있다. 조사 목적은 가족 생활, 결혼 및 이혼, 임신, 출산, 피임, 그리 고 남녀 건강에 대한 정보를 수집하고, 조사 결과는 건강 서비스 및 건강 교육 프로그램, 그리고 가족, 출산, 건강에 대한 통계적 조사를 수행 하는데 사용된다. 자세한 사항은 다음 웹사이트를 참조한다. http://cdc.gov/nchs/nsfg.htm. 첫째 아이가 늦게 낳는지와 다른 문제를 조사하려고 상기 조사로 수집된 데이터 를 사용한다. 데이터를 효과적으로 사용하기 위해서는, 조사 설계(design of the study)를 이해할 필요가 있다. NSFG는 횡단적 연구(cross-sectional study)로 특정 시점에 한 집단에 대한 스 냅샷 정보를 수집한다. 가장 흔한 대안 연구는 종단적 연구(longitudinal study) 로 한 집단을 여러 시점에 걸쳐 반복적으로 관찰하는 것이다. NSFG는 7번 조사를 수행했다; 각 조사 전개를 사이클(cycle)이라고 한다. 2002 년 1월에서 2003년 3월까지 수행된 여섯번째 사이클에서 나온 데이터를 사용 한다. 조사 목적은 모집단(population)에 대한 결론을 도출하는 것으로, NSFG 목표 모집단은 15-44 연령의 미국민이다. 이상적으로 데이터를 전체 모집단의 모든 사람에게서 데이터를 수집하여야 하지만, 현실적으로 불가능하다. 대신에 표본 (sample)으로 불리는 모집단의 일부에서 데이터를 수집한다. 조사에 참여한 사 람을 응답자(respondents)라고 부른다. 일반적으로 종단적 연구는 대표성(representative)을 가져야 하는데 목표 모집 단의 모든 멤버가 동일한 참여 가능성을 가져야한다는 의미다. 이러한 이상은 실무에서 달성하기는 어렵다. 하지만 조사를 수행함에 있어 최대한 근접하도록 노력해야 한다. NSFG는 대표적이지 않다; 대신에 의도적으로 오버샘플링(oversampling)했다. 조사 설계자가 세 집단 (히스패닉, 흑인, 10대)에 대해서 미국인구에서 차지하는 것보다 높은 비율로 조사를 실시한다. 사유는 유효한 통계적 추론을 이끌어 내기 위해서 각 그룹에 대해 충분이 큰 응답자를 확보하기 위해서다. 물론, 오버샘플링 단점은 조사로부터 나온 통계량에 기반하여 일반 모집단에 대 한 결론을 도출하기는 쉽지 않다. 나중에 이점에 대해서는 다시 다룰 것이다. 이러한 유형의 데이터를 작업할 때, 코드북(codebook)과 친근해지는 것이 중 요하다. 코드북은 조사 서례, 조사 질문, 응답자 기록을 문서화한다. 코드북과 NSFG 데이터에 대한 사용자 가이드는 웹사이트에서 찾아볼 수 있다. http: //www.cdc.gov/nchs/nsfg/nsfg_cycle6.htm

제 1 장. 탐색적 자료 분석 4 제 3 절 데이터 가져오기 이 책에 사용된 코드와 데이터는 https://github.com/allendowney/ ThinkStats2 사이트에서 사용할 수 있다. 다운로드와 코드로 작업하는 것에 대한 자세한 정보는 4을 참조한다. 코드를 다운로드하면, ThinkStats2/code/nsfg.py이라는 파일이 있다. 실행하 면, 데이터 파일을 읽고, 몇가지 테스트를 수행하고, All tests passed. 라는 메시지를 출력한다. $ python nsfg.py (13593, 244) nsfg.py: All tests passed. 프로그램이 무엇을 수행하는지 살펴보자. NSFG 6번째 사이클에서 임신 데 이터는 파일명이 2002FemPreg.dat.gz이다. 고정폭 칼럼을 가진 일반 텍스트 (ASCII) 파일형식으로 gzip으로 압축되어 있다. 파일 각각 라인은 한개 임신에 대한 데이터를 포함하는 레코드(record)가 된다. 파일 형식(format)은 2002FemPreg.dct 파일에 문서화되어 기술되어 있고 Stata 딕셔너리 파일이다. Stata는 통계 소프트웨어 시스템 (통계 팩키지)의 일종으로 이러한 맥락에서 딕셔너리 는 각 행마다 각 변수의 위치를 식별하는데 사용되 는 인덱스, 형식, 변수명 목록 정보를 담고 있다. 예를 들어 2002FemPreg.dct 파일에서 몇줄이 다음에 있다. infile dictionary { _column(1) str12 _column(13) byte } caseid pregordr %12s %2f "RESPONDENT ID NUMBER" "PREGNANCY ORDER (NUMBER)" 딕셔너리는 변수 두개를 기술한다: caseid는 응답자 ID를 대표하는 12 자리 문자 로 된 문자열이다; pregorder는 1 바이트 정수형으로 응답자에 대한 임신 정보를 나타낸다. 다운로드한 코드에는 thinkstats2.py 파일이 있는데 파이썬 모듈로 이 책에서 사용되는 많은 클래스와 함수를 포함하고 있다. Stata 딕셔너리와 NSFG 데이 터 파일을 읽어 들일 수 있다. 다음에 nsfg.py 프로그램에서 어떻게 사용되는지 사용례가 있다. def ReadFemPreg(dct_file='2002FemPreg.dct', dat_file='2002fempreg.dat.gz'): dct = thinkstats2.readstatadct(dct_file) df = dct.readfixedwidth(dat_file, compression='gzip') CleanFemPreg(df) return df

4. 데이터프레임(DataFrames) 5 ReadStataDct은 딕셔너리 파일이름을 받아서 dct를 반환한다. dct는 딕셔너리 에서 받은 정보를 담고 있는 FixedWidthVariables 객체다. dct는 데이터 파일 을 읽는 FixedWidthVariables을 제공한다. 제 4 절 데이터프레임(DataFrames) ReadFixedWidth 결과는 데이터프레임(DataFrame)으로 판다스(pandas)에서 제공하는 가장 근원적인 자료구조다. 판다스는 이 책에서 사용하는 파이썬 자료 및 통계 팩키지 이름이다. 데이터프레임은 각 레코드마다 행(이 경우에 각 임신 마다 한 행이 됨)과 각 변수에 대한 열을 포함하고 있다. 데이터외에 데이터프레임은 변수명과 변수 자료형을 포함하고 있으며, 데이터에 접근 및 변경하는 방법을 제공한다. df를 출력하면, 행과 열, 데이터프레임 모양(13593 행/레코드, 244 열/변수)에 대한 잘려진 일부를 볼 수 있다. >>> import nsfg >>> df = nsfg.readfempreg() >>> df... [13593 rows x 244 columns] columns 속성은 유니코드 문자열로 칼럼명 시퀀스(sequence)를 반환한다. >>> df.columns Index([u'caseid', u'pregordr', u'howpreg_n', u'howpreg_p',... ]) 결과는 인덱스(Index)로 또다른 판다스 자료구조다. 추후 인덱스(Index)에 관해 서 좀더 배울 것이지만, 지금은 리스트처럼 다루기로 한다. >>> df.columns[1] 'pregordr' 데이터프레임 칼럼에 접근하기 위해서는 칼럼이름을 키(key)로 사용할 수도 있다. >>> pregordr = df['pregordr'] >>> type(pregordr) <class 'pandas.core.series.series'> 결과는 시리즈(Series)로 또다른 판다스 자료구조다. 시리즈는 몇가지 추가 기능 을 가진 파이썬 리스트다. 시리즈를 출력하면, 인덱스와 상응하는 값이 출력된다. >>> pregordr 0 1 1 2

제 1 장. 탐색적 자료 분석 6 2 1 3 2... 13590 3 13591 4 13592 5 Name: pregordr, Length: 13593, dtype: int64 상기 예제에서, 인덱스는 0에서 13592 정수형 자료지만, 일반적으로 정렬가능한 임의의 자료형도 가능하다. 요소값도 정수형이지만, 임의의 자료형도 가능하다. 마지막 행은 변수명, 시리즈 길이, 그리고 자료형 정보가 있다; int64은 NumPy 에서 제공하는 자료형 중의 하나다. 만약 32-비트 컴퓨터에서 상기 예제를 실행 한다면, int32가 출력된다. 정수 인덱스와 슬라이스(slice)를 사용해서 시리즈 요소값(element)에 접근할 수 있다. >>> pregordr[0] 1 >>> pregordr[2:5] 2 1 3 2 4 3 Name: pregordr, dtype: int64 인덱스 연산자 실행 결과는 int64이고, 슬라이스 연산자 결과는 또 다른 시리 즈다. 점 표기법(dot notation)을 사용해서 데이터프레임 칼럼을 접근할 수도 있다. >>> pregordr = df.pregordr 칼럼명이 유효한 파이썬 식별자라면 이 표기법은 잘 동작한다. 그래서 문자로 시작해야 하고, 공백을 포함하지 말아야 하고 등등을 지켜줘야 있다. 제 5 절 변수 (Variables) NSFG 데이터셋에서 이미 변수 두개, caseid와 pregordr을 살펴봤다. 전체적으 로 244개 변수가 있다는 것도 확인했다. 책에서 탐색적 자료분석으로 다음 변수를 사용한다. caseid는 응답자의 정수형 ID다. prglngth는 정수형으로 주로 임신 기간을 나타낸다.

6. 변환 (Transformation) 7 outcome은 출산 결과에 대한 정수형 코드값이다. 코드값 1 은 정상출산을 나타낸다. pregordr은 임신 일련번호다; 예를 들어, 응답자의 첫번째 임신 코드값은 1, 두번째 임신 코드값은 2, 등등. birthord는 정상출산에 대한 일련번호다; 응답자의 첫번째 아이 코드값은 1 등등. 정상출산이 아닌 경우에는 필드값이 공백이다. birthwgt_lb와 birthwgt_oz은 출산시 아이 체중에 대한 파운드와 온스 정보를 담고 있다. agepreg는 임신 후기 산모 나이를 나타낸다. finalwgt는 응답자와 연관된 통계적 가중치다. 부동소수점 값으로 응답자 가 대표하는 미국 인구중에 비중을 나타낸다. 주의깊이 코드북을 읽게되면, 변수 중의 상당수가 재코드(recodes)된 것을 볼 수 있는데 조사에서 수집된 원자료 (raw data) 일부분은 아니다. 재코드된 변수는 원자료를 이용하여 계산된 것이다. 예를 들어, 정상출산에 대한 prglngth 변수는 만약 있다면 wksgest (회임기간 주차 정보)와 동일하다; 만약 회임기간 정보가 없다면 mosgest * 4.33 공식(회 임기간 월차 정보 곱하기 한달 평균 주차 정보)을 사용해서 추정한다. 재코드는 자료 정합성과 일관성을 점검하는 로직에 기반한다. 스스로 원자료를 처리할 납득이갈만한 이유가 없다면, 일반적으로 재코드된 자료가 있다면 그대 로 사용하는 것이 좋은 생각이다. 제 6 절 변환 (Transformation) 이와 같이 데이터를 가져올 때, 오류를 점검하고, 특수값을 처리하고, 데이터를 다른 형식으로 변환하고, 계산을 수행해야 한다. 이와 같은 작업을 통상 데이터 정제(data cleaning)라고 부른다. nsfg.py는 CleanFemPreg 함수가 있어서 사용할 변수를 사전에 정제한다. def CleanFemPreg(df): df.agepreg /= 100.0 na_vals = [97, 98, 99] df.birthwgt_lb.replace(na_vals, np.nan, inplace=true) df.birthwgt_oz.replace(na_vals, np.nan, inplace=true) df['totalwgt_lb'] = df.birthwgt_lb + df.birthwgt_oz / 16.0

8 제 1 장. 탐색적 자료 분석 agepreg 변수는 임신 말기에 산모 나이정보를 담고 있다. 데이터 파일에서 agepreg 변수는 백분의 정수로 인코딩되어 있다. 그래서 첫번째은 100으로 agepreg 변수를 나눠서 연도로 부동소수점 값을 생성한다. birthwgt_lb와 birthwgt_oz 변수는 정상출산 임신에 대한 신생아의 체중으로 파운드와 온스 표현된 정보를 담고 있다. 추가로 몇몇 특수값도 있다. 97 NOT ASCERTAINED 98 REFUSED 99 DON'T KNOW 숫자 부호로 표현된 특수값은 위험한데, 이유는 만약 적절하게 처리되지 않는 다면, 99 파운드 신생아처럼 가공된 결과를 생성할 수 있다. replace 메쏘드는 특수값을 np.nan으로 바꾼다. np.nan는 not a number. 를 나타내는 특수 부동 소수점값이다. inplace 플래그는 replace에 새로운 시리즈를 생성하는 대신에 기존 시리즈를 변경하게 한다. IEEE 부동소수점 표준의 일부분으로, 만약 인자중 하나가 nan 이면, 모든 수학 연산은 nan을 반환한다. >>> import numpy as np >>> np.nan / 100.0 nan 그래서, nan으로 연산한 것은 올바른 연산을 하고, 대부분의 판다스 함수는 nan 을 적절하게 다룬다. 하지만 결측값(missing value)을 다루는 것은 반복되는 이 슈가 된다. CleanFemPreg 함수 마지막 줄은 파운드와 온스를 하나의 값, 파운드로 조합하는 새로운 칼럼 totalwgt_lb을 생성한다. 중요한 사항: 데이터프레임에 새로운 칼럼을 추가할 때, 다음과 같은 딕셔너리 구문을 사용해야 한다. # CORRECT df['totalwgt_lb'] = df.birthwgt_lb + df.birthwgt_oz / 16.0 다음과 같은 점표기법은 안된다. # WRONG! df.totalwgt_lb = df.birthwgt_lb + df.birthwgt_oz / 16.0 점표기법 버젼은 데이터프레임 객체에 속성을 추가하지만, 그 속성이 새로운 칼 럼으로 다뤄지는 것은 아니다. 제 7 절 타당성 검사(Validation) 데이터를 다른 소프트웨어 환경에서 내보내고 또 다른 소프트웨어 환경으로 가져 오기 할 때, 오류가 발생할지도 모른다. 그리고 전혀 새로운 데이터셋에 익숙해질

7. 타당성 검사(Validation) 9 때, 데이터를 부정확하게 해석하거나 오해가 생겨나기도 한다. 만약 데이터의 타 당성을 확보할 시간을 갖게 된다면, 나중에 업무시간을 절약하고 오류를 회필할 수 있다. 데이터 타당성을 확보하는 한 방법은 기초 통계량을 계산하고 공표된 결과값과 비교하는 것이다. 예를 들어, NSFG 코드북에는 각 변수를 요약한 장표가 있다. outcome에 대한 테이블이 있는데 각 임신 결과값을 코드화한 것이다. value label 1 LIVE BIRTH 2 INDUCED ABORTION 3 STILLBIRTH 4 MISCARRIAGE 5 ECTOPIC PREGNANCY 6 CURRENT PREGNANCY Total 9148 1862 120 1921 190 352 시리즈 클래스는 value_counts 라는 메쏘드를 제공하는데 각 값이 출현하 는 횟수를 계수한다. 만약 데이터프레임에서 outcome 시리즈를 선택한다면, value_counts를 사용해서 공표된 값과 비교할 수 있다. >>> df.outcome.value_counts().sort_index() 1 9148 2 1862 3 120 4 1921 5 190 6 352 value_counts 결과는 시리즈이고 sort_index가 인덱스별로 시리즈를 정렬한 다. 그래서 ㄱ결과값이 순서대로 나타난다. 결과값을 공표된 장표와 비교하면, outcome 값이 올바른 것처럼 보인다. 마찬가 지로, birthwgt_lb에 대한 공표된 장표가 다음에 있다. value label. INAPPLICABLE 0-5 UNDER 6 POUNDS 6 6 POUNDS 7 7 POUNDS 8 8 POUNDS 9-95 9 POUNDS OR MORE Total 4449 1125 2223 3049 1889 799 그리고, 계수된 값이 다음에 있다. >>> df.birthwgt_lb.value_counts().sort_index() 0 8 1 40

제 1 장. 탐색적 자료 분석 10 2 3 4 5 6 7 8 9 10 11 12 13 14 15 51 53 98 229 697 2223 3049 1889 623 132 26 10 3 3 1 1 6, 7, 8 에 대한 계수는 확인됐고, 만약 0-5와 9-95 범위 숫자를 더한다면, 계수 도 맞는 것으로 확인된다. 하지만, 만약 좀더 자세히 들여다본다면, 오류가 있는 값을 하나 발견할 것이다. 51 파운드 신생아! 이 오류를 다루기 위해서, CleanFemPreg 프로그램에 한줄 코드를 추가한다. df.birthwgt_lb[df.birthwgt_lb > 20] = np.nan 상기 문장은 유효하지 않은 값을 np.nan으로 바꾼다. 꺾쇠괄호에 있는 표현식은 부울(bool) 자료형 시리즈를 산출한다. 여기서 True는 조건이 참인 것을 나타 낸다. 불리언 시리즈가 인덱스로 사용될 때, 조건을 만족하는 요소값(element)만 선택한다. 제 8 절 해석 (Interpretation) 효과적으로 데이터를 가지고 작업하기 위해서는 동시에 두 관점에 대해서 생각 해야만 한다: 통계적관점과 문맥적 관점. 사례로 응답자 몇명에 대한 응답 시퀀스를 살펴보자. 데이터 파일이 구성된 방식 때문에 각 응답자에 대한 임신 데이터를 수집하기 위해서는 몇가지 작업을 해야 한다. 다음이 작업을 수행하는 함수다. def MakePregMap(df): d = defaultdict(list) for index, caseid in df.caseid.iteritems(): d[caseid].append(index) return d

9. 연습 문제 (Exercises) 11 df는 임신 데이터가 있는 데이터프레임이다. iteritems 메쏘드는 임신 각각에 대해 인덱스(행 번호)와 caseid를 하나씩 열거한다. d는 딕셔너리로 각 ID에서 인덱스 리스트로 매핑한다. 만약 defaultdict과 친 숙하지 않다면, 파이썬 collections 모듈로 생각하면 된다. d를 사용해서, 응답 자를 찾아내고 해당 응답자 임신에 대한 인덱스를 얻을 수 있다. 다음 사례는 응답자 한명을 찾아 응답자하신 여성분의 임신 결과를 리스트로 출 력한다. >>> caseid = 10229 >>> indices = preg_map[caseid] >>> df.outcome[indices].values [4 4 4 4 4 4 1] indices는 응답자 번호 10229에 대응되는 임신 인덱스 리스트다. 인덱스로 df.outcome에 리스트를 사용하서 표식된 행을 선택하고 시리즈를 산 출한다. 전체 시리즈를 출력하는 대신에 NumPy 배열인 values 속성을 선택했 다. 코드 결과값 1은 정상출산을 나타낸다. 코드 결과값 4는 유산을 나타낸다; 즉, 통상 알려진 의학적인 원인 없이 자연스럽게 끝난 임신. 통계적으로 해당 응답자가 유별난 것은 아니다. 유산은 흔하며, 다수 혹은 그 이 상을 보고한 다른 응답자도 있다. 하지만 문맥을 기억한다면, 데이터가 말하는 것은 6번 임신했고, 매번 유산으로 끝난 한 여성의 이야기다. 7번째로 가장 최근 임신은 정상출산으로 마무리 되었 다. 만약 연민을 가지고 데이터를 생각한다면, 데이터가 전하는 이야기로 감동받 는 것은 어쩌면 자연스럽다. NSFG 데이터셋의 각 레코드는 아주 많은 개인적이고 어려운 질문에 대한 정직한 응답을 제공한 사람을 대표한다. 해당 데이터를 사용해서 가족 생활, 출산, 건강 에 관한 통계적 질문에 답할 수 있다. 동시에 데이터로 대표되는 사람을 사려깊이 생각하고, 존경과 감사를 가질 의무도 있다. 제9절 연습 문제 (Exercises) Exercise 1.1. 다운로드 받은 저장소에서, chap01ex.ipynb 파일을 찾아라. IPython 노트북 파일이다. 명령라인에서 다음과 같이 입력해서 IPython 노트북을 실행한다: $ ipython notebook &

12 제 1 장. 탐색적 자료 분석 만약 IPython이 설치되어 있으면, 백그라운드로 실행되는 서버를 실행시키 고, 노트북을 볼 수 있도록 브라우져가 열린다. 만약 IPython과 친숙하지 않 다면, http: // ipython. org/ ipython-doc/ stable/ notebook/ notebook. html 웹사이트에서 시작해 보는 것을 권장한다. 그림을 쭉 줄지어(inline) 나오도록 명령라인 선택옵션을 추가할 수 있다; 즉, 쭉 줄지어(inline) 는 팝업 윈도우가 아닌 노트북에 그림이 나오게 한다: $ ipython notebook --pylab=inline & chap01ex.ipynb 파일을 연다. 일부 셀이 이미 채워져 있고, 채워진 셀은 실행해 야 한다. 다른 셀은 연습문제로 명령어를 넣어 주어야 된다. 연습문제에 대한 해답은 chap01soln.ipynb 파일에 나와 있다. Exercise 1.2. chap01ex.py라는 파일을 생성하고, 2002FemResp.dat.gz 응답자 파일을 불러 읽는 코드를 작성한다. nsfg.py 파일을 복사한 뒤 변형해도 좋다. pregnum 변수는 각 응답자가 얼마나 많이 임신했는지 재부호화(recode)한 것이 다. 이 변수의 값에 대한 갯수를 출력하고 NSFG 코드책에 출판된 결과와 비교 하라. 각 응답자에 대한 pregnum와 임신 파일에 레코드 숫자와 비교해서 응답자 파일과 임신 파일을 상호 타당성을 검증할 수도 있다. 각 색인 목록에 caseid에서 임신 데이터프레임으로 매핑하는 딕셔너리를 만드 는데 nsfg.makepregmap을 사용할 수 있다. 이 연습문제에 대한 해답은 chap01soln.py에 나와 있다. Exercise 1.3. 통계를 학습하는 가장 좋은 방법은 관심있는 프로젝트로 작업해보 는 것이다. 첫째 아이가 늦게 태어날까? 같은 질문이 조사하고자 하는 것인가? 개인적으로 관심이 있는 질문, 논란이 있는 주제, 정치적 영향을 갖는 질문, 사회 적 통념을 생각해 보라. 그리고 통계적 연구로 이끌게 되는 질문으로 공식화할 있는지 살펴보라. 질문을 다루는데 도움이 되는 자료를 찾아보라. 정부가 좋은 원천정보가 될 수 있는데 이유는 공공 연구로부터 나온 데이터가 흔히 자유로이 이용가능하기 때 문이다. 시작하기 좋은 웹사이는 다음과 같다. http: // www. data. gov/, http: // www. science. gov/, 영국에는 http: // data. gov. uk/. 저자가 선호하는 두가지 데이터셋은 일반사회조사(General Social Survey), http: // www3. norc. org/ gss+ website/, 그리고 유럽사회조사, http: // www. europeansocialsurvey. org/. 만약 누군가 이미 관심있는 질문에 답을 한 것처럼 보인다면, 해당 대답이 정당화 될 수 있는지 꼼꼼히 살펴보라. 데이터에 오류가 있거나 결론에 신뢰가 가지 않는

10. 용어사전 13 분석일 수 있다. 이런 경우, 동일한 데이터에 다른 분석을 수행하거나, 더 좋은 데이터 원천정보를 찾아나선다. 만약 관심있는 질문을 다룬 출판된 논문을 찾게 되면, 원자료를 얻을 수 있어야 된다. 많은 저자는 웹에 데이터를 공개하고 있다. 하지만, 민감한 데이터에 대해서 는 저자에게 편지를 써서 데이터 사용계획에 관한 정보를 제공하고, 사용 조건에 동의해야만 한다. 끈기를 가지세요! 제 10 절 용어사전 일화적 증거 (anecdotal evidence): 제대로 설계된 조사에 의한 것보다는 우연히 수집된 종종 개인적인 증거. 모집단 (population): 조사에서 관심을 가지는 그룹. 모집단 은 종종 한 무리의 사람을 가르키지만, 용어가 또한 다른 대상에 대해서도 사용된다. 종단적 연구 (cross-sectional study): 특정 시점에 모집단에 관한 자료를 수집하는 연구. 사이클 (cycle): 반복되는 종단 연구에서, 연구 반복을 사이클이라고 한다. 횡단적 연구 (longitudinal study): 시간을 두고 모집단을 추적하는 연구 로 동일 그룹에서 반복적으로 데이터를 수집한다. 레코드(record): 데이셋에서, 한 사람 혹은 다른 피험자에 관한 정보 집합. 응답자 (respondent): 조사에 응답한 사람. 표본 (sample): 자료 수집하는데 사용된 모집단의 부분집합. 대표성 (representative): 만약 모집단의 모든 멤버가 표본에 뽑힐 가능성 이 동일한다면 표본은 대표성이 있다. 오버샘플링 (oversampling): 적은 표본 크리로 생기는 오류를 피하기 위 해서 하위 모집단의 대표성을 키우는 기법. 원자료 (raw data): 점검, 계산, 해석이 거의 없거나 전혀 없는 상태로 기록 되고 수집된 값. 재코드 (recode): 원자료에 적용된 계산 혹은 다른 로직으로 생성된 값. 자료 정제 (data cleaning): 데이터 타당성 확보, 오류 식별, 자료형간의 변환, 자료 표현 등을 포함하는 프로세스.

14 제 1 장. 탐색적 자료 분석

제2장 분포 (Distribution) 제 1 절 히스토그램 변수를 기술하는 가장 좋은 방법중의 하나는 데이터셋에 나타나는 값과 각 값 이 얼마나 나타나는지를 보고하는 것이다. 이러한 기술법을 변수 분포(distribution)라고 부른다. 가장 일반적인 분포 표현은 히스토그램(histogram)으로 각 값의 빈도(frequency)를 보여주는 그래프다. 이러한 맥락에서 빈도 는 값이 출현하는 횟수를 의미한다. 파이썬에서 빈도를 계산하는 효율적인 방법은 딕셔너리를 사용하는 것이다. 시 퀀스 값 t가 주어진 상태에서, hist = {} for x in t: hist[x] = hist.get(x, 0) + 1 결과는 값을 빈도로 매칭하는 딕셔너리다. 대안으로 collections 모듈에 정의된 Counter 클래스를 사용할 수 있다. from collections import Counter counter = Counter(t) 결과는 Counter 객체로 딕셔너리의 하위클래스가 된다. 또다른 선택지는 판다스 value_counts 메쏘드를 사용하는 것으로 앞장에서 살 펴봤다. 하지만, 이 책에서 히스토그램을 나타내는 Hist 클래스를 생성하고 Hist 클래스에서 동작하는 메쏘드를 제공한다.

16 제 2 장. 분포 (Distribution) 제 2 절 히스토그램 표현하기 Hist 생성자는 시퀀스, 딕셔너리, 판다스 시리즈, 혹은 다른 Hist를 받을 수 있다. 다음과 같이 Hist 객체 인스턴스를 생성할 수 있다. >>> import thinkstats2 >>> hist = thinkstats2.hist([1, 2, 2, 3, 5]) >>> hist Hist({1: 1, 2: 2, 3: 1, 5: 1}) Hist 객체는 Freq 메쏘드를 제공하는데 값을 받아 빈도를 반환한다. >>> hist.freq(2) 2 꺾쇠 연산자도 동일한 것을 수행한다. >>> hist[2] 2 만약 찾는 값이 없다면, 빈도는 0이다. >>> hist.freq(4) 0 Values 메쏘드는 Hist에 정렬되지 않는 리스트 값을 반환한다. >>> hist.values() [1, 5, 3, 2] 정렬된 값으로 루프를 돌리려면, 내장함수 sorted를 사용할 수 있다. for val in sorted(hist.values()): print(val, hist.freq(val)) Items 메쏘드를 사용해서 값-빈도(value-frequency) 짝을 반복처리할 수 있다. for val, freq in hist.items(): print(val, freq) 제 3 절 히스토그램 그리기 (Plotting histograms) 이 책에서 저자는 thinkplot.py 모듈을 작성해서 Hists를 그리는 함수 와 thinkstats2.py에 정의된 객체를 제공한다. pyplot에 기반하고 있고 matplotlib 패키지의 일부다. matplotlib을 설치하는 방법은 4을 참조하세요. thinkplot으로 hist를 그리기 위해서 다음을 시도해 보세요. >>> import thinkplot >>> thinkplot.hist(hist) >>> thinkplot.show(xlabel='value', ylabel='frequency')

4. NSFG 변수 17 ' ) $ $ V ] f h \ k [ h S ` V ' $ $ $ & ) $ $ & $ $ $ % ) $ $ % $ $ $ ) $ $ $ & $ & ( *, % $ % & % ( % * 그림 2.1: 출생체중 파운드 히스토그램. http://greenteapress.com/thinkstats2/thinkplot.html thinkplot에 대한 문서를 참조할 수 있다. 웹사이트에서 제 4 절 NSFG 변수 이제 NSFG에 있는 데이터로 다시 돌아가자. 이장에 있는 코드는 first.py다. 코드를 다운로드하고 작업에 대한 정보는 4 장을 참조하라. 새로운 데이터셋을 가지고 작업을 시작할 때, 한번에 하나씩 사용하려는 변수를 탐색하길 제안한다. 시작하는 좋은 방법은 히스토그램을 그려보는 것이다. 6에서 agepreg를 백분년에서 년단위로 변환했고, birthwgt_lb와 birthwgt_oz을 조합해서 totalwgt_lb 한 단위량으로 만들었다. 이번 절 에서 히스토그램의 몇가지 기능을 시연하기 위해서 이 변수들을 사용한다. 데이터를 읽고, 정상 출산에 대한 레코드를 선택해서 시작해보자. preg = nsfg.readfempreg() live = preg[preg.outcome == 1] 꺾쇠 표현식은 부울 시리즈(boolean Series)로 데이터프레임에서 행을 선택하고 새로운 데이터프레임을 반환한다. 다음에 정상출산에 대한 birthwgt_lb 히스토 그램을 생성하고 플롯해서 그려낸다. hist = thinkstats2.hist(live.birthwgt_lb, label='birthwgt_lb') thinkplot.hist(hist) thinkplot.show(xlabel='pounds', ylabel='frequency')

제 2 장. 분포 (Distribution) 18 % & $ $ V ] f h \ k [ h S c n % $ $ $, $ $ * $ $ ( $ $ & $ $ $ & $ & ( *, % $ % & % ( % * 그림 2.2: 출생체중 온스 히스토그램. % $ $ U [ Y d f Y [, $ * $ ( $ & $ $ % $ % ) & $ & ) ' $ ' ) ( $ ( ) 그림 2.3: 임신 종료시점 산모연령 히스토그램.

5. 특이점 (Outliers) 19 ) $ $ $ d f [ ` b [ h \ ( $ $ $ ' $ $ $ & $ $ $ % $ $ $ $ % $ $ % $ & $ ' $ ( $ ) $ * $ 그림 2.4: 임신기간(주별) 히스토그램. Hist에 인자가 판다스 시리즈일 때, nan 값은 탈락한다. label은 문자열로 Hist 가 그려질 때 범례에 나타난다. 그림 2.1가 결과를 보여준다. 가장 많이 관찰되는 값을 최빈값(mode)이라고 하고 이 경우에 7 파운드다. 분포는 근사적으로 종모양인 정규(normal) 분포 모양으 로 가우스(Gaussian) 분포라고도 한다. 하지만, 순수 정규분포와 달리, 분포가 비대칭이다; 오른쪽보다 왼쪽으로 좀더 확장된 꼬리(tail)가 있다. 그림 2.2은 변수 birthwgt_oz의 히스토그램으로 출생 체중의 온스 부분이다. 이론적으로 분포가 균등(uniform)하길 기대한다; 즉, 모든 값이 동일한 빈도를 가져야 한다. 사실 0 이 다른 값과 비교하여 좀더 흔하고, 1과 15는 좀더 흔하지 않은데, 아마도 이유는 응답자가 정수값에 가까운 출생 체중을 반올림한것으로 추측한다. 그림 2.3은 agepreg의 히스토그램으로 임신 말기 산모 나이다. 분포는 대략 종모 양이지만, 이 사례의 경우 꼬리가 좀더 왼쪽보다 오른쪽으로 뻗여나갔다. 대부분 의 산모는 20대이지만 30대도 적은 수지만 존재한다. 그림 2.4은 prglngth의 히스토그램으로 주간(week) 단위 임신기간이다. 가장 흔한 값은 39주다. 외쪽 꼬리가 오른쪽 꼬리보다 길다; 조산 신생아가 일반적이 지만, 임신기간이 43주를 넘어가지는 않고, 만약 의사가 판단하기에 필요하다면 임신기간에 관여하는 것이 일반적이다. 제 5 절 특이점 (Outliers) 히스토그램을 보면, 가장 흔한 값과 분포 모양을 식별하기는 쉽다. 하지만, 드문 값이 항상 눈에 잘 뜨이지는 않는다.

제 2 장. 분포 (Distribution) 20 계속 진행하기 전에, 특이점 (outliers)을 점검하는 것이 좋은 생각이다. 특이점은 이상치라고 불리는 극단값으로 측정과 기록에서 오류일 수도 있고, 드분 사건의 정확한 기록일 수도 있다. Hist는 Largest, Smallest 메쏘드를 제공하는데, 정수 n을 받아 히스토그램에서 최대값과 최소값 n개를 반환한다. for weeks, freq in hist.smallest(10): print(weeks, freq) 정상 출산에 대한 임신기간 리스트에서 가장 작은 최소값 10개는 [0, 4, 9, 13, 17, 18, 19, 20, 21, 22]이다. 10 주보다 적은 값은 확실한 오류다; 가장 그럴듯한 설명은 아마도 결과를 올바르게 코드화하지 못한 것이다. 30주 이상되 는 값은 아마도 적합하다. 10주에서 30주 사이의 값은 확실하다고 하기가 어렵다; 몇몇 값은 아마도 오류지만 몇몇은 미숙아를 나타낸다. 범위의 반대편에서 가장 큰 값은 다음과 같다. weeks 43 44 45 46 47 48 50 count 148 46 10 1 1 7 2 만약 임신기간이 42주를 넘어가면 대부분의 의사는 유도분만(induced labor)을 추천한다. 그래서 몇몇 긴 임신기간값은 놀라움을 준다. 특히, 임신 50주는 의학 적으로 가능하지 않아 보인다. 특이점을 다루는 가장 좋은 방법은 특정 분야의 전문 지식(domain knowledge) 에 달려있다; 즉, 데이터 출처와 데이터가 의미하는 바에 대한 정보. 그 리고 어떠한 분석방법을 수행할지에 달려있다. 이번 예제에서, 동기 부여 질문은 첫번째 아이가 일찍 (혹은 늦게) 태어나는 경향 이 있느냐는 것이다. 사람들이 이 질문을 할 때, 대체로 전체 임신기간에 관심이 있다. 그래서, 이번 분석에서는 27주 이상이 되는 임신에 초점을 맞출 것이다. 제6절 첫번째 아이 (First babies) 첫째 아이와 나머지 아이에 대한 임신 기간 분포를 이제 비교할 수 있다. birthord 변수를 사용해서 정상 출산 데이터프레임을 나누고 히스토그램을 연 산해서 그린다.

6. 첫번째 아이 (First babies) 21 ' $ $ $ & ) $ $ & $ $ $ % ) $ $ % $ $ $ ) $ $ $ % $ $ % $ & $ ' $ ( $ ) $ * $ 그림 2.5: 임신기간 히스토그램. firsts = live[live.birthord == 1] others = live[live.birthord!= 1] first_hist = thinkstats2.hist(firsts.prglngth) other_hist = thinkstats2.hist(others.prglngth) 그리고 나서, 동일 축에 히스토그램을 플롯하여 그린다. width = 0.45 thinkplot.preplot(2) thinkplot.hist(first_hist, align='right', width=width) thinkplot.hist(other_hist, align='left', width=width) thinkplot.show(xlabel='weeks', ylabel='frequency') thinkplot.preplot 함수는 그래프를 그리려고하는 히스토그램 갯수를 인자로 받는다; 인자 정보를 이용해서 적절한 색깔 집합을 선택할 수 있다. thinkplot.hist는 align= center 을 기본값으로 사용해서 각 막대는 값에 대 해서 중앙에 위치한다. 그림에서는 align= right 와 align= left 를 사용해 서 각 값의 양쪽으로 해당 막대를 위치시켰다. width=0.45 옵션값으로, 두 막대의 전체 넓이는 0.9로, 각 막대페어 간에 약간 공백을 두었다. 마지막으로, 축을 조정해서 27주와 46주 사이 데이터만 보이게 만들었다. 그 림 2.5이 지금까지의 결과를 보여준다. 히스토그램은 최빈값을 즉시 명확하게 보여준다는 점에서 유용하다. 하지만, 두 분포를 비교하는데는 가장 좋은 선택이 되지는 못하다. 이번 예제에서 첫째가

제 2 장. 분포 (Distribution) 22 아닌 아이 보다 첫째 아이 숫자가 더 적다. 그래서, 히스토그램에서 명백한 차 이는 표본크기에서 나온다. 다음 장에서 확률질량함수(probability mass functions)를 사용해서 이 문제를 다뤄본다. 제 7 절 분포 요약하기 히스토그램은 표본을 완전히 기술하는 분포다; 즉, 히스토그램이 주어진다면 (순 서대로는 할 수 없지만) 표본에 있는 값을 재구성할 수 있다. 만약 분포에 대한 자세한 사항이 중요하다면, 히스토그램으로 표현하는 것이 필 요할지도 모른다. 하지만, 종종 기술 통계량 몇개로 분포를 요약할 때도 있다. 보고하는데 사용되는 특성치 몇개는 다음과 같다. 중심경향성 (central tendency): 값들이 특정한 점을 주심으로 군집하는 경 향이 있는가? 모드 (modes): 하나 이상 군집(cluster)이 있는가? 퍼짐 (spread): 값들에 얼마나 많은 변동이 있는가? 꼬리 (tails): 모드(최빈값)에서 멀어질 때, 확률이 얼마나 빨리 떨어지는가? 특이점 (outliers): 모드(최빈값)에서 멀리 떨어진 극단값이 있는가? 상기 질문에 대답하도록 설계된 통계량이 요약통계 (summary statistics)다. 지 금까지 가장 흔한 요약통계는 평균(mean)으로 분포의 중심경향성을 기술하는 의도가 있다. 값을 합한 뒤에 표본갯수로 나눈 것이 각 값이 xi 인 n개 표본이 있다면, 평균 x는 다; 다른 말로, 1 x = xi n i 평균 (mean) 와 평균(average) 은 때때로 상호호환적으으로 사용된다. 하지 만 다음과 같이 이 책에서 구별한다. 표본 평균 (mean) 은 앞선 공식으로 계산되는 요약 통계다. 평균 (average) 은 중심경향성을 기술하려고 선택하는 다수 요약통계량 중 하나다.

8. 분산 (Variance) 23 때때로 평균(mean)은 값들의 집합을 잘 기술한다. 예를 들어, 사과는 거의 크기 가 동일하다. (최소한 마트에서 팔리는 사과는 그렇다.) 그래서, 사과 6개를 사고, 전체 무게가 3 파운드라면, 사과 각각은 0.5 파운드라고 주장하는 것은 일리있는 요약이 된다. 하지만, 호박은 좀더 다양하다. 텃밭에서 호박 몇종을 기른다고 가정하자. 어느 날 1 파운드 장식용 호박 3개, 3 파운드 호박파이용 호박 2개, 그리고 519 파운드 대서양 거인 호박 한개를 수확했다. 표본 평균은 100 파운드다. 하지만, 텃밭에 호박 평균 무게는 100 파운드 라고 말한다면 오도할 수 있다. 호박 무게에 대해서 전형적인 호박이 없기 때문에 유의미한 평균은 없다. 제 8 절 분산 (Variance) 호박 무게를 요약하는 단 하나의 숫자가 없다면, 숫자 두개로 좀더 잘 할 수 있다; 평균(meand)과 분산 (variance). 분산은 분포의 변동(variability)과 퍼짐(spread)을 기술하려는 요약통계다. 값 들의 집합에 대한 분산은 다음과 같다. S2 = 1 ( xi x )2 n i xi x 항은 평균으로부터 편차(deviation from the mean) 라고 하고, 분산은 평균제곱편차다. 분산의 제곱근(S)을 표준편차 (standard deviation)라고 한다. 이전에 경험이 있다면, 분모에 n 대신에 n 1로 분산을 계산하는 공식을 봤을 것 이다. 이 통계치는 표본을 사용해서 모집단 분산을 추정하는데 사용된다. 이것에 대해서는 나중에 8장에서 다시 다룰 것이다. 판다스 자료구조는 평균, 분산, 표준편차를 계산하는 메쏘드를 제공한다. mean = live.prglngth.mean() var = live.prglngth.var() std = live.prglngth.std() 모든 정상 분만에 대해서, 평균 임신기간은 38.6주, 표준편차는 2.7주로 의미하는 바는 일반적으로 2-3주 편차가 있다는 것이다. 임신 기간의 분산은 7.3으로 해석하기가 여렵다. 특히, 단위가 주2, 즉 주 제곱 이다. 분산은 몇몇 계산에서는 유용하지만, 좋은 요약통계는 아니다.

제 2 장. 분포 (Distribution) 24 제 9 절 효과 크기 (Effect size) 효과 크기(effect size)는 효과의 크기를 기술하려는 요약 통계다. 예를 들어, 두 집단간에 차이를 기술하기 위해서 평균값의 차이는 명확한 한가지 선택이 된다. 첫째 아이에 대한 평균 임신기간은 38.601; 첫째를 제외한 아이들의 평균 임신 기간은 38.523이다. 차이는 0.078주가 되고, 시간으로는 13시간이다. 전형적인 임신기간에 대한 일부분으로 보면, 차이는 약 0.2%가 된다. 만약 추정치가 정확하다고 가정하면, 이와 같은 차이는 실질적인 중요성은 없다. 사실, 대규모 임신사례를 관찰하지 않고 누구도 이와 같은 차이를 인지할 것 같지 는 않다. 효과의 크기를 전달하는 또 다른 방법은 집단간(between groups)의 차이를 집단 내(within groups) 변동성과 비교하는 것이다. 코헨(Cohen) d가 이러한 의도를 가진 통계량이다; 다음과 같이 정의된다. d= x 1 x 2 s x 1 와 x 2 은 집단 평균값이고, s는 합동 표준편차(pooled standard deviation) 다. 코헨(Cohen) d를 계산하는 파이썬 코드가 다음에 있다. def CohenEffectSize(group1, group2): diff = group1.mean() - group2.mean() var1 = group1.var() var2 = group2.var() n1, n2 = len(group1), len(group2) pooled_var = (n1 * var1 + n2 * var2) / (n1 + n2) d = diff / math.sqrt(pooled_var) return d 이 예제애서, 평균값의 차이는 0.029 표준편차로 크지 않다. 이러한 관점에서 본다면, 남성과 여성의 키 차이는 약 1.7 표준편차다.(https://en.wikipedia. org/wiki/effect_size 참조) 제 10 절 결과 보고하기 첫째 아이와 첫째가 아닌 아이간에 임신 기간(만약 차이가 있다면)에 차이를 기 술하는 몇가지 방법을 살펴봤다.

11. 연습 문제 25 질문은 누가 질문을 하느냐에 달려있다. 과학자는 아무리 작더라도 존재하는 (실 제) 차이에 관심이 있을지 모른다. 의사는 단지 임상적으로 유의한 (clinically significant) 효과에만 관심을 둘 수 있다; 즉, 치료결정에 영향을 주는 차이. 임 신한 여성은 늦게 혹은 빨리 출산할 확률 같은 본인에게 관련된 결과에만 관심이 있을 수 있다. 어떻게 결과를 보고할지도 또한 목적에 달려있다. 만약 효과의 중요성을 시연 하려고 한다면, 차이를 강조하는 요약통계량을 선택할 수도 있다. 만약 환자를 안심시키고자 한다면, 차이를 염두에 둔 통계량을 선택할지도 모른다. 물론, 본인의 결정은 또한 전문가 윤리에 따라야만 한다. 설득하려고 한다면 괜찮 다; 스토리를 명확하게 전달하는 시각화 도구와 통계 보고서를 설계해야만 한다. 하지만, 또한 보고서를 정직하게 만들고, 불활실성과 한계를 인정하는데도 최선 을 다해야 한다. 제 11 절 연습 문제 Exercise 2.1. 이번 장의 결과에 기반해서, 첫번째 아이 출산이 늦은가에 관해서 배운 것을 요약하도록 요청받는다고 가정하자. 9시 뉴스에 나온다면, 어떤 요약 통계량을 사용해야 할까? 불안해 하는 환자를 안심시키려면 어떤 요약 통계량을 사용해야 할까? 마지막으로, 진실한 정보(The Straight Dope) (http: // straightdope. com )의 저자 세실 아담스(Cecil Adams)라고 상상하자. 여러분의 일은 첫째 아이가 늦 게 태어나는가? 질문에 대답하는 것이다. 분명하고, 정확하고, 정직하게 질문에 답하는데 이번 장에서 나온 결과를 사용해서 한 문단으로 작성하시오. Exercise 2.2. 다운로드받은 저장소에서, chap02ex.ipynb 라는 이름의 파일을 찾아서 연다. 일부 셀이 이미 채워져 있고, 채워진 셀은 실행해야 한다. 다른 셀은 연습문제로 명령어를 넣어 주어야 된다. 지침을 따라서 정답을 채워넣으세요. 연습문제에 대한 해답은 chap02soln.ipynb 파일에 나와 있다. 다음 연습문제로, chap02ex.py 이름으로 파일을 생성하시오. chap02soln.py 파일에 정답이 나와있다. Exercise 2.3. 분포 최빈값(mode)은 가장 빈번하게 나오는 값이다; http: // wikipedia. org/ wiki/ Mode_ ( statistics) 을 참조한다. Hist를 입력값으로 받아서 가장 빈번하게 나오는 값을 반환하는 함수 Mode를 작성하시오. 좀더 도전적인 연습문제로, AllModes라는 함수를 작성한다. 빈도수를 내림차순 으로 정렬하는 값-빈도를 짝지은 목록으로 반환한다. Exercise 2.4. 변수 totalwgt_lb을 사용해서, 첫번째 아이가 다른 아이들보다 더 가벼운지 더 무거운지 조사하시오. 집단 사이 차이를 정량화하는데 코헨 d (Cohen s d)를 계산한다. 임신 기간에 차이와 어떻게 비교가 되는가?

제 2 장. 분포 (Distribution) 26 제 12 절 용어사전 분포 (distribution): 표본에 나타나는 값과 개별 값의 빈도 히스토그램 (histogram): 값에서 빈도로 매핑, 혹은 매핑을 보여주는 그래 프. 빈도 (frequency): 표본에서 값이 나타나는 횟수. 최빈값 (mode): 표본에서 가장 빈도가 높은 값 혹은 가장 빈도가 높은 값중 의 하나. 정규분포 (normal distribution): 이상적인 종모양 분포; 가우스 분포로도 알려져 있다. 균등분포 (uniform distribution): 모든 값이 동일한 본도를 갖는 분포. 꼬리 (tail): 가장 높고 가장 낮은 극단에 있는 분포 부분. 중심경향성 (central tendency): 표본 혹은 모집단 특성치; 직관적으로 평 균 혹은 전형적인 값. 특이점 (outlier): 중심경향성에서 떨어진 값. 퍼짐 (spread): 분포에 있는 값들이 얼마나 퍼져있는지에 대한 측정. 요약통계 (summary statistic): 중심경향성 혹은 퍼짐같이 분포의 일부 측 면을 정량화하는 통계치. 분산 (variance): 퍼짐을 정량화하는데 종종 사용되는 요약통계. 표준편차 (standard deviation): 분산의 제곱근으로 또한 퍼짐을 측정하는 데 사용된다. 효과 크기 (effect size): 집단간의 차이처럼 효과 크기를 정량화하는 요약 통계. 임상적으로 유의한 (clinically significant): 집단간 차이처럼, 실제로 연관 있는 결과.

제3장 확률 질량 함수 이번 장에서 사용되는 코드는 probability.py에 있다. 코드를 다운로드하고 작 업하는 것에 대한 정보는 4을 참조한다. 제 1 절 Pmf 분포를 표현하는 또다른 방식은 확률 질량 함수(probability mass function) (PMF)로 각 값을 확률로 매핑한다. 확률(probability)은 표본 크기 n의 일부로 서 표현되는 빈도다. 빈도에서 확률을 얻기 위해서, n으로 나누는데 이를 정규화 (normalization)라고 부른다. Hist가 주어지면, 각 값에 확률값을 매핑하는 딕셔너리를 만들 수 있다. n = hist.total() d = {} for x, freq in hist.items(): d[x] = freq / n 혹은 thinkstats2에서 제공하는 Pmf 클래스를 사용할 수도 있다. Hist와 마찬 가지로, Pmf 생성자는 판다스, 시리즈, 딕셔너리, Hist, 다른 Pmf 객체를 받을 수 있다. 다음에 간단한 리스트를 입력값으로 받는 예제가 있다. >>> import thinkstats2 >>> pmf = thinkstats2.pmf([1, 2, 2, 3, 5]) >>> pmf Pmf({1: 0.2, 2: 0.4, 3: 0.2, 5: 0.2}) Pmf는 정규화 과정을 거쳐 전체 확률값이 1이 된다.

28 제 3 장. 확률 질량 함수 Pmf와 Hist 객체는 많은 점에서 비슷하다; 사실, 공통 부모 클래스에서 많은 메쏘 드를 상속받았다. 예를 들어, Values와 Items 메쏘드는 두 객체 모두에 동일한 방 식으로 동작한다. 가장 큰 차이점은 Hist가 값을 정수형 계수기(integer counter) 로 매핑한다는 것이고; Pmf는 값을 부동소수점 확률값으로 매핑한다는 것이다. 값과 연관된 확률값을 조회하려면, Prob를 사용한다.: >>> pmf.prob(2) 0.4 꺾쇠 연산자도 동등한 기능을 한다. >>> pmf[2] 0.4 기존 Pmf를 값과 연관되어 있는 확률값을 증가시킴으로써 변경할 수 있다. >>> pmf.incr(2, 0.2) >>> pmf.prob(2) 0.6 혹은 확률에 일정량을 곱할 수도 있다. >>> pmf.mult(2, 0.5) >>> pmf.prob(2) 0.3 만약 Pmf를 변경하면, 결과는 정규화되지 않을지도 모른다; 즉, 확률값을 다 합하 면 1이 되지 않을지도 모른다. 확률값을 합한 결과를 반환하는데 사용되는 Total 메쏘드를 호출해서 확인한다. >>> pmf.total() 0.9 다시 정규화하기 위해서, Normalize를 호출한다: >>> pmf.normalize() >>> pmf.total() 1.0 Pmf 객체는 Copy 메쏘드를 제공하는데, 이를 통해서 원본에 영향을 주지않고, 사본을 만들고 변경 작업을 할 수 있다. 이번 절에 표기법이 일관성을 갖지 않는 것처럼 보일지도 모르지만 체계가 있다; Pmf를 클래스 명칭으로, pmf는 클래스의 인스턴스로, PMF는 확률질량함수에 대한 수학적 개념으로 각각을 표기하는데 사용한다.

2. PMF 플롯으로 그리기 29 $ " * $ " * $ " ) $ " ) $ " ( $ " ( $ " ' $ " ' $ " & $ " & $ " % $ " % $ " $ ' $ ' ) ( $ ( ) $ " $ ' $ ' ) ( $ ( ) 그림 3.1: 막대 그래프와 계단 함수를 사용하여, 첫째 아기와 첫째가 아닌 아기에 대한 임신기간 PMF. 제 2 절 PMF 플롯으로 그리기 thinkplot은 Pmf 플롯을 그리는 두가지 방식을 제공한다. Pmf를 막대그래프로 그리기 위해서 thinkplot.hist을 사용한다. 만약 Pmf에 값의 개수가 작다면 막대그래프가 가장 유용한다. 계단 함수로 Pmf를 그래프 그리기 위해서는, thinkplot.pmf을 사용할 수 있다. 만약 값이 많고, Pmf가 매끄럽다면(smooth) 탁월한 선택이 된다. 이 함수는 Hist 객체에서도 동작한다. 추가로, pyplot은 hist 함수를 제공하는데 값(value) 시퀀스를 받아서 히스토그 램을 계산하고, 그래프로 그린다. Hist 객체를 사용하기 때문에, pyplot.hist은 사용하지 않는다. 그림 3.1은 막대그래프(왼쪽)와 계단함수(오른쪽)를 사용해서 첫째 아이와 첫째 가 아닌 아이에 대한 임신기간 PMF를 보여준다. 히스토그램 대신에 PMF 플롯을 그려서, 표본차이로 오도되지 않고 두 분포를 비교할 수 있다. 그림을 해석하면, 첫번째 아이는 다른 아이들보다 정시(39주차) 에 출산하지 않고, 늦게(41, 42주차) 출산할 것 같다. 그림 3.1을 생성하는 코드가 다음에 있다:

제 3 장. 확률 질량 함수 30 thinkplot.preplot(2, cols=2) thinkplot.hist(first_pmf, align='right', width=width) thinkplot.hist(other_pmf, align='left', width=width) thinkplot.config(xlabel='weeks', ylabel='probability', axis=[27, 46, 0, 0.6]) thinkplot.preplot(2) thinkplot.subplot(2) thinkplot.pmfs([first_pmf, other_pmf]) thinkplot.show(xlabel='weeks', axis=[27, 46, 0, 0.6]) PrePlot 메쏘드는 옵션 매개변수 rows와 cols을 받아서 그림 격자(grid)를 만 드는데 이경우 한 행에 그림 두개를 넣는 격자가 된다. 첫번째 그림(왼쪽)은 thinkplot.hist을 사용해서 앞에서 봤던 Pmf를 화면에 출력한다. PrePlot에 두번째 호출로 색깔 생성자를 초기화한다. 그리고 나서 SubPlot이 두번째 그림(오른쪽)으로 바꿔서, thinkplot.pmfs을 사용해서 Pmf를 화면에 출력한다. axis을 사용해서 그림 두개 모두 동일한 축(axis)에 놓여지도록 확실 히 한다. 그림 두개를 비교하려고 한다면, 축을 통일하는 것이 좋다. 제 3 절 다른 시각화 방법 히스토그램과 PMF은 데이터를 탐색하고 패턴과 관계를 식별하는데 유용하게 사용된다. 데이터에서 무슨 정보가 담겨져있고, 어떻게 돌아가는지 아이디어를 얻게 된다면, 다음 단계는 최대한 깔끔하게 식별한 패턴화할 수 있는 시각화 설계 하는 것이다. NSFG데이터에서 분포에서 가장 큰 차이는 모드(최빈치)에 있다. 그래서, 그래 프에서 이 부분만을 확대하여 들여다보고, 차이를 강조하도록 자료를 변환하는 것이 의미가 있다. weeks = range(35, 46) diffs = [] for week in weeks: p1 = first_pmf.prob(week) p2 = other_pmf.prob(week) diff = 100 * (p1 - p2) diffs.append(diff) thinkplot.bar(weeks, diffs)

4. 학급 크기 패러독스 (class size paradox) 31 ( & $ & ( *, ' ( ' * ', ( $ ( & ( ( ( * 그림 3.2: 주별 백분율점(percentage point)으로 나타낸 차이. 상기 코드에서 weeks가 임신주 범위다; diffs는 퍼센트에서 두 PMF간 차이가 된다. 그림 3.2는 막대그래프로 결과를 보여준다. 그림이 패턴을 좀더 명확하게 한다: 첫째 아이는 임신 39주차에 덜 태어날 것 같고, 임신 41, 42주차에 더 태어날 것 같다. 지금까지 결론을 잠정적으로 내렸다. 동일한 데이터셋을 사용해서 명백하게 차 이를 식별하고 나서 차이를 명확하게 만드는 시각화 방식을 선택했다. 효과 차 이가 실질적인지 확실하다고 할 수는 없다; 확률변동(random variation)일 수도 있다. 나중에 이 문제를 다시 다룰 것이다. 제 4 절 학급 크기 패러독스 (class size paradox) 진도를 더 나가기 전에, Pmf 객체를 가지고 할 수 있는 한가지 계산(computation)을 시연하고자 한다; 다음 예제를 학급 크기 패러독스(class size paradox) 라고 명명한다. 많은 미국 대학에서, 학생대교수 비율은 약 10:1이 된다. 하지만 종종 학생들이 평균 학급크기가 10보다 큰 것을 발견하고 놀라곤 한다. 불일치에 대한 두가지 이유가 있다. 학생들이 학기당 일반적으로 4 5 과목을 수강하지만, 교수는 1 혹은 2 교과 목만 가르친다. 적은 학급 수업을 즐기는 학생 숫자는 적지만, 큰 학급 수업에 학생수는 많다.

제 3 장. 확률 질량 함수 32 첫 이유는 명확하지만, 두번째 이유는 다소 모호하다. 사례를 살펴보자. 대학에서 다음과 같은 학급 크기 분포로 한 학기에 65 교과목을 개설한다고 가정하자. size 5-9 10-14 15-19 20-24 25-29 30-34 35-39 40-44 45-49 count 8 8 14 4 6 12 8 3 2 만약 학교 총장에게 평균 학급크기를 물어본다면, 총장은 PMF를 생성하고, 평균 을 계산하고 나서 학급 평균 크기가 23.7이라고 보고한다. 다음에 코드가 있다. d = { 7: 8, 12: 8, 17: 14, 22: 4, 27: 6, 32: 12, 37: 8, 42: 3, 47: 2 } pmf = thinkstats2.pmf(d, label='actual') print('mean', pmf.mean()) 하지만, 학생집단을 대상으로 수업에 학생이 있는지 물어보고, 평균을 계산한다 면, 평균 학급크기가 더 크다고 생각할 것이다. 얼마나 더 큰지 살펴보자. 먼저, 학생들이 관측한 분포를 계산하자. 여기서 각 학급 크기와 연관된 확률은 학급에 있는 학생으로 편의(bias) 가 있다. def BiasPmf(pmf, label): new_pmf = pmf.copy(label=label) for x, p in pmf.items(): new_pmf.mult(x, x) new_pmf.normalize() return new_pmf 각 학급 크기 x마다, 확률값에 학급 크기를 관측한 학생수 x를 곱한다. 결과는 편의분포를 나타내는 새로운 Pmf가 된다. 이제 실제와 관측된 분포 모두를 플롯 그래프로 그릴 수 있다. biased_pmf = BiasPmf(pmf, label='observed') thinkplot.preplot(2) thinkplot.pmfs([pmf, biased_pmf]) thinkplot.show(xlabel='class size', ylabel='pmf')

4. 학급 크기 패러독스 (class size paradox) 33 $ " & ) $ " & $ D A : $ " % ) $ " % $ $ " $ ) $ " $ $ $ % $ & $ ' $ ( $ ) $ 그림 3.3: 실제값과 학생이 관측한 값에 대한 학급크기 분포. 그림 3.3은 결과를 보여준다. 편의된 분포에서 작은 학급은 더 작고, 큰 학급은 더 많다. 편의된 분포 평균은 29.1로 실제 평균값보다 약 25%더 많다. 이 연산을 거꾸로 하는 것도 또한 가능하다. 대학 학급 크기 분포를 알고자 한 다고 가정하자. 하지만, 대학 총장으로부터 신뢰성 있는 자료를 얻을 수는 없다. 대안은 무작위 학생 표본을 골라 학급에 학생수가 얼마인지 설문하는 것이다. 결과는 앞선 살펴봤던 이유로 편의가 있을지 모르지만, 이것을 사용해서 실제 분포를 추정한다. 다음에 Pmf 불편의(unbiased) 함수가 있다. def UnbiasPmf(pmf, label): new_pmf = pmf.copy(label=label) for x, p in pmf.items(): new_pmf.mult(x, 1.0/x) new_pmf.normalize() return new_pmf BiasPmf 함수와 비슷하다; 유일한 차이점은 곱하는 대신에 각 확률값을 x로 나 눈다는 것이다.

제 3 장. 확률 질량 함수 34 제 5 절 데이터프레임 인덱싱 (DataFrame indexing) 4 절에서 판다스 데이터프레임을 읽고, 데이터프레임을 사용해서 데이터 열(칼 럼)을 선택하고 변경했다. 이제 행선택을 살펴보자. NumPy 난수 행렬을 생성하 고, 이것을 사용해서 데이터프레임으로 초기화한다. >>> >>> >>> >>> >>> 0 1 2 3 import numpy as np import pandas array = np.random.randn(4, 2) df = pandas.dataframe(array) df 0 1-0.143510 0.616050-1.489647 0.300774-0.074350 0.039621-1.369968 0.545897 초기 설정값(by default)으로 행과 열 모두 0에서 시작하는 숫자로 번호가 매겨 진다. 하지만, 열이름을 지정할 수 있다. >>> columns = ['A', 'B'] >>> df = pandas.dataframe(array, columns=columns) >>> df A B 0-0.143510 0.616050 1-1.489647 0.300774 2-0.074350 0.039621 3-1.369968 0.545897 행이름도 지정할 수 있다. 행이름 집합을 index라고 한다; 행이름 자체는 labels 이라고 한다. >>> index = ['a', 'b', 'c', 'd'] >>> df = pandas.dataframe(array, columns=columns, index=index) >>> df A B a -0.143510 0.616050 b -1.489647 0.300774 c -0.074350 0.039621 d -1.369968 0.545897 앞장에서 살펴보았듯이, 단순 인덱싱으로 열을 선택하면 시리즈를 반환한다. >>> df['a'] a -0.143510 b -1.489647

5. 데이터프레임 인덱싱 (DataFrame indexing) 35 c -0.074350 d -1.369968 Name: A, dtype: float64 레이블(label)로 행을 선택하려면 loc 속성을 사용하면 되고 시리즈를 반환한다. >>> df.loc['a'] A -0.14351 B 0.61605 Name: a, dtype: float64 레이블(label) 보다 행의 정수 위치정보를 알고 있다면, iloc속성을 사용하고, 실행 결과로 시리즈를 반환한다. >>> df.iloc[0] A -0.14351 B 0.61605 Name: a, dtype: float64 또한 loc는 레이블 리스트를 인자로 받고, 결과로 데이터프레임을 반환한다. >>> indices = ['a', 'c'] >>> df.loc[indices] A B a -0.14351 0.616050 c -0.07435 0.039621 마지막으로 레이블(label)로 행 범위를 선택하는데 슬라이스를 사용할 수 있다. >>> df['a':'c'] A B a -0.143510 0.616050 b -1.489647 0.300774 c -0.074350 0.039621 혹은 정수 위치정보를 사용할 수도 있다. >>> df[0:2] A a -0.143510 b -1.489647 B 0.616050 0.300774 어느 경우든지 관계없이 결과는 데이터프레임이 된다. 하지만 첫번째 결과는 슬 라이스 끝값을 포함하지만, 두번째는 끝값을 포함하지 않는 것을 주목하라. 저자 충고: 만약 행에 단순히 정수값이 아닌 레이블(label)이 있다면, 레이블을 일관되게 사용하고 정수 위치정보 사용을 피하라.

제 3 장. 확률 질량 함수 36 제 6 절 연습 문제 이번 연습문제 대한 해답은 chap03soln.ipynb 파일과 chap03soln.py 파일에 담겨있다. Exercise 3.1. 만약 자녀에 대해서, 얼마나 많은 자녀가 있는지 묻는다면, 학급 크 기 패러독스 같은 것이 나타난다. 많은 자녀를 갖는 가족이 표본에 더 잘 나타날 것 같고 자녀가 없는 가족이 표본에 나타날 가능성은 없다. NSFG 응답자 NUMKDHH 변수를 사용해서 가구에서 18세 이하 자녀수에 대한 실제 분포를 생성하라. 이제 만약 자녀에 대해서, 18세 이하 (본인 포함) 얼마나 많은 자녀가 있는지 묻 는다면, 보게될 편향된 분포를 계산하라. 실제 분포와 편향된 분포를 도식화하고 평균을 계산하라. 출발장소로 chap03ex.ipynb 파일을 사용할 수 있다. Exercise 3.2. 7 절에서 구성요소를 더해가고 n으로 나눠서 표본 평균을 계산했 다. 만약 PMF가 주어지면, 여전히 평균을 계산할 수 있으나, 과정은 다소 차이가 난다: x = pi xi i 여기서, xi 는 PMF에 있는 유일한 값이고, pi = PMF ( xi ). 마찬가지로, 다음과 같이 분산을 계산할 수 있다: S2 = pi (xi x )2 i Pmf 객체를 인자로 받아 평균과 분산을 계산하는 함수를 PmfMean 와 PmfVar 으로 이름지어 작성하시오. 작성한 메쏘드를 테스트하기 위해서, Pmf에서 제공 하는 Mean, Var 메쏘드와 일치하는지 검사하라. Exercise 3.3. 저자는 첫째 아이가 좀더 늦게 태어날 것 같은가? 라는 질문으로 시작했다. 이 질문을 다루는데, 아이 집단간에 평균에 차이를 계산했다. 하지만, 동일 여성에 대해 첫째 아이와 다른 아이 사이에 차이가 있을 수 있다는 가능성을 간과했다. 이 질문을 다루는데, 적어도 아이가 두명인 응답자를 선택하고 쌍별 차이(pairwise difference)를 계산한다. 이 질문 구성이 다른 결과를 도출해 내는가? 힌트: nsfg.makepregmap을 사용한다. Exercise 3.4. 대부분의 도보경주(foot race)에서 모든 사람이 같은 시간에 출발한 다. 만약 빠른 주자라면, 초반 경주에서 많은 사람을 앞질러 간다. 하지만, 몇 마일 지난 후에 주위 모든 사람은 같은 속도록 달려간다. 저자가 처음으로 장거리 (209마일) 계주를 뛰었을 때, 저자는 특이한 현상을 알 아챘다: 저자가 다른 주자를 따라 잡았을 때, 저자는 통상 훨씬 더 빠르고, 또다른