#author("2021-12-06T13:13:55+09:00;2021-11-26T08:55:55+09:00","default:inoue.ko","inoue.ko") #author("2021-12-06T15:58:06+09:00;2021-11-26T08:55:55+09:00","default:inoue.ko","inoue.ko") *第11回 データビジュアライゼーション1 [[データサイエンス/2021]]|''2021.11.26'' ~ ***AGENDA -以下名簿が表示されます。出欠確認・座席記録をお願いします。 &fontawesome(far fa-hand-point-right); [[出欠確認・座席記録>https://docs.google.com/spreadsheets/d/1gBwHsVDOZEf6LrYj8o8tgIXqMTVqdiI5827jysirKmQ/edit?usp=sharing]] -講義はこのページの内容を解説するかたちで遠隔 LIVE 配信します。 -質問等は YouTubeLive のチャットまたは LINEの 20ASグループからどうぞ。 -学科サイトの各自のページを更新して下さい。 &fontawesome(far fa-hand-point-right); [[学科サイト|受講生一覧>https://design.kyusan-u.ac.jp/socialdesign/?%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9]] ~ #hr '''''以下、LIVE動画をご覧下さい。記事に沿って解説します。''''' 記録動画は後日、[[学科サイトの特設ページ(要ログイン)>https://design.kyusan-u.ac.jp/socialdesign/?%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9/%E9%99%90%E5%AE%9A]]に移動します。 #hr ~ #youtube(ewv8ZKG7Gi0) https://youtu.be/ewv8ZKG7Gi0 //埋め込み無効状態です。授業開始直前にページをリロードして下さい。 ~ -配信開始:2021.11.26 09:00 - -動画は授業直前に有効になります(準備段階では黒い画面)。授業開始時にページを再読み込みしていただくと、視聴が有効になります。 ~ ***CONTENTS #contents2_1 ~ ~ **はじめに ***進捗確認 -第8回 %%データサイエンスとPython%% 演習1, 2 -第9回 %%Python によるデータ解析1(GitHub CSV)%% 演習3 -第10回 %%Python によるデータ解析2(GoogleDrive Excel)%% 演習4 -第11回 ''Python によるデータビジュアライゼーション1'' 演習5 -第12回 Python によるデータビジュアライゼーション2 -第13回 Python によるデータビジュアライゼーション3 -第14回 機械学習・序説 https://design.kyusan-u.ac.jp/socialdesign/?JohnSmith/DataScience ~ ~ **Pythonによるデータ解析について ある程度、利用に慣れてきたところで、多少専門的なお話を補足します。 ~ ***Python について > [[Python]] ~ ***Python データ解析ライブラリ Pandas について > [[Pandas]] ~ ***オブジェクト指向プログラミングについて -[[ObjectOrientedProgramming]] -https://www.w3schools.com/js/js_objects.asp ~ ~ **データビジュアライゼーション データビジュアライゼーション(Data Visualization)とは、物事の関係性を視覚的に捉えられるように、データを画像・グラフ・図表などに変換することを言います。その目的はデータから価値や知恵を生み出すことにあります。 ''Data'' → ''Information''(構造化)→ ''Knowledge''(知見)→ ''Wisdom''(知恵) ~ ***様々なグラフ -[[ヒストグラム>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 によるビジュアライゼーション 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 -[[folium>https://python-visualization.github.io/folium/]]|地図・位置情報の可視化 import folium from folium.plugins import HeatMap -[[plotly>https://plotly.com/python/]]|動的グラフ作成 import plotly.graph_objects as go import plotly.express as px -[[wordcloud>https://amueller.github.io/word_cloud/]]|ワードクラウドの描画 -[[pillow>https://pillow.readthedocs.io/]]|画像処理 ~ ~ **Pythonによる統計グラフ 今回は matplotlib と pandas の連携による基本的なグラフ描画を体験します。 ~ ***データの準備 統計グラフの作成には、対象となるデータを''データフレーム''として読み込む必要があります(すでに前回までに確認済み)。 df = pd.read_csv( '/path/to/xxxxx.csv' ) ~ ***ヒストグラム #image(Pandas/hist.png,right,30%) ヒストグラム(柱状グラフ、度数分布図)は、横軸に階級、縦軸に度数をとった統計グラフで、データの分布状況を可視化するために用いられます。 データフレームからヒストグラムを生成するコードは非常に簡単です。 df.hist( ) 全項目一挙表示 df[ 'XXX' ] .hist( ) 特定カラムの表示 &small(df はデータフレーム変数の例です。); ~ ***ボックスプロット #image(Pandas/box.png,right,30%) ボックスプロット(箱ひげ図)は、データのばらつきを可視化する統計グラフで、箱(box)と、その両側に出たひげ(whisker)で表現されることからその名が付けられています。 一般に以下の五数が要約(five-number summary)されて表示されます。 -最小値(minimum) -第1四分位点(lower quartile) -中央値(第2四分位点、median) -第3四分位点(upper quartile) -最大値(maximum) 以下のコードは、対象カラム(XXX)をグループ(AAA)別に表示します。 df.boxplot( column='XXX' , by='AAA' ) ~ ***散布図 #image(Pandas/scatter.png,right,30%) 散布図(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(Pandas/bar.png,right,30%) 生成された df_mean を使うと、簡単に積み重ね棒グラフができます。 df_mean.plot.bar( stacked=True ) &small(stacked=True は、積み重ねを有効にする・・という意味です。); ~ ~ **Pythonによる統計グラフの描画体験 CSVデータから統計量を視覚化するサンプルです。matplotlib と連携した pandas のグラフ描画機能を使って、様々なグラフの描画を体験します。 ~ ***ノートブックの新規作成 -__[[Google Colaboratory>https://colab.research.google.com]]__ でノートブックを新規作成 -Untitled0.ipynb というファイル名を変更 > StatisticalGraphics1.ipynb ~ ***サンプルデータ 第9回と同じ Tips のデータをサンプルとして利用します。 直接読み込むので、ダウンロードの必要はありません。 https://github.com/mwaskom/seaborn-data/blob/master/tips.csv //https://raw.githubusercontent.com/mwaskom/seaborn-data/master/tips.csv ~ ***サンプルコード JupyterNotebook形式(.ipynb)でプログラムを提供します。 https://github.com/koichi-inoue/DataScience/blob/main/StatisticalGraph1.ipynb ~ ~ ~ **プログラムの解説 ***ライブラリーの読み込み 冒頭で、グラフ描画用のライブラリー''matplotlib''とデータ解析用のライブラリー ''pandas''を読み込んでいます。 # matplotlib パッケージ から pyplot モジュールを plt として import from matplotlib import pyplot as plt 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) ) ~ ~ **学科サイトにリンク掲載(その5) ノートを、学科サイトの個人ページからリンクして下さい。以下、手順です。 -1. 自分のノートを開いた状態で、右上の「共有」をクリック -2. 共有設定を変更して、以下のように表示される状態にします。 このリンクを知っているインターネット上の全員が閲覧できます。 -3. 「リンクをコピー」をクリックして、そのアドレスを、以下の形式で、学科サイトの「Jupyter Notebooks」の部分に掲載して下さい。 -[[StatisticalGraphics1>https://colab.research.go・・=sharing]] -4. 以下のようになればOKです。 https://design.kyusan-u.ac.jp/socialdesign/?JohnSmith/DataScience ~ ~ **APPENDIX ***数理グラフ 数式等を用いたグラフ表示のサンプルです。時間に余裕のある方のみお試しください。取り組みは任意です。 https://github.com/koichi-inoue/DataScience/blob/main/Plotting.ipynb ~ ~