대규모 주류 판매 데이터 분석 - Plotly 시각화

dpwl·2024년 6월 15일
0

Data Analysis with SQL

목록 보기
107/120

1. Plotly 시각화

# plotly 라이브러리 설치
%pip install plotly==5.11.0
sample_pd = df.filter(F.col("City")=="WAUKEE").toPandas()

toPandas: PySpark DataFrame 객체를 Pandas DataFrame 객체로 변환

Pandas로 변환하는 이유:

  • 시각화를 하기 위해서는 모든 데이터를 한번에 로드해야함
  • 대부분의 시각화 라이브러리 지원 가능
  • Pyspark는 분산 처리 기반으로 시각화에는 적합하지 않음

1.1 plotly.graph_objects

import plotly.graph_objects as go

# go.Figure() 함수를 활용하여 기본 그래프를 생성
fig = go.Figure(

    # Data 입력
    data=[go.Line(x=WAUKEE_pd["Date"], y=WAUKEE_pd["BottlesSold"])],

    # layout 입력
    layout=go.Layout(
        title=go.layout.Title(text="Bottles Sold Amount at WAUKEE")
    )
)
# show하면 그래프 표시
fig.show()

1.2 plotly.express

import plotly.express as px

fig = px.line(x=WAUKEE_pd["Date"], y=WAUKEE_pd["BottlesSold"], title="Bottles Sold Amount at WAUKEE")

fig.show()

1.3 plotly.graph_objects vs plotly.express

plotly.graph_objects:

  • 직접 지정해줘야하는게 많지만, 커스터마이징 가능

plotly.express:

  • 완성형 보편적인 그래프를 그릴 수 있음

graph_objectsexpress의 관계는 범용적인 시각화 라이브러리인 matplotlibseaborn의 관계와 비슷함

왜 plotly를 사용할까?

  • interactive한 그래프를 그릴 수 있음
  • Python에 익숙하다면 plotly에서 개발한 dash를 사용해 웹 대시보드까지도 발전 가능

1.4 Pandas 기본 시각화로 plotly 사용하기

  • Pandas는 기본적으로 matplotlib library를 바탕으로 시각화가 된다.
  • plotly를 사용하기 위해서는 아래와 같은 기본 설정을 추가하면 된다.
import pandas as pd
pd.options.plotting.backend = "plotly"

위와 같이 기본 plotly 설정을 하면 아래와 같이 기본 라이브러리로 시각화가 가능하다.

WAUKEE_pd["BottlesSold"].hist() # 기본 라이브러리로 시각화 가능

2. plotly의 interactive 기능

2.1 Hover Label 스타일 설정

fig = px.line(x=WAUKEE_pd["Date"], y=WAUKEE_pd["BottlesSold"],title="Bottles Sold amount at WAUKEE")

# hover label 스타일 설정
fig.update_layout(
        hoverlabel_bgcolor="white",
        hoverlabel_font_size=10,
        hoverlabel_font_color='black',
        hoverlabel_font_family="Rockwell")

fig.show()

2.2 Hover Label 세부 내용 설정

fig = px.line(
    WAUKEE_pd,
    x="Date",
    y="BottlesSold",
    title="Bottles Sold Amount at WAUKEE",
    text="SaleDollars" # text로 사용할 컬럼 지정
    )

# hover label 스타일 설정
fig.update_layout(
        hoverlabel_bgcolor="white",
        hoverlabel_font_size=15,
        hoverlabel_font_color='black',
        hoverlabel_font_family="Rockwell"
        )

# hover label의 세부 내용 작성
# html sytle
fig.update_traces(hovertemplate='총 매출: %{text}달러 <br>'
                                '날짜: %{x} <br>'+
                                 '판매량 : %{y}개')

fig.show()

2.3 슬라이더

fig = px.line(
    WAUKEE_pd,
    x="Date",
    y="BottlesSold",
    title="Bottles Sold Amount at WAUKEE",
    text="SaleDollars"
    )

# hover label 스타일 설정
fig.update_layout(
        hoverlabel_bgcolor="white",
        hoverlabel_font_size=15,
        hoverlabel_font_color='black',
        hoverlabel_font_family="Rockwell"
        )

# hover label의 세부 내용 작성
fig.update_traces(hovertemplate='총 매출: %{text}달러 <br>'
                                '날짜: %{x} <br>'+
                                 '판매량 : %{y}개')
# 범위 슬라이더 생성
fig.update_layout(xaxis=dict(rangeslider_visible=True)) # x축 기준 슬라이더

fig.show()

2.4 드롭다운

import plotly.graph_objects as go

fig = go.Figure()

# 1번 그래프
fig.add_trace(go.Line(
    name="BottlesSold",
    x=WAUKEE_pd["Date"],
    y=WAUKEE_pd["BottlesSold"]
    ))

# 2번 그래프
fig.add_trace(go.Line(
    name="SaleDollars",
    x=WAUKEE_pd["Date"],
    y=WAUKEE_pd["SaleDollars"]
    ))

fig.update_layout(
    updatemenus=[
        dict(
            type="dropdown",
            direction="down",
            buttons=list([
                dict(label="Both",
                     method="update",
                     args=[{"visible": [True, True]},
                           {"title": "BottlesSold & SaleDollars"}]),
                dict(label="BottlesSold",
                     method="update",
                     args=[{"visible": [True, False]},
                           {"title": "BottlesSold",}]),
                dict(label="SaleDollars",
                     method="update",
                     args=[{"visible": [False, True]},
                           {"title": "SaleDollars",}]),
            ]),
        ),
    ]
)

fig.show()

profile
거북선통통통통

0개의 댓글