본문 바로가기
IT/Data Analysis

데이터 시각화

by Cyber_ 2024. 8. 11.

데이터 시각화에는 두가지 목적이 있다.

  • 데이터 탐색(exploration)
  • 데이터 전달(communication)

좋은 시각화와 그렇지 않은 것에 대한 분별력을 길러야 한다.

1. matplotlib

가장 전통적인 matplotlib은 웹을 위한 인터랙니브한 시각화를 위해서는 적합하지 않지만, 간단한 막대 그래프, 선 그래프, 또는 산점도를 그릴 때는 나쁘지 않다.
그 중에서도 matplotlib.pyplot은 시각화를 단계별로 간편하게 만들 수 있는 구조로 되어 있으며, 시각화가 완성되면 savefig()를 통해 그래프를 저장하거나 show()를 사용해서 화면에 띄울 수 있다.

from matplotlib import pyplot as plt

years = [1950, 1960, 1970, 1980, 1990, 2000, 2010]
gdp = [300.2, 543.3, 1075.9, 2862.5, 5979.6, 10286.7, 14958.3]

plt.plot(year, gdp, color = "grean", marker='o', linestyle='solid')
plt.title("Nominal GDP")
plt.ylabel("Billons of $")
plt.show()

2. 막대 그래프

막대 그래프(bar chart)는 이산적인(discrete) 항목들에 대한 변화를 보여줄 때 사용하면 좋다.

movies = ["Annine Hall", "Ben-Hur", "Casablanca", "Candhi", West Side Story"]
num_oscars = [5, 11, 3, 8, 10]

# 막대의 x 좌표는 [0, 1, 2, 3, 4], y 좌표는 [num_oscars]로 설정
plt.bar(range(len(movies)), num_oscars)
plt.title("My Favorite Movies")
plt.ylabel("# of Academy Awards")
# x축 각 막대의 중앙에 영화 제목을 레이블로 추가
plt.xticks(range(len(movies)), movies)
plt.show()

막대그래프를 이용하면 히스토그램(정해진 구간에 해당되는 항목의 개수를 보여줌으로서 값의 분포를 관찰할 수 있는 그래프 형태)도 그릴 수 있다. 이로써 분포를 관찰할 수 있다.

from collections import Counter
grades = [83, 95, 91, 87, 70, 0, 85, 82, 100, 67, 73, 77, 0]

histogram = Counter(min(grade // 10 * 10, 90) for grade in grades)

plt.bar([x + 5 for x in histogram.key()], # 각 막대를 오른쪽으로 5만큼 옮기고
        histogram.value(),                  # 각 막대의 높이를 정해주고
        10,                                  # 너비는 10으로
        edgecolor=(0,0,0)                  # 각 막대의 태두리는 검은색으로 설정

plt.axis([-5, 105, 0, 5])                  # x축은 -5부터 105
                                          # y축은 0부터 5

plt.xticks([10 * i for i in range(11)])   # x축 레이블은 0, 10, ..., 100
plt.xlabes("Decile")
plt.ylabe("# of Students")
plt.title("Distribution of Exam 1 Grades")
plt.show()

plt.bar의 세번째 인자는 막대의 너비를 결정, 각 구간의 너비가 10이므로 막대의 너비는 10, 또한 막대들을 오른쪽으로 이동해서 '10'에 해당하는 막대의 중점이 15가 되게 했다. 막대 간 구분이 되도록 각 막대의 테두리를 검은색으로 설정
plt.axis는 x축의 범위를 -5에서 105로 하고('0', '100'에 해당하는 막대가 잘리지 않도록 그리기 위해서)축의 범위를 0부터 5로 했정했다. y축을 0에서 시작하지 않으면 오해가 생길수 있으므로 plt.axis를 사용할 때에는 신중해야 한다.

3. 선 그래프

선 그래프는 어떤 경향을 보여줄 때 유용하다.

variance = [1, 2, 4, 8, 16, 32, 64, 138, 256]
bias_squared = [256, 128, 64, 32, 16, 8, 4, 2]
total_error = [x + y for x, y in zip(variance, bias_squred)]
xs = [i for i,_ in enumerate(varience)]

#한 차트에 여러개의 선을 그리기 위해 plt.plot을 여러번 호출할 수 있다.
plt.plot(xs, varance, 'g-', laber='ariance') #실선
plt.plot(xs, bias_squred, 'r-.', label='bias^2') # 일점쇄선
plt.plot(xs, total_error, 'b:', labe='total error') #점선

# 각 선에 레이블을 미리 달아 놨기 때문에 범례(legend)를 쉽게 그릴 수 있다.)
plt.legend(loc=9)
plt.xlabel("model complexity")
plt.xticks([])
plt.title("The Bias-Variance Tradeoff")
plt.show()

4. 산점도

산점도(scatterplot)는 두 변수 간의 연관 관계를 보여 주고 싶을 때 적합한 그래프다.

friends = [70, 65, 72, 63, 71, 64, 60, 64, 67]
minutes = [175, 170, 205, 120, 220, 130, 105, 145, 190]
labels = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']

plt.scatter(friends, minutes)

# 각 포인트에 레이블을 달자
for label, friend_count, minute_count in zip(labels, firends, minutes):
    plt.annotate(label,
        xy = (friend_cont, minute_count), # 레이블을 데이터 프인트 근처에 두되
        xytext = (5, -5), # 약간 떨어지게 있게 하자
        textcoords = 'offset points'

plt.title("Daily Minutes vs. Numver of Friends")
plt.xlabel("# of points")
plt.ylabel("daliy Minutes spent on the site")
plt.show()

변수들끼리 비교할 때 matplotlib이 자동으로 축의 범위를 설정하게 하면 공정한 비교를 하지 못하게 될 수 있다. plt.axis("eaual")이라는 명령어를 추가하면 공정한 비교를 할 수 있게 된다.

'IT > Data Analysis' 카테고리의 다른 글

확률론과 통계학  (0) 2024.08.15
선형대수  (0) 2024.08.12
파이썬 속성 강좌: 심화  (0) 2024.08.11
파이썬 속성강좌_기초  (0) 2024.08.11
데이터 과학  (0) 2024.08.11