MongoDBから取得したデータをpyechartsで可視化する方法

概要

pyecharts

概要

  • EChartsは、バaiduが開発したインタラクティブなデータ可視化ライブラリであり、強力なインタラクティブ機能と美しいグラフ表現を持つ。Pythonはデータ処理に優れた言語であり、pyechartsはEChartsベースのPython可視化ライブラリとして、豊富なインタラクティブチャートを生成可能。簡単なPythonコードで複雑なデータ可視化を実現し、API設計は洗練されており、チェーン呼び出しをサポートすることでコードの可読性と開発効率を高める。pyechartsは30以上の一般的なチャートタイプをサポートし、トレンド変化、比較分析、構成比などさまざまな分析シーンに対応可能。Jupyter NotebookやJupyterLabなどの主要なNotebook環境にも統合可能で、WebフレームワークFlaskやDjangoにも容易に組み込める。柔軟な設定オプションにより、カスタマイズされた美しいチャートを簡単に作成可能。詳細なドキュメントと多数のサンプルが提供され、開発者の学習コストを低減し、開発効率を向上させる。400以上のマップファイルとネイティブのバaiduマップ対応により、地理データの可視化を強力に支援し、さまざまな地理データの表示と分析に適している。

  • Pythonによるインタラクティブチャート生成ライブラリ。折れ線図、棒グラフ、散布図など多様なチャートタイプをサポートし、シンプルなPythonコードで複雑なデータ可視化を実現可能。

特徴

  • シンプルなAPI設計で、スムーズな操作が可能で、チェーン呼び出しをサポート
  • 30以上の一般的なチャートを含む
  • 主流Notebook環境(Jupyter Notebook、JupyterLab)への統合をサポートし、FlaskやDjangoとの連携も容易
  • 高度なカスタマイズ機能により、美しいチャートの作成が可能
  • 詳細なドキュメントと豊富なサンプルにより、開発者が迅速にプロジェクトに取り組める
  • 400以上のマップファイルおよびバaiduマップのネイティブ対応により、地理データ可視化を強化

MongoDB

MongoDBはオープンソースのNoSQLデータベースであり、文書ストレージモデルを使用し、半構造化・非構造化データの処理に適している。従来のリレーショナルデータベースとは異なり、MongoDBは柔軟なBSON(Binary JSON)形式でデータを保存し、動的なスキーマをサポートし、高速な開発イテレーションに適している。

データの読み込み


  1. データベースへの接続
  • 必要なモジュールをインポート。pymongoはMongoDBとの通信に使用され、pandasはデータ処理と分析に使用される。
  • MongoClientを使用してローカルのMongoDBサービス(デフォルトポート27017)に接続する。その後、「db_JobList」データベースと「list」コレクションを選択し、後続のデータ読み込み準備を行う。
# モジュールのインポート
from pymongo import MongoClient
import pandas as pd

client = MongoClient("localhost", 27017)  # データベースに接続
database = client["db_JobList"]          # データベース「db_JobList」を選択
collection = database["list"]            # コレクション「list」を選択
  1. データの読み込み
  • findメソッドを使用してコレクション内のすべてのドキュメントを取得し、_idフィールドを除外してpandasのDataFrame形式に変換する。これにより、pandasの強力なデータ処理機能を利用できるようになる。データ構造には、職種名、勤務地、給与、学歴要件、福利厚生などの複数のフィールドが含まれており、分析に十分な情報が提供される。
# データをクエリし、DataFrameに変換
data = list(collection.find({}, {'_id': 0}))  # 全てのドキュメントを取得し、_idを除外
data = pd.DataFrame(data)                     # DataFrame形式に変換

データ処理


(1)棒グラフのデータ処理

  1. データのクリーニング:日給データを削除し、月給分析に集中する。文字列操作により「元/日」を含む給与記録を削除し、月給分析に影響を与えないようにする。
  2. データ変換:給与データを標準化し、最小給与の数値を抽出し、float型に変換して後続の数値計算と集計を可能にする。
  3. データの分割:適切な給与範囲を定義し、pandasのcut関数を使用して連続的な給与データを複数の区間へ分割する。これにより、各給与帯の職種分布を直感的に観察でき、棒グラフの描画に必要なデータを提供する。分割結果のカウントと並び替えを行い、データの正確性と可視化の順序性を確保する。
