Plotly ~ : )

인터랙티브한 통계적 데이터 시각화, Plotly 정복하기
( Gemini한테 내용을 채워보라고 하였습니다! )

작성자:   ~ : )
(with Gemini)
작성일: 2025년 5월 20일
수정일: 2025년 6월 17일

▼ 학습 시작하기 ▼

* 머리말

Plotly의 세계에 오신 것을 환영합니다. Plotly는 아름답고 인터랙티브한 통계 그래픽을 손쉽게 만들 수 있도록 설계된 파이썬 시각화 라이브러리입니다. 웹 기반 대시보드 및 애플리케이션에 최적화되어 있습니다.

이 문서는 Plotly의 기본 개념, Plotly Express를 사용한 간편한 시각화, 다양한 인터랙티브 플롯 유형, 그리고 실제 데이터셋(타이타닉)을 활용한 고급 시각화 예제까지 다룹니다. Plotly를 통해 복잡한 데이터를 명확하고 동적으로 표현하는 방법을 배우실 수 있습니다.

- ~ : ) (with Gemini)

제 1 장: Plotly란?

Plotly는 파이썬을 위한 강력한 인터랙티브 데이터 시각화 라이브러리입니다. 웹 브라우저에서 상호작용이 가능한 고품질 그래프를 생성하는 데 중점을 둡니다. Plotly는 Plotly.js라는 JavaScript 라이브러리를 기반으로 하며, 파이썬 외에도 R, Julia 등 다양한 언어를 지원합니다.

Plotly 파이썬 라이브러리는 주로 두 가지 인터페이스를 제공합니다:

1.1. Plotly의 주요 특징

제 2 장: 다른 시각화 라이브러리와의 관계

Plotly는 독립적인 시각화 라이브러리이지만, Matplotlib이나 Seaborn과 같은 다른 라이브러리와 함께 사용될 수도 있습니다. 각 라이브러리는 고유한 강점과 사용 목적을 가지고 있습니다.

Plotly는 특히 다음과 같은 경우에 유용합니다:

Plotly Express를 사용하면 몇 줄의 코드로 매우 강력하고 인터랙티브한 시각화를 만들 수 있습니다.

예시 코드: Plotly Express로 간단한 산점도 만들기

import plotly.express as px
import pandas as pd
import numpy as np

# 예시 데이터 생성
data = pd.DataFrame({
    'x': np.random.randn(100),
    'y': np.random.randn(100) * 2 + 0.5,
    'category': np.random.choice(['A', 'B', 'C'], 100)
})

# Plotly Express로 산점도 생성
fig = px.scatter(data_frame=data, x='x', y='y', color='category', 
                 title='Plotly Express Scatter Plot',
                 labels={'x': 'X-Value (from DataFrame)', 'y': 'Y-Value (from DataFrame)'},
                 size_max=10, symbol='category')

# 그래프 보이기 (Jupyter Notebook 환경에서는 fig.show()만으로 충분)
# HTML 파일로 저장하려면: fig.write_html("plotly_scatter_example.html")
fig.show()

예상 결과:

(x축과 y축에 해당하는 100개의 점들이 카테고리(A, B, C)에 따라 다른 색상과 모양으로 표시된 인터랙티브 산점도가 나타납니다.
마우스를 점 위에 올리면 해당 데이터의 상세 정보가 툴팁으로 표시되며, 범례를 클릭하여 특정 카테고리를 숨기거나 보일 수 있습니다.
그래프 영역에서 드래그하여 확대/축소, 패닝이 가능합니다. 제목과 축 레이블이 표시됩니다.)

제 3 장: 주요 인터랙티브 플롯

Plotly Express는 데이터의 관계, 분포, 범주를 시각화하기 위한 다양한 고수준 함수를 제공하며, 모두 인터랙티브합니다.

3.1 관계형 플롯 (Relational Plots)

두 변수 간의 관계를 시각화하는 데 사용됩니다. 대표적으로 px.scatter()px.line()이 있습니다.

