第11回 データビジュアライゼーション1
データサイエンス/2022|2022.11.30
出席確認・その他
- 演習の成果は、学科サイトの各自のページにリンク掲載して下さい。
学科サイト|受講生一覧
> Recording
CONTENTS
- はじめに
- Python プログラミングについて
- データビジュアライゼーション
- Python によるビジュアライゼーション
- Pythonによる統計グラフ
- Pythonによる統計グラフの描画体験 01
- プログラムの解説
- APPENDIX
はじめに
進捗確認
- 第8回 データサイエンスとPython 演習1・2
- 第9回 Python によるデータ解析1 演習3
- 第10回 Python によるデータ解析2 演習4(任意)
- 第11回 データビジュアライゼーション1 演習5
- 第12回 データビジュアライゼーション2 演習6
- 第13回 データビジュアライゼーション3 演習7
- 第14回 機械学習・序説
https://design.kyusan-u.ac.jp/socialdesign/?JohnSmith/DataScience
Python プログラミングについて
ある程度、利用に慣れてきたところで、多少専門的なお話を補足します。
関数について
プログラムの基本は 入力 > 処理 > 出力 です。プログラムのことを関数と呼ぶことがありますが、関数は英語で function つまり「何らかの機能を持ったもの」という意味で、世の中のあらゆるアプリケーションは、function の集合体と捉えることができます。
中学・高校の数学で登場する「関数」を思い出して下さい。例えば・・
y = 2x + 1 ・・・ y = f ( x ) と書いたりします
は、入力データ x を受け入れて、これに処理 f ( ) つまり「2倍して1加える」を施して、その結果を y として返す・・・つまり、入力>処理>出力の機能を数式で表現したものと言えます。
データサイエンスの演習では、その大半理を、各種ライブラリーに定義された関数を利用するだけで実現させていますが、自分自身でオリジナルの関数を作って利用することもできます。以下のように記述します。
# 自作関数の定義 def myFunc(x): # 入力:引数(ひきすう)として x を受け取る y = 2*x+1 # 処理 return y # 出力:戻り値として y を返す # 自作関数を利用したプログラム s = input("数を入力して下さい >>>") # 入力 x = float(s) # 処理(文字列を数値に変換) y = myFunc(x) # 処理(計算) print("計算結果:", y) # 出力 --- 実行結果 --- 数字を入力して下さい >>> 2.5 計算結果: 6
この事例は、演習の最初に作成した PythonBasics.ipnbに追記しておくことをおすすめします。
def は define(定義)という意味の英語の略です。
付記
プログラマーは、世界のあらゆる現象を関数(入力・処理・出力)として捉える思考を身につけることで、問題を効率的に解決しています。プログラミング教育の目的は、特定の言語によるコーディングの技術を身につけることではなく、プログラマー的思考を身につけることにあります。
データビジュアライゼーション
データビジュアライゼーション(Data Visualization)とは、物事の関係性を視覚的に捉えられるように、データを画像・グラフ・図表などに変換することを言います。その目的はデータから価値や知恵を生み出すことにあります。
Data → Information(構造化)→ Knowledge(知見)→ Wisdom(知恵)
様々なグラフ
- ヒストグラム:縦軸に度数、横軸に項目を対応させ、事項間の度数を比較するもの。度数分布図、柱状グラフともいう。
- ボックスプロット(箱ひげ図):データのばらつきを、箱(box)と、その両側に出たひげ(whisker)で表現する図。特に品質管理でよく用いられる。
- 散布図:縦軸、横軸に変数を対応させて、データを点でプロットしたもの
- 折れ線グラフ:時系列の推移を表すもの
- 棒グラフ:項目間の値を比較するもの
- 円グラフ:円図形を扇形に分割し、事項の構成比率を表すもの
- ヒートマップ:2次元データの個々の値を色や濃淡として表現したもの
Topics
- ナイチンゲールの鶏頭図(1858)
クリミア戦争における月別の死因を可視化したもの。赤色が負傷、青が病気、黒がその他を意味していて、グラフからは負傷による死亡よりも病気による死亡が圧倒的に多いことがわかります。
出典:
- データインク比
エドワード・タフテによる「良いグラフィック」の指標で、「グラフィック全体の印刷にかかったインク量のうち、データを伝えるために用いられたインク量の比率が 1.0 に近いほど良い・・と考えられます。Data-ink ratio = Data-ink / total ink used to print the graphic
Edward Tufte, 1992, The Visual Display of Quantitative Information
Python によるビジュアライゼーション
Pythonを用いたデータビジュアライゼーションには、様々な関連ライブラリーのインポート、データの読み込み、各種メソッドの活用が前提となります。以下、具体的なコードとともに概要を説明します。
基本データ処理用のライブラリ
- pandas|データフレームの活用
import pandas as pd
ビジュアライゼーション用のライブラリ
- matplotlib|グラフ描画の基本機能の提供
import matplotlib.pyplot as plt
- seaborn|matplotlib をベースにした美麗な可視化
import seaborn as sns
- folium|地図・位置情報の可視化
import folium from folium.plugins import HeatMap
- plotly|動的グラフ作成
import plotly.graph_objects as go import plotly.express as px
- wordcloud|ワードクラウドの描画
- pillow|画像処理
Pythonによる統計グラフ
今回は matplotlib と pandas の連携による基本的なグラフ描画を体験します。
データの準備
統計グラフの作成には、対象となるデータをデータフレームとして読み込む必要があります(すでに前回までに確認済み)。
df = pd.read_csv( '/path/to/xxxxx.csv' )
ヒストグラム
ヒストグラム(柱状グラフ、度数分布図)は、横軸に階級、縦軸に度数をとった統計グラフで、データの分布状況を可視化するために用いられます。
データフレームからヒストグラムを生成するコードは非常に簡単です。
df.hist( ) 全項目一挙表示 df[ 'XXX' ] .hist( ) 特定カラムの表示
df はデータフレーム変数の例です。
ボックスプロット
ボックスプロット(箱ひげ図)は、データのばらつきを可視化する統計グラフで、箱(box)と、その両側に出たひげ(whisker)で表現されることからその名が付けられています。
一般に以下の五数が要約(five-number summary)されて表示されます。
- 最小値(minimum)
- 第1四分位点(lower quartile)
- 中央値(第2四分位点、median)
- 第3四分位点(upper quartile)
- 最大値(maximum)
以下のコードは、対象カラム(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 は、積み重ねを有効にする・・という意味です。
Pythonによる統計グラフの描画体験 01
CSVデータから統計量を視覚化するサンプルです。matplotlib と連携した pandas のグラフ描画機能を使って、様々なグラフの描画を体験します。
ノートブックの新規作成
- Google Colaboratory でノートブックを新規作成
- Untitled0.ipynb というファイル名を変更 > StatisticalGraphics01.ipynb
サンプルデータ
第9回と同じ Tips のデータをサンプルとして利用します。
直接読み込むので、ダウンロードの必要はありません。
https://github.com/mwaskom/seaborn-data/blob/master/tips.csv
サンプルコード
JupyterNotebook形式(.ipynb)でプログラムを提供します。
https://github.com/koichi-inoue/DataScience2022/blob/main/StatisticalGraph01.ipynb
学科サイトにリンク掲載(演習5)
ノートを、学科サイトの個人ページからリンクして下さい。以下、手順です。
- 1. 自分のノートを開いた状態で、右上の「共有」をクリック
- 2. 共有設定を変更して、以下のように表示される状態にします。
このリンクを知っているインターネット上の全員が閲覧できます。
- 3. 「リンクをコピー」をクリックして、そのアドレスを、以下の形式で、学科サイトの「Jupyter Notebooks」の部分に掲載して下さい。
-[[StatisticalGraphics01>https://colab.research.go・・=sharing]]
- 4. 以下のようになればOKです。
https://design.kyusan-u.ac.jp/socialdesign/?JohnSmith/DataScience
プログラムの解説
ライブラリーの読み込み
冒頭で、グラフ描画用のライブラリーmatplotlibとデータ解析用のライブラリー pandasを読み込んでいます。
# matplotlib パッケージ から pyplot モジュールを plt として import import matplotlib.pyplot as plt # pandasライブラリの読み込み import pandas as pd
ヒストグラム・ボックスプロット・散布図
- ヒストグラム(度数分布) hist
以下の1行で、データフレームに含まれる「量的データ」すべての項目について度数分布が描画されます。df.hist()
以下の一行で、グラフを表示します。この1行は書かなくても、df.hist が自動的に matplotlib を呼んで表示まで行ってくれますが、後のコードに合わせて、表示を明示的に行っています。plt.show()
- ボックスプロット(箱ひげ図) boxplot
以下の一行で曜日ごとのチップの額に関するボックスプロットが表示されます。df.boxplot( column = 'tip', by = 'day' , figsize = ( 9, 6 ) )
figsize はノート上に表示されるグラフの幅と高さを指定しています。
- 散布図 plot.scatter
以下の一行で「総支払い額」と「チップ」の散布図が表示されます。df.plot.scatter( x = 'total_bill' , y = 'tip' , figsize = ( 9, 6 ) , alpha = 0.7 )
alpha は点をプロットする際の「不透明度」を意味します。
棒グラフ・折れ線グラフ・円グラフ
- 事前のデータ処理
折れ線グラフ、棒グラフ、円グラフでは、全てのデータを可視化しても読み取れません。以下、グラフ用に「曜日別の平均」を算出して新たなデータフレームを作成しています。df2 = df.groupby( 'day' ).mean() df2
- indexの並べ替え
データフレームを処理すると、項目がアルファベット順に出力されます。そのままだと、Fri, Sat, Sun, Thur と、違和感のある並びになるので、reindex というメソッドを使ってデータを Thur, Fri, Sat, Sun の順に並べ替えています。df3 = df2.reindex( index = [ 'Thur', 'Fri', 'Sat' , 'Sun' ] ) df3
- 折れ線グラフ plot
以下の一行で量的データ項目の折れ線グラフが表示されます。この例では、曜日の時間的「推移」として読むことができます。df3.plot( figsize = ( 9, 6 ) )
- 棒グラフ plot.bar
以下の一行で量的データ項目の棒グラフが表示されます。df3.plot.bar( figsize = ( 9 , 6 ) )
- 積み重ね棒グラフ
以下の一行で総支払額とチップの積み重ね棒グラフが表示されます。df3[ ['total_bill' , 'tip'] ].plot.bar( stacked=True , figsize = ( 9 , 6 ) )
- 円グラフ plot.pie
以下の一行で量的データ項目の曜日構成比が円グラフとして表示されます。df3.plot.pie( subplots = True , figsize = (12,6) )
APPENDIX
数理グラフ
数式等を用いたグラフ表示のサンプルです。時間に余裕のある方のみお試しください。取り組みは任意です。
https://github.com/koichi-inoue/DataScience2022/blob/main/Plotting.ipynb