📊 Python 시각화 라이브러리


📌 시각화의 중요성

  • 시각화의 중요성
    - 같은 모델(함수)이라도 시각화할 시, 다른 형태의 그래프가 도출될 수 있다.
    - 즉, 같은 모델이라도 데이터의 분포가 서로 다르기 때문에 시각화 결과도 다르다.


📌 R Matplotlib 이란?

  • Matplotlib
    그래프를 통해 시각화 기능을 지원하는 라이브러리

  • 그래프 종류
    - line, scatter, contour(등고선), surface, bar, histogram, box, ....


📌 R Matplotlib Figure

  • Figure
    - 모든 그래프(차트)는 Figure라고 부른다.









📊 Matplotlib 그래프


📌 R Matplotlib.pyplot 모듈 메소드

  • 깨짐 방지
    - 한글 깨짐 방지 : plt.rc('font', family='폰트명')
    - 음수 깨짐 방지 : plt.rcParams['axes.unicode_minus'] = False

  • 그래프 타이틀
    - 타이틀 지정 : plt.title('타이틀명')

  • 축 표현 범주 제한
    - x축 표현 제한 : plt.xlim([시작값, 끝값])
    - y축 표현 제한 : plt.ylim([시작값, 끝값])

  • 축 tick 표현 지정
    - x축 tick 번호 지정 : plt.xticks(표현할 값들의 리스트)
    - y축 tick 번호 지정 : plt.yticks(표현할 값들의 리스트)

  • 그래프 그리기
    - 선 그래프 : plt.plot(x데이터, y데이터)
    - 산점도 그래프 : plt.scatter(x데이터, y데이터)
    - 그래프 스타일 적용 : plt.plot(x, y, 'go--', linewidth=2, markersize=10)

  • 그래프 x축 데이터에 텍스트 표시
    for문으로 zip(x값 리스트, y값 리스트)를 기반으로 하여 a1, a2에 받는다.
    - 그래프에 텍스트 출력 : plt.text(x값, y값, 출력값)

  • 범례
    - 그래프 범례 : plt.legend(['첫번째 line명', 두번째 line명', ....], loc=범례위치[1, 2, 3, 4])

  • SubPlot으로 Figure 나누기
    - Figure 분리 : plt.subplot(행개수, 열개수, 위치인덱스)

  • 그래프 이미지 파일로 저장
    - 이미지 저장
    1) 저장 선언 : plt.gcf()
    2) 이미지 저장 : plt.savefig()


📌 R Matplotlib 그래프 종류

  • 그래프 종류
    - 선 그래프 : plt.plot(x데이터, y데이터)
    - 산점도 그래프 : plt.scatter(x데이터, y데이터)
    - 히스토그램 : plt.hist(데이터, bins=데이터구간, alpha=투명도)
    - 바 그래프 : plt.bar(x데이터, y데이터)
    - 원형 그래프 : plt.pie(데이터, explode=튀어나온정도, colors=[색깔지정])
    - 박스플롯 : plt.boxplot(데이터)


📌 R Seaborn 그래프 종류

  • 그래프 종류
    - 바 그래프 : sns.barplot(x='칼럼1', y='칼럼2', data=데이터프레임)
    - 디스트플롯 : sns.distplot(데이터프레임)
    - 박스플롯 : sns.boxplot(y='칼럼명', data=데이터프레임)
    - 히트맵 : sns.heatmap(피봇데이터)









📊 Matplotlib 그래프


📌 R Pandas DB연동 및 시각화

  • 시각화 + pandas조작 + Pandas DB 연동
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import MySQLdb
import pickle

config = {}
plt.rc('font', family='malgun gothic')
plt.rcParams['axes.unicode_minus'] = False

try:
    with open('mydb.dat', 'rb') as f:
        config = pickle.load(f)
except Exception as e:
    print('err :', e)

try:
    conn = MySQLdb.connect(**config)
    cursor = conn.cursor()
    sql = "SELECT jikwon_no, jikwon_name, buser_name, jikwon_pay, jikwon_jik, jikwon_gen FROM jikwon a INNER JOIN buser b ON a.buser_num=b.buser_no"
    cursor.execute(sql)
    df = pd.DataFrame(cursor.fetchall(), columns=['사번', '이름', '부서명', '연봉', '직급', '성별'])

    # 1. 부서명별 연봉의 합, 연봉의 최대/최소값을 출력
    print('부서별 연봉 합 :\n', df.groupby(['부서명'])['연봉'].sum(), end="\n\n")
    print('부서별 최대 연봉 :\n', df.groupby(['부서명'])['연봉'].max(), end="\n\n")
    print('부서별 최소 연봉 :\n', df.groupby(['부서명'])['연봉'].min(), end="\n\n")


    # 2. 부서명, 직급으로 교차 테이블(빈도표)을 작성(crosstab(부서, 직급))
    freq_table = pd.crosstab(index=df['부서명'], columns=df['직급'], margins=True)
    print(freq_table)


    # 3. 직원별 담당 고객자료(고객번호, 고객명, 고객전화)를 출력. 담당 고객이 없으면 "담당 고객  X"으로 표시
    sql = "SELECT a.jikwon_no, jikwon_name, gogek_no, gogek_name, gogek_tel FROM jikwon a LEFT OUTER JOIN gogek b ON a.jikwon_no=b.gogek_damsano"
    gogek_df = pd.read_sql(sql, conn)
    gogek_df.columns = ['사번', '이름', '고객번호', '고객명', '전화번호']
    print(gogek_df.isnull().sum())
    gogek_df = gogek_df.fillna('담당 고객 X')
    print(gogek_df)


    # 4. 부서명별 연봉의 평균으로 가로 막대 그래프를 작성
    print()
    data = df.groupby(['부서명'])['연봉'].mean()
    print(data)
    plt.barh(y=data.index, width=data.values)
    plt.title('부서명별 연봉 평균')
    plt.show()


    # 5. pivot_table을 사용하여 성별 연봉의 평균을 출력
    jik_df = pd.read_sql("SELECT * FROM jikwon", conn)
    jik_df.columns = ['사번', '이름', '부서번호', '직급', '연봉', '입사일', '성별', '점수']
    pv_table = pd.pivot_table(jik_df,
                   index='성별',
                   values='연봉',
                   aggfunc='mean')
    print(pv_table)


    # 6. 성별(남, 여) 연봉의 평균으로 시각화 - 세로 막대 그래프
    y_value = pv_table.values.reshape(1,2)[0]
    x_value = pv_table.index
    sns.barplot(y=y_value, x=x_value)
    plt.show()


    # 7. 부서명, 성별로 교차 테이블을 작성 (crosstab(부서, 성별))
    print()
    crs_table = pd.crosstab(index=df['부서명'],
                columns=df['성별'])
    print(crs_table)

except Exception as e:
    print('err :', e)
finally:
    cursor.close()
    conn.close()









📊 JavaScript 시각화 라이브러리


📌 참고 문서

JavaScript 시각화 라이브러리










profile
데이터 사이언티스트를 목표로 하는 개발자

0개의 댓글