예시 코드: px.scatter()px.line()

import plotly.express as px
import pandas as pd

# 데이터 로드 (Plotly 내장 'gapminder' 데이터셋 일부 사용)
gapminder = px.data.gapminder().query("country in ['Canada', 'Korea, Rep.']")

# 산점도
fig_scatter = px.scatter(gapminder, x="year", y="lifeExp", color="country",
                         title='Scatter Plot of Life Expectancy Over Time')
fig_scatter.show()

# 선 그래프
fig_line = px.line(gapminder, x="year", y="lifeExp", color="country", markers=True,
                   title='Line Plot of Life Expectancy Over Time')
fig_line.show()

예상 결과:

(두 개의 인터랙티브 플롯이 차례로 나타납니다.
첫 번째는 시간에 따른 기대 수명 데이터를 산점도로 표시하며, 국가(Canada, Korea, Rep.)에 따라 색상이 구분됩니다.
두 번째는 동일한 데이터를 선 플롯으로 표시하며, 각 데이터 포인트에 마커가 함께 나타납니다.
두 플롯 모두 마우스 호버 시 상세 정보 표시, 범례를 통한 필터링, 확대/축소 등의 인터랙션이 가능합니다.)

3.2 분포 플롯 (Distribution Plots)

단일 변수의 분포 또는 여러 변수 간의 분포를 시각화합니다. px.histogram(), px.box(), px.violin() 등이 유용합니다.

예시 코드: px.histogram()px.violin()

import plotly.express as px

# 데이터 로드 (Plotly 내장 'tips' 데이터셋 사용)
tips = px.data.tips()

# 히스토그램 (KDE 곡선 및 Rug plot 추가 가능)
fig_hist = px.histogram(tips, x="total_bill", color="sex", marginal="rug", # 또는 "box", "violin"
                        hover_data=tips.columns, title='Histogram of Total Bill by Sex')
fig_hist.show()

# 바이올린 플롯
fig_violin = px.violin(tips, y="total_bill", x="day", color="smoker", box=True, points="all",
                       title='Violin Plot of Total Bill by Day and Smoker')
fig_violin.show()

예상 결과:

(두 개의 인터랙티브 플롯이 차례로 나타납니다.
첫 번째는 성별(sex)에 따른 총 식사 금액(total_bill)의 분포를 히스토그램으로 표시합니다. 각 막대 위에 마우스를 올리면 해당 구간의 빈도수 등의 정보가 나타납니다. 주변부(marginal)에는 러그 플롯이 표시되어 개별 데이터 포인트의 위치를 보여줍니다.
두 번째는 요일(day) 및 흡연 여부(smoker)에 따른 총 식사 금액의 분포를 바이올린 플롯으로 보여줍니다. 바이올린 내부에는 박스 플롯이 함께 표시되고, 모든 개별 데이터 포인트(points="all")도 나타납니다. 호버 기능과 범례 인터랙션이 제공됩니다.)

3.3 범주형 플롯 (Categorical Plots)

하나 이상의 범주형 변수와 수치형 변수 간의 관계를 시각화합니다. px.bar(), px.strip(), px.funnel() 등이 있습니다. px.histogram()도 범주형 데이터의 빈도를 세는 데 사용될 수 있습니다 (Seaborn의 countplot과 유사).

예시 코드: px.bar() (countplot 역할) 와 px.strip()

import plotly.express as px

# 데이터 로드 (Plotly 내장 'tips' 데이터셋 사용)
tips = px.data.tips()

# 막대 그래프 (countplot과 유사하게 사용)
# px.histogram을 사용하여 범주형 데이터의 빈도수를 시각화할 수도 있습니다.
# 여기서는 day별 count를 px.bar로 직접 표현합니다.
day_counts = tips['day'].value_counts().reset_index()
day_counts.columns = ['day', 'count']
fig_bar = px.bar(day_counts, x="day", y="count", color="day",
                 title='Count of Entries by Day (Bar Plot)')
