4장 시각화
1. 시각화
1) 화면 분할
* 한글 폰트 설치
# 한글 폰트 설치
!sudo apt-get install -y fonts-nanum
!sudo fc-cache -fv
!rm ~/.cache/matplotlib -rf
# 설치 후 런타임 다시 시작
* 표 데이터
# 라이브러리 불러오기
import pandas as pd
import matplotlib.pyplot as plt
# 데이터 불러오기
df = pd.read_excel("/content/drive/MyDrive/BDA/part4/시도별 전출입 인구수.xlsx",
header = 0, engine = "openpyxl")
print(df.head())
# NaN 값을 채우기
df = df.fillna(method = "ffill")
# 서울시에서 다른 지역으로 이동한 데이터
# 전출지별 == 서울시 & 전입지별 != 서울시
b_ind = (df["전출지별"] == "서울특별시") & (df["전입지별"] != "서울특별시")
# 불리언 인덱스로 데이터 추출 = 조건을 만족하는 행
df_seoul = df[b_ind]
# 열 삭제
df_seoul = df_seoul.drop("전출지별", axis = 1)
# 열 이름 변경
df_seoul.rename({"전입지별":"전입지"}, axis = 1, inplace = True)
print(df_seoul)
# 행 인덱스 변경
df_seoul.set_index("전입지", inplace = True)
print(df_seoul)
* 한글 폰트 지정
# 한글 폰트 지정
plt.rc("font",family="NanumGothic")
* 화면 분할 - 연습용
# %%
## 연습용
# 충남,경북,강원,전남
#print(df_seoul)
# 함수(함수,데이터)
#map(str,range(1970,2017+1))
col_years = list(map(str,range(1970,2017+1)))
df_4 = df_seoul.loc[["부산광역시","대구광역시","경기도","제주특별자치도"], col_years]
# 그래프 객체 만들기
fig = plt.figure(figsize=(20,10)) # 가로 사이즈
ax1 = fig.add_subplot(2,2,1)
ax3 = fig.add_subplot(2,2,3)
ax4 = fig.add_subplot(2,2,4)
# axe 객체에 그래프 출력
ax1.plot(col_years,df_4.loc["부산광역시",:], marker = "o",
markerfacecolor = "gold", markersize = 5, color = "yellow",
linewidth = 1, label = "서울 => 부산" )
ax3.plot(col_years,df_4.loc["경기도",:], marker = "o",
markerfacecolor = "brown", markersize = 5, color = "orange",
linewidth = 1, label = "서울 => 경기도" )
ax4.plot(col_years,df_4.loc["제주특별자치도",:], marker = "o",
markerfacecolor = "green", markersize = 5, color = "green",
linewidth = 1, label = "서울 => 제주" )
# 스타일 서식
plt.style.use("ggplot")
# 범례
ax1.legend(loc = "best")
ax3.legend(loc = "best")
ax4.legend(loc = "best")
# x축 눈금 라벨 = 연도 회전시키기
ax1.set_xticklabels(col_years, rotation = 90)
ax3.set_xticklabels(col_years, rotation = 90)
ax4.set_xticklabels(col_years, rotation = 90)
# 차트 제목
ax1.set_title("서울시에서 부산으로 이동한 인구", size=10)
ax3.set_title("서울시에서 경기도로 이동한 인구", size=10)
ax4.set_title("서울시에서 제주로 이동한 인구", size=10)
* 화면 분할
# %%
# 충남,경북,강원,전남
#print(df_seoul)
# 함수(함수,데이터)
#map(str,range(1970,2017+1))
col_years = list(map(str,range(1970,2017+1)))
df_4 = df_seoul.loc[["충청남도","경상북도","강원도","전라남도"], col_years]
# 그래프 객체 만들기
fig = plt.figure(figsize=(20,10)) # 가로 사이즈
ax1 = fig.add_subplot(2,2,1)
ax2 = fig.add_subplot(2,2,2)
ax3 = fig.add_subplot(2,2,3)
ax4 = fig.add_subplot(2,2,4)
# axe 객체에 그래프 출력
ax1.plot(col_years,df_4.loc["충청남도",:], marker = "o",
markerfacecolor = "gold", markersize = 5, color = "yellow",
linewidth = 1, label = "서울 => 충남" )
ax2.plot(col_years,df_4.loc["경상북도",:], marker = "o",
markerfacecolor = "red", markersize = 5, color = "purple",
linewidth = 1, label = "서울 => 경북" )
ax3.plot(col_years,df_4.loc["강원도",:], marker = "o",
markerfacecolor = "brown", markersize = 5, color = "orange",
linewidth = 1, label = "서울 => 강원" )
ax4.plot(col_years,df_4.loc["전라남도",:], marker = "o",
markerfacecolor = "green", markersize = 5, color = "green",
linewidth = 1, label = "서울 => 전남" )
# 스타일 서식
plt.style.use("ggplot")
# 범례
ax1.legend(loc = "best")
ax2.legend(loc = "best")
ax3.legend(loc = "best")
ax4.legend(loc = "best")
# x축 눈금 라벨 = 연도 회전시키기
ax1.set_xticklabels(col_years, rotation = 90)
ax2.set_xticklabels(col_years, rotation = 90)
ax3.set_xticklabels(col_years, rotation = 90)
ax4.set_xticklabels(col_years, rotation = 90)
# 차트 제목
ax1.set_title("서울시에서 충청남도로 이동한 인구", size=10)
ax2.set_title("서울시에서 경상북도로 이동한 인구", size=10)
ax3.set_title("서울시에서 강원도로 이동한 인구", size=10)
ax4.set_title("서울시에서 전라남도로 이동한 인구", size=10)
# 축 눈금 라벨 크기
ax1.tick_params(axis = "x", labelsize=10)
ax1.tick_params(axis = "y", labelsize=10)
ax2.tick_params(axis = "x", labelsize=10)
ax2.tick_params(axis = "y", labelsize=10)
ax3.tick_params(axis = "x", labelsize=10)
ax3.tick_params(axis = "y", labelsize=10)
ax4.tick_params(axis = "x", labelsize=10)
ax4.tick_params(axis = "y", labelsize=10)
# 축 범위
ax1.set_ylim(10000,60000)
ax2.set_ylim(10000,60000)
ax3.set_ylim(10000,60000)
ax4.set_ylim(10000,60000)
* 색상 이름 & 헥사 코드
# %%
# 색상 이름 & 헥사 코드
import matplotlib
colors = {}
for name, code in matplotlib.colors.cnames.items():
colors[name] = code
print(colors)
2) 면적 그래프
# %%
# 행과 열 전치
df_4 = df_4.T
# %%
## 면적 그래프
df_4.plot(kind = "area",
stacked=False,
alpha = 0.2,
figsize=(20,7))
# 차트 제목
plt.title("서울시에서 다른 지역으로 이동한 인구")
# 축 제목
plt.xlabel("기간(연도)", size = 10)
plt.ylabel("이동 인구 수", size = 10)
* 면적 그래프 디자인 (누적 시켜서 표현)
# %%
# 스타일 서식 지정
plt.style.use("ggplot")
## 면적 그래프 - 누적 시켜서 표현
df_4.plot(kind = "area",
stacked=True,
alpha = 0.2,
figsize=(20,7))
# 차트 제목
plt.title("서울시에서 다른 지역으로 이동한 인구")
# 축 제목
plt.xlabel("기간(연도)", size = 10)
plt.ylabel("이동 인구 수", size = 10)
* axe 객체로 그려보기 (표현식만 다르고 결과는 비슷함 // 제목 살짝 수정)
# %%
# axe 객체로 그려보기 (ax1 정의하여)
# 스타일 서식 지정
plt.style.use("ggplot")
## 면적 그래프 - 누적 시켜서 표현
ax1 = df_4.plot(kind = "area",
stacked=True,
alpha = 0.2,
figsize=(20,7))
print(type(ax1))
# 차트 제목
ax1.set_title("서울시에서 다른 지역으로 이동한 인구", size=20, color="blue",
weight = "bold")
# 축 제목
ax1.set_xlabel("기간(연도)", size = 10, color = "gray")
ax1.set_ylabel("이동 인구 수", size = 10, color = "gray")
* 세로형 막대 그래프
# %%
# 스타일 서식 지정
plt.style.use("ggplot")
## 세로형 막대 그래프
df_4.plot(kind = "bar",
figsize=(20,7),
width = 0.5,
color = ["gold","red","brown","green"])
# 차트 제목
plt.title("서울시에서 다른 지역으로 이동한 인구")
# 축 제목
plt.xlabel("기간(연도)", size = 10)
plt.ylabel("이동 인구 수", size = 10)
* 2000년부터 데이터 새로 추출해서 세로형 막대 그래프 데이터 확인
#%%
# 2000년부터 데이터를 새로 추출
df_4_new = df_4.T.loc[:,"2000":].T
# %%
# 스타일 서식 지정
plt.style.use("ggplot")
## 세로형 막대 그래프
df_4_new.plot(kind = "bar",
figsize=(20,7),
width = 0.5,
color = ["gold","red","brown","green"])
# 차트 제목
plt.title("서울시에서 다른 지역으로 이동한 인구")
# 축 제목
plt.xlabel("기간(연도)", size = 10)
plt.ylabel("이동 인구 수", size = 10)
* 가로형 막대 그래프로 확인
# %%
## 가로형 막대 그래프
df_4_new.plot(kind = "barh",
figsize=(20,7),
width = 0.5,
color = ["gold","red","brown","green"])
* 행과 열의 합을 계산하는 코드
# %%
df_4_new.T.sum(axis=0)
# 해당 코드는 DataFrame인 df_4_new의 행과 열을 전치(transpose)하여,
# 열(axis=0)을 기준으로 합(sum)을 계산하는 코드입니다.
* 합계열 오름차순 정렬
# %%
df_total = df_4_new.T # DataFrame인 df_4_new의 행과 열을 전치하여 df_total 변수에 저장합니다.
df_total["합계"] = df_4_new.T.sum() # 각 열(axis=0)의 합계를 계산하여 "합계" 열을 추가합니다.
df_total = df_total[["합계"]].sort_values(by="합계", ascending=True) # "합계" 열을 기준으로 오름차순 정렬하여 df_total을 업데이트합니다.
* 가로형 막대 그래프
# %%
## 가로형 막대 그래프
df_4_new.plot(kind = "barh",
figsize=(20,7),
width = 0.7,
color = "blue")
# 차트 제목
plt.title("서울시에서 다른 지역으로 이동한 인구")
# 축 제목
plt.xlabel("이동 인구 수(합)", size=10)
plt.ylabel("전입지", size=10)
3) 2축 그래프 (보조축) 생성하기
# 라이브러리 불러오기
import pandas as pd
import matplotlib.pyplot as plt
# 한글 폰트 지정
plt.rc("font", family = "NanumGothic")
# 데이터 불러오기
df = pd.read_excel("/content/drive/MyDrive/BDA/part4/남북한발전전력량.xlsx",
engine = "openpyxl")
# 북한 데이터 추출
df = df.iloc[5:]
df.drop("전력량 (억㎾h)", axis = "columns", inplace = True)
df.set_index("발전 전력별", inplace = True)
df = df.T
print(df)
* 증감율 계산
# 증감율 계산
df = df.rename(columns = {"합계": "총발전량"})
df["전년총발전량"] = df["총발전량"].shift(1)
df["증감율"] = ((df["총발전량"] - df["전년총발전량"])/df["전년총발전량"])*100
print(df.index)
print(df)
* 북한 전력 발전량 추이
# 마이너스 부호를 출력해야 되는 경우
plt.rcParams["axes.unicode_minus"] = False
# 수력, 화력
ax1 = df[["수력","화력"]].plot(kind = "bar",figsize = (20,10),stacked = True)
ax2 = ax1.twinx()
ax2.plot(df.index,df["증감율"], color = "green", marker = "o",
label = "증감율")
# 축 조정
ax1.set_ylim(-50, 500)
ax2.set_ylim(-50, 50)
# 축 제목
ax1.set_xlabel("기간(연도)")
ax1.set_ylabel("발전량")
ax2.set_ylabel("증감율")
# 범례
ax1.legend(loc = "upper left")
ax2.legend(loc = "best")
# 차트 제목
plt.title("북한 전력 발전량")
4) 히스토그램
# %%
## 히스토그램
# 라이브러리 불러오기
import pandas as pd
# 데이터 불러오기
df = pd.read_csv(r"/content/drive/MyDrive/BDA/part3/auto-mpg.csv", header=None)
print(df)
# 열 이름 지정
df.columns = ["mpg", "cylinders", "displacement","horsepower", "weight",
"accleration","model year","origin","name"]
print(df)
* 연비 열에 대한 히스토그램
# 한글 폰트 지정
plt.rc("font", family = "NanumGothic")
# 스타일 서식
plt.style.use("ggplot")
# 히스토그램
df["mpg"].plot(kind = "hist", bins = 20, color = "aqua", figsize = (10,5))
# 차트 제목 추가
plt.title("히스토그램")
# 축 제목 추가
plt.xlabel("연비")
5) 산점도분석
# 산점도 그리기
# 산점도 데이터
print(df)
# 한글 폰트 지정
plt.rc("font", family = "NanumGothic")
# 스타일 서식
plt.style.use("ggplot")
df.plot(kind="scatter",
x="weight",
y="mpg",
c="coral",
s=10,
figsize=(10,5))
plt.title("산점도 분석")
* 버블차트
#%%
# 버블 차트
print(df)
# 스타일 서식
plt.style.use("classic")
# 3번째 변수 처리
cy = df.cylinders/df.cylinders.max()*300
# 산점도 그리기
print(df.cylinders)
df.plot(kind="scatter",x="weight",y="mpg",c="coral",
s=cy,
alpha = 0.3,
figsize=(10,5))
plt.title("scatter")
# 파일로 저장
plt.savefig("./scatter.png")
plt.savefig("./scatter_transparent.png", transparent=True)
6) 상자 그림
* 데이터 만들기
#%%
# 스타일 서식
plt.style.use("ggplot")
df["count"]=1
df_origin = df.groupby("origin").sum()
df_origin.index = ["USA","EU","JAPAN"]
print(df_origin.head())
* 파이차트
# 스타일 서식
plt.style.use("ggplot")
# 파이 차트
df_origin["count"].plot(kind = "pie", figsize = (10,5), autopct = "%1.1f%%",
colors = ["orange","lightcoral","royalblue"],
startangle = 0)
# 제목 추가
plt.title("Pie Chart")
# 원에 가깝게 표현
plt.axis("equal")
# 범례 추가
plt.legend(loc = "upper right")
# 파이차트는 빈도를 만드는게 포인트다.
* 상자그림
# %%
# 상자그림
fig = plt.figure(figsize=(10,5))
ax = fig.add_subplot(1,1,1)
ax1.boxplot(x=[df[df["origin"]==1]["mpg"],
df[df["origin"]==2]["mpg"],
df[df["origin"]==3]["mpg"]],
labels=["USA","EU","JAPAN"])
fig = plt.figure(figsize=(10,5))
ax = fig.add_subplot(1,1,1)
ax2.boxplot(x=[df[df["origin"]==1]["mpg"],
df[df["origin"]==2]["mpg"],
df[df["origin"]==3]["mpg"]],
labels=["USA","EU","JAPAN"],
vert = False) # 상자그림을 가로로
* 컬러맵, 스타일시트 확인하기
# %%
# 컬러맵
plt.colormaps()
# %%
# 스타일 시트
plt.style.available
* 파이썬 그래프 갤러리
# %%
# 파이썬 그래프 샘플이나 코드 제공
# 파이썬 그래프 갤러리
# https://www.python-graph-gallery.com/
7) Seaborn 라이브러리
# %%
## Seaborn 라이브러리
### 데이터 준비
import seaborn as sns
titanic = sns.load_dataset("titanic")
print("titanic.head()")
print("titanic.info()")
# %%
import matplotlib.pyplot as plt
import seaborn as sns
# 스타일 테마
sns.set_style("darkgrid")
titanic = sns.load_dataset("titanic")
fig=plt.figure(figsize=(15,5))
ax1=fig.add_subplot(1,2,1)
ax2=fig.add_subplot(1,2,2)
sns.regplot(x="age",
y="fare",
data=titanic,
ax=ax1)
sns.regplot(x="age",
y="fare",
data=titanic,
ax=ax2,
fit_reg=False)
* 히스토그램, 커널밀도 함수 확인
## 히스토그램, 커널밀도함수
# 그래프 객체 생성
fig = plt.figure(figsize = (15,5))
ax1 = fig.add_subplot(1,3,1)
ax2 = fig.add_subplot(1,3,2)
ax3 = fig.add_subplot(1,3,3)
# 히스토그램 + 커널밀도함수
sns.distplot(titanic["fare"], ax = ax1)
# 커널밀도함수
sns.kdeplot(titanic["fare"], ax = ax2)
# 히스토그램
sns.histplot(titanic["fare"], ax = ax3)
# 제목 추가
ax1.set_title("histogram & density plot")
ax2.set_title("density plot")
ax3.set_title("histogram")
* 핵심
r studio와 표기법 확인하면서 코드 눈에 익히기
* 링크 (구글 코랩 작성한 계정으로 로그인하기)
728x90
반응형
LIST
'배운 책들 정리 > 파이썬 머신러닝 판다스 데이터분석' 카테고리의 다른 글
파이썬 머신러닝 판다스 데이터 분석 5,6 - 데이터 사전 처리, 데이터프레임의 다양한 응용 (0) | 2023.04.28 |
---|---|
파이썬 머신러닝 판다스 데이터 분석 4_3, 5 - 시각화, 데이터 사전 처리 (0) | 2023.04.27 |
파이썬 머신러닝 판다스 데이터 분석 3,4 - 데이터 살펴보기, 시각화 (1) | 2023.04.25 |
파이썬 머신러닝 판다스 데이터 분석 1,2 - 판다스 입문, 데이터 입출력 (0) | 2023.04.24 |
파이썬 머신러닝 판다스 데이터 분석 1 - 판다스 자료 구조 (0) | 2023.04.21 |