Plotly Expressを用いて、可視化の様々な方法を学ぶ。

データの可視化の準備

データの種類には,以下のものがある.

  • 連続数値データ
  • カテゴリカルデータ
    • 順序データ(ordinal data): 順序づけが可能なもの.離散数値データもこれに含まれる.
    • 名義データ (nominal data): 順序がつけられないもの.たとえば,性別(男女)や色など.
  • 時刻データ(の組)
  • 緯度・経度データ

データの種類を考えて、適切なグラフで描画する必要がある。

時刻データが1つの場合には,時系列データとして線グラフで描画する.

時刻データが2つ以上の場合には

  • ガントチャート(開始時刻と終了時刻)
  • 時空間ネットワーク(さらにモノの移動を考慮した場合) が考えられる.

また, 緯度・経度データがあるなら,地図上に描画できる.

以下のサイトFrom Data to Vizの決定木を参照.

https://www.data-to-viz.com/

ここでは,以下の例題のデータをpandasで読み込み、Plotly Expressで描画する。

https://github.com/holtzy/data_to_viz/tree/master/Example_dataset

import pandas as pd
import plotly.express as px

# Google Colab.でプロットするためには,以下を実行する.
# import plotly.io as pio
# pio.renderers.default = "colab"

ヒストグラム histgram

まずはヒストグラム(histgram, 度数分布表)を描画してみる.

ヒストグラムは数値データの分布の概要を知る際に便利である.

plotly.express (以下px)のhistgramを用いる.

主な引数

  • data_frame: データフレーム
  • x: $x$ 軸に用いる列名
  • color: 色に用いる列名
  • nbins: ビンの数($x$ 軸の区分数)
  • marginal: 上部に表示する付加グラフの種類.'rug'(絨毯プロット), 'box'(箱ひげ図), 'violin'(バイオリン図), 'histogram'(ヒストグラム)から選択する.
  • opacity: 透過度
  • range_x: $x$ 軸の表示範囲
  • facet_row: 行に複数のグラフを表示させるときのカテゴリカルデータが入っている列名
  • facet_column: 列に複数のグラフを表示させるときのカテゴリカルデータが入っている列名

marginal で表示するグラフの使い分け

  • データそのものを見たい場合には絨毯プロット (rug)
  • データの大まかな値を見たい場合には箱ひげ図 (box)
  • 分布を見たい場合にはバイオリン図 (violin)

例題 AIRBNB PRICES ON THE FRENCH RIVIERA

Air B&B社が提供している宿泊施設の価格データを例として用いる.

参照 https://www.data-to-viz.com/story/OneNum.html

df1 = pd.read_csv(
    "https://raw.githubusercontent.com/holtzy/data_to_viz/master/Example_dataset/1_OneNum.csv"
)
df1.head()
price
0 75.0
1 104.0
2 369.0
3 300.0
4 92.0
fig = px.histogram(
    df1, x="price", range_x=(0, 3000), nbins=1000, opacity=0.5, marginal="rug"
)
plotly.offline.plot(fig)

問題(アヤメ)

アヤメのデータ(iris)を読み込み,アヤメの種類(3種)ごとのsepal_lengthのヒストグラムを描画せよ (ヒント:横に並べるには facet_col引数に種類を表す列名を入れる).

iris = px.data.iris()
iris.head()
sepal_length sepal_width petal_length petal_width species species_id
0 5.1 3.5 1.4 0.2 setosa 1
1 4.9 3.0 1.4 0.2 setosa 1
2 4.7 3.2 1.3 0.2 setosa 1
3 4.6 3.1 1.5 0.2 setosa 1
4 5.0 3.6 1.4 0.2 setosa 1

問題 (SAT,GPA)

http://logopt.com/data/SATGPA.csv からデータを読み込み,2種類のSATの成績とGPAのヒストグラムを描画せよ.

問題(ポケモン)

以下のように読み込んだポケモンのデータフレームを用いて,攻撃力(Attack),守備力(Defense)のヒストグラムを描画せよ.

