Ch 2. 자료의 정리

  • 변수와 자료
  • 도수분포표

1. 변수 ( variable, feature )

양적변수 ( quantitative variable, real value )

수치로 나타낼 수 있는 변수

  • 이산변수 ( discrete )
    • 정숫값을 취한 수 있는 변수
    • ex. 자녀수, 자동차판매대수 등
  • 연속변수 ( continuous )
    • 모든 실수값을 취할 수 있는 변수
    • ex. 길이, 무게 등

질적변수 ( qualitative variable, categorical value )

수치로 나타낼 수 없는 변수

  • 명목변수 ( nominal )
    • ex. 성별, 종교, 출생지, 운동선수 등번호 등
  • 서열변수 ( ordinal )
    • 측정대상 간의 순서를 매기기 위해 사용되는 변수
    • ex. 성적 A, B, C 등급

2. 도수분포표

수집된 자료를 적절한 등급(또는 범주)으로 분류하고 각 등급에 해당되는 빈도수 등을 정리한 표 <img src="http://trsketch.dothome.co.kr/_contents/2009curi/images/img900027.png", width=600>

도수분포표 작성요령

  1. 모든 자료는 빠짐없이 도수분포표에 포함되어야 한다. 극단적 수치(이상치)가 있다고 해도 제외하지 말고 구간의 간격을 ~이상, 또는 ~이하로 표시하여 다 포함시켜야 한다.
  2. 이상치를 제외한 나머지 등급의 구간은 모두 같아야 한다.
  3. 등급은 서로 중복되지 않아야 한다.
  4. 등급은 연속적으로 표시되어야 한다. 해당 사례수가 없다고 해서 그 구간을 제외해선 안 된다.
  5. 등급의 구간의 크기는 홀수로 정하는 것이 좋다. 그래야 그 구간의 중간점을 쉽게 정할 수 있다.
  6. 등급 구간의 첫번째 숫자는 한눈에 잘 띄는 숫자로 시작하는 것이 좋다. 예를 들면 93이상 ~ 98미만 보단 90이상 ~ 95미만 이 좋다.

등급의 구간

  • 등급의 구간 = ( 자료의 최대값 - 자료의 최소값 ) / 등급의 수

Q. 연습문제


In [1]:
import pandas as pd
import numpy as np

np.random.seed(0)
data = np.random.randint(50, 100, size=(8, 5))
data[0][0] = 12

data


Out[1]:
array([[12, 97, 50, 53, 53],
       [89, 59, 69, 71, 86],
       [73, 56, 74, 74, 62],
       [51, 88, 89, 73, 96],
       [74, 67, 87, 75, 63],
       [58, 59, 70, 66, 55],
       [65, 97, 50, 68, 85],
       [74, 99, 79, 69, 69]])

In [2]:
np.sort(data.flatten())


Out[2]:
array([12, 50, 50, 51, 53, 53, 55, 56, 58, 59, 59, 62, 63, 65, 66, 67, 68,
       69, 69, 69, 70, 71, 73, 73, 74, 74, 74, 74, 75, 79, 85, 86, 87, 88,
       89, 89, 96, 97, 97, 99])

구간 설정

  • 구간 개수 : 5개
  • 구간 크기 : 10

In [3]:
interval = 5
interval_len = ( data.max() - 50 ) / interval
interval_len


Out[3]:
9.8000000000000007

구간별 빈도수 측정

  • 50미만 : 1
  • 50이상 60미만 : 10
  • 60이상 70미만 : 9
  • 70이상 80미만 : 10
  • 80이상 90미만 : 6
  • 90이상 100미만 : 4

In [4]:
data1 = [[45, 1, 1],
         [55, 10, 11],
         [65, 9, 20],
         [75, 10, 30],
         [85, 6, 36],
         [95, 4, 40]]
df = pd.DataFrame(data1,
             index=[u'~50', u'50~60', u'60~70', u'70~80', u'80~90', u'90~100'],
             columns=[u"중간값" ,u"빈도수", u"누적빈도"])
df


Out[4]:
중간값 빈도수 누적빈도
~50 45 1 1
50~60 55 10 11
60~70 65 9 20
70~80 75 10 30
80~90 85 6 36
90~100 95 4 40

In [5]:
import matplotlib.pyplot as plt

X = df.중간값
y = df.빈도수

plt.bar(X, y, width=5, align='center')
plt.title("histogram")
plt.xlabel("score")
plt.ylabel("frequency")
plt.xticks(X, [u'~50', u'50~60', u'60~70', u'70~80', u'80~90', u'90~100'])
plt.show()



In [6]:
X = df.중간값
y = df.누적빈도

plt.plot(X, y, "--o")
plt.xlim(45, 95)
plt.title("cumulative line plot")
plt.xlabel("score")
plt.ylabel("cumulative frequency")
plt.xticks(X, [u'~50', u'50~60', u'60~70', u'70~80', u'80~90', u'90~100'])
plt.show()