データビジュアライゼーション(Data Visualization)とは、物事の関係性を視覚的に捉えられるように、データを画像・グラフ・図表などに変換することを言います。その目的はデータから価値や知恵を生み出すことにあります。
Data → Information(構造化)→ Knowledge(知見)→ Wisdom(知恵)
Data-ink ratio = Data-ink / total ink used to print the graphicEdward Tufte, 1992, The Visual Display of Quantitative Information
Pythonを用いたデータビジュアライゼーションには、様々な関連ライブラリーのインポート、データの読み込み、各種メソッドの活用が前提となります。以下、具体的なコードとともに概要を説明します。
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import folium from folium.plugins import HeatMap
import plotly.graph_objects as go import plotly.express as px
はじめに matplotlib と pandas の連携による基本的なグラフ描画を体験します。
統計グラフの作成には、対象となるデータをデータフレームとして読み込む必要があります(すでに前回までに確認済み)。
df = pd.read_csv( '/path/to/xxxxx.csv' )
ヒストグラム(柱状グラフ、度数分布図)は、横軸に階級、縦軸に度数をとった統計グラフで、データの分布状況を可視化するために用いられます。
データフレームからヒストグラムを生成するコードは非常に簡単です。
df.hist( ) 全項目一挙表示 df[ 'XXX' ] .hist( ) 特定カラムの表示
df はデータフレーム変数の例です。
ボックスプロット(箱ひげ図)は、データのばらつきを可視化する統計グラフで、箱(box)と、その両側に出たひげ(whisker)で表現されることからその名が付けられています。
一般に以下の五数が要約(five-number summary)されて表示されます。
以下のコードは、対象カラム(XXX)をグループ(AAA)別に表示します。
df.boxplot( column='XXX' , by='AAA' )
散布図(scatter plot)は、縦軸、横軸に2つの量的データ項目を対応させて、各レコードのデータを点でプロットしたものです。項目間の相関の有無が可視化されます。
以下のコードは、x軸とy軸にカラム項目を指定して表示します。
df.plot.scatter( x='XXX', y='YYY' )
これらのグラフは項目間の推移や比較を見るために使います。数万件もある全レコードを表示しても視覚的に読み取ることはできないので、グラフにしたい内容によって、事前に「データの平均値を出す」、「クロス集計する」といった処理を行った後、それを新たなデータフレームとしてグラフの表示に利用するのが一般的です(以下、棒グラフの事例です)。
# 性別ごとに国語・英語・数学の平均値を算出 df_mean = df.groupby( 'Gender' , as_index=False ).mean( ) df_mean
Gender | Japanese | English | Mathematics | |
0 | F | 62.350000 | 58.475000 | 39.800000 |
1 | M | 56.420455 | 41.142045 | 39.539773 |
生成された df_mean を使うと、簡単に積み重ね棒グラフができます。
df_mean.plot.bar( stacked=True )
stacked=True は、積み重ねを有効にする・・という意味です。
CSVデータから統計量を視覚化するサンプルです。matplotlib と連携した pandas のグラフ描画機能を使って、様々なグラフの描画を体験します。
Tips のデータをサンプルとして利用します。
直接読み込むので、ダウンロードの必要はありません。
https://github.com/mwaskom/seaborn-data/blob/master/tips.csv
JupyterNotebook形式(.ipynb)でプログラムを提供します。
https://github.com/koichi-inoue/DataScience/blob/main/StatisticalGraph01.ipynb
ノートを、学科サイトの個人ページからリンクして下さい。以下、手順です。
このリンクを知っているインターネット上の全員が閲覧できます。
-[[統計グラフ>https://colab.research.go・・=sharing]]
冒頭で、グラフ描画用のライブラリーmatplotlibとデータ解析用のライブラリー pandasを読み込んでいます。
# matplotlib パッケージ から pyplot モジュールを plt として import import matplotlib.pyplot as plt # pandasライブラリの読み込み import pandas as pd
df.hist()以下の一行で、グラフを表示します。この1行は書かなくても、df.hist が自動的に matplotlib を呼んで表示まで行ってくれますが、後のコードに合わせて、表示を明示的に行っています。
plt.show()
df.boxplot( column = 'tip', by = 'day' , figsize = ( 9, 6 ) )figsize はノート上に表示されるグラフの幅と高さを指定しています。
df.plot.scatter( x = 'total_bill' , y = 'tip' , figsize = ( 9, 6 ) , alpha = 0.7 )alpha は点をプロットする際の「不透明度」を意味します。
df2 = df.groupby( 'day' ).mean() df2
df3 = df2.reindex( index = [ 'Thur', 'Fri', 'Sat' , 'Sun' ] ) df3
df3.plot( figsize = ( 9, 6 ) )
df3.plot.bar( figsize = ( 9 , 6 ) )
df3[ ['total_bill' , 'tip'] ].plot.bar( stacked=True , figsize = ( 9 , 6 ) )
df3.plot.pie( subplots = True , figsize = (12,6) )
seaborn というライブラリを使った応用的なグラフ描画を体験します。
seabornは Python の可視化ライブラリで、matplotlib が内部で動いています。
sns.displot( ) sns.histplot( )Web検索では dis t plot が表示されることが多いようですが、dis t plot は将来削除される予定で、代わりに以下の関数を利用することが推奨されています。
sns.displot( df['total_bill'] , bins=20 , color='#0033AA' )
sns.histplot( data = df , x= 'total_bill' , bins=20 , hue = 'day' )
sns.countplot( )
sns.boxplot( )
質的変数の違いを色・形で区別、また量的変数をドットのサイズで表現可能
sns.scatterplot( )
相関行列同様に、量的項目間の相関を一括表示
sns.pairplot( )
2次元の表の値を色の差( 青:小 ←→ 赤:大 など)で表現
sns.heatmap( )
seaborn ライブラリーによる棒グラフの表示は煩雑、また seaborn には円グラフを描く機能が実装されていないため、ここでは省略します。
いずれも https アクセスでプログラム内で直接読み込むので、ダウンロードする必要はありません。
JupyterNotebook形式(.ipynb)でプログラムを提供します。
https://github.com/koichi-inoue/DataScience/blob/main/StatisticalGraph02.ipynb
ノートを、学科サイトの個人ページからリンクして下さい。以下、手順です。
このリンクを知っているインターネット上の全員が閲覧できます。
-[[統計グラフ+>https://colab.research.go・・=sharing]]
冒頭で、グラフ描画用のライブラリ matplotlib、seaborn とデータ解析用のライブラリ pandasを読み込んでいます。
# matplotlib パッケージ から pyplot モジュールを plt として import import matplotlib.pyplot as plt # seaborn ライブラリを sns として読み込み import seaborn as sns # seabornの機能を有効化 sns.set() # pandasライブラリの読み込み import pandas as pd
sns.displot( )
sns.countplot( )
sns.boxplot( )
sns.scatterplot( )
相関行列同様に、量的項目間の相関を一括表示
sns.pairplot( )
このサンプルでは、covid-19 の陽性者数を「横軸:年月、縦軸:都道府県」というかたちで2次元の表にしたデータ(df2)を利用しています。
sns.heatmap( )
GoogleColab のファイル操作のためのライブラリを読み込むことで、描画されたグラフを画像ファイルとしてダウンロード保存することができます。
from google.colab import files
plt.savefig('heatmap.png')
files.download('heatmap.png')
数式等を用いたグラフ表示のサンプルです。時間に余裕のある方のみお試しください。取り組みは任意です。
https://github.com/koichi-inoue/DataScience/blob/main/Plotting.ipynb