pokemon = pd.read_csv("http://logopt.com/data/poke.csv", encoding="utf-8")
pokemon.head()
# Name Type 1 Type 2 Total HP Attack Defense Sp. Atk Sp. Def Speed Generation Legendary Japanese
0 1 Bulbasaur Grass Poison 318 45 49 49 65 65 45 1 False フシギダネ
1 2 Ivysaur Grass Poison 405 60 62 63 80 80 60 1 False フシギソウ
2 3 Venusaur Grass Poison 525 80 82 83 100 100 80 1 False フシギバナ
3 3 VenusaurMega Venusaur Grass Poison 625 80 100 123 122 120 80 1 False フシギバナ・メガ進化
4 4 Charmander Fire NaN 309 39 52 43 60 50 65 1 False ヒトカゲ

散布図 scatter

散布図(scatter plot)は,2つの数値データの関係を知る際に便利である.

Plotly Expressのpx.scatterを用いる.

主な引数

  • data_frame: データフレーム
  • x: $x$ 軸に用いる列名
  • y: $y$ 軸に用いる列名
  • color: 色に用いる列名
  • marginal_x: $x$ 軸データを上部に表示させるグラフの種類. "rug", "box", "violin", "histogram" から選択する.
  • marginal_y: $y$ 軸データを右部に表示させるグラフの種類. "rug", "box", "violin", "histogram" から選択する.
  • animation_frame: 列の数値を元にアニメーションフレームを作成
  • animation_group: 列の要素ごとにアニメーションをグループ化
  • opacity: 透過度
  • range_x: $x$ 軸の表示範囲
  • facet_row: 行に複数のグラフを表示させるときのカテゴリカルデータが入っている列名
  • facet_column: 列に複数のグラフを表示させるときのカテゴリカルデータが入っている列名

例題 APARTMENT PRICE VS GROUND LIVING AREA

住宅の価格と面積の関係を表すデータを例として用いる.

https://www.data-to-viz.com/story/TwoNum.html

df2 = pd.read_csv(
    "https://raw.githubusercontent.com/holtzy/data_to_viz/master/Example_dataset/2_TwoNum.csv"
)
df2.head()
GrLivArea SalePrice
0 1710 208500
1 1262 181500
2 1786 223500
3 1717 140000
4 2198 250000
fig = px.scatter(
    df2, x="GrLivArea", y="SalePrice", marginal_y="rug", marginal_x="histogram"
)
plotly.offline.plot(fig);

問題(アヤメ)

アヤメのデータを読み込み,がく片長 sepal_lengthと花びら長 petal_lengthの関係を散布図で描画せよ.

問題(ダイヤモンド)

http://logopt.com/data/Diamond.csv からダイアモンドの価格データを読み込み,カラット carat と価格 price の散布図を描け.

問題 (SAT,GPA)

http://logopt.com/data/SATGPA.csv からデータを読み込み,MathSATとGPAの関係を描画せよ。

問題(ポケモン)

ポケモンのデータフレームに対して,攻撃力(Attack),守備力(Defense)の関係を散布図に描画せよ.

pokemon = pd.read_csv("http://logopt.com/data/poke.csv", encoding="utf-8")
pokemon.head()
# Name Type 1 Type 2 Total HP Attack Defense Sp. Atk Sp. Def Speed Generation Legendary Japanese
0 1 Bulbasaur Grass Poison 318 45 49 49 65 65 45 1 False フシギダネ
1 2 Ivysaur Grass Poison 405 60 62 63 80 80 60 1 False フシギソウ
2 3 Venusaur Grass Poison 525 80 82 83 100 100 80 1 False フシギバナ
3 3 VenusaurMega Venusaur Grass Poison 625 80 100 123 122 120 80 1 False フシギバナ・メガ進化
4 4 Charmander Fire NaN 309 39 52 43 60 50 65 1 False ヒトカゲ

問題(タイタニック)

seabornを用いてtitanicデータを読み込み,客室クラス(class)と性別(sex)ごとの運賃(fare)と生存確率(survived)の関係を描画せよ (ヒント:カテゴリカルデータを行(列)に分けて並べるには facet_row(facet_col)引数に分けたい列名を入れる).

