Pandas 기술통계
Pandas는 데이터프레임에서 기본적인 몇 가지 기술통계를 자동으로 추출해 주는 describe() 메서드를 제공한다.
ns_book6.describe()
count | 누락된 값을 제외한 데이터 개수 |
mean | 평균 |
std | 표준편차 |
min | 쵯소값 |
25% | 25% 값 |
50% | 중앙값 |
75% | 75% 값 |
max | 최댓값 |
25%, 50%, 75% 이외의 위치에 해당하는 값을 확인하고 싶다면 percentiles 매개변수를 사용한다.
describe(percentiles = [0.3, 0.6, 0.9])
중앙값 구하기
중앙값은 데이터를 순서대로 늘어 놓았을 때 중앙에 위치한 값이다. Pandas에서는 중앙값을 구하기 위한 median() 메서드를 제공한다. 중복값을 제외하고 중앙값을 구하려면 drop_duplicates() 메서드와 함께 median()을 사용한다.
ns_book7['대출건수'].drop_duplicates().median()
백분위 구하기
어떤 숫자의 백분위를 구하는 방법이 있을까? 1, 2, 3, 4, 5에서 4의 백분위는 0.75라고 쉽게 알 수 있다. 그렇지만 데이터의 수가 많아지면 이런 방법으로는 찾기가 어려울 것이다.
특정한 값에 대하여 불리언 배열을 만들고 이 불리언 배열에서 True의 값을 모두 헤아린 후 전체 데이터의 개수로 나눈다면 백분위와 거의 비슷한 값을 얻을 수 있다. Pandas에서 True는 1, False는 0으로 취급하므로 불리언 배열의 평균을 구하면 특정한 값이 차지하는 비율을 얻을 수 있다.
borrow_10_flag = ns_book7['대출건수'] < 10
borrow_10_flag.mean()
Numpy 기술통계
average()
Numpy의 average() 함수는 weights 매개변수를 이용하여 가중치를 적용한 가중 평균을 계산할 수 있다.
대출건수의 평균을 구할 때 도서권수의 역수를 가중치로 적용한다면 다음과 같다.
np.average(ns_book7['대출건수'], weights = 1/ns_book7['도서권수'])
분산
Pandas는 분산을 계산할 때 자유도를 고려하여 계산하기 때문에 분산을 계산하는 수식에서 분모에 (n-1)을 사용한다. 반면에 Numpy의 분산은 분모를 n으로 사용하기 때문에 두 분산 사이에 차이가 발생한다.
분포 요약하기
산점도 그리기
산점도는 두 변수의 값을 직교 좌표계에 점으로 나타내는 그래프이며 scatter() 함수로 그린다.
import matplotlib.pyplot as plt
plt.scatter(ns_book7['번호'], ns_book7['대출건수']
plt.scatter(ns_book7['도서권수'], ns_book7['대출건수']
plt.show()
히스토그램그리기
히스토그램은 수치형 특성의 값을 일정한 구간으로 나누어 구간 안에 포함된 데이터 개수를 막대 그래프로 그린 것이다. 가간 안에 속한 데이터 개수를 도수라고 부른다.
import matplotlib.pyplot as plt
plt.hist([0, 3, 5, 6, 7, 7, 8, 13], bins = 5)
plt.hist(np.random.randn(1000))
plt.show()
구간 조정하기
한 구간의 도수가 너무 커서 다른 구간에는 도수가 표시되지 않는 현상이 발생할 수 있는데 y축을 로그 스케일로 바꾼다면 문제를 해결할 수 있다.
plt.hist(ns_book7['대출건수'], bins = 100)
plt.yscale('log')
plt.show()
상자 수염
상자 수염은 최솟값, 세 개의 사분위수, 최댓값의 5개의 숫자를 이용해 데이터를 요약하는 그래프이다. 대략적인 과정은 다음과 같다.
1. 먼저 사분위를 구하고 25%, 75% 지점을 밑면과 윗면으로 하는 직사각형을 그린다.
2. 중간값에 해당하는 지점에 수평선을 그린다.
3. 사각형의 밑면과 윗면에서 사각형의 높이의 1.5배만큼 떨어진 거리 안에서 가장 멀리 있는 샘플까지 수직선을 그린다.
4. 이 수직선 밖에서 최솟값과 최댓값까지 데이터를 점으로 표시한다. 이 영역의 데이터를 이상치라고 한다.
plt.boxplot(ns_book7[['대출건수', '도서권수']]
plt.yscale('log')
plt.boxplot(ns_book7[['대출건수', '도서권수']], vert = False)
plt.xscale('log')
plt.show()