fig_bar.show()

# 스트립 플롯
fig_strip = px.strip(tips, x="day", y="total_bill", color="smoker",
                     title='Strip Plot of Total Bill by Day and Smoker')
fig_strip.show()

예상 결과:

(두 개의 인터랙티브 플롯이 차례로 나타납니다.
첫 번째는 요일(day)별 데이터 개수를 막대 그래프로 보여줍니다. 각 막대는 요일을 나타내며 높이는 해당 요일의 데이터 빈도입니다.
두 번째는 요일(day) 및 흡연 여부(smoker)에 따른 총 식사 금액(total_bill)을 스트립 플롯(점 플롯)으로 보여줍니다. 각 점은 개별 데이터를 나타냅니다.
두 플롯 모두 인터랙티브 기능을 제공합니다.)

제 4 장: 다중 플롯 그리드와 패싯

Plotly Express는 facet_rowfacet_col 매개변수를 사용하여 데이터의 여러 하위 집합에 걸쳐 동일한 종류의 플롯을 생성하여 비교할 수 있는 강력한 패싯(facet) 기능을 제공합니다. 또한, px.scatter_matrix()를 통해 여러 변수 간의 쌍별 관계를 한눈에 볼 수 있습니다.

예시 코드: facet_colpx.scatter_matrix()

import plotly.express as px

# FacetGrid 예시 (tips 데이터셋 사용)
tips = px.data.tips()
fig_facet = px.scatter(tips, x="total_bill", y="tip", color="smoker",
                       facet_col="day",  # 요일별로 열 분리
                       facet_row="time",  # 시간대별로 행 분리 (선택 사항)
                       title='Facet Plot: Tip vs Total Bill by Day, Time, Smoker')
fig_facet.show()


# scatter_matrix 예시 (penguins 데이터셋 사용, Plotly Express에 내장된 iris 데이터로 대체)
iris = px.data.iris() # penguins 데이터셋이 기본 제공되지 않으므로 iris 사용
fig_matrix = px.scatter_matrix(iris, dimensions=["sepal_width", "sepal_length", "petal_width", "petal_length"],
                               color="species", title='Scatter Matrix of Iris Features by Species')
fig_matrix.update_traces(diagonal_visible=False) # 대각선 히스토그램 숨기기 (선택)
fig_matrix.show()

예상 결과:

(Facet Plot 예시 결과:
식사 요일(day)을 열로, 식사 시간(time)을 행으로 하는 격자 형태의 서브플롯들이 나타납니다.
각 서브플롯은 해당 조건에 맞는 데이터의 total_bill과 tip 간의 관계를 산점도로 보여주며, 흡연 여부(smoker)에 따라 점의 색상이 구분됩니다.
전체 플롯은 인터랙티브하며, 각 서브플롯도 개별적으로 상호작용 가능합니다. 제목이 포함됩니다.)

(Scatter Matrix 예시 결과:
Iris 데이터셋의 선택된 수치형 특성들 간의 모든 쌍별 관계를 보여주는 그리드가 나타납니다.
대각선에는 각 특성의 단일 변수 분포(기본적으로 히스토그램 또는 KDE)가 표시될 수 있으나 여기서는 숨겼습니다. 비대각선에는 두 특성 간의 산점도가 표시됩니다.
점의 색상은 붓꽃 종(species)에 따라 구분됩니다. 모든 플롯은 인터랙티브합니다. 전체 제목이 포함됩니다.)

더 복잡한 다중 플롯 레이아웃은 plotly.subplots 모듈의 make_subplots 함수와 Plotly Graph Objects를 사용하여 구성할 수 있습니다.

제 5 장: 스타일, 템플릿 및 레이아웃

Plotly는 플롯의 전반적인 미적 스타일, 색상 팔레트, 레이아웃 등을 유연하게 변경할 수 있는 다양한 방법을 제공합니다.

예시 코드: 템플릿과 레이아웃 변경

import plotly.express as px
import pandas as pd
import numpy as np