import seaborn as sns

titanic = sns.load_dataset("titanic")
titanic.head()
survived pclass sex age sibsp parch fare embarked class who adult_male deck embark_town alive alone
0 0 3 male 22.0 1 0 7.2500 S Third man True NaN Southampton no False
1 1 1 female 38.0 1 0 71.2833 C First woman False C Cherbourg yes False
2 1 3 female 26.0 0 0 7.9250 S Third woman False NaN Southampton yes True
3 1 1 female 35.0 1 0 53.1000 S First woman False C Southampton yes False
4 0 3 male 35.0 0 0 8.0500 S Third man True NaN Southampton no True

問題 (チップ)

散布図では、引数trendlineに"ols"(ordinary least square)を指定することによって、最小自乗法による線形回帰の結果を表示することができる。

seabornを用いてtipsデータを読み込み、支払総額(total_bill)とチップ(tip)の関係を, 行に喫煙者か否か(facet_row="smoker"),列に性別(facet_col="sex"),色に昼食か夕食か(color="time")を設定して分析せよ。

tips = sns.load_dataset("tips")
tips.head()
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4

線グラフ line

時系列データを描画するには、線グラフlineを用いる。

例題 EVOLUTION OF THE BITCOIN PRICE

ビットコインの価格の推移を例として用いる.

https://www.data-to-viz.com/story/TwoNumOrdered.html

線グラフは px.line で描画できる. 引数は散布図とほぼ同じであるので,省略する.

df3 = pd.read_csv(
    "https://raw.githubusercontent.com/holtzy/data_to_viz/master/Example_dataset/3_TwoNumOrdered.csv",
    sep=" ",
)
df3.head()
date value
0 2013-04-28 135.98
1 2013-04-29 147.49
2 2013-04-30 146.93
3 2013-05-01 139.89
4 2013-05-02 125.60
fig = px.line(df3, x="date", y="value")
plotly.offline.plot(fig)

問題(航空機の乗客数)

http://logopt.com/data/AirPassengers.csv からデータを読み込み、横軸にMonth、縦軸に#Passengersを設定して線グラフで描画せよ。

passengers = pd.read_csv("http://logopt.com/data/AirPassengers.csv")
passengers.head()
Month #Passengers
0 1949-01 112
1 1949-02 118
2 1949-03 132
3 1949-04 129
4 1949-05 121

散布図にさらなる軸を加えるには

散布図は2次元の情報を効率的に視覚化してくれる。 3次元以上の情報はどのように視覚化すべきだろうか? 3軸目が連続量の場合には、3次元の散布図も考えられるが、大きさや色、もしくはアニメーションで視覚化した方がわかりやすい場合がある。

例題 LIFE EXPECTANCY, GDP PER CAPITA AND POPULATION SIZE

以下の例では、国別のGDP、平均寿命、人口のデータを,アニメーションを用いて可視化する。

https://www.data-to-viz.com/story/ThreeNum.html

print(px.data.gapminder.__doc__)
    Each row represents a country on a given year.

    https://www.gapminder.org/data/

    Returns:
        A `pandas.DataFrame` with 1704 rows and the following columns:
        `['country', 'continent', 'year', 'lifeExp', 'pop', 'gdpPercap',
        'iso_alpha', 'iso_num']`.
        If `datetimes` is True, the 'year' column will be a datetime column
        If `centroids` is True, two new columns are added: ['centroid_lat', 'centroid_lon']
        If `year` is an integer, the dataset will be filtered for that year
    
df4 = px.data.gapminder()
df4.head()
country continent year lifeExp pop gdpPercap iso_alpha iso_num
0 Afghanistan Asia 1952 28.801 8425333 779.445314 AFG 4
1 Afghanistan Asia 1957 30.332 9240934 820.853030 AFG 4
2 Afghanistan Asia 1962 31.997 10267083 853.100710 AFG 4
3 Afghanistan Asia 1967 34.020 11537966 836.197138 AFG 4
4 Afghanistan Asia 1972 36.088 13079460 739.981106 AFG 4
fig = px.scatter(
    df4,
    x="gdpPercap",
    y="lifeExp",
    size="pop",
    color="continent",
    hover_name="country",
    animation_frame="year",
)
plotly.offline.plot(fig)

