#author("2023-11-23T17:55:28+09:00","default:inoue.ko","inoue.ko") *第10回 データビジュアライゼーション [[データサイエンス/2023]]|[[受講生一覧>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]]|[[汎用シート>https://docs.google.com/spreadsheets/d/1g-6TyzeQg3md55l9SGnqN-USBsoCNYOwSDDUOKVBJu8/edit?usp=sharing]] ~ //***CONTENTS //#contents2_1 //~ ~ **はじめに (準備中) //***アンケート //授業アンケートを兼ねて、以下のアンケートへの回答をお願いします。 //データ分析等の素材として活用することを想定しています。 //https://forms.gle/ArJixPMzMcTTNRQG9 ~ ~ **データビジュアライゼーション データビジュアライゼーション(Data Visualization)とは、物事の関係性を視覚的に捉えられるように、データを画像・グラフ・図表などに変換することを言います。その目的はデータから価値や知恵を生み出すことにあります。 ''Data'' → ''Information''(構造化)→ ''Knowledge''(知見)→ ''Wisdom''(知恵) ~ ***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を用いたデータビジュアライゼーションには、様々な関連ライブラリーのインポート、データの読み込み、各種メソッドの活用が前提となります。以下、各種ライブラリの紹介です。 -[[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/]]|ワードクラウドの描画 -[[janome>https://mocobeta.github.io/janome/]]|日本語の形態素解析器 import janome -[[pillow>https://pillow.readthedocs.io/]]|画像処理 ~ ~ **地理情報の可視化 統計データを、国や地域、道路など地図上に可視化する需要が高まっています。今回は、地図情報の活用と、地図上にデータをプロットする方法を体験します。 ~ ***地理情報の可視化ライブラリ Folium オープンソースのJavaScriptライブラリ__[[Leaflet]]__を用いて Pythonでインタラクティブな地図を生成するライブラリです。 緯度・経度の値を使ったマーカー表示や、ヒートマップの表示、また GeoJSON形式の地理情報と統計情報を合わせた各種の可視化が可能になります。 Foliumはデフォルトで [[OpenStreetMap>https://openstreetmap.jp/]] を使用しています。 -folium.Map( ):ベースとなる地図を生成します -folium.Marker( ):地図上にマーカーを表示します -folium.Circle( ):地図上に円を表示します -folium.Choropleth( ):コロプレス図を生成します -HeatMap( ):ヒートマップを生成します ~ ***コロプレス図とは コロプレス図とは、統計数値を地図上に表現したもので、区域単位(国別など)の情報を、統計値に応じた色彩や明暗によって表します。人口やGDP、生産高など、土地の上に分布するものを表現するのに適しています。 ~ ***GeoJSONデータとは -GeoJSONは、地理情報を __[[JSON]]__ 形式で記述したものです。 > [[JSON#GeoJSON]] -世界地図の GeoJSONデータ https://raw.githubusercontent.com/johan/world.geo.json/master/countries.geo.json ~ ***緯度・経度情報を取得するには -''GoogleMap'' を使う 地図上で目的の場所をダブルクリックすると、マーカーが表示されるとともに住所と緯度・経度が表示されます。 -''GeoJSON.io'' を使う https://geojson.io/ 地図上でマーカーツールを選択して目的の場所をクリックすると右サイドに GeoJSON形式のデータが表示されます。"coordinates" として表示される最初の数字が経度、次の数字が緯度になっています。 ~ ~ **演習10|地理情報の可視化 ***ノートブックの新規作成 -__[[Google Colaboratory>https://colab.research.google.com]]__ でノートブックを新規作成 -Untitled0.ipynb というファイル名を変更 > GeographicVisualization.ipynb ~ ***サンプルデータ -全国の医療機関の医療提供状況(内閣官房 新型コロナ感染症対策) --Data:__[[covid-19_daily_survey.csv(20220823)>https://raw.githubusercontent.com/koichi-inoue/DataScience/main/covid-19_daily_20220823.csv]]__ --付記:昨年まで以下のURLで毎日更新公開されていましたが、現在は停止されているため、昨年8月23日に取得済みのデータを利用します。 ---https://corona.go.jp/dashboard ---https://cio.go.jp/hosp_monitoring_c19 -Annotated geo-json geometry files for the world --掲載サイト:https://github.com/johan/world.geo.json --Data:countries.geo.json --DataURL:https://raw.githubusercontent.com/johan/world.geo.json/master/countries.geo.json --URLから直接読み込んで利用します。 -世界各国の一人当たりのGDP(2007年) --plotly に同梱されているものを読み込むため、準備不要です。 ~ ***サンプルコード -JupyterNotebook形式(.ipynb)でプログラムを提供します。 https://github.com/koichi-inoue/DataScience/blob/main/GeographicVisualization.ipynb ~ ***学科サイトにリンク掲載 ノートを、学科サイトの個人ページからリンクして下さい。以下、手順です。 -1. 自分のノートを開いた状態で、右上の「共有」をクリック -2. 共有設定を変更して、以下のように表示される状態にします。 このリンクを知っているインターネット上の全員が閲覧できます。 -3. 「リンクをコピー」をクリックして、そのアドレスを、以下の形式で、学科サイトの「Jupyter Notebooks」の部分に掲載して下さい。 -[[地理情報の可視化>https://colab.research.go・・=sharing]] -4. 以下のようになればOKです。 https://design.kyusan-u.ac.jp/socialdesign/?JohnSmith/DataScience ~ ~ **演習10|プログラムの解説 ***基本的な地図の描画(Folium) -基本的な地図は、以下の様に記述することで表示されます。 map0 = folium.Map( location = [35,139] , zoom_start = 5.0 , tiles="OpenStreetMap" ) map0 -パラメータ --location:地図の中心とする位置(緯度・経度) --zoom_start:初期表示倍率 --tiles:地図のスタイル --width:地図の幅 --height:地図の高さ -地図タイルには、以下のようなものが利用できます。 --OpenStreetMap:デフォルト --Stamen Terrain, Stamen Watercolor, Stamen Toner --Mapbox Bright:Limited levels of zoom for free tiles --Mapbox Control Room:Limited levels of zoom for free tiles ~ ***地図上にマーカーを表示(Folium) -九州産業大学の座標を変数に定義 ksu_lat = 33.66983627668292 ksu_lng = 130.44487416744232 -folium.Map 関数でベースとなる地図を作成 map1 = folium.Map( location = [ksu_lat, ksu_lng] , zoom_start = 20 ) -folium.Marker 関数でマーカーを定義 folium.Marker( location = [ksu_lat, ksu_lng] , popup="九州産業大学" ).add_to( map1 ) ~ ***地図上にサークルを表示(Folium) 上と同様につき、省略します。 ~ ***ヒートマップの描画(Folium) -オープンデータ covid-19_daily_survey.csv を df に読み込み df = pd.read_csv('https://covid-19-surveillance・・covid-19_daily_survey.csv') 本日最新のデータがこのURLから直接読まれます。 -ベースとなる地図を map3 として描画 map3 = folium.Map( location = [TOKYO_lat, TOKYO_lng] , zoom_start = 11 , tiles="cartodbpositron" ) -入院・通常 に該当する病院の座標情報を df_hospital に回収 df_hospital = df.query( "医療区分=='入院' & 医療区分回答=='制限'" ).loc[:,['緯度','経度']] -ヒートマップ用の変数 df_hospital_geolist に df_hospital の値をリスト登録 df_hospital_geolist = df_hospital.values.tolist() -各医療機関の座標を半径7 ぼかし5 で map3 に追加 HeatMap( df_hospital_geolist, radius=7, blur=5 ).add_to(map3) ~ ***GeoJSON データを活用したコロプレス図(Folium) -世界の区画データの読み込み(テキストを json 形式のデータとして読み込み) url = requests.get('https://raw.githubusercontent.com/johan/world.geo.json/master/countries.geo.json') text = url.text geo_json = json.loads( text) -plotlyに同梱されている gapminder 2007年のデータを読み込み df_gm = px.data.gapminder().query("year == 2007") -folium.Map 関数でベースとなる地図を作成 map4 = folium.Map( location = [40,0] , zoom_start = 1.8 ) - folium.Choropleth 関数でコロプレス図を定義 folium.Choropleth( geo_data = geo_json, data = df_gm, fill_opacity = 1, line_color = 'white' , nan_fill_color = '#888888' , # 欠損値の色 columns = ['iso_alpha' , 'gdpPercap'], # 色分けに使うキーとカラム名 key_on = 'feature.id' , # データに対応した geo.json のキー fill_color = 'OrRd', ).add_to(map4) ~ ***plotly.express による地球儀(plotly) -地球儀に国名をドットで表示 df_gm = px.data.gapminder().query("year == 2007") fig0 = px.scatter_geo( df_gm, locations="iso_alpha", color="continent", projection="orthographic") fig0.show() -地球儀に gapminder の各国の人口(2007年)を重ねて表示 df_gm = px.data.gapminder().query("year == 2007") fig1 = px.scatter_geo( df_gm, locations='iso_alpha', color='continent', hover_name='country', size='pop', projection='orthographic' ) fig1.show() ~ ~ #hr CENTER:'''以下は、ワードクラウドの事例です''' '''参考情報なので、取り組みは任意です。''' #hr ~ ~ **ワードクラウド ***ワードクラウドとは ワードクラウドは、文章の中に含まれる単語をカウントして、どのような単語が多く含まれるかを視覚的に表現します。 英語の場合は、単語間にスペースがあるので、解析が簡単ですが、日本語の場合はオリジナルの文章から単語間がスペースで区切られた「分かち書き」の状態に変換する作業が必要になります。 ~ ***ライブラリ -公式サイト:https://amueller.github.io/word_cloud/ -ライブラリの読み込み import wordcloud ~ ~ **演習10+|ワードクラウド ***ノートブックの新規作成 -__[[Google Colaboratory>https://colab.research.google.com]]__ でノートブックを新規作成 -Untitled0.ipynb というファイル名を変更 > WordCloud.ipynb ~ ***サンプルデータ 以下のような一般のテキストデータが利用できます。 -https://en.wikipedia.org/wiki/Python_(programming_language) -https://www.aozora.gr.jp/cards/000148/files/776_14941.html ~ ***サンプルコード JupyterNotebook形式(.ipynb)でプログラムを提供します。 https://github.com/koichi-inoue/DataScience/blob/main/WordCloud.ipynb -カラーマップには以下のものが利用できます。 https://matplotlib.org/stable/tutorials/colors/colormaps.html 例:'viridis', 'plasma', 'inferno', 'magma', 'cividis' ~ ***学科サイトにリンク掲載 ノートを、学科サイトの個人ページからリンクして下さい。以下、手順です。 -1. 自分のノートを開いた状態で、右上の「共有」をクリック -2. 共有設定を変更して、以下のように表示される状態にします。 このリンクを知っているインターネット上の全員が閲覧できます。 -3. 「リンクをコピー」をクリックして、そのアドレスを、以下の形式で、学科サイトの「Jupyter Notebooks」の部分に掲載して下さい。 -[[ワードクラウド>https://colab.research.go・・=sharing]] -4. 以下のようになればOKです。 https://design.kyusan-u.ac.jp/socialdesign/?JohnSmith/DataScience ~ ~ ~