LogoMark.png

DataVisualization のバックアップ差分(No.7)


#author("2021-11-15T16:08:04+09:00;2021-02-11T19:11:36+09:00","default:inoue.ko","inoue.ko")
#author("2021-11-22T20:01:10+09:00;2021-02-11T19:11:36+09:00","default:inoue.ko","inoue.ko")
#settableborder(line)

*可視化
Data Visualization
~

可視化とは、物事の関係性を視覚的に捉えられるように、データを画像・グラフ・図表などに変換することを言います。その目的は以下のように、データから価値や知恵を生み出すことにあります。

''Data'' → ''Information''(構造化) → ''Knowledge''(知見)→ ''Wisdom''(知恵)
~
~

**はじめに
***様々なグラフ
-[[ヒストグラム>GoogleImage:ヒストグラム]]:縦軸に度数、横軸に項目を対応させ、事項間の度数を比較するもの。度数分布図、柱状グラフともいう。 
-[[散布図>GoogleImage:散布図]]:縦軸、横軸に変数を対応させて、データを点でプロットしたもの
-[[ボックスプロット(箱ひげ図)>GoogleImage:箱ひげ図]]:データのばらつきを、箱(box)と、その両側に出たひげ(whisker)で表現する図。特に品質管理でよく用いられる。
-[[円グラフ>GoogleImage:円グラフ]]:円図形を扇形に分割し、事項の構成比率を表すもの
-[[ヒストグラム>GoogleImage:ヒストグラム]]:縦軸に度数、横軸に項目を対応させ、事項間の度数を比較するもの。度数分布図、柱状グラフともいいます。 
-[[ボックスプロット(箱ひげ図)>GoogleImage:箱ひげ図]]:データのばらつきを、箱(box)と、その両側に出たひげ(whisker)で表現する図。特に品質管理でよく用いられます。
-[[散布図>GoogleImage:散布図]]:縦軸、横軸に変数を対応させて、データを点でプロットしたもの。項目間の相関が見て取れます。
-[[折れ線グラフ>GoogleImage:折れ線グラフ]]:時系列の推移を表すもの
-[[棒グラフ>GoogleImage:棒グラフ]]:項目間の値を比較するもの
-[[円グラフ>GoogleImage:円グラフ]]:円図形を扇形に分割し、事項の構成比率を表すもの。

-[[ヒートマップ>GoogleImage:ヒートマップ]]:2次元データの個々の値を色や濃淡として表現したもの

~