問題(ポケモン)

以下のように読み込んだポケモンのデータフレームを用いて、自分で考えた(適当な列をx,y,size,color,animation_frameなどに設定し)散布図を描画せよ.

pokemon = pd.read_csv("http://logopt.com/data/poke.csv", encoding="utf-8")
pokemon.head()
# Name Type 1 Type 2 Total HP Attack Defense Sp. Atk Sp. Def Speed Generation Legendary Japanese
0 1 Bulbasaur Grass Poison 318 45 49 49 65 65 45 1 False フシギダネ
1 2 Ivysaur Grass Poison 405 60 62 63 80 80 60 1 False フシギソウ
2 3 Venusaur Grass Poison 525 80 82 83 100 100 80 1 False フシギバナ
3 3 VenusaurMega Venusaur Grass Poison 625 80 100 123 122 120 80 1 False フシギバナ・メガ進化
4 4 Charmander Fire NaN 309 39 52 43 60 50 65 1 False ヒトカゲ

特徴間の関係の図示 scatter_matrix

複数の特徴をもつデータが与えられたとき、特徴間の関係を一度に図示したいことがある。 そのための方法として,scatter_matrixが準備されている.

例題 ELEVEN FEATURES FOR 32 CARS

以下の例題では、車の11つの特徴から連続量である6つの特徴を抽出し、その間の関係を図示する。同時に、1つのカテゴリカルデータを色で区別する。

https://www.data-to-viz.com/story/SeveralNum.html

df5 = pd.read_csv(
    "https://raw.githubusercontent.com/holtzy/data_to_viz/master/Example_dataset/6_SeveralNum.csv"
)
df5.head()
Unnamed: 0 mpg cyl disp hp drat wt qsec vs am gear carb
0 Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
1 Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
2 Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
3 Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
4 Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
fig = px.scatter_matrix(
    df5, dimensions=["mpg", "disp", "drat", "hp", "qsec", "wt"], color="gear"
)
plotly.offline.plot(fig);

問題 (SAT,GPA)

http://logopt.com/data/SATGPA.csv からデータを読み込み,MathSAT, VerbalSAT, GPAの相互関係を描画せよ.

棒グラフ bar

$x$ 軸がカテゴリカルデータ、$y$ 軸が連続データの場合には、棒グラフを用いることが多い。

例題 WHO SELLS MORE WEAPONS?

以下では、国別の兵器販売額を棒グラフで図示する。

https://www.data-to-viz.com/story/OneNumOneCat.html

df6 = pd.read_csv(
    "https://raw.githubusercontent.com/holtzy/data_to_viz/master/Example_dataset/7_OneCatOneNum.csv"
)
df6.head()
Country Value
0 United States 12394.0
1 Russia 6148.0
2 Germany (FRG) 1653.0
3 France 2162.0
4 United Kingdom 1214.0
fig = px.bar(df6, x="Country", y="Value")
plotly.offline.plot(fig);

積み上げ棒グラフ

棒グラフにもう1軸追加したい場合には、積み上げ棒グラフを用いる。

例題 THE GENDER WAGE GAP

以下の例題では、国別、年代別の男女の賃金格差を表示する。

https://www.data-to-viz.com/story/OneNumSevCatSubgroupOneObsPerGroup.html

df7 = pd.read_csv(
    "https://raw.githubusercontent.com/holtzy/data_to_viz/master/Example_dataset/9_OneNumSevCatSubgroupOneObs.csv"
)
df7.head()
Country TIME Value
0 Australia 2000 17.2
1 Australia 2005 15.8
2 Australia 2010 14.0
3 Australia 2015 13.0
4 Austria 2000 23.1
fig = px.bar(df7, x="Country", y="Value", color="TIME")
plotly.offline.plot(fig);

問題 (賃金格差)

