学習した内容を深めるために、アウトプットするのが一番良い手段です。もし他人の参考にもなれば、最高です。
そのため、こちらのコースDTSA 5304 Fundamentals of Data Visualizationから重要なポイントを抜粋し、自分なりの解釈を加えてこちらに残しています。
全体概要
このコースでは、主に以下の六つを紹介しています。
- デザインの基本
- ユーザーのニーズ
- 評価
W1-Introduction to Altair
W1-Visual Mapping
W1-Ethical Visualization Choices
W1-Interaction
W2-Types of Visualization Tasks
W2-Design Studies Methodology
W2-Perception in Visualization
W2-Uncertainty & Ethical Decision Making
W3-Insight-Based Evaluation
W3-Qualitative Evaluation
W3-Experimental Design
W3-Trade-Offs in Evaluation
デザインの基本
データ可視化における以下の3つの要素があります:
- サイズ
- 色
- 位置
データをこれら要素に変換することで、可視化になります。
データ可視化における基本アイデアの説明
このスライドは、データ可視化における設計選択のための共通言語を提供するという基本的な考え方を示しています。具体的には、以下の3つの要素について述べています:
-
サイズ (Size)
データの値に基づいて、可視化するオブジェクトのサイズを変えることができます。たとえば、棒グラフの棒の高さや散布図の点の大きさなどです。サイズの変化は、データの量や重要性を視覚的に表現するために使用されます。 -
色 (Color)
色は、異なるカテゴリや範囲を視覚的に区別するために使用されます。例えば、ヒートマップでは異なる色を使って値の強度を表現したり、カテゴリカルデータを色で区別することができます。 -
位置 (Position)
位置は、データポイントを2次元または3次元の空間上に配置するために使用されます。例えば、散布図ではx軸とy軸の位置がデータポイントの値を表しています。
Altairを使用して、これらの要素にデータを変換する方法を示します:
!pip install altair
import altair as alt
import pandas as pd
# Google Colab用の設定
alt.renderers.enable('colab')
# サンプルデータ
data = pd.DataFrame({
'x': range(10),
'y': range(10),
'category': ['A', 'B'] * 5,
'value': range(10)
})
# サイズ、色、位置を使用した散布図
chart = alt.Chart(data).mark_point().encode(
x='x',
y='y',
color='category',
size='value'
)
chart.show() # エラーが発生したら、chartのみで出力
Pythonでの可視化
Pythonでデータ可視化を行う際の7つの主要な構成要素について、具体的なコード例を交えて解説します。ここでは、一般的なデータ可視化ライブラリであるAltairを使用します。
1. データ (Data)
データは可視化の基礎です。ここではPandasを使ってデータフレームを作成します。
import pandas as pd
# サンプルデータ
data = pd.DataFrame({
'x': range(10),
'y': range(10)
})
data
このコードを実行すると、以下のようなデータフレームが生成されます:
x | y | |
---|---|---|
0 | 0 | 0 |
1 | 1 | 1 |
2 | 2 | 2 |
3 | 3 | 3 |
4 | 4 | 4 |
5 | 5 | 5 |
6 | 6 | 6 |
7 | 7 | 7 |
8 | 8 | 8 |
9 | 9 | 9 |
2. 美学 (Aesthetics)
美学はデータポイントの見た目を決定します。Altairではencode
メソッドを使います。
import altair as alt
# データの見た目を設定
chart = alt.Chart(data).mark_point().encode(
x='x',
y='y',
color='y', # 色でデータポイントを表現
size='y' # サイズでデータポイントを表現
)
chart.show()
3. スケール (Scale)
スケールはデータを視覚的属性にマッピングする方法です。Altairではscale
パラメータを使ってカスタマイズできます。
chart = alt.Chart(data).mark_point().encode(
x=alt.X('x', scale=alt.Scale(domain=(0, 10))),
y=alt.Y('y', scale=alt.Scale(domain=(0, 10))),
color='y',
size='y'
)
chart.show()
デフォルトは、最大値の10になります。もし20に変更すると:
chart = alt.Chart(data).mark_point().encode(
x=alt.X('x', scale=alt.Scale(domain=(0, 20))),
y=alt.Y('y', scale=alt.Scale(domain=(0, 20))),
color='y',
size='y'
)
chart.show()
4. 幾何学的オブジェクト (Geometric Objects)
幾何学的オブジェクトはデータを表示する基本形状です。Altairではmark_*
メソッドを使って設定します。
# 棒グラフの例
chart = alt.Chart(data).mark_bar().encode(
x='x',
y='y'
)
chart.show()
5. 統計 (Statistics)
統計はデータの要約や集計に使います。Altairではtransform_*
メソッドを使って統計操作を行います。
# 平均値の計算と表示
mean_chart = alt.Chart(data).mark_rule(color='red').encode(
y='mean(y):Q'
).transform_aggregate(
mean_y='mean(y)',
groupby=['x']
)
chart + mean_chart
- alt.Chartを再度使用して、新しいチャートを作成します。
- mark_rule(color='red')メソッドは、赤色の水平線を表示することを指定します。
- encodeメソッドで、y軸に平均値(mean(y):Q)を設定します。:Qは定量データ(quantitative)を示します。
- transform_aggregateメソッドを使用して、mean_yとして各xに対するyの平均値を計算します。この操作は、xでグループ化して行われます。
6. ファセット (Facets)
ファセットはデータをサブセットに分割して複数のプロットを作成します。Altairではfacet
メソッドを使います。
# カテゴリに基づいたファセット
data['category'] = ['A'] * 5 + ['B'] * 5
facet_chart = alt.Chart(data).mark_point().encode(
x='x',
y='y',
color='category'
).facet(
column='category'
)
facet_chart.show()
- 新しい列categoryをデータフレームに追加します。最初の5行にはカテゴリAを、次の5行にはカテゴリBを設定しています。これにより、データは2つのカテゴリに分けられます。
- alt.Chartを使用して、基本的なチャートを作成します。
- mark_point()メソッドは、データポイントを点として表示することを指定します。
- encodeメソッドを使用して、x列をx軸に、y列をy軸に、category列を色にマッピングします。これにより、各カテゴリが異なる色で表示されます。
- facetメソッドを使用して、category列に基づいてチャートを列ごとに分割します。これにより、各カテゴリAとBに対して個別の散布図が作成されます。
7. 座標系 (Coordinate System)
座標系はデータを配置するフレームワークです。Altairではprojection
メソッドを使って設定します。
# 極座標系の使用例
polar_chart = alt.Chart(data).mark_point().encode(
theta='x',
radius='y'
).properties(
width=400,
height=400
).configure_view(
strokeWidth=0
)
polar_chart.show()
- encodeメソッドを使用して、thetaにx列を、radiusにy列をマッピングします。これにより、データポイントが極座標系で配置されます。
- thetaはデータポイントの角度を指定します。
- radiusはデータポイントの半径を指定します。
- propertiesメソッドで、チャートの幅と高さを設定します。この例では、それぞれ400ピクセルに設定されています。
- configure_viewメソッドを使用して、チャートの外枠の線の幅を0に設定します。これにより、チャートの枠線が表示されなくなります。
これらの要素を組み合わせることで、PythonとAltairを使って高度なデータ可視化を実現できます。
Altairの紹介(Handson)
これから実際のデータを利用して、Altairパッケージを紹介します。
データセットには、2015〜2017年における世界のほぼすべての国の幸福度データが入っています。国ごとに、全体におけるランキングが割り当てられ、平均寿命、経済、自由などの基準に対して個別のスコアが付けられています。
世界幸福度報告の詳細とデータの解釈方法については、Kaggleのページを参照してください。
データのダウンロードはこちらとこちらです
列の解釈は以下の通りです:
以下は、画像に表示されている世界幸福度報告書のデータ列の説明をテーブル形式で示したものです。
列名 | 説明 |
---|---|
Country (国) | 各国の名前。 |
Region (地域) | 各国が属する地域。ここでは「Western Europe(西ヨーロッパ)」が示されています。 |
Happiness Rank (幸福度ランク) | 世界幸福度ランキングにおける順位。ここでは1位から5位までが示されています。 |
Happiness Score (幸福度スコア) | 各国の幸福度を数値化したスコア。このスコアは、住民の主観的な幸福度に基づいています。 |
Lower Confidence Interval (信頼区間の下限) | 幸福度スコアの信頼区間の下限。測定されたスコアの信頼性を示します。 |
Upper Confidence Interval (信頼区間の上限) | 幸福度スコアの信頼区間の上限。測定されたスコアの信頼性を示します。 |
Economy (GDP per Capita) (経済: 一人当たりのGDP) | 各国の一人当たりのGDP。経済的な豊かさを示します。 |
Family (家族) | 各国の家族支援の強さ。社会的なサポートの指標となります。 |
Health (Life Expectancy) (健康: 平均寿命) | 各国の平均寿命。健康の指標として使用されます。 |
Freedom (自由) | 人々が人生の選択をする自由度。 |
Trust (Government Corruption) (信頼: 政府の腐敗) | 政府の腐敗の少なさ。政府に対する信頼度を示します。 |
Generosity (寛容さ) | 寄付や社会貢献の程度を示す指標。 |
Dystopia Residual (ディストピア残余) | ディストピアの状況(最悪の状況)からの改善度合い。この値が高いほど、その国はディストピア状況からの改善が大きいとされます。 |
データ読み込み
データをチェックしてみます:
#
import pandas as pd
data = pd.read_csv("WHR_2016.csv")
data.head()
棒グラフ
各地域(Region)の幸福度スコア(Happiness Score)を示す棒グラフを作成します。
# 各地域の幸福度スコアを表すバーが描画されます。バーの色はデフォルト設定のままですが、追加のエンコーディングを使って色を設定することも可能です。
import altair as alt
alt.Chart(data).mark_bar().encode(
x = "Region",
y = "Happiness Score"
)
棒グラフ(バーチャート)は、データを視覚的に表現するための一般的な方法で、多くの用途があります。以下に、棒グラフがよく使用される用途を説明します:
-
カテゴリーデータの比較
棒グラフは、異なるカテゴリ間での数値の比較を視覚的に行うのに適しています。各バーは異なるカテゴリを表し、その高さは該当カテゴリの値を示します。
例: 異なる国の人口、販売データ、各部門の業績など。 -
時系列データの表示
複数の時点でのデータを比較するために、時間の経過とともにデータがどのように変化したかを示すことができます。
例: ある製品の月ごとの売上高、年間の平均気温の変動など。 -
分布の分析
棒グラフを使用して、データの分布を分析し、特定の範囲内にどれだけのデータが存在するかを示すことができます。
例: テストの得点分布、給与の分布など。 -
ランキングの表示
ランキング形式のデータを視覚的に表示するために使用されます。順位が明確に示され、視覚的に一目で理解できます。
例: スポーツチームの順位、幸福度ランキング、人気製品のランキングなど。 -
パート・オブ・ホール分析
カテゴリ全体に対する各部分の割合を示すために使用されます。各バーはカテゴリ全体に対する個々の部分を表します。
例: 予算の内訳、全体売上に対する各商品の売上割合など。 -
異常値の特定
特定のデータポイントが他のデータポイントと大きく異なる場合、異常値(アウトライアー)を特定するために使用できます。
例: 予想外に高い/低い売上、異常に高い/低いテストスコアなど。
結論
棒グラフは、データの比較や分析を行うための強力なツールです。視覚的にデータの関係性やパターンを明確に示すことができ、特に以下のような用途に適しています:
- カテゴリーデータの比較
- 時系列データの表示
- 分布の分析
- ランキングの表示
- パート・オブ・ホール分析
- 異常値の特定
これにより、データを理解しやすくし、データに基づいた意思決定をサポートします。
散布図
Altairを使用して散布図(サークルプロット)を作成する例です。この散布図は、各国の平均寿命(Health (Life Expectancy))と幸福度スコア(Happiness Score)の関係を示しています。
# 各データポイント(国)は円として表示されます。各円の位置は、その国の平均寿命と幸福度スコアによって決まります。
import altair as alt
alt.Chart(data).mark_circle().encode(
x = "Health (Life Expectancy)",
y = "Happiness Score"
)
この散布図は、以下のような目的で使用されます:
-
相関関係の可視化:
- 平均寿命と幸福度スコアの間にどのような関係があるかを視覚的に確認することができます。例えば、平均寿命が高い国は幸福度スコアも高い傾向にあるかどうかを調べることができます。
-
異常値の発見:
- 他のデータポイントと比較して、特異な位置にある国(異常値)を特定することができます。例えば、平均寿命が高いにもかかわらず幸福度スコアが低い国を見つけることができます。
-
パターンの識別:
- データ全体のパターンやトレンドを視覚的に識別することができます。例えば、健康状態と幸福度の間に直線的な関係があるか、あるいは別の形状の関係があるかを判断することができます。
このコードを実行すると、以下のような散布図が生成されます:
- x軸には各国の平均寿命(例:0.8から0.9の範囲)。
- y軸には各国の幸福度スコア(例:6から8の範囲)。
- 各データポイントは円として表示され、その位置は対応する国の平均寿命と幸福度スコアによって決まります。
このような図は、健康政策や福祉政策の分析において、国の健康状態と幸福度の関係を理解するために有用です。データに基づいた意思決定をサポートするために、視覚的なツールとして利用されます。
折れ線グラフ
Altairを使用して折れ線グラフを作成する例です。この折れ線グラフは、各国の幸福度スコア(Happiness Score)と平均寿命(Health (Life Expectancy))の関係を示しています。
# データポイントは線で結ばれ、各データポイントはその国の幸福度スコアと平均寿命を表しています。
linegraph = alt.Chart(data).mark_line().encode(
x = "Happiness Score",
y = "Health (Life Expectancy)"
)
linegraph
以下のコードは、Altairを使用して折れ線グラフを作成する例です。この折れ線グラフは、各国の幸福度スコア(Happiness Score)と平均寿命(Health (Life Expectancy))の関係を示しています。
import altair as alt
# 折れ線グラフの作成
linegraph = alt.Chart(data).mark_line().encode(
x = "Happiness Score",
y = "Health (Life Expectancy)"
)
linegraph
折れ線グラフは以下のような目的で使用されます:
-
トレンドの視覚化:
- 時系列データや関連データのトレンドを視覚的に確認するために使用されます。例えば、幸福度スコアが上がると平均寿命がどのように変化するかを示すことができます。
-
相関関係の分析:
- 2つの変数間の相関関係を視覚的に示します。例えば、幸福度スコアと平均寿命の間に正の相関があるかどうかを確認できます。
-
データの連続性の強調:
- 折れ線グラフは、データポイント間の連続性や変化の方向を強調します。これは、データが連続的に変化する場合に特に有用です。
このコードを実行すると、以下のような折れ線グラフが生成されます:
- x軸には各国の幸福度スコアがプロットされます。
- y軸には各国の平均寿命がプロットされます。
- データポイントは線で結ばれ、各国の幸福度スコアと平均寿命の関係を示します。
このようなグラフは、幸福度スコアと健康状態の関係を視覚的に分析するために有用です。特に、幸福度が高い国ほど健康状態も良いかどうかを確認するために使用されます。また、データに基づいた政策決定や研究においても役立ちます。
図をHTMLに保存
Altairを使用して作成した折れ線グラフをHTMLファイルとして保存する例です。ここでは、SVGレンダラーを使用してグラフを保存しています。
#
linegraph.save("linegraph.html",embed_options={"renderer":"svg"})
グラフに要素を追加(色・ツールチップ・パイプライン)
さらに、色などの要素を追加して、より多くの情報を表します。
- 色の追加(デフォルト色)
alt.Chart(data).mark_circle().encode(
x = "Health (Life Expectancy)",
y = "Happiness Score",
color = "Region"
)
- 色の追加(scale追加)
scale = alt.Scale(scheme = "spectral")
を追加すると、データの Region
に基づいて表示される色が、Spectralというカラースキームに従って選ばれるようになります。
scale = alt.Scale(scheme = "spectral")
を追加することで、グラフの色合いが変わり、データの地域ごとの違いがより鮮明に視覚化されます。Spectralスキームは、特に視覚的に多くの異なるカテゴリを一目で区別する必要がある場合に有用です。
alt.Chart(data).mark_circle().encode(
x = "Health (Life Expectancy)",
y = "Happiness Score",
color = alt.Color("Region",scale = alt.Scale(scheme = "spectral"))
)
-
ツールチップの追加
Altairを使用してインタラクティブな散布図を作成する例です。各データポイントにツールチップ(マウスオーバー時に表示される情報)を追加しています。
alt.Chart(data).mark_circle().encode(
x = "Health (Life Expectancy)",
y = "Happiness Score",
color = alt.Color("Region",scale = alt.Scale(scheme = "spectral")),
tooltip = ["Country","Happiness Score"]
)
- サイズの追加
Generosity (寛容さ):寄付や社会貢献の程度を示す指標。
これを円のサイズの指標として追加します。
alt.Chart(data).mark_circle().encode(
x = "Health (Life Expectancy)",
y = "Happiness Score",
color = alt.Color("Region",scale = alt.Scale(scheme = "spectral")),
tooltip = ["Country","Happiness Score","Generosity"],
size = "Generosity"
)
- パイプラインの使用
しかし、上記のサイズを追加しても関係を見つけるのは難しいです。というのも、人々はサイズの大きさに非常に敏感だからです。寛容さ(Generosity)と他の変数との関係を明確にするために、パイプラインを使用することができます。
パイプラインは、データの前処理、変換、分析を段階的に行う手法であり、複雑なデータ関係を整理し、理解しやすくするために有用です。
healthPlot = alt.Chart(data).mark_circle().encode(
x = "Health (Life Expectancy)",
y = "Happiness Score",
color = alt.Color("Region",scale = alt.Scale(scheme = "spectral")),
tooltip = ["Country","Happiness Score"],
)
generosityPlot = alt.Chart(data).mark_circle().encode(
x = "Generosity",
y = "Happiness Score",
color = alt.Color("Region",scale = alt.Scale(scheme = "spectral")),
tooltip = ["Country","Happiness Score"],
)
healthPlot | generosityPlot
このコードを実行すると、以下のような2つの散布図が並べて表示されます:
- 左側の散布図: 平均寿命(Health (Life Expectancy))と幸福度スコア(Happiness Score)の関係を示します。
- 右側の散布図: 寛容さ(Generosity)と幸福度スコア(Happiness Score)の関係を示します。
用途:
- 比較分析: 2つの異なる変数(平均寿命と寛容さ)が幸福度スコアにどのように影響するかを視覚的に比較できます。
- データのパターン認識: 各国の幸福度に対する健康状態や寛容さの影響を確認できます。
- インタラクティブなデータ探索: ツールチップにより、各データポイントに関する詳細情報を簡単に取得でき、データの理解が深まります。
このような視覚化は、データの複雑な関係を明確にし、洞察を得るために非常に有用です。
Altairの紹介(Lab)
可視化のマッピング
視覚化におけるマッピングとは、データを視覚的に表現するプロセスを指し、データ空間を視覚空間に変換することを意味します。
データ空間が次の3つのタイプの次元(または属性)から構成されます。
-
カテゴリカル (Categorical): これは、データがカテゴリーに分類されるもので、例えば、「Cats (猫)」「Dogs (犬)」「Birds (鳥)」のように分類されています。カテゴリカルデータは、名前やラベルで表されるもので、順序がありません。
-
順序 (Ordinal): これは、データに自然な順序があるタイプです。例えば、「Small (小)」「Medium (中)」「Large (大)」のように順序がつけられています。順序データは順位やスケールを持ちますが、その間隔は一定であるとは限りません。
-
連続 (Continuous): これは、データが数値として連続的に変化するタイプです。例えば、「1、2、3」と示されており、数値が連続的に変化します。連続データは通常、物理的な測定値や時間など、量的な値を表します。
このように、各次元にはタイプがあり、そのタイプに応じてデータを効果的にマッピングする方法が選ばれます。
視覚空間では、データ空間での各次元(カテゴリカル、順序、連続)のタイプに応じて、どのようにデータを視覚的に表現するかを決定する際に使用されます。
具体的には、以下のようなビジュアル変数が説明されています:
-
Position(位置): データのポイントを異なる位置に配置することで違いを表現します。
-
Color(色): 異なるデータポイントを異なる色で表現します。
-
Shape(形状): データを異なる形状で区別します。
-
Orientation(向き): データの向きを変えることで違いを示します。
-
Size(サイズ): データの大きさを変えることで区別します。
-
Value/Lightness(明度): 色の明るさや濃さを変えてデータを区別します。
-
Motion(動き): 動きの有無や方向でデータを表現します。
-
Texture(質感): データに異なる質感を与えて区別します。
これらのビジュアル変数は、データ空間で示されたデータのタイプ(カテゴリカル、順序、連続)を視覚的に表現するために使用されます。例えば、
- カテゴリカルデータ: 色、形状、動き、質感
- 連続データ: 位置、向き、サイズ、明度
このように、データのタイプに応じた適切なビジュアル変数を選択することで、データをより効果的に理解できるようになります。
具体的には、選択する際に、「表現力(Expressiveness)」と「効果性(Effectiveness)」が必要です。
-
表現力(Expressiveness):
視覚的エンコーディングは、データセットの属性に含まれる全ての情報を、かつその情報のみを正確に表現する必要があります。これにより、データの各カテゴリが明確に識別できるようになっています。色による表現が「1、2、3」をそれぞれ異なる色で表すのと、同じ色の濃淡で表す場合が比較されており、異なる色を使った方がより効果的な表現ができることが示されています。 -
効果性(Effectiveness):
データの属性の重要性は、それを表現するチャネル(色、サイズ、形など)の目立ちやすさと一致しているべきです。例えば、数字が大きくなるほど円のサイズが大きくなり、その重要性が視覚的に強調されます。サイズが小さくて目立たない表現よりも、適切なサイズを使って重要性を示す方が効果的です。
視覚的エンコーディングを使ってデータを表現する際に、正確で効果的な表現をするために「表現力」と「効果性」を考慮する必要があります。
色について
データを視覚的にエンコードする際に、データの特徴によって異なるアプローチが必要です。
この画像は、データを視覚的にエンコードする際の異なるアプローチについて説明しています。具体的には、「Sequential Encodings(連続エンコーディング)」「Categorical Encodings(カテゴリカルエンコーディング)」「Diverging Encodings(分岐エンコーディング)」の3つのエンコーディング方法が紹介されています。それぞれがデータの異なる特性を視覚的に表現するために使用されます。
1. Sequential Encodings(連続エンコーディング)
- 説明: このエンコーディングでは、データが連続的に変化する場合に使用します。視覚的な表現では、明度や彩度を用いてデータの変化を示します。
- 例: 温度の変化を視覚化する場合、低温から高温にかけて色の明度が徐々に変化するグラデーションを使用します。例えば、青から白への変化を使って、温度が上がるにつれて色が明るくなるように表現します。
2. Categorical Encodings(カテゴリカルエンコーディング)
- 説明: カテゴリカルエンコーディングは、異なるカテゴリを視覚的に区別するために使用されます。このエンコーディングでは、色相(Hue)を用いて異なるカテゴリを示します。
- 例: 学生が異なる学科に属している場合、それぞれの学科を異なる色(例:赤、緑、青など)で表現します。これにより、学科ごとのデータポイントが一目で区別できるようになります。
3. Diverging Encodings(分岐エンコーディング)
- 説明: 分岐エンコーディングは、データが中央の基準値から両方向に分岐する場合に使用します。これには、色相と明度の両方を組み合わせて、カテゴリ間の違いとグループ内の連続的な変化を同時に表現します。
- 例: 世論調査で賛成と反対の意見を視覚化する際、賛成側には青系の色を、反対側には赤系の色を使用し、中間の意見は白またはグレーで表現します。これにより、賛否の強さとその分布が視覚的に表現されます。
要点
- 連続エンコーディングはデータの連続的な変化を表すのに最適であり、明度や彩度の変化を用いて表現されます。
- カテゴリカルエンコーディングはカテゴリを明確に区別するために色相を用います。
- 分岐エンコーディングはデータが中央の基準点から異なる方向に分かれる場合に適しており、カテゴリの違いと連続的な変化の両方を表現します。
これらのエンコーディング手法を適切に使うことで、データをより効果的に視覚化し、理解しやすい形で提示することが可能になります。
補足説明
-
chart.show()
を利用してエラーが発生する際に、chart
だけで行ける場合があります。原因はまだ確認中です。 -
!pip install altair
でaltair`をインストールします。
Grading
参考資料