본문 바로가기
Python/통계분석

[누구나 파이썬 통계분석]_Ch02.1차원 데이터 정리_시각화

by ssolLEE 2024. 1. 13.
반응형

파이썬으로 간단하게 통계 내용을 공부해보아요. 오늘부터 열심히 달려보겠습니다.

 

포스팅은 타니아이 히로키님의 '누구나 파이썬 통계 분석' 책의 내용을 실습한 것입니다. 

감사합니다.

소스코드와 데이터는 아래의 웹페이지에 공개되어 있습니다. 

- 한빛출판네트워크(https://www.hanbit.co.kr/support/supplement_list.html)

- 깃허브(https://github.com/ghmagazine/python_stat_sample)

 

 

저번 포스팅에서 우리는 도수분포표를 사용해서 데이터를 잘 파악할 수 있었습니다. 

이번 포스팅에서는 데이터를 시각화하여 파악해보겠습니다. 

 

 

2.4.2 히스토그램

  • 히스토그램은 도수분포표를 막대그래프로 나타낸 것입니다. 
  • 시각화할 때 많이 사용하는 Matplotlib 라이브러리를 사용합니다.
import matplotlib.pyplot as plt

# 그래프가 jupyter notebook에 표시되도록 함
%matplotlib inline

# 그래프의 크기(가로, 세로)를 설정합니다.
fig = plt.figure(figsize=(7, 5)) 
# 인수는 영역을 1X1개 지정, 하나의 영역에 그린다는 것을 의미
ax = fig.add_subplot(111)

# 계급수를 10으로 하여 히스토그램 그리기
freq, _, _ = ax.hist(english_scores, bins = 10, range = (0, 100))
# x, y축에 레이블 부여
ax.set_xlabel('score')
ax.set_ylabel('person number')

# x, y축에 눈금 표시
ax.set_xticks(np.linspace(0, 100, 10+1))
ax.set_yticks(np.arange(0, freq.max()+1))

plt.show()

  • 어때요? 표로도 데이터를 파악할 수 있지만 이렇게 눈으로 확연하게 볼 수도 있죠? 
  • 계급폭을 줄이면, 즉 계급수를 늘리면 더 세부적으로 데이터의 분포를 볼 수 있습니다. 
  • 계급수를 20으로 해보면 다음처럼 히스토그램을 볼 수 있습니다. 

  • 모양이 다르죠? 데이터 특성에 많게 적절하게 계급을 조절해서 사용하세요!
  • 이번에는 상대도수의 히스토그램을 누적상대도수의 꺾은선 그래프와 함께 그리겠습니다.
fig = plt.figure(figsize=(10, 7)) 
ax1 = fig.add_subplot(111)

# y축의 스케일이 다른 그래프를 ax1과 동일한 영역에 생성
ax2 = ax1.twinx()

# 상대도수의 히스토그램으로 하기 위해서는, 도수를 데이터 수로 나눌 필요가 있음
# 이것은 hist의 인수 weight를 지정하면 실현 가능
weights = np.ones_like(english_scores) / len(english_scores)
rel_freq, _, _ = ax1.hist(english_scores, bins = 25, range=(0, 100), weights=weights)
cum_rel_freq = np.cumsum(rel_freq)
class_value = [(i + (i+4))//2 for i in range(0, 100, 4)]

# 꺾은선 그래프를 그림
# 인수 ls를 '--'로 하면 점선이 그려짐
# 인수 marker를 'o'으로 하면 데이터 점을 그림
ax2.plot(class_value, cum_rel_freq, ls = '--', marker = 'o', color = 'black')

# 꺾은선 그래프의 눈금선 제거
ax2.grid(visible = False)

ax1.set_xlabel('score')
ax1.set_ylabel('relative frequency')
ax2.set_ylabel('cumulative relative freqency')
ax1.set_xticks(np.linspace(0, 100, 25+1))

plt.show()

  • 표로 데이터를 보는 것과는 또 다른 느낌입니다. 

2.4.3 상자그림

  • 상자그림은 데이터의 산포도를 표현하는 것입니다.
  • 데이터의 분포와 이상값을 시각적으로 파악할 수 있고, 개인적으로 데이터 분석을 하기 앞서, 데이터를 파악할 때 꼭 하는 작업입니다. 
  • 다음과 같은 구성입니다. 

출처: https://computer-science-student.tistory.com/174

fig = plt.figure(figsize = (5, 6))
ax = fig.add_subplot(111)
ax.boxplot(english_scores, labels=['english'])

plt.show()

  • 중앙값이 평균값보다는 작고, 낮은 점수 부분에 이상값이 보입니다. 
  • 대체적으로 점수가 60점 전후에 많이 모여 있다는 것을 알 수 있네요. 

 

지금까지 1차원 데이터를 정리하는 것에 대해서 차근차근 살펴보았습니다.

감사합니다.