[BigData] 데이터 시각화

2023. 4. 17. 13:03Computer Sciences/BigData

도수 분포표

  • 데이터가 취하는 값을 몇 개의 구간으로 나누고, 각 구간에 몇 개의 데이터가 들어가는가를 세서 정리한 표이다.

용어

  • 계급(class): 구간
    • 0 ~ 10, 10 ~ 20, 20 ~ 30, …
  • 계급폭(class interval): 구간 길이
    • 10
  • 계급값(class midpoint/mark): 구간 대푯값
    • 5, 15, 25, …
  • 계급수(bins): 총 계급 수
    • 100점까지 계급폭이 10이므로 계급 수는 10이다.
  • 도수(frequency): 계급에 속한 학생 수
    • 0 ~ 10까지는 1, 11 ~ 20 까지는 3, …
  • 상대도수(relative frequency)
    • 전체 중 해당 계급이 차지하는 비율
  • 누적상대도수(cumulative relative frequency) 
    • 현재 계급까지 상대도수의 합

Numpy, Pandas

  • numpy.histogram() 함수로 도수분포표를 구할 수 있다.
eng_s = df['english']

freq, bin_edges = np.histogram(eng_s, bins=10, range=(0, 100))
freq, bin_edges
# (array([ 0,  0,  0,  2,  8, 16, 18,  6,  0,  0], dtype=int64),
#  array([  0.,  10.,  20.,  30.,  40.,  50.,  60.,  70.,  80.,  90., 100.]))

bin_edges = [int(be) for be in bin_edges]
_class = [f'{bin_edges[i]}~{bin_edges[i+1]}' for i in range(len(bin_edges) - 1)]
_class
# ['0~10',
#  '10~20',
#  '20~30',
#  '30~40',
#  '40~50',
#  '50~60',
#  '60~70',
#  '70~80',
#  '80~90',
#  '90~100']

# 도수분포표
freq_dist_df = pd.DataFrame({'frequency': freq}, index=pd.Index(_class, name='class'))
freq_dist_df
#         frequency
# class    
# 0~10      0
# 10~20      0
# 20~30      0
# 30~40      2
# 40~50      8
# 50~60      16
# 60~70      18
# 70~80      6
# 80~90      0
# 90~100    0

# 계급값(class midpoint)
class_mid = [(i+(i+10))//2 for i in range(0, 100, 10)]
class_mid
# [5, 15, 25, 35, 45, 55, 65, 75, 85, 95]

# 상대도수
rel_freq = freq / freq.sum()
rel_freq
# array([0.  , 0.  , 0.  , 0.04, 0.16, 0.32, 0.36, 0.12, 0.  , 0.  ])

# 누적상대도수
cum_rel_freq = np.cumsum(rel_freq)
cum_rel_freq
# array([0.  , 0.  , 0.  , 0.04, 0.2 , 0.52, 0.88, 1.  , 1.  , 1.  ])

freq_dist_df['class midpoint']=class_mid
freq_dist_df['class interval']=10
freq_dist_df['relative frequency']=rel_freq
freq_dist_df['cumulative relative frequency']=cum_rel_freq
freq_dist_df=freq_dist_df[['class interval', 'class midpoint', 'frequency', 'relative frequency', 'cumulative relative frequency']]
freq_dist_df
#        ci      cm  f   rf    cfr
# class                    
# 0~10     10      5      0   0.00    0.00
# 10~20     10      15    0      0.00    0.00
# 20~30     10      25    0      0.00    0.00
# 30~40     10      35    2      0.04    0.04
# 40~50     10      45    8      0.16    0.20
# 50~60     10      55    16  0.32    0.52
# 60~70     10      65    18    0.36    0.88
# 70~80     10      75    6      0.12    1.00
# 80~90     10      85    0      0.00    1.00
# 90~100 10      95    0      0.00    1.00

히스토그램

  • 도수분포표를 막대 그래프로 나타낸 것이다.
# Pandas Dataframe Histogram
fig = plt.figure(figsize=(10,6))
ax = fig.add_subplot(111)
ax.set_xlabel('score')
ax.set_ylabel('frequency')
ax.set_xticks(np.linspace(0, 100, 11))
ax.set_yticks(np.arange(0, 20))

eng_s.hist(range=(0, 100))

# Matploblib histogram
ax.hist(eng_s, range=(0, 100))
ax.grid(True)
💡 프레임워크에서 제공하는 건 커스텀하기 어려우므로 가능한 원래 라이브러리를 활용하는 것이 권장된다.
💡 히스토그램을 그릴 때 계급이나 계급수 등을 어떻게 설정하는지가 중요하다. 값을 어떻게 설정하는지에 따라 통계 결과를 보는 사람의 생각이 바뀌기 때문이다. 또한 range 설정도 오차값 처리를 위해서 중요하다. 이러한 설정은 정해진 답이 있는게 아니므로 상황에 따라 적절하게 지정해야 한다.

'Computer Sciences > BigData' 카테고리의 다른 글

[BigData] 데이터 정규화  (0) 2023.04.17
[BigData] 데이터 이해  (1) 2023.04.17
[BigData] Pandas 기본  (4) 2023.03.14
[BigData] Numpy 기본  (0) 2023.03.13