data = pd.DataFrame(np.random.randn(100, 2), columns=['x', 'y'])
data['category'] = np.random.choice(['Alpha', 'Beta', 'Gamma'], 100)


fig = px.scatter(data, x='x', y='y', color='category',
                 color_discrete_sequence=px.colors.qualitative.Vivid, # 특정 색상 시퀀스 사용
                 template='plotly_dark') # 어두운 테마 적용

# 레이아웃 추가 조정
fig.update_layout(
    title_text='Customized Scatter Plot (Dark Theme & Vivid Colors)',
    title_font_size=20,
    xaxis_title='Custom X-axis Label',
    yaxis_title='Custom Y-axis Label',
    legend_title_text='Categories'
)
fig.show()

예상 결과:

(어두운 배경(plotly_dark 템플릿)에 Vivid 색상 팔레트가 적용된 인터랙티브 산점도가 나타납니다.
점들은 카테고리(Alpha, Beta, Gamma)에 따라 다른 색상으로 구분됩니다.
그래프 제목, 축 레이블, 범례 제목 등이 사용자 정의된 텍스트와 스타일로 표시됩니다. 모든 인터랙티브 기능은 그대로 유지됩니다.)

제 6 장: 타이타닉 데이터 시각화 (Plotly)

타이타닉 데이터셋을 Plotly Express를 사용하여 다양하고 인터랙티브한 방식으로 시각화해봅니다.

6.1 데이터 준비

Pandas를 사용하여 타이타닉 데이터를 불러오고 기본적인 전처리를 수행합니다. (이전 Seaborn 예제와 데이터 준비 과정은 동일)

예시 코드: (데이터 로딩 및 전처리)

import pandas as pd
import numpy as np
import plotly.express as px

# Kaggle의 타이타닉 데이터셋 URL (또는 로컬 경로)
# 실제 URL 대신 Plotly Express의 내장 데이터로 일부 대체하거나,
# 사용자가 직접 데이터를 로드할 수 있도록 안내할 수 있습니다.
# 여기서는 이전과 동일하게 URL을 사용하되, Plotly Express는 웹 접근에 제약이 있을 수 있으므로
# 로컬 파일로 저장 후 로드하는 것을 권장합니다.
# 여기서는 px.data.tips() 처럼 직접 로드할 수 있는 데이터가 아니므로 pandas로 로드합니다.

try:
    df = pd.read_csv('https://web.stanford.edu/class/archive/cs/cs109/cs109.1166/stuff/titanic.csv')
except Exception as e:
    print(f"Error loading data: {e}. Using a fallback sample.")
    data_dict = {'Survived': [0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1], 
                 'Pclass': [3, 1, 3, 1, 3, 3, 1, 3, 3, 2, 2, 1],
                 'Sex': ['male', 'female', 'female', 'female', 'male', 'male', 'male', 'male', 'female', 'female', 'male', 'female'],
                 'Age': [22, 38, 26, 35, 35, np.nan, 54, 2, 27, 14, 30, 58], 
                 'Fare': [7.25,71.28,7.92,53.1,8.05,8.45,51.86,21.07,11.13,30.07, 13.0, 26.55],
                 'Embarked': ['S', 'C', 'S', 'S', 'S', 'Q', 'S', 'S', 'S', 'C', 'S', 'S'],
                 'SibSp': [1,1,0,1,0,0,0,3,0,1,0,0], 'Parch': [0,0,0,0,0,0,0,1,2,0,0,0]}
    df = pd.DataFrame(data_dict)