上の賃金格差の例題において、$x$ 軸を年 (TIME) に設定し、国 (Country) を積み上げた棒グラフを描画せよ。

地図の描画 scatter_mapbox

散布図の $x,y$ 座標の代わりに、緯度・経度を使うと地図上へプロットすることができる。

例題 THE BIGGEST UK CITIES

以下の例では、英国の主要都市の人口を点の大きさに表示して描画する。

https://www.data-to-viz.com/story/GPSCoordWithValue.html

地図の描画には、mapboxのtokenが必要になる。以下のサイトで登録し、tokenを得てから"mapbox_token.txt"というテキストファイルを作成し、そこに保管しておく。

https://www.mapbox.com/

以下では、tokenがファイルに保管されていると仮定し、読み込んでから地図を描画する。また、引数zoomで地図上での拡大を設定できる。

なお,レイアウトでスタイルに"open-street-map"を使用すれば,tokenなしでも描画できる.

df8 = pd.read_csv(
    "https://raw.githubusercontent.com/holtzy/data_to_viz/master/Example_dataset/18_ListGPSCoordinatesWithValue.csv",
    sep=" ",
)
df8.head()
lat long pop name
0 51.65 -3.14 10146 Abercarn-Newbridge
1 51.72 -3.46 33048 Aberdare
2 57.15 -2.10 184031 Aberdeen
3 51.83 -3.02 14251 Abergavenny
4 53.28 -3.58 17819 Abergele
# px.set_mapbox_access_token(open("mapbox_token.txt").read())
fig = px.scatter_mapbox(
    df8, lat="lat", lon="long", size="pop", hover_name="name", zoom=5
)
# tokenがない場合には以下の行を生かす.
# fig.update_layout(mapbox_style="open-street-map")
plotly.offline.plot(fig);

問題(カーシェアリング)

以下のカーシェアリングのデータを地図上に描画せよ。zoomを適切に設定し、car_hoursを点の大きさに、peak_hourを色で区別して描画せよ。

carshare = px.data.carshare()
carshare.head()
centroid_lat centroid_lon car_hours peak_hour
0 45.471549 -73.588684 1772.750000 2
1 45.543865 -73.562456 986.333333 23
2 45.487640 -73.642767 354.750000 20
3 45.522870 -73.595677 560.166667 23
4 45.453971 -73.738946 2836.666667 19

コロプレス図 choropleth

地図上に数値情報を色で表示した図を、コロプレス図と呼ぶ。

以下では、国別の寿命を年ごとの変化をアニメーションとして表示する(下部のyearをクリックすると徐々に色が変わる)。

重要な引数

  • location: 地名を表す列名を入れる。以下のlocationmodeで緯度・経度の情報に変換される。
  • locationmode: locationの情報が、"ISO-3"(国の略称:既定値), "USA-states"(米国の州名), "country names"(国名)のいずれかを指定する。
df4 = px.data.gapminder()
df4.head()
country continent year lifeExp pop gdpPercap iso_alpha iso_num
0 Afghanistan Asia 1952 28.801 8425333 779.445314 AFG 4
1 Afghanistan Asia 1957 30.332 9240934 820.853030 AFG 4
2 Afghanistan Asia 1962 31.997 10267083 853.100710 AFG 4
3 Afghanistan Asia 1967 34.020 11537966 836.197138 AFG 4
4 Afghanistan Asia 1972 36.088 13079460 739.981106 AFG 4
fig = px.choropleth(
    df4,
    locations="iso_alpha",
    locationmode="ISO-3",
    color="lifeExp",
    hover_name="country",
    animation_frame="year",
)
plotly.offline.plot(fig);

問題(アルコール摂取量)

世界のアルコール摂取量のデータを http://logopt.com/data/drinks.csv から読み込み、コロプレス図で各国のワイン摂取量 (wine_servings) を描画せよ (ヒント:国の略称のかわりに国名を使うには, locationmode引数に"country names"を入れる).