***Topics
#image(https://upload.wikimedia.org/wikipedia/commons/thumb/1/17/Nightingale-mortality.jpg/1024px-Nightingale-mortality.jpg,right,30%)
-__[[ナイチンゲールの鶏頭図>GoogleImage:ナイチンゲール 鶏頭図]]__(1858)
クリミア戦争における月別の死因を可視化したもの。赤色が負傷、青が病気、黒がその他を意味していて、グラフからは負傷による死亡よりも病気による死亡が圧倒的に多いことがわかります。
&scale(75){出典:https://commons.wikimedia.org/wiki/File:Nightingale-mortality.jpg};
~

-__[[データインク比>GoogleImage:Data-ink ratio]]__
エドワード・タフテによる「良いグラフィック」の指標で、「グラフィック全体の印刷にかかったインク量のうち、データを伝えるために用いられたインク量の比率が 1.0 に近いほど良い・・と考えられます。
 Data-ink ratio = Data-ink / total ink used to print the graphic
&scale(75){Edward Tufte, 1992, The Visual Display of Quantitative Information };
~
~

**Python ビジュアライゼーション
CENTER:'''''以下、Python によるビジュアライゼーションについて概説します。'''''

~
~

***基本データ処理用のライブラリの読み込み

**可視化に必要なライブラリ
代表的な Python ライブラリと、その読み込み方を紹介します。
~

***基本データ処理用のライブラリ
-[[numpy>https://numpy.org/]]|数値計算
 import numpy as np

-[[pandas>Pandas]]|データフレームの活用
 import pandas as pd

-[[janome>https://mocobeta.github.io/janome/]]|日本語の形態素解析器
 import janome
~


***ビジュアライゼーション用のライブラリの読み込み
***ビジュアライゼーション用のライブラリ
-[[matplotlib>https://matplotlib.org/]]|グラフ描画
 import matplotlib.pyplot as plt

-[[seaborn>https://seaborn.pydata.org/]]|matplotlib をベースにした美麗な可視化
 import seaborn as sns

-[[plotly>https://plotly.com/python/]]|動的グラフ作成

-[[folium>https://python-visualization.github.io/folium/]]|地図・位置情報の可視化

-[[wordcloud>https://amueller.github.io/word_cloud/]]|ワードクラウドの描画

-[[pillow>https://pillow.readthedocs.io/]]|画像処理
&small(開発が停止しているPIL(Python Image Library)からフォークされたライブラリ);
~
~

**基本的なグラフの描画
データ解析ライブラリ pandas のメソッドを用いたのグラフ描画の方法を紹介します(pandas は matplotlib を用いてグラフを描画しています)。
~

***ライブラリの読み込み
最低限必要なのは、matplotlib と pandas です。以下典型的な記載例です。
 import matplotlib.pyplot as plt
 import pandas as pd
~

***データの準備
はじめに対象となるデータを''データフレーム''として読み込む必要があります。データの読み込み方法については、__[[Pandas]]__ のページをご覧下さい。
 df = pd.read_csv( '/path/to/xxxxxx.csv' )
~

***ヒストグラム
#image(DataVisualization/hist.png,right,30%)
データフレーム(以下 df )からヒストグラムの生成は非常に簡単です。
ヒストグラム(柱状グラフ、度数分布図)は、横軸に階級、縦軸に度数をとった統計グラフで、データの分布状況を可視化するために用いられます。

データフレームからヒストグラムを生成するコードは非常に簡単です。
 df.hist( ) 全項目一挙表示
 df[ 'XXX' ] .hist(  ) 特定カラムの表示
&small(df はデータフレーム変数の例です。);
~

***ボックスプロット
#image(DataVisualization/box.png,right,30%)
対象カラム(XXX)を、グループ別(AAA)に分けて表示します。
ボックスプロット(箱ひげ図)は、データのばらつきを可視化する統計グラフで、箱(box)と、その両側に出たひげ(whisker)で表現されることからその名が付けられています。

一般に以下の五数が要約(five-number summary)されて表示されます。
-最小値(minimum)
-第1四分位点(lower quartile)
-中央値(第2四分位点、median)
-第3四分位点(upper quartile)
-最大値(maximum)

以下のコードは、対象カラム(XXX)をグループ(AAA)別に表示します。
 df.boxplot( column='XXX' , by='AAA' )
~

***散布図
#image(DataVisualization/scatter.png,right,30%)
x軸とy軸にカラム項目を指定して表示します。
散布図(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|h
|0|F|62.350000|58.475000|39.800000|
|1|M|56.420455|41.142045|39.539773|

#image(DataVisualization/bar.png,right,30%)
生成された df_mean を使うと、簡単に積み重ね棒グラフができます。
 df_mean.plot.bar( stacked=True )
&small(stacked=True は、積み重ねを有効にする・・という意味です。);

~
~

**応用的なグラフ描画
Pythonの可視化ライブラリ seaborn を用いた様々な描画方法を紹介します。

(書きかけです)
~

***ライブラリの読み込み
以下、ライブラリーの読み込み記載例です。
 # matplotlib パッケージ から pyplot モジュールを plt として import
 from matplotlib import pyplot as plt
 
 # seaborn ライブラリを sns として読み込み
 import seaborn as sns
 # seabornの機能を有効化
 sns.set()
 
 # pandasライブラリを pd として読み込み(データフレームを利用するため)
 import pandas as pd
~

***ヒストグラム sns.displot
 # seaborn のヒストグラム表示機能を用いた詳細設定
 sns.displot( df['total_bill'], bins=12 , color='#0033AA', height=6 , aspect=2, kde=True )

~

***ボックスプロット sns.boxplot
 # seaborn の boxplot を用いた「箱ひげ図」の描画
 sns.boxplot( data = df , x = 'day' , y = 'total_bill' , order = ['Thur','Fri','Sat','Sun'] )
~

***散布図 sns.scatterplot
 # seaborn の scatterplot を用いた「散布図」の描画
 plt.figure( figsize=(12, 8) )
 sns.scatterplot( data = df , x = 'total_bill' , y = 'tip' )
~

 # カラムの「質的変数」(この例では曜日)の違いを色で区別して描画
 plt.figure(figsize=(12, 8))
 sns.scatterplot( data = df , x = 'total_bill' , y = 'tip' , hue = 'day' , s = 100 )
~

 # カラムの「質的変数」(この例では ランチとディナー)の違いを形で区別して 描画
 plt.figure(figsize=(12, 8))
 sns.scatterplot( data = df , x = 'total_bill' , y = 'tip' , style = 'time' , s = 100 )
~

 # カラムの「量的変数」(この事例では「テーブルサイズ」)をドットの大きさを変えて描画する
 plt.figure(figsize=(12, 8))
 sns.scatterplot( data = df , x = 'total_bill' , y = 'tip' , hue = 'day' , size = 'size' , sizes = (100,1000) , alpha = 0.5 )
~

***散布図行列 sns.pairplot
 # seaborn の pairplot を用いた「散布図行列」の描画
 sns.pairplot( data = df , hue = 'day' , height = 4 , aspect = 1 )
~

***ヒートマップ sns.heatmap
 # ヒートマップの表示
 plt.figure( figsize=(16, 24))
 sns.heatmap(df2 , linewidths=.5 , cmap="coolwarm" , fmt="d" , annot=True , robust=True )
~
~

**グラフの書き出し
ノートに書き出されたグラフは、画像としてダウンロードすることができます。以下、Google Colab の場合の事例です。

 # GoogleColab のファイル操作機能の読み込み
 from google.colab import files
 
 # ヒートマップの表示
 plt.figure( figsize=(16, 24))
 sns.heatmap(df2 , linewidths=.5 , cmap="coolwarm" , fmt="d" , annot=True , robust=True )
 
 #画像の保存(内部的に保存されます)
 plt.savefig('heatmap.png')
 
 # GoogleColab の機能を使ってファイルをダウンロード
 files.download('heatmap.png')

~
~

~