for textmining

데이터 시각화

|

이번 글에서는 데이터 시각화 관련 코드를 정리해보겠습니다. 분석한 결과를 예쁘게 포장할 때 유용한 팁들인데요. 분석 자체에만 신경쓰다가 정작 시각화에는 실패하는 경우가 저 경험상 많았는데요. 시간도 없고 힘들어 죽겠는데 시각화 코드를 일일이 찾아 검색하는 것도 한계가 있고요. 그래서 저도 정리 겸 해서 이런 글을 쓰게 됐습니다.

출처를 일일이 밝혀야 하는데, 저도 어디서 검색했는지 가물가물한 코드가 많아서..(죄송합니다) 혹시 출처를 확실히 알고 계신 분이 있으시면 댓글로 남겨주셔요. 바로 반영하겠습니다. 단행본 ‘조엘 그루스(2015), 밑바닥부터 시작하는 데이터과학’ 등을 비롯해 다양한 자료를 참고하였음을 먼저 밝힙니다. 그럼 시작하겠습니다.

꺾은선 그래프, python

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, 10289.7, 14958.3]
plt.plot(years,gdp,color='green',marker='o',linestyle='solid')
plt.title('Nominal GDP')
plt.ylabel("Billions of $")
plt.show()

막대 그래프, python

from matplotlib import pyplot as plt
movies = ['Annie Hall','Ben-Hur','Casablanca','Gandhi','West Side Story']
num_of_oscars = [5,11,3,8,10]
# 막대 너비의 기본값이 0.8이므로 막대가 가운데로 올 수 있도록 
# 왼쪽 좌표에 0.1씩 더해줌
xs = [i + 0.1 for i, _ in enumerate(movies)]
plt.bar(xs,num_of_oscars)
plt.ylabel('# of Academy Awards')
plt.title('My Favorite Movies')
# 막대의 가운데에 오도록 영화 제목 레이블을 달자
plt.xticks([i + 0.5 for i, _ in enumerate(movies)],movies)
plt.show()

히스토그램, python

from matplotlib import pyplot as plt
from collections import Counter
grades = [83,95,91,87,70,0,85,82,100,67,73,77,0]
decile = lambda grade: grade // 10 * 10
# counter는 key와 value의 빈도를 연결시켜준다
histrogram = Counter(decile(grade) for grade in grades)
plt.bar([x-4 for x in histrogram.keys()], histrogram.values(), 8)
# X축은 -5부터 105, Y축은 0부터 5
plt.axis([-5,105,0,5])
# X축의 레이블은 0, 10, ..., 100
plt.xticks([10 * i for i in range(11)])
plt.xlabel("Decile")
plt.ylabel('# of Students')
plt.title('Distribution of Exam 1 Grades')
plt.show()

선 그래프, python

from matplotlib import pyplot as plt
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)]
xs = [i for i, _ in enumerate(variance)]
plt.plot(xs, variance, 'g-', label='variance') # 녹색 실선
plt.plot(xs, bias_squared, 'r-', label='bias^2') # 빨간 실선
plt.plot(xs, total_error, 'b:', label='total error') #  파란 점선
plt.legend(loc=9) # 범례 그리기, loc=9 ; top center를 의미
plt.xlabel('model complexity')
plt.title('The Bias-Variance Tradeoff')
plt.show()

산점도, python

from matplotlib import pyplot as plt
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, friends, minutes):
    plt.annotate(label,
                 xy=(friend_count, minute_count), #label을 데이터포인트에 두되
                 xytext=(5,-5), # 약간 떨어져 있게
                 textcoords='offset points')
plt.title('Daily Minutes vs. Number of Friends')
plt.xlabel('# of friends')
plt.ylabel('daily minutes spent on the site')
plt.show

산점도, R

library(ggplot2)
pcadata <- data.frame(princomp(iris[,-5])$scores[,1:2],iris[,5])
colnames(pcadata) <- c('V1','V2','Class')
ggplot(pcadata,
       aes(x=V1,y=V2,color=Class)) + geom_point(size=1.25) + 
  guides(colour = guide_legend(override.aes = list(size=5))) + 
  xlab("") + ylab("") + ggtitle("PCA 2D Embedding of Data") + 
  theme_light(base_size=10) +
  theme(strip.background = element_blank(),
        strip.text.x     = element_blank(),
        axis.text.x      = element_blank(),
        axis.text.y      = element_blank(),
        axis.ticks       = element_blank(),
        axis.line        = element_blank(),
        panel.border    = element_blank())
ggsave('PCA.png')

heatmap, python

import matplotlib.pyplot as plt
import numpy as np
#here's our data to plot, all normal Python lists
x = [1, 2, 3, 4, 5]
y = [0.1, 0.2, 0.3, 0.4, 0.5]
intensity = [[5, 10, 15, 20, 25],
            [30, 35, 40, 45, 50],
            [55, 60, 65, 70, 75],
            [80, 85, 90, 95, 100],
    [       105, 110, 115, 120, 125]]
#setup the 2D grid with Numpy
x, y = np.meshgrid(x, y)
#convert intensity (list of lists) to a numpy array for plotting
intensity = np.array(intensity)
#now just plug the data into pcolormesh, it's that easy!
plt.pcolormesh(x, y, intensity)
plt.colorbar() #need a colorbar to show the intensity scale
plt.show() #boom

Boxplot, python

import seaborn as sns
import matplotlib.pyplot as plt
plt.figure(figsize = (35, 12))
sns.boxplot(y = 'y', x = 'x', data = data, width = 0.8, showmeans = True, fliersize = 3)
plt.show()

Joint Plot, python

import seaborn as sns
import matplotlib.pyplot as plt
plt.figure(figsize = (30, 20))
sns.jointplot(x = "x", y = "y", data = data, kind = 'scatter', size = 10)
plt.show()

Comments