drinks = pd.read_csv("http://logopt.com/data/drinks.csv")
drinks.head()
country beer_servings spirit_servings wine_servings total_litres_of_pure_alcohol continent
0 Afghanistan 0 0 0 0.0 Asia
1 Albania 89 132 54 4.9 Europe
2 Algeria 25 0 14 0.7 Africa
3 Andorra 245 138 312 12.4 Europe
4 Angola 217 57 45 5.9 Africa

並行座標図

散布図では3次元までの図を可視化できるが,4次元以上だと人間の目では無理だ.

多次元データを可視化するための方法として並行座標図 parallel_coordinates がある.

これは散布図の $y$ 軸を $x$ 軸と並行にしたものである.複数の $y$ 軸があっても大丈夫だが,あまり多いとよく分からなくなる.

ここではiris(アヤメ)のデータフレームを、アヤメの種類を表す番号 'species_id' で色分けして、並行座標図に描画する.

Plotlyでは、範囲をマウスで指定したり、軸を入れ替えたりして分析できる。

iris = px.data.iris()
fig = px.parallel_coordinates(iris, color="species_id")
plotly.offline.plot(fig);

カテゴリカルデータに対する平行座標図を描画するには、parallel_categoriesを用いる。

以下では、tipsデータセットに対して、来客人数 (size) で色分けして描画する。

tips = px.data.tips()
tips.head()
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
fig = px.parallel_categories(tips, color="size")
plotly.offline.plot(fig);

問題(肺癌)

以下の肺癌のデータから,適当な列を4つ切り出し,parallel_coordinatesで可視化せよ.

from sklearn.datasets import load_breast_cancer

cancer = load_breast_cancer()
cancer_df = pd.DataFrame(cancer.data, columns=cancer.feature_names)
cancer_df.head()
mean radius mean texture mean perimeter mean area mean smoothness mean compactness mean concavity mean concave points mean symmetry mean fractal dimension ... worst radius worst texture worst perimeter worst area worst smoothness worst compactness worst concavity worst concave points worst symmetry worst fractal dimension
0 17.99 10.38 122.80 1001.0 0.11840 0.27760 0.3001 0.14710 0.2419 0.07871 ... 25.38 17.33 184.60 2019.0 0.1622 0.6656 0.7119 0.2654 0.4601 0.11890
1 20.57 17.77 132.90 1326.0 0.08474 0.07864 0.0869 0.07017 0.1812 0.05667 ... 24.99 23.41 158.80 1956.0 0.1238 0.1866 0.2416 0.1860 0.2750 0.08902
2 19.69 21.25 130.00 1203.0 0.10960 0.15990 0.1974 0.12790 0.2069 0.05999 ... 23.57 25.53 152.50 1709.0 0.1444 0.4245 0.4504 0.2430 0.3613 0.08758
3 11.42 20.38 77.58 386.1 0.14250 0.28390 0.2414 0.10520 0.2597 0.09744 ... 14.91 26.50 98.87 567.7 0.2098 0.8663 0.6869 0.2575 0.6638 0.17300
4 20.29 14.34 135.10 1297.0 0.10030 0.13280 0.1980 0.10430 0.1809 0.05883 ... 22.54 16.67 152.20 1575.0 0.1374 0.2050 0.4000 0.1625 0.2364 0.07678

5 rows × 30 columns

問題(車)

以下の車のデータから,適当な列を4つ切り出し,parallel_coordinatesで可視化せよ.

car = pd.read_csv(
    "https://raw.githubusercontent.com/holtzy/data_to_viz/master/Example_dataset/6_SeveralNum.csv"
)
car.head()
Unnamed: 0 mpg cyl disp hp drat wt qsec vs am gear carb
0 Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
1 Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
2 Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
3 Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
4 Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2

その他のグラフ

他にも色々なグラフが容易に描画できる.

以下に例を示す.

円グラフ pie

他の図の一部として利用する場合に用いる. 単独では用いるべきではない.

df = px.data.gapminder().query("year == 2007").query("continent == 'Europe'")
fig = px.pie(df, values='pop', names='country', title='Population of European continent')
plotly.offline.plot(fig);

面積グラフ area