# Age 결측치를 평균으로 채우기
df['Age'].fillna(df['Age().mean(), inplace=True)
# Embarked 결측치를 최빈값으로 채우기
if 'Embarked' in df.columns and df['Embarked'].isnull().any():
    df['Embarked'].fillna(df['Embarked'].mode()[0], inplace=True)

# Survived를 문자열로 변환하여 범주형으로 명확히 인식시키기 (Plotly 색상 구분에 용이)
df['Survived_cat'] = df['Survived'].map({0: 'Died', 1: 'Survived'})


print("--- 데이터 준비 완료 (처음 3개 행) ---")
print(df.head(3))

예상 결과:

--- 데이터 준비 완료 (처음 3개 행) ---
   Survived  Pclass                                               Name     Sex   Age  SibSp  Parch            Ticket     Fare Cabin Embarked Survived_cat
0         0       3                            Braund, Mr. Owen Harris    male  22.0      1      0         A/5 21171   7.2500   NaN        S         Died
1         1       1  Cumings, Mrs. John Bradley (Florence Briggs Th...  female  38.0      1      0          PC 17599  71.2833   C85        C     Survived
2         1       3                             Heikkinen, Miss. Laina  female  26.0      0      0  STON/O2. 3101282   7.9250   NaN        S     Survived
(실제 데이터 로드 결과에 따라 다를 수 있으며, 'Survived_cat' 열이 추가됩니다.)

6.2 성별/객실 등급별 생존자 (histogram 또는 bar)

px.histogram (또는 집계 후 px.bar)을 사용하여 성별 또는 객실 등급에 따른 생존자/사망자 수를 인터랙티브하게 비교합니다.

예시 코드:

# 성별에 따른 생존자/사망자 수
fig_sex_survival = px.histogram(df, x='Sex', color='Survived_cat', barmode='group',
                                title='Survival Count by Sex (Plotly)',
                                labels={'Survived_cat': 'Survival Status'},
                                color_discrete_map={'Died':'salmon', 'Survived':'lightgreen'})
fig_sex_survival.show()

# 객실 등급에 따른 생존자/사망자 수
fig_pclass_survival = px.histogram(df, x='Pclass', color='Survived_cat', barmode='group',
                                   title='Survival Count by Pclass (Plotly)',
                                   labels={'Survived_cat': 'Survival Status', 'Pclass': 'Passenger Class'},
                                   category_orders={"Pclass": [1, 2, 3]}, # Pclass 순서 정렬
                                   color_discrete_map={'Died':'grey', 'Survived':'skyblue'})
fig_pclass_survival.show()

예상 결과:

(두 개의 인터랙티브 히스토그램(막대 그래프 형태)이 나타납니다.
첫 번째는 성별(male, female)에 따라 생존자(연두색)와 사망자(연어색) 수를 그룹화된 막대로 표시합니다.
두 번째는 객실 등급(1, 2, 3)에 따라 생존자(하늘색)와 사망자(회색) 수를 그룹화된 막대로 표시합니다.
각 플롯은 마우스 호버 시 상세 정보(개수 등)를 보여주고, 범례를 통해 특정 그룹을 토글할 수 있습니다.)

6.3 생존 여부에 따른 연령 분포 (histogram, violin)

생존 여부에 따라 승객들의 연령 분포를 히스토그램이나 바이올린 플롯으로 비교합니다. Plotly Express의 histogrammarginal="rug" 또는 marginal="box"를 추가하여 분포를 더 자세히 볼 수 있고, violin은 분포의 모양을 부드럽게 보여줍니다.

예시 코드:

# 히스토그램으로 연령 분포 비교
fig_age_hist = px.histogram(df, x='Age', color='Survived_cat',
                            barmode='overlay', # 겹쳐서 그리기
                            marginal='box', # 주변부에 박스 플롯 추가
                            opacity=0.7,
                            title='Age Distribution by Survival (Histogram with Box Plot)',
                            color_discrete_map={'Died':'orangered', 'Survived':'dodgerblue'})
fig_age_hist.show()

# 바이올린 플롯으로 연령 분포 비교
fig_age_violin = px.violin(df, y='Age', x='Survived_cat', color='Survived_cat',
                           box=True, # 바이올린 내부에 박스 플롯 표시
                           points="all", # 모든 점 표시 (선택 사항)
                           title='Age Distribution by Survival (Violin Plot)',
                           color_discrete_map={'Died':'red', 'Survived':'blue'})
fig_age_violin.show()

예상 결과:

(두 개의 인터랙티브 플롯이 나타납니다.
첫 번째는 생존 여부(Died, Survived)에 따라 승객 연령(Age) 분포를 겹쳐진 히스토그램으로 보여줍니다. 주변부(marginal)에는 각 그룹의 박스 플롯이 표시되어 분포의 주요 통계치를 요약해줍니다 (사망자는 주황색 계열, 생존자는 파란색 계열).
두 번째는 동일한 데이터를 바이올린 플롯으로 보여주며, 각 그룹의 분포 모양을 부드럽게 나타냅니다. 내부에는 박스 플롯이 함께 표시되고, 개별 데이터 포인트도 볼 수 있습니다 (사망자는 빨간색, 생존자는 파란색).
두 플롯 모두 인터랙티브 기능을 제공합니다.)

6.4 객실 등급 및 성별에 따른 연령 분포 (box)

객실 등급(Pclass)과 성별(Sex)에 따라 승객들의 연령(Age) 분포를 인터랙티브 박스 플롯으로 비교합니다.

예시 코드:

fig_age_pclass_sex_box = px.box(df, x='Pclass', y='Age', color='Sex',
                                 title='Age Distribution by Pclass and Sex (Box Plot)',
                                 labels={'Pclass': 'Passenger Class'},
                                 category_orders={"Pclass": [1, 2, 3]},
                                 color_discrete_map={'male': 'lightblue', 'female': 'pink'})
fig_age_pclass_sex_box.show()

예상 결과:

(x축에 객실 등급(1, 2, 3)이 표시되고, 각 등급 내에서 성별(male, female)에 따라 연령 분포를 나타내는 인터랙티브 박스 플롯이 그려집니다.
남성은 하늘색, 여성은 분홍색으로 구분됩니다. 각 박스 플롯에 마우스를 올리면 사분위수, 중앙값, 이상치 등의 통계 정보를 볼 수 있습니다. 제목이 포함됩니다.)

6.5 생존 여부에 따른 요금 분포 (violin)

생존 여부(Survived)에 따라 승객들이 지불한 요금(Fare)의 분포를 인터랙티브 바이올린 플롯으로 시각화합니다. 요금 분포는 매우 비대칭적이므로 로그 스케일을 적용하는 것이 유용할 수 있습니다.

예시 코드:

fig_fare_violin = px.violin(df, x='Survived_cat', y='Fare', color='Survived_cat',
                              box=True, points='all', # points='all'은 데이터가 많을 경우 느려질 수 있음
                              title='Fare Distribution by Survival (Violin Plot - Log Scale for Y)',
                              labels={'Survived_cat': 'Survival Status'},
                              log_y=True, # Y축 로그 스케일 적용
                              color_discrete_map={'Died': 'salmon', 'Survived': 'lightgreen'})
fig_fare_violin.show()

예상 결과:

(x축에 생존 여부(Died, Survived)가 표시되고, 각 그룹에 대한 요금(Fare) 분포를 인터랙티브 바이올린 플롯으로 보여줍니다.
사망자는 연어색, 생존자는 연두색으로 구분됩니다. 요금의 분포 범위가 넓어 y축은 로그 스케일로 표시되어 분포를 더 명확하게 비교할 수 있습니다.
바이올린 플롯 위에 마우스를 올리면 관련 통계 정보를 볼 수 있으며, 개별 데이터 포인트도 함께 표시됩니다. 제목과 x축 레이블이 포함됩니다.)

6.6 특성 간 상관관계 (imshow)

데이터셋의 수치형 특성들 간의 상관관계를 인터랙티브 히트맵으로 시각화합니다. Plotly Express의 px.imshow()를 사용할 수 있습니다.

예시 코드:

# 수치형 데이터만 선택
numerical_df = df[['Survived', 'Pclass', 'Age', 'SibSp', 'Parch', 'Fare']].copy()

# 결측치 한 번 더 확인 및 처리 (Age는 이미 처리됨)
# numerical_df.dropna(inplace=True) # 상관관계 계산 전 결측치 제거

correlation_matrix = numerical_df.corr()

fig_heatmap = px.imshow(correlation_matrix, text_auto=True, # 각 셀에 값 자동 표시
                        color_continuous_scale='RdBu_r', # Red-Blue_r (반전) 색상 스케일
                        title='Correlation Matrix of Titanic Features (Plotly Heatmap)',
                        aspect="auto") # 셀 크기 자동 조정
fig_heatmap.show()

예상 결과:

(선택된 수치형 특성들 간의 상관계수 행렬이 인터랙티브 히트맵으로 표시됩니다.
각 셀은 두 특성 간의 상관계수 값을 나타내며, 값의 크기에 따라 색상(RdBu_r 팔레트)이 다르게 표시됩니다.
각 셀에는 상관계수 값이 숫자로 표시되며, 마우스를 올리면 더 정확한 값을 볼 수 있습니다. 제목이 포함됩니다.)

6.7 주요 특성 간 관계 (scatter_matrix)

선택된 몇 가지 주요 특성들 간의 쌍별 관계를 한 번에 인터랙티브하게 시각화합니다. 생존 여부에 따라 색상을 구분할 수 있습니다.

예시 코드:

# scatter_matrix를 위한 주요 특성 선택
pairplot_df = df[['Survived_cat', 'Pclass', 'Age', 'Fare', 'Sex']].copy()

fig_scatter_matrix = px.scatter_matrix(pairplot_df,
                                       dimensions=['Pclass', 'Age', 'Fare'], # 수치형 변수만 dimensions에 명시
                                       color='Survived_cat',
                                       symbol='Sex', # 성별에 따라 마커 모양 다르게
                                       title='Pair Plot of Key Titanic Features by Survival and Sex',
                                       labels={'Survived_cat': 'Survival Status'},
                                       color_discrete_map={'Died': 'red', 'Survived': 'blue'},
                                       height=700) # 그래프 크기 조절
# 대각선 그래프 종류 변경 (기본은 히스토그램)
# fig_scatter_matrix.update_traces(diagonal_kde=True, selector=dict(type='histogram')) # KDE로 변경 시도 (px 0.4.0+)
# 또는 fig_scatter_matrix.update_traces(diagonal_visible=False) 로 숨기기

fig_scatter_matrix.show()

예상 결과:

(선택된 특성들('Pclass', 'Age', 'Fare') 간의 모든 쌍별 관계를 보여주는 인터랙티브 그리드가 나타납니다.
대각선에는 각 특성의 단일 변수 분포(기본적으로 히스토그램)가 생존 여부에 따라 다른 색으로 표시되고,
비대각선에는 두 특성 간의 산점도가 생존 여부에 따라 다른 색상(사망자는 빨간색, 생존자는 파란색)과 성별에 따라 다른 마커로 표시됩니다.
각 플롯은 확대/축소, 호버 정보 표시 등 인터랙티브 기능을 제공합니다. 전체 제목이 포함됩니다.)

제 7 장: 맺음말

Plotly, 특히 Plotly Express는 파이썬에서 인터랙티브하고 미려한 통계적 데이터 시각화를 매우 쉽고 효율적으로 만들 수 있는 강력한 라이브러리입니다. 이 문서를 통해 Plotly의 다양한 플롯 기능과 사용자 정의 방법을 익히셨기를 바랍니다.

Plotly는 데이터 분석 과정에서 탐색적 데이터 분석(EDA)을 수행하고, 분석 결과를 웹 기반 대시보드(Dash)나 프레젠테이션을 통해 효과적으로 전달하는 데 매우 유용합니다. 더 많은 예제와 상세한 API 정보는 Plotly Python 공식 문서, Plotly Express 튜토리얼, 그리고 Plotly Graph Objects 튜토리얼을 참고하시기 바랍니다.