# 棒グラフに必要なデータを処理
data = data[~data['給与'].str.contains('元/日')]  # 日給データを削除
salary = data['給与'].str.replace(r'·\d+年', '', regex=True)  # 「·X年」を削除
min_salary = salary.str.extract(r'(\d+)-')[0].astype(float)  # 最小給与を抽出し、floatに変換

# 区間の定義
bins = [0, 5, 10, 15, 20, 25, 30]
labels = ['<5K', '5-10K', '10-15K', '15-20K', '20-25K', '25-30K']

# データを区間に分割
range_salary = pd.cut(min_salary, bins=bins, labels=labels, right=False)
salary_counts = range_salary.value_counts().sort_index()

(2)円グラフのデータ処理

  1. 学歴データに対して、pandasのgroupbyメソッドを使用し、異なる学歴レベルごとの職種数を集計する。集計結果を円グラフに必要な形式(キーと値のペア)に変換し、各学歴レベルの市場での分布比率を明確に表示する。このデータ処理により、学歴と求人市場の関係を視覚的に理解可能となる。
# 円グラフに必要なデータを処理
job_degree = data.groupby('学歴')['学歴'].count()
pie_data = [(name, value) for name, value in job_degree.items()]

(3)地図データの処理

データ形式

{<name>: [<longitude>, <latitude>]}

  1. 都市の地理座標の処理:勤務地情報を基に、各都市の職種数を統計し、都市の経緯度座標と関連付ける。pandasのgroupbytransformメソッドを使って都市ごとの職種数を算出し、都市名、経度・緯度、職種数を含むデータ構造を作成し、Geoマップの描画に必要な座標データと数値データを提供する。このプロセスにより、各都市における職種の分布を正確に把握し、マップによる視覚化で地域ごとの求人熱度差を示すことが可能になる。
# 地図に必要なデータを処理
data['都市数'] = data.groupby('勤務地')['勤務地'].transform('count')
map_data = data.set_index('勤務地')[['経度', '緯度']].apply(list, axis=1).to_dict()
map_data2 = data[['勤務地', '都市数']].apply(list, axis=1).to_list()

(4)ワードクラウドのデータ処理

data = [("name", "count")]

  1. 福利厚生データの処理:福利厚生データをクリーニングし、欠損値を削除した後、スペースで分割し、個別の福利厚生項目に分解する。value_countsメソッドで各項目の出現頻度を計算し、ワードクラウドに必要な形式に変換する。この処理により、各福利厚生の普及度と人気を視覚的に示すことができ、職種の福利厚生を分析するための明確なデータが得られる。
# ワードクラウドに必要なデータを処理
welfare_list = data.dropna(subset=['福利厚生'])
welfare_list = welfare_list['福利厚生'].str.split().explode()
welfare_count = welfare_list.value_counts().to_dict()
welfare_data = list(welfare_count.items())

データ可視化


(1)棒グラフ

  1. pyechartsのBarクラスを使用して棒グラフオブジェクトを作成する。
  2. add_xaxisメソッドで給与区間をX軸データとして追加し、add_yaxisメソッドで職種数をY軸データとして追加し、給与帯別の職種分布を視覚化する。
  3. グローバル設定(タイトルなど)を設定し、チャートの可読性と表現力を高める。棒グラフにより、給与水準と職種数の関係を明確に示すことができ、市場の給与傾向と分布特性を素早く把握可能。
# 棒グラフを作成
bar_chart = (
    Bar()
    .add_xaxis(salary_counts.index.tolist())
    .add_yaxis("月給", salary_counts.values.tolist())
    .set_global_opts(title_opts=opts.TitleOpts(title="給与"))
)

(2)円グラフ

  1. Pieクラスを使用して円グラフオブジェクトを生成する。
  2. addメソッドで学歴カテゴリとその職種数を追加し、学歴分布を可視化する。
  3. タイトルやラベルのフォーマットなどのグローバルとシリーズ設定を適用し、チャートを美しく理解しやすくする。円グラフにより、各学歴レベルの市場での割合を直感的に示し、学歴が就職機会に与える影響を分析可能。
# 円グラフを作成
pie_chart = (
    Pie()
    .add("", pie_data)
    .set_global_opts(title_opts=opts.TitleOpts(title="学歴分布"))
    .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
)