線グラフを積み上げで表示したいときに用いる.

df = px.data.gapminder()
fig = px.area(df, x="year", y="pop", color="continent", line_group="country")
plotly.offline.plot(fig);

ガントチャート timeline

スケジューリングにおける作業の開始と終了を表示したいときに用いる.

df = pd.DataFrame([
    dict(Task="Job A", Start='2009-01-01', Finish='2009-02-28', Resource="Alex"),
    dict(Task="Job B", Start='2009-03-05', Finish='2009-04-15', Resource="Alex"),
    dict(Task="Job C", Start='2009-02-20', Finish='2009-05-30', Resource="Max")
])

fig = px.timeline(df, x_start="Start", x_end="Finish", y="Resource", color="Resource")
plotly.offline.plot(fig);

日輪グラフ sunburst

階層をもつ円グラフを表示したいときに用いる.

data = dict(
    character=["Eve", "Cain", "Seth", "Enos", "Noam", "Abel", "Awan", "Enoch", "Azura"],
    parent=["", "Eve", "Eve", "Seth", "Seth", "Eve", "Eve", "Awan", "Eve" ],
    value=[10, 14, 12, 10, 2, 6, 6, 4, 4])

fig = px.sunburst(
    data,
    names='character',
    parents='parent',
    values='value',
)
plotly.offline.plot(fig);

木マップグラフ treemap

階層をもつ面積図を描きたいときに用いる.

import numpy as np
df = px.data.gapminder().query("year == 2007")
fig = px.treemap(df, path=[px.Constant("world"), 'continent', 'country'], values='pop',
                  color='lifeExp', hover_data=['iso_alpha'],
                  color_continuous_scale='RdBu',
                  color_continuous_midpoint=np.average(df['lifeExp'], weights=df['pop']))
plotly.offline.plot(fig);

漏斗(じょうご)グラフ funnel

data = dict(
    number=[39, 27.4, 20.6, 11, 2],
    stage=["Website visit", "Downloads", "Potential customers", "Requested price", "invoice sent"])
fig = px.funnel(data, x='number', y='stage')
plotly.offline.plot(fig);

まとめ問題

以下のポケモンデータに対して,「自分なりに考えて,興味深い結論を得られるような」分析を行い,その結論を導くために用いた図を示せ.また,図の種類を選んだ理由を説明せよ.

ポケモンデータ豆知識

  • 最初の♯の列の整数はポケモンの通し番号である.
  • ポケモンの英語名はName列,日本語名はJapanese列に入っている.
  • ポケモンはタイプをもつ.Type 1列に主要な種類(草タイプポケモンならGrass),Type 2に副次的な種類(毒タイプならPoisson)が入る.
  • ポケモンの能力は体力(HP)から速度(Speed)までの列に数値として入っている.その合計がTotal列に入っている.
  • Generationの列は,世代が入っており,初代は1で始まる整数である.
  • Legendaryの列がTrueのポケモンは,伝説のポケモンといって珍しい.
  • 同種のポケモンが,進化,メガ進化する.たとえばフシギダネは,フシギソウ,フシギバナと進化し,さらにメガ進化する.これらは,連続した行に入っている.
pokemon = pd.read_csv("http://logopt.com/data/poke.csv", encoding="utf-8")
pokemon.head()
# Name Type 1 Type 2 Total HP Attack Defense Sp. Atk Sp. Def Speed Generation Legendary Japanese
0 1 Bulbasaur Grass Poison 318 45 49 49 65 65 45 1 False フシギダネ
1 2 Ivysaur Grass Poison 405 60 62 63 80 80 60 1 False フシギソウ
2 3 Venusaur Grass Poison 525 80 82 83 100 100 80 1 False フシギバナ
3 3 VenusaurMega Venusaur Grass Poison 625 80 100 123 122 120 80 1 False フシギバナ・メガ進化
4 4 Charmander Fire NaN 309 39 52 43 60 50 65 1 False ヒトカゲ
fig = px.histogram(pokemon, x="Attack", marginal="violin") 
plotly.offline.plot(fig);