본문 바로가기

배운 책들 정리/파이썬 머신러닝 판다스 데이터분석

파이썬 머신러닝 판다스 데이터 분석 4_2 - 시각화

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와 표기법 확인하면서 코드 눈에 익히기

 

 

* 링크 (구글 코랩 작성한 계정으로 로그인하기)

 

Google Colaboratory Notebook

Run, share, and edit Python notebooks

colab.research.google.com

 

728x90
반응형
LIST