데이터 시각화에는 두가지 목적이 있다.
- To explore data - 데이터 탐색
- To communicate data - 데이터 전달
matplotlib
from matplotlib import pyplot as plt
years = [1950, 1960, 1970, 1980, 1990, 2000, 2010]
gdp = [300.2, 543.3, 1075.9, 2862.5, 5979.5, 10289.7, 14958.3]
#create a line chart, years on x-axis, gdp on y-asix
plt.plot(years, gdp, color='green', marker='o', linestyle='solid')
#add a title
plt.title('Nominal GDP')
#add a lable to the y-axis
plt.ylabel('Billions of $')
plt.show()
Bar Charts
막대 그래프는 이산적인discrete 항목들이 얼만큼의 수량quantity를 가지는지 보여줄 때 유용하다. 즉, 정해진 구간에 해당되는 학목의 개수를 보여줌으로써 갚의 분포를 관찰할 수 있는 그래프 형태인 histogram을 그릴 수 있다!!
movies = ['Annie Hall', 'Ben-Hur', 'Casablanca', 'Gandhi', 'West Side Story']
num_oscars = [5, 11, 3, 8, 10]
plt.bar(movies, num_oscars)
plt.ylabel('# of Academy Awards')
plt.title('My Favorite Movies')
plt.show()
matplotlib.pyplot.xticks
locs, labels = xticks() # Get the current locations and labels.
xticks(np.arange(0, 1, step=0.2)) # Set label locations.
xticks(np.arange(3), ['Tom', 'Dick', 'Sue']) # Set text labels.
xticks([0, 1, 2], ['January', 'February', 'March'],
rotation=20) # Set text labels and properties.
xticks([]) # Disable xticks.
Using a bar chart for a histogram
또한 bar chart는 그룹화해서 보여주고 싶은 값들bucketed numeric values의 histogram을 보여줄 때도 좋은 선택지가 될 수 있다.
from collections import Counter
grades = [83, 95, 91, 87, 70, 0, 85, 82, 100, 67, 73, 77, 0]
decile = lambda grade: grade // 10 * 10
histogram = Counter(decile(grade) for grade in grades) # Counter({80: 4, 90: 2, 70: 3, 0: 2, 100: 1, 60: 1})
plt.bar([x + 5 for x in histogram.keys()], # shift each bar to the right by 5
histogram.values(), # give each bar its correct height
8) # give each bar a width of 8
plt.axis([-5, 100, 0, 5]) # x-axis from -5 to 105, y-axis from 0 to 5
plt.xticks([10 * i for i in range(11)]) # x-axis labels at 0, 10, ..., 100
plt.xlabel('Decile')
plt.ylabel('# of Students')
plt.title('Distrivubtion of Exam 1 Grades')
plt.show()
- plt.bar의 첫번째 인자에는 histogram의 key값을 오른쪽으로 5만큼씩 옮겨 넘겨줌 → histogram의 key값의 80은 80~90의 값을 나타내기 때문
- plt.bar의 세번째 인자에는 막대의 넓이를 넘겨줌 → 위에서는 막대와 막대 사이의 공간을 위해 넓이를 8로 지정 (default 값는 0.8)
Be judicious when using plt.axis()
막대 그래프를 만들때, y축을 0부터 시작하지 않게 하는 것은 막대 그래프가 특히 더 나쁜 형태로 취급된다. 왜냐하면 데이터를 왜곡해서 보여줄 수 있기 때문이다.
mentions = [500, 505]
years = [2013, 2014]
f, axs = plt.subplots(2,2,figsize=(12,5))
ax1 = plt.subplot(121)
ax2 = plt.subplot(122)
ax1.bar(years, mentions)
ax1.set_title('Look at the Huge Increase!')
ax1.axis([2012.5, 2014.5, 499, 506])
ax2.bar(years, mentions)
ax2.set_title('Look at the Small Increase!')
ax2.axis([2012.5, 2014.5, 0, 550])
plt.show()
왼쪽의 그래프는 y축이 499부터 시작하고, 오른쪽의 그래프는 0부터 시작한다.
실제로는 매우 작은 차이가 왼쪽의 그래프에서는 심하게 왜곡되어 표현될 수 있다.
Line Charts
line chart는 경향/추세trend를 볼 때 좋은 그래프이다.
variance = [1, 2, 4, 8, 16, 32, 64, 128, 256]
bias_squared = [256, 128, 64, 32, 16, 8, 4, 2, 1]
total_error = [x+y for x, y in zip(variance, bias_squared)] #[257, 130, 68, 40, 32, 40, 68, 130, 257]
xs = [i for i, _ in enumerate(variance)]
# we can make multiple calls to plt.plot
# to show multiple series on the same chart
plt.plot(xs, variance, 'g-', label='variance') #green solid line
plt.plot(xs, bias_squared, 'r-.', label='bias^2') #red dot-dashed line
plt.plot(xs, total_error, 'b:', label='total_error') #blue dotted line
# because we've assigned labels to each series
# we can get a legend for free
plt.legend(loc=9) #log=9 means 'top center'
plt.xlabel('model chomplexity')
plt.title('The Bias-Variance Tradeoff')
plt.show()
Scatterplots
산점도는 2개의 데이터셋(변수)간의 연관 관계를 시각화하는데에 유용하다.
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)
# label each point
for label, friend_count, minute_count in zip(labels, friends, minutes):
plt.annotate(label,
xy=(friend_count, minute_count), # put the label with its point
xytext=(5, -5), # but slightly offset
textcoords='offset points')
plt.title("Daily Minutes vs, Number of Freinds")
plt.xlabel('# of friends')
plt.ylabel('daily minutes spent on the site')
plt.show()
Scatter plot above illustrates the relationship between the number of friends your users have and the number of minutes they spend on the site every day.
만약, 비교할 수 있는 변수들을 scattering하고 있는데 matplotlib
에서 자동으로 scale을 선택하게 한다면 데이터를 제대로 설명하지 못할 수 있다.
f, axs = plt.subplots(2,2,figsize=(12,5))
ax1 = plt.subplot(121)
ax2 = plt.subplot(122)
test_1_grades = [90, 90, 85, 97, 80]
test_2_grades = [100, 85, 60, 90, 70]
ax1.scatter(test_1_grades, test_2_grades)
ax1.set_title("Axes Aren't Comparable")
ax1.set_xlabel('test 1 grade')
ax1.set_ylabel('test 2 grade')
ax2.scatter(test_1_grades, test_2_grades)
ax2.set_title("Axes Are Comparable")
ax2.set_xlabel('test 1 grade')
ax2.set_ylabel('test 2 grade')
ax2.axis("equal")
plt.show()
plt.axis("equal")
옵션을 넣어준 오른쪽 산점도가 test2에서의 변동성을 더 잘 설명해준다.
If we include a call to plt.axis("equal")
, the plot more accurately shows that most of the variation occurs on test2.
For Further Exploration
- seaborn is built on top of matplotlib and allows you to easily produce prettier (and more complex) visualizations.
- D3.js is a JavaScript library for producing sophisticated interactive visualizations for the web. Although it is not in Python, it is both trendy and widely used, and it is well worth your while to be familiar with it.
- Bokeh is a newer library that brings D3-style visualizations into Python.
- ggplot is a Python port of the popular R library ggplot2, which is widely used for creating “publication quality” charts and graphics. It’s probably most interesting if you’re already an avid ggplot2 user, and possibly a little opaque if you’re not.
'Data Science' 카테고리의 다른 글
데이터의 이해(데이터와 정보) | 정성/정량적 데이터 | 정형/반정형/비정형 데이터 | 암묵지, 형식지 | DIKW 피라미드 | ADP, ADsP 1과목 (0) | 2022.02.26 |
---|---|
[Data Science from Scratch] Ch4. Linear Algebra (0) | 2021.12.08 |
[Data Science from Scratch] Ch2. A Crash Course in Python (0) | 2021.12.03 |
python scraping 연습 (한빛미디어 도서리스트 scraper 만들기) (0) | 2021.09.12 |
👩💻 링크타고 브랜드 타이틀 크롤링 (1) | 2021.09.12 |
댓글