(3)Geoマップ

  1. Geoクラスのインスタンスを作成し、地理分布マップを描画する。
  2. add_schemaメソッドでマップタイプを「china」として中国地図の基本構造を構築する。
  3. ループを使用して各都市に座標情報を追加し、マップ上の都市の正確な位置を示す。
  4. addメソッドで都市名、座標、職種数を結合し、「effectScatter」効果で職種の分布を表示し、視覚マッピングやタイトルなどの設定を適用し、マップの可視化効果と情報伝達能力を強化する。Geoマップにより、全国の職種分布を直感的に表示し、地域ごとの雇用市場の違いや人材移動傾向の分析を支援する。
# Geoマップを作成
geo_charts = Geo()
geo_charts.add_schema(maptype="china")
for name, coord in map_data.items():
    geo_charts.add_coordinate(name, coord[0], coord[1])

geo_charts.add("geo", map_data2, type_="effectScatter")
geo_charts.set_series_opts(label_opts=opts.LabelOpts(is_show=False))
geo_charts.set_global_opts(
    visualmap_opts=opts.VisualMapOpts(dimension=2),
    title_opts=opts.TitleOpts(title="勤務地分布")
)

(4)ワードクラウド

  1. WordCloudクラスを使用してワードクラウドオブジェクトを作成する。
  2. addメソッドで福利厚生名と数値を追加し、フォントサイズ範囲やテキストスタイルを設定し、頻出福利厚生を強調表示する。
  3. タイトルなどのグローバル設定を適用し、可視化効果と情報の明確さを向上させる。ワードクラウドにより、福利厚生の多様性と人気を視覚的に表現し、福利厚生の魅力と競争力を分析するのに役立つ。
# ワードクラウドを作成
wordCloud_charts = (
    WordCloud()
    .add(
        "",
        welfare_data,
        word_size_range=[20, 100],
        textstyle_opts=opts.TextStyleOpts(font_family="cursive"),
    )
    .set_global_opts(title_opts=opts.TitleOpts(title="福利厚生"))
)

チャートの統合


  1. Pageオブジェクトを作成し、単純な垂直レイアウトを選択し、棒グラフ、円グラフ、Geoマップ、ワードクラウドなどの可視化チャートを順次追加する。
  2. 統合ページのタイトルを設定し、動的にデータ総量を表示させ、ページの個別化と情報量を増やす。
  3. renderメソッドを使用して統合チャートをHTMLファイルとして出力し、ブラウザで確認・共有可能にする。統合チャートにより、複数の可視化結果を1ページにまとめて表示し、ユーザーが異なるデータの比較分析が容易になり、全体のデータ特徴と関連性を把握可能。
# チャートを統合
page = Page(layout=Page.SimplePageLayout)
page.add(bar_f(data), pie_f(data), geo_f(data), wordCloud_f(data))
page.page_title = f'総データ数{len(data)}'
page.render('./charts/page_new.html')

表示例


pyechartsの簡単な入門

まとめと今後の展望


上記はpyechartsを用いたデータ分析可視化の完全な実践プロセスである。MongoDBからのデータ読み込み、データ処理、複数チャートの描画と統合表示まで、各ステップが密接に結びついている。棒グラフ、円グラフ、Geoマップ、ワードクラウドなどの可視化手法を用いることで、職種データを多角的に分析し、背後にある価値ある情報を抽出できる。これは求職者にとって市場の現状を理解し、より良いキャリア選択ができるだけでなく、企業が採用戦略を最適化し、福利厚生の競争力を高めるための参考にもなる。

  • 今後のデータ分析と可視化では、データソースと分析次元をさらに拡張し、時間軸分析や求人詳細のスキル要件を抽出してスキル熱度分析なども可能にする。また、pyechartsの高度な機能やカスタム設定を活用し、より美しく、個別化された、インタラクティブな可視化作品を作成することで、データ分析と意思決定にさらに強力な支援を提供することが期待できる。
  • 変換過程において、重要な情報を漏らさず、Echarts上で正しく表示されるようにすることに注意が必要である。
  • 実際の変換時には、各セクションのデータ形式を判断し、それに応じたデータ形式を適用する必要がある。また、特殊文字やnull値に注意し、それらが表示やアクセスに影響しないようにする。
  • 変換完了後は生成されたHTMLドキュメントを確認し、すべてのチャートが正しく表示され、形式が適切であることを確認し、問題があれば即時修正する。最終的に提供されるチャートがユーザーのニーズに応えられるようにする。

タグ: Python MongoDB pyecharts データ可視化 データ分析

8月5日 23:21 投稿