Big Data with Python 2 : 그래프 그리기 (Matplotlib & Seaborn)
🎨시각화란 수치데이터를 이해하기 쉽도록 시각적으로 표현하고 전달하는 과정
Matplotlib
파이썬에서 가장 널리 사용되는 시각화 라이브러리
2차원 선 그래프(plot), 산점도(sctter plot), 히스토그램(Histogram)등의 데이터 분석 시각화에 많이 사용되는 MATLAB형태의 그래프
표준 플롯을 쉽게 그릴 수 있을 뿐 아니라 복잡한 세부적인 변경또한 자유로움
Matplotilb은 Numpy나 Pandas에서 사용되는 자료구조를 쉽게 시각화함
!pip install Matplotlib
import matplotlib.pyplot as plt
y=np.arange(0,10)**3
print(y)
plt.plot(y) # 그래프 그리기
plt.show() #그래프 보기
스타일 변경하기
# 스타일 지정
y1=np.sin(x)
y2=np.sin(x+0.5)
y3=np.sin(x+1)
# 범례 표시
plt.plot(x,y1,'r--',label='Sin A')
plt.plot(x,y2,'g-.',label='Sin B')
plt.plot(x,y3,'b:',label='Sin C')
plt.legend(loc='upper right') # 범례의 위치 변경
#plt.show()
# 크기 변경
fig=plt.gcf()
fig.set_size_inches(8,3)
plt.show()
subplot를 이용해서 차트 여러개 그리기
plt.style.use('ggplot')
plt.figure(figsize=(12,3)) # 차트의 크기 조정
# 좌우로 두개의 차트 그리기
# plt.subplot(1,2,1)
# plt.plot(x,y,'r--')
# plt.subplot(1,2,2)
# plt.plot(x,z,'g--')
# 위 아래로 두개의 차트 그리기
plt.subplot(2,1,1)
plt.plot(x,y,'r--')
plt.subplot(2,1,2)
plt.plot(x,z,'g--')
#차트 3개 그리기
# plt.subplot(2,2,3)
# plt.plot(x,z,'b-.')
산점도
# 산점도
n=50
x=np.random.rand(n)
y=np.random.rand(n)
area=(30*np.random.rand(n))**2
colors=np.random.rand(n)
plt.scatter(x,y,s=area,c=colors,alpha=0.7)
#plt.scatter(x,y)
plt.show()
bar 그래프
# bar 그래프
x=['A','B','C','D']
y=[5.,25.,50.,20.]
#plt.bar(x,y) # 수직
plt.barh(x,y) # 수평
plt.show()
히스토그램
# 히스토그램
x=np.random.normal(172,10,250)
plt.hist(x,bins=20) #bins는 x축의 개수를 지정
plt.show()
박스플롯 - 중간값 표현
# 박스플롯- 중간값표현
x=np.random.normal(10,3,100) #np.random.normal은 NumPy 라이브러리에서 제공하는 함수로, 정규 분포(가우시안 분포)를 따르는 난수를 생성하는 데 사용
y=np.random.normal(13,3,100)
z=np.random.normal(8,5,100)
plt.boxplot([x,y,z],patch_artist=True, sym='ro')
plt.xticks([1,2,3],['A','B','C'])
plt.show()
히트맵
#히트맵
import matplotlib.pyplot as plt
arr=np.random.standard_normal((30,40))
plt.matshow(arr)
plt.colorbar(shrink=0.9, aspect=10) #히트맵 범례 : colorbar(shrink=0.8, aspect=10)
#plt.show()
plt.savefig('hitmap2.png') #이미지 저장
그래프 이미지로 만들기
# 이미지 표시
import matplotlib.pyplot as plt
from matplotlib.image import imread
img=imread('hitmap2.png')
plt.imshow(img)
plt.xticks([]) # 이미지를 그래프로 나타낸 거라 안보이게 x축,y축 안보이게 한 것
plt.yticks([])
plt.show()
Seaborn
matplotlib 기반의 시각화 라이브러리로 그래픽을 위한 고급 인터페이스 제공
figure-level : matplotlib와 별개로 seaborn의 f igure를 만들어서 plotting figure-level 함수를 사용한 경우에는 facetgrid(seaborn의 figure)를 통해 레이아웃을 변경.
axes-level: axes 수준에서 plotting을 하는 함수이며, plt.figure()와 같은 함수로 레이아웃을 변경.
# Seaborn 시각화
!pip install seaborn
import seaborn as sns
print(sns.__version__)
bar 그래프
sns.countplot(data=tips,x='day')
plt.show()
sns.countplot(data=tips,x='day',hue='smoker')
plt.show()
sns.barplot(x=tips['sex'],y=tips['tip'])
plt.show()
countplot와 barplot의 차이
- 데이터 유형:
- barplot: 범주형 데이터와 수치형 데이터.
- countplot: 범주형 데이터.
- 목적:
- barplot: 범주형 데이터에 대한 수치형 데이터의 요약 통계를 시각화 (평균, 합계 등).
- countplot: 범주형 데이터의 빈도를 시각화.
- 사용 예:
- barplot: 특정 범주에 대한 평균 매출, 평균 점수 등을 시각화할 때.
- countplot: 제품의 종류별 판매 횟수, 설문 조사 응답 빈도 등을 시각화할 때.
히스토그램
데이터의 분포를 시각화
연속형 데이터를 일정한 범위의 구간으로 나누고, 각 구간에 포함된 값의 개수를 표시
histplot는 함수로 그래프를 그림, distplot는 좀 더 많은 기능을 제공
# 히스토그램
sns.histplot(x='total_bill',data=tips,kde=True) #kde는 데이터의 분포를 확인할 수 있는 라인
plt.show()
sns.displot(x='total_bill',data=tips,kde=True)
plt.show()
sns.displot(data=tips,x='total_bill',hue='smoker',col='time',kde=True)
plt.show()
# 박스 플롯
sns.boxplot(x='smoker',y='total_bill',data=tips)
plt.show()
# 바이올린 플롯
sns.violinplot(x='smoker',y='total_bill',hue='sex',data=tips)
plt.show()
#히트맵
df=tips.select_dtypes(['number'])
x=df.corr()
sns.heatmap(x,annot=True,cmap='viridis')
plt.show()
# 결측치 표시
df = titanic[['Survived', 'Pclass', 'Sex', 'Age','Ticket', 'Fare', 'Cabin']]
sns.heatmap(df.isnull(),yticklabels=False,cbar=False,cmap='viridis')
plt.show()
# 패싯 그리드
# 산점도 : 성별과 시간에 따라 지불금액 차이
g=sns.FacetGrid(data=tips,col='time',row='sex')
g.map(sns.scatterplot,'total_bill','tip')
plt.show()
g=sns.FacetGrid(data=tips,col='time',row='sex')
g.map_dataframe(sns.histplot,'total_bill')
plt.show()
# 페어플롯
iris=sns.load_dataset('iris')
iris.head()
sns.set_style('white')
sns.pairplot(iris,hue='species')
plt.show()
Folum - 지도 마커 표시
#Folium
!pip install folium
import folium
seoul_map=folium.Map(location=[37.55,126.98],zoom_start=12)
# 지도를 HTML 파일로 저장하기 seoul_map.save('./seoul.html')
seoul_map
# 37.550530787451585, 경도는 127.07423684111673
seoul_map=folium.Map(location=[37.550530787451585,127.07423684111673 ],zoom_start=12)
folium.Marker([37.550530787451585, 127.07423684111673 ], popup='세종대학교').add_to(seoul_map) # 마커 표시
# 지도를 HTML 파일로 저장하기 seoul_map.save('./seoul.html')
seoul_map
마커 표시
df= pd.read_excel('./seoulUniv.xlsx',engine='openpyxl')
seoul_map=folium.Map(location=[37.550530787451585,127.07423684111673 ],zoom_start=12)
for name,lat,lng in zip(df.index,df.위도,df.경도):
folium.Marker([lat,lng],popup=name).add_to(seoul_map)
seoul_map
CircleMarker 표시
#다른 데이터로 해보기
data=pd.read_csv('산림휴양지_인근_야생동물_분포_정보(2023년).csv')
animal_map=folium.Map(location=[37.550530787451585,127.07423684111673 ],zoom_start=8)
for name,lat,lng in zip(data.spcs_lcnm,data.wgs84_lltd_ycrd,data.wgs84_lltd_xcrd):
folium.CircleMarker([lat,lng],radius=10,color='green',fill=True,fil_color='coral',fill_opacity=0.7,popup=name).add_to(animal_map)
animal_map
덧 ) 한글 사용하기
# 한글 사용하기
#설치
!sudo apt-get install -y fonts-nanum
!sudo fc-cache -fv
!rm ~/.cache/matplotlib -rf #캐쉬삭제
!apt-get update -qq
!apt-get install fonts-nanum* -qq #설치되었는지 확인
import matplotlib.font_manager as fm
import warnings
warnings.filterwarnings(action='ignore')
path = '/usr/share/fonts/truetype/nanum/NanumGothic.ttf' # 나눔 고딕
font_name = fm.FontProperties(fname=path, size=10).get_name() # 폰트의 속성 지정 , 기본 폰트 사이즈 : 10
plt.rc('font', family=font_name)
두 셀 실행 후 세션 재시작!