-
03-3 중심경향의 지표 : 중앙값과 조건문 2데이터 분석/파이썬으로 배우는 데이터 분석을 위한 통계학 2022. 3. 14. 22:06
이제 조건문에 대해 배웠으니 중앙값을 구해볼까? 1, 3, 5, 7, 9와 같이 홀수개의 숫자들의 중앙값과 2, 4, 6, 8과 같이 짝수개의 숫자들의 중앙값을 구해 볼거야. 앞서 배웠듯이 홀수개와 짝수개 일때 중앙값을 구하는 방법이 달라. 숫자들이 홀수개라면 말 그대로 중앙에 있는 값이 중앙값이 되는거고, 짝수개라면 중앙에 있는 두 값의 평균이 중앙값이 되는거지.
그렇다면!
숫자들이 모두 몇 개인지 알아야겠네? 그 다음엔 홀수개인지 짝수개인지 판별하면 될 거고.
1, 3, 5, 7, 9나 2, 4, 6, 8은 숫자가 몇 개 안되기 때문에 눈으로 세기 쉬워. 하지만 숫자가 많으면 눈으로 세는 것이 어려워질 수 밖에 없겠지? 이 땐 우리가 배웠던 'len()'이라는 내장 함수를 이용하면 돼. 'len()'은 항목의 갯수가 얼마인지 알려주는 함수였어. 기억나지? 복습해 보면,
nums1 이라는 리스트는 총 5개의 값을 가지고 있기 때문에 5를 출력됐고, nums2 라는 리스트는 총 4개의 값을 가지고 있기 때문에 4가 출력됐어. 참 쉽지?
이제 조건문을 사용해서 리스트의 항목 개수가 홀수라면 중앙에 있는 값을, 짝수라면 중앙에 있는 두 개의 값의 평균을 구하기만 하면 돼.
항목의 개수를 N이라 하고 만약 N이 홀수 라면 중앙값을 구할 땐
(N이 홀수일 때) 중앙값이 위치한 순서 : (N+1) / 2
와 같았지?
그대로 파이썬 코드로 만들어 볼게. N이 홀수인지 판별하려면 홀수와 짝수의 정의를 떠올려 보면 돼. 어떤수 K를 2로 나누었을 때 나누어 떨어지면 짝수, 그렇지 않고 나머지가 1이면 홀수였지? 파이썬에서 나머지를 구할 땐 '%'기호를 이용하면 돼. '앞에 있는 숫자에서 뒤에 있는 숫자를 나눈 나머지'를 쉽게 구할 수 있지!
만약 7에서 5를 나눈나머지를 구하고 싶다면
7%5
와 같이 표현할 수 있어. 파이썬 코드로 실행해 볼까?
7을 5로 나눈 나머지, 7을 3으로 나눈 나머지 그리고 7을 7로 나눈 나머지를 각각 출력해 봤어. 나머지를 구할 수 있는나머지 연산자(%)를 사용하니 참 쉽게 나머지를 구할 수 있네! 이 나머지 연산자를 사용해서 조건문의 조건을 만들어 볼게. 만약 N이 홀수라면 N을 2로 나눈 나머지가 1이 될거야. 파이썬 코드로 나타내기 전에 값을 비교하기 위한 '비교 연산자'에 대해 알아볼게.
연산을 할 수 있는 연산자에는 사칙연산과 같은 산술 연산자만 있는것은 아니야. 다른 연산자들도 있지. 그중에서 비교 연산자를 먼저 살펴볼게.
비교 연산 (比較 演算, comparison operation, [컴페어리슨 오퍼레이션])은 말 그대로 값을 비교하는 연산이야.
관계 연산 (關係 演算, relational operation, [릴레이셔널 오퍼레이션]) 이라고도 불러. 값의 관계를 비교하기 때문이지. 둘은 용어만 다를 뿐 같은거야.일단 비교 연산을 하게 해주는 비교 연산자(比較 演算子, comparison operator, [컴페어리슨 오퍼레이터])들을 살펴볼까?
기호 의미 예문 뜻 == 같다. a == b a와 b가 같다. != 다르다. a != b a와 b가 다르다. <
>크다. (초과)
작다. (미만)a < b
a > ba가 b보다 작다. (b가 a보다 크다.)
a가 b보다 크다. (= b가 a보다 작다.)<=
>=크거나 같다. (이상)
작거나 같다. (이하)a <= b
a >= ba가 b보다 작거나 같다. (b가 a보다 크거나 같다.)
a가 b보다 크거나 같다. (b가 a보다 작거나 같다.)'비교 연산자'라는 용어를 들었을 땐 어려워 보였지만 막상 보니 너무나 쉬운 것들이지? 이미 학교에서 배운 것들이기도 해. 값이 같은지 다른지 혹은 작은지 큰지 비교해 주는 비교할 수 있어!
주의할 점은 값이 같다는 뜻의 '=='라는 비교 연산자야. 같음을 나타내는 등호(=)를 두 번 연속으로 써야만 비교 연산자가 돼. 만약 하나만 쓴다면? 변수를 선언할 때처럼 값을 넣겠다는 완전히 다른 뜻으로 바뀌게 돼. 주의해야겠지?그렇다면 홀수인지 아닌지 판별하기 위해서는 '==' 라는 비교 연산자를 사용해서 조건을 만들면 되겠어! 아래와 같이 말야.
if N%2 == 1: 조건이 참 일때 실행
'N을 2로 나누었을 때 나머지가 1'을 산술 연산자 '%'와 비교 연산자 '=='로 나타내어 조건을 만들어 줬어. 그리고 조건이 참이라면 아래 들여쓰기 이하에 있는 내용이 실행될거야. 아래의 코드 처럼 말야.
N이 3이기 때문에 2로 나누었을 때 나머지는 1이 돼. 조건이 참이지? 조건이 참이기 때문에 코드를 실행해 보면 'N은 홀수입니다.'라는 문구가 출력되는 것을 볼 수 있어.
이제 배운것들을 활용해서 1, 3, 5, 7, 9라는 숫자들의 중앙값을 구해볼까?
nums1 이라는 리스트의 항목 개수는 5개야. N이 5라는 뜻이지. 그리고 N을 2로 나누었을 때 나머지가 1이니까 N은 홀수가 되겠지? N이 홀수라면 중앙값은 (N+1)/2 번째 있는 숫자가 될 것이고, 그 값을 median이라는 변수에 담았어. 3이 출력 되었네? 3번째 있는 숫자라는 뜻이 될거야.
만약 nums1라는 리스트에서 3번째 있는 숫자를 출력하고 싶다면? 대괄호 [] 를 이용하면 돼!
리스트이름[순서]
만약 nums1라는 리스트에서 3번째 있는 값을 출력하고 싶다면 아래와 같은 코드로 구현할 수 있어.
어? 그런데 3번째 있는 숫자가 5가 아니라 7이라고 출력되고 있어! 분명히 3번째 있는 숫자는 5처럼 보이는데 말야..
아니야. 파이썬의 리스트에서는 가장 첫 번째 항목이 0부터 시작해. 따라서 nums1에서 0번째 항목은 1, 1번째 항목은 3, 2번째 항목은 5, 3번째 항목은 7, 마지막으로 4번째 항목은 9가 돼. 이런 항목의 순서를 index(인덱스)라고 해. 항목은 item(아이템)이라고 하고. nums1에서 5라는 항목은 인덱스가 2인 것이지. 이해 됐어? 따라서 5를 출력하고 싶다면 인덱스를 3이 아니라 2로 바꿔 주어야 돼. 아래 코드 처럼 말야.
nums1[2]은 nums1라는 리스트의 인덱스가 2인 항목을 뜻 해. 바로 5야. 잘 출력됐지? 이제 앞서 중앙값을 구하려고 시도했던 코드를 조금만 고쳐서 진짜 중앙값을 출력해볼게!
median에서 1을 빼 주기만 하면 인덱스가 보정 될거야. 리스트의 인덱스는 0부터 시작하니까!
어?! 그런데
TypeError: list indices must be integers, not float on line 5 in main.py
라고 에러가 출력되는 것을 볼 수 있어. 해석하면, 리스트의 인덱스는 '정수(integer)'여야 되는데, 인덱스를 '실수(float)'로 놓으니까 에러가 났다~ 라는 뜻이야. median만 따로 출력해 보면 '2.0'이 나오거든. 소숫점이 붙은 실수인 것이지. 이 실수를 정수로 만들어 주기만 하면 돼! 실수를 정수로 만들기 위해서는 여러가지 방법이 있는데, 그 중에서 가장 간단한 방법은 'int()'라는 내장 함수를 사용하는거야.
int(정수로 변환할 숫자)
소괄호 안에 정수로 변환하고자 하는 숫자를 넣으면 돼. 우리는 median을 정수로 만들어 주면 되겠지?
야호!
int() 함수를 사용해서 (N+1)/2-1을 정수로 바꿔 주었더니 코드가 잘 작동하는 것을 볼 수 있어! 1, 3, 5, 7, 9의 중앙값인 5도 잘 출력되는 것도 확인할 수 있고 말야! 신난다! 이제 N이 홀수 일 때 중앙값을 파이썬 코드로 구현할수 있게 되었어. 그렇다면 N이 짝수일 땐?
N이 짝수라는 뜻은 홀수가 아니라는 뜻이기도 해. 홀수이면서 짝수인 숫자는 없으니까. 즉, N을 2로 나누었는데 나머지가 1이 아니라면 짝수라는 뜻이야. 맞지?
조건문에서 어떤 조건이 참일 때 실행될 동작을 정해줄 수 있었어. 반대로 어떤 조건이 참이 아닐 때 실행될 동작을 정해 줄 수 도 있어. 예약어 'else'라는 예약어를 통해서 말야!
if 조건: 조건이 참일 때 동작 else: 조건이 거짓일 때 동작
else는 말 그대로 '그밖에'라는 뜻이야. 조건이 참인 것은 참이지만, 참이 아닌 다른 것들은 그밖의 것이지. 하얀색은 하얀색이지만 하얀색이 아니라고 검은색은 아냐. 회색, 빨간색, 노란색 등 그밖의 것들이 하얀색이 아닌거지. 이게 else의 개념이야. 홀수와 짝수에 대입해 보면 홀수라는 조건이 참이라면 홀수지만 참이 아니라면 짝수가 될거야. 홀수가 아닌 그밖의 숫자는 짝수니까. (몇몇 정수론에서는 0을 홀수나 짝수가 아닌 독립적인 수로 보기도 하지만.. 교육과정과 같이 0을 짝수라고 볼게.)
if N이 홀수: N이 홀수일때 실행 else: N이 짝수일때 실행
이제 else의 사용법을 알겠지? else를 사용해서 우리가 중앙값을 구했던 코드를 확장해 볼게. N이 짝수일때의 경우도 생각해 보자는거야.
이번에는 nums2 라는 리스트를 사용했어. nums2에는 2, 4, 6, 8이 들어있지. 총 4개의 숫자야. N은 당연히 4가 되겠지? 4는 짝수이고 말야.
그래서 N을 2로 나누었을 땐 나머지가 1이 되지 않아. 조건이 참이 아니라는 거지. 조건은 N을 2로 나눈 나머지가 1이라는 것인데, 4는 2로 나누면 나머지가 0이니까 조건이 참이 되지 않고 거짓이 되어버려. 그치?
따라서 조건이 참이 아니기 때문에 else의 동작이 실행될거야. 'N은 짝수입니다.'라는 문구의 출력이지. 참 쉽지?
이제 N이 짝수일 때 중앙값을 구해볼게. N이 짝수일 땐
(N이 짝수일 때) 중앙값이 위치한 순서들 : N/2와 (N+1)/2
라고 배웠었어. N/2번째 숫자와 (N+1)/2번째 숫자의 평균을 구하면 돼. 대신 파이썬의 리스트에서는 인덱스가 0부터 시작하기 때문에 순서를 보정해주어야 할거야. N/2-1이랑 (N+1)/2-1번째 숫자로 말야. 근데 이러면 수식이 너무 복잡해 보이니까 간단하게 바꿔볼게.
2, 4, 6, 8이 순서대로 있는 nums2에서 중앙값은 4와 6의 평균이 될거야. 그치? 그리고 4의 인덱스는 1, 6의 인덱스는 2가 될거고. 이 1과 2는 N을 2로 나눈 다음 1을 뺀 값과 N에 1을 더한 다음 2로 나누고 1을 뺀 값과 같아. 복잡하지? 그러니 이러지 말고,
N을 2로 나눈 값인 2와, N을 2로 나눈 값에서 1을 뺀 값인 1을 가지고 평균을 구하는게 더 간단하지 않을까? 수식으로 정리하면
N/2-1번째 인덱스의 값이랑 (N+1)/2-1번째 인덱스의 평균이 아닌,
N/2-1번째 인덱스의 값이랑 N/2번째 인덱스의 평균으로 하자는거지.
어차피 그놈이 그 놈이니까. 알겠지? 따라서 중앙값은 인덱스 N/2-1이랑 N/2를 더한 다음 2로 나눠주면 구할 수 있을거야. 한 번 구해볼까?
대신 이번에는 인덱스에 넣을 숫자를 int() 함수가 아닌 '몫'으로 할거야. 몫은 정수로 밖에 표현이 되질 않으니까! 파이썬에서 몫은 '//' 기호를 사용해서 구할 수 있어. 8을 4로 나눈 몫을 구하고 싶다면 '8//4' 처럼 작성하면 돼. 아래의 코드를 실행해서 살펴보면 좋겠어.
8을 4로 나눈 몫은 2지? 나머지는 0이 될거고. 또, 8을 3으로 나누면 마찬가지로 몫은 2가 될거야 .하지만 나머지는 2가 되겠지. 이런식으로 산술 연산자 '//'를 사용하면 쉽게 몫을 구할 수 있어. 이제 본격적으로 짝수 일 때 중앙값을 구하는 코드를 만들어볼까?
nums2[N//2-1]은 N을 2로 나눈 몫에서 1을 뺀 값을 인덱스로 하는 항목을,
nums2[N//2]는 N을 2로 나눈 몫을 인덱스로 하는 항목을 뜻 해. 각각 4와 6이겠지? 이 둘을 더해서 2로 나누면 평균이 구해 질거야. 그게 바로 nums2의 중앙값이 되는거지! 5.0이 출력되었어! 야호! 성공!
이제 우리는 리스트 항목의 개수가 홀수이거나 짝수이거나 상관 없이 중앙값을 파이썬을 이용해 구할 수 있게 되었어! 야호! 다음으로는 '최빈값'에 대해 살펴볼까?
'데이터 분석 > 파이썬으로 배우는 데이터 분석을 위한 통계학' 카테고리의 다른 글
03-5 중심경향의 지표들과 파이썬 : 라이브러리와 모듈 (0) 2022.03.16 03-4 중심경향의 지표 : 최빈값 (0) 2022.03.16 03-2 중심경향의 지표 : 중앙값과 조건문 1 (0) 2022.03.14 03-1 중심경향의 지표 : 평균 (0) 2022.03.14 02-2 도표와 변산성 : 분포들은 어떻게 다른가? (0) 2022.03.14