Kevin's Data Analytics Blog

データサイエンティスト、AIエンジニアを目指す方に向けて情報発信していきます。

確率分布の期待値・分散・母関数まとめ~連続分布~

以前の記事に続き、統計検定1級/準1級の対策として、各確率分布の期待値・分散・母関数について整理しました。
今回は、連続分布を扱いました。
離散分布のまとめについてはこちらを参照ください。
確率分布の期待値・分散・母関数まとめ~離散分布~ - Kevin's Data Analytics Blog

1. 連続一様分布

定義

𝑎<𝑥<𝑏の連続値をとる確率変数𝑋に対して、確率密度関数の値が常に一定であるような確率分布を連続一様分布という。

期待値

 E(X)=\dfrac{a+b}{2}

分散

 V(X)=\dfrac{(b-a)^{2}}{12}

積率母関数(モーメント母関数)

 E(t^{tX})=\dfrac{e^{tb}-e^{ta}}{t(b-a)}

2. 正規分布

定義

𝜇∈"ℝ, " σ>0とし、確率変数𝑋に対して、以下の確率密度関数をもつ分布を正規分布という。𝜇を中心する左右対称の釣鐘型の分布になっている。

期待値

 E(X)=\mu

分散

 V(X)=\sigma^ 2

積率母関数(モーメント母関数)

 E(t^{tX})=\exp(\mu t+\dfrac{\sigma^2 t^2}{2})

3. 指数分布

定義

 λ>0とし、確率変数𝑋に対して、以下の確率密度関数をもつ分布を指数分布という。単位時間あたり平均λ回起こる現象の発生間隔の確率分布を表している。

期待値

 E(X)=\dfrac{1}{\lambda}

分散

 V(X)=\dfrac{1}{\lambda ^2}

積率母関数(モーメント母関数)

 E(t^{tX})=\dfrac{\lambda}{\lambda - t}  \quad (t < \lambda)

4. ガンマ分布

定義

 α>0, 𝛽>0 とし、確率変数𝑋に対して、以下の確率密度関数をもつ分布をガンマ分布という。ガンマ分布は単位時間あたり平均𝛽回起こる現象がα回起こるまでの時間の確率分布を表している。

確率密度関数

 f(x)=\frac{\beta^{\alpha}}{\Gamma(\alpha)}x^{\alpha-1}e^{-\beta x} \quad (x>0)

※ガンマ関数の定義は以下のとおり

\Gamma(x)=\displaystyle\int_{0}^{\infty}t^{x-1}e^{-t}\,dt

期待値

 E(X)=\dfrac{\alpha}{\beta}

分散

 V(X)=\dfrac{\alpha}{\beta ^2}

積率母関数(モーメント母関数)

 E(t^{tX})=(\dfrac{\beta}{\beta - t})^{\alpha}

5. ベータ分布

定義

 α>0, 𝛽>0 とし、確率変数𝑋に対して、以下の確率密度関数をもつ分布をベータ分布という。

確率密度関数

 f(x)=\dfrac{1}{B(\alpha , \beta)}x^{\alpha -1}(1-x)^{\beta -1}

※ベータ関数の定義は以下のとおり

B(\alpha , \beta)=\displaystyle\int_{0}^{1}x^{\alpha-1}(1-x)^{\beta -1}\,dt

期待値

 E(X)=\dfrac{\alpha}{\alpha + \beta}

分散

 V(X)=\dfrac{\alpha\beta}{(\alpha + \beta)^2(\alpha + \beta +1)}

積率母関数(モーメント母関数)

 簡単な式で表せない

6. コーシー分布

定義

 確率変数𝑋に対して、以下の確率密度関数をもつ分布をコーシー分布という。

期待値

 存在しない

分散

 存在しない

積率母関数(モーメント母関数)

 存在しない

7. 対数正規分布

定義

𝑌~N(𝜇, 𝜎^2) のとき、確率変数𝑋=𝑒^𝑌が従う確率分布を対数正規分布という。確率密度関数は以下のとおり。

期待値

 E(X)=\exp(\mu +\dfrac{\sigma ^2}{2})

分散

 V(X)=\exp(2\mu +\sigma ^2)(\exp(\sigma ^2) -1)

積率母関数(モーメント母関数)

 存在しない

8. ワイブル分布

定義

 𝑎>0, 𝑏>0 とし、確率変数𝑋に対して、以下の確率密度関数をもつ分布をワイブル布という。

確率密度関数

 f(x)=\dfrac{b}{a^b}x^{b-1}\exp(-(\dfrac{x}{a})^b)

なお、ワイブル分布は、ガンマ関数における定数λを、以下の式で 𝑥の関数とした場合の分布である。

 \lambda=\gamma(x)=cx^{b-1}, \quad c=\dfrac{b}{a^b}

𝑏=1 のときのワイブル分布は、𝑟(𝑥)=𝑐で一定となり、指数分布になる。

期待値

 E(X)=\alpha\Gamma(\dfrac{b+1}{b})

分散

 V(X)=\alpha^2(\Gamma(\dfrac{b+2}{b}) - \Gamma(\dfrac{b+1}{b})^2)

積率母関数(モーメント母関数)

 簡単な式で表せない

9. ロジスティック分布

定義

 確率変数𝑋に対して、以下の確率密度関数をもつ分布をロジスティック分布という。

確率密度関数

 f(x)=\dfrac{e^{-x}}{(1+e^{-x})^2}

また、ロジスティック分布の累積分布関数は、ロジスティック関数である。

 P(X\le x)=\dfrac{1}{1+e^{-x}}

期待値

 E(X)=0

分散

 V(X)=\dfrac{\pi^2}{3}

積率母関数(モーメント母関数)

 E(t^{tX})=\Gamma(1+t)\Gamma(1-t)

導出方法

多くの参考書において、これらの導出は、数式の途中計算や公式等の前提知識の説明が省略されていることが多いため、理解に時間がかかると感じていました。
前回同様、今回も自分用に整理したものを、動画にしてみました。途中の流れを細かく説明しています。必要に応じてご確認ください。
youtu.be

対策本

統計検定1級/準1級の対策本としては、以下の書籍があります。

こちらの書籍は、検定の範囲内のトピックが幅広く網羅されていますが、数式や解説が省略されている個所が多い印象です。あくまでも、出題範囲のトピックを確認するための用途として使用し、詳細の内容はインターネット等で確認し理解を深めるのが良いと思います。

まとめ

確率分布の期待値・分散・母関数について整理しました。また、導出方法についてまとめた動画および、対策本について紹介しました。
本記事が、統計検定の対策を進める上で、お役に立てば幸いです。

PythonでSQLiteのデータを読み込む方法

今回は、PythonからSQLiteのデータベースにアクセスしてSQLの実行してデータを読み込む方法を紹介します。
Pythonでデータを読み込んで処理するメリットは次の点が挙げられます。

  • PythonのPandasライブラリでは、データを効率的に処理するための便利な機能が多く提供されている
  • Pythonには機械学習を適用するためのライブラリも用意されている
  • その他、プログラミング言語として、SQLよりもできることが多い

関連するトピックについて、過去の記事で紹介していますので、よろしければ併せてご参照ください。
データサイエンティストを目指す方向け Pythonセットアップ方法(Windows版) - Kevin's Data Analytics Blog
Jupyter Notebook:データサイエンティストを目指す方にオススメのPython実行環境 - Kevin's Data Analytics Blog
【初心者向け】Pandas入門 これだけは押さえておくべき基本操作|データ分析で必須 - Kevin's Data Analytics Blog

ライブラリのインポート

PythonSQLiteデータを読み込むため、Pandasとsqlite3を使用します。どちらのライブラリも標準ライブラリのため追加インストールは不要です。

import pandas as pd
import sqlite3

SQLiteに接続

sqlite3.connect関数を使用して、SQLiteのデータファイルに接続します。関数の引数にデータファイルのパスを指定します。

conn = sqlite3.connect('../data/zenkoku.sqlite3')

なお、zenkoku.sqlite3は、以下のサイトから取得しました。
住所データSQL【住所.jp】

Pandasでデータの読み込み

read_sql_query関数を使用して、データベースに対してSQLを実行します。第一引数にselect文を記述し、第二引数には先ほど接続時に作成した「conn」を指定します。

data1 = pd.read_sql_query('select * from ad_address', conn)

データの中身を確認します。

data1

f:id:dskevin:20220220163951p:plain
データフレームの形式で読み込むことが出来ました。

改行を含む長いSQL文を記述する場合は、変数にSQL文を格納します。シングルクォーテーション3つで囲みます。

query_text='''
select
  zip
  ,ken_name
  ,city_name
  ,town_name
  ,office_name
  ,office_address
from ad_address
where ken_name = "東京都"
  and office_flg = 1
'''

同様に、read_sql_query関数を使用して、データベースに対してSQLを実行します。第一引数には、SQL文を格納した変数(query_text)を指定します。

data2 = pd.read_sql_query(query_text, conn)

データの中身を確認します。

data2

f:id:dskevin:20220220164919p:plain
クエリが実行され、クエリのwhere句に指定した条件(東京都で、office_flg=1)の住所を抽出できました。

SQLiteにデータを保存

Pandasのデータフレームを、SQLiteデータベース上の新しいテーブルとして保存することができます。
to_sql関数を使用します。第一引数には、データベース上に作成する新しいテーブル名を指定します。

data2.to_sql('office_data', conn)

以下のように、テーブルの一覧を取得して、新しくテーブルが作成されていることを確認できます。

# テーブル一覧の取得
pd.read_sql_query('select * from sqlite_master where type="table"', conn)

まとめ

Pythonを使ってSQLiteのデータを読み込む方法について紹介しました。
PythonSQLを使ってデータを扱っている方や、現在勉強中の方にとって、本記事が少しでもお役に立てば幸いです。
今回も、実際にPCで操作している様子を動画にまとめました。よければこちらもご確認ください。
youtu.be

最後まで読んでいただき、ありがとうございました!

DB Browser for SQLiteにCSVファイルをインポート

DB Browser for SQLiteCSVファイルをインポートする方法を紹介します。
SQLの書き方を勉強・実習するにあたって、一からデータベースを構築するよりも、CSVファイルをデータベースに読み込む方が簡単なのでおススメです。
CSVファイルをインポートするにあたって、日本語のファイルを扱う場合の文字コードと、データの型に注意が必要ですので、備忘録を兼ねて手順をまとめました。

データベースの作成

「新しいデータベース」をクリックして、データベースファイルの保存先を指定します。
f:id:dskevin:20220213214029p:plain:h320

テーブルの作成は「キャンセル」をクリックします。
f:id:dskevin:20220213214201p:plain:h320

CSVファイルのインポート

「ファイル」→「インポート」→「CSVファイルからテーブルへ」をクリックします。
f:id:dskevin:20220213214332p:plain:h320

読み込み対象のCSVファイルを選択します。
f:id:dskevin:20220213214436p:plain:h320

テーブル名には、ファイル名がデフォルトで設定されます。
日本語のデータを含むファイルをインポートする場合、文字化けが発生することがあります。
f:id:dskevin:20220213214714p:plain:h320

エンコードで「Shift_JIS」を選ぶと多くの場合に直ります。
f:id:dskevin:20220213214847p:plain:h320

f:id:dskevin:20220213214926p:plain:h320

また、このとき、必要に応じて「先頭行をカラム名に」をチェックします。

データの型変更

データを読み込む時に、ツールが自動でデータの型を判定します。間違えている場合は、手動で直す必要があります。今回の例では、「年俸」のカラムが文字列型と判定されました。
f:id:dskevin:20220219114114p:plain:h320

対象のテーブル名を選択し、「テーブルを変更」をクリックします。
f:id:dskevin:20220219114237p:plain

テーブル定義の編集画面が表示されますので、データの型を修正します。整数型の「INTEGER」を指定します。
f:id:dskevin:20220219114346p:plain:h320

SQL実行

SQL実行」タブを開いて、SQL文を記述します。
年俸のデータ型が正しく指定できていることを確認するために、数値の比較を条件に入れてクエリを実行します。
なお、テーブル名には、CSVファイルのファイル名(インポート時のデフォルト値)を指定します。また、日本語のカラム名を指定する場合は、ダブルクォーテーションで囲む必要があります。

SELECT * FROM npb_players
WHERE "年俸">50000

f:id:dskevin:20220219114616p:plain:h320

正しくSQL実行できました。

まとめ

DB Browser for SQLiteCSVファイルをインポートする方法を紹介しました。
これから、SQLについての勉強・スキルアップをしたい方にとって、本記事が少しでもお役に立てば幸いです。
今回も、実際にPCで操作している様子を動画にまとめました。よければこちらもご確認ください。
youtu.be

最後まで読んでいただき、ありがとうございました!

DB Browser for SQLiteのセットアップ方法・使い方

今回は、DB Browser for SQLiteのセットアップ方法と使い方について紹介します。

SQLiteとは

SQLiteは、以下の特徴を持ったデータベースです。
・設定が簡単
・フリーで使用することができる
・PC上のアプリケーションとしても動作可能(サーバの用意が不要)
そのため、簡易的にデータベースを構築したい場合や、SQLの練習環境として、SQLiteがおすすめです。

DB Browser for SQLiteとは

DB Browser for SQLiteは、SQLiteのデータベースをGUIで操作することができるツールです。テーブルを作成したり、SQL文を実行することができます。
f:id:dskevin:20220211171128p:plain:h320

セットアップ

インストーラのダウンロード

以下のサイトから、PC環境に合わせてインストーラをダウンロードします。
https://sqlitebrowser.org/dl/

f:id:dskevin:20220211221305p:plain:h320

インストール

インストーラを起動します。「Next」をクリック。
f:id:dskevin:20220211221506p:plain:h320

「I accept ...」にチェックを入れて、「Next」をクリック。
f:id:dskevin:20220211221809p:plain:h320

必要に応じて、ショートカットの作成をチェックして、「Next」をクリック。
f:id:dskevin:20220211222112p:plain:h320

カスタム設定は特に不要ですので、「Next」をクリック
f:id:dskevin:20220211222257p:plain:h320

「Install」をクリックして、インストールします。
f:id:dskevin:20220211222743p:plain:h320

使い方

データベース・テーブルの作成

プログラムを起動して、「新しいデータベース」をクリックします。
f:id:dskevin:20220211222937p:plain:h320

データベースファイルの保存先を指定します。
f:id:dskevin:20220211223115p:plain:h320

テーブルの定義画面が表示されますので、テーブル名、フィールド名、フィールドの属性値を設定します。
f:id:dskevin:20220211223305p:plain:h320

「データ閲覧」タブから、挿入ボタンをクリックし、データを挿入します。
f:id:dskevin:20220211223507p:plain:h320

「変更を書き込み」をクリックして、データを保存します。
f:id:dskevin:20220211223726p:plain:h320

SQLの実行

SQL実行」タブから、SQLを記述して、実行ボタンをクリックします。
f:id:dskevin:20220211223919p:plain:h320

先ほど作成したテーブルからデータを取得できました。
f:id:dskevin:20220211224105p:plain:h320

まとめ

SQLiteおよび、DB Browser for SQLiteについて紹介しました。昨今のデジタル化時代においてデータを利活用することが求められる中、データベースから必要なデータを抽出するスキルは、必要不可欠なスキルになると感じています。これから、SQLについての勉強・スキルアップをしたい方にとって、本記事が少しでもお役に立てば幸いです。
今回も、実際にPCで操作している様子を動画にまとめました。よければこちらもご確認ください。
youtu.be

最後まで読んでいただき、ありがとうございました!

[機械学習 実践]プロ野球選手の年俸を査定するAIを作成|LightGBM|Machine Learning|Python

機械学習の実践例として、プロ野球選手の成績と年俸のデータを使って、機械学習モデルの作成・予測実行してみました。

イメージは以下のとおりです。
f:id:dskevin:20220116104836p:plain:h320
f:id:dskevin:20220116104850p:plain:h320
f:id:dskevin:20220116104905p:plain:h320

準備

lightgbmパッケージのインストール

LightGBMを使うためには、lightgbmパッケージが必要です。インストールしていない場合は、コマンドプロンプトを開いて、以下のコマンドを実行するとインストールできます。

pip install lightgbm

sweetvizパッケージのインストール

データの可視化で、Sweetvizを使用します。日本語データを扱うための設定が若干複雑でしたので、今回は説明は割愛します。(別の機会に紹介します。)
もし、インストール済でない場合、機械学習モデルの作成自体はできますので、スキップしても大丈夫です。

データの取得

機会学習に必要な数値を以下のサイトから取得し、CSVファイルに保存します。欠損値データの除去などの前処理も事前に行います。
プロ野球データFreak

実装

1. ライブラリのインポート

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

# データ可視化用ライブラリ →未インストールの場合はインポート不要
import sweetviz as sv
sv.config_parser.read('sweetviz_setting.ini')

# 機械学習用ライブラリ LightGBM
import lightgbm as lgb

# テストデータ分割用ライブラリ
from sklearn.model_selection import LeaveOneOut

# 評価用ライブラリ
from sklearn.metrics import mean_squared_error
from sklearn.metrics import r2_score

2. データの読み込み・確認

pitcher = pd.read_csv('../data/npb_stats_salary_pitcher.csv', encoding='cp932')
pitcher
pitcher[pitcher['年']==2021]
# Sweetviz →未インストールの場合はスキップ
sv_out = sv.analyze(pitcher)
sv_out.show_html('../output/sv_report.html')

3. 機械学習の適用

# 説明変数用カラム
X_columns = pitcher.columns[3:-1]
X_columns
# 説明変数
X = pitcher[X_columns].copy()
# 目的変数
y = pitcher['年俸']
X
y
# モデル学習、予測
# モデルのインスタンスの作成
model = lgb.LGBMRegressor()

# Leave one out法で、モデルの学習と予測を繰り返す
loo = LeaveOneOut()
actual = []
pred = []
cnt = 0
for train_index, test_index in loo.split(X):
    # データの分割
    x_train, x_test = X.iloc[train_index], X.iloc[test_index]
    y_train, y_test = y[train_index], y[test_index]
    
    # モデルの学習
    model.fit(x_train, y_train) # モデルの学習

    # テストデータの予測
    y_pred = model.predict(x_test)
    actual.append(y_test.values[0])
    pred.append(y_pred[0])

    # 340人分(2021年データ)で終了
    cnt+=1
    if cnt == 340:
        break
# 散布図を描画(実値 vs 予測値)
plt.plot(actual, actual, color = 'red', label = 'x=y') # 直線y = x
plt.scatter(actual, pred) # 散布図のプロット
plt.xlabel('y_actual') # x軸ラベル
plt.ylabel('y_pred') # y軸ラベル
plt.title('y_actual vs y_pred') # グラフタイトル
# モデル評価
# rmse: 平均二乗誤差の平方根
mse = mean_squared_error(actual, pred)
rmse = np.sqrt(mse)
print('RMSE :',rmse)

# r2: 決定係数
r2 = r2_score(actual,pred)
print('R2 :',r2)

4. 結果の出力

# 2021年の340人分に結合
pitcher_v2 = pitcher.head(340).copy()
pitcher_v2['年俸(AI)'] = pred
pitcher_v2
# CSVファイルに出力
pitcher_v2.to_csv('../output/npb_stats_salary_pitcher_output.csv', index=False, encoding='cp932')

結果

機械学習で算出した年俸額の上位5選手(投手・野手)は、以下のとおりでした。

投手

選手名チーム背番号年齢年数防御率試合勝利敗北セーブホールド勝率打者投球回被安打本塁打与四球死球奪三振失点自責点WHIPDIPS年俸年俸(AI)
田中 将大E183383.012349000.308624155.21311729512654521.033.589000034551
大野 雄大D2233112.9522711000.389566143.11211226211848471.033.133000031805
平野 佳寿B1637132.346132930.2516343304903711110.913.241500031591
則本 昂大E143193.1723115000.688584144.21231835315256511.093.423000029512
マルティネスH373141.62194000.692553140.2108638513825251.042.631000027793

野手

選手名チーム背番号年齢年数打率試合打席数打数安打本塁打打点盗塁四球死球三振犠打併殺打出塁率長打率OPSRC27XR27年俸年俸(AI)
鈴木 誠也C12790.3171325334351383888987688070.4330.6391.07210.039.773100036256
柳田 悠岐H933110.314159351615528806696122060.3880.5410.9297.897.596100034681
島内 宏明E3531100.25714159948612521962978872150.3850.4770.8636.396.381200034395
丸 佳浩G832140.26511845739210423555630120050.3650.4950.866.56.494500033422
山田 哲人S129110.2721375814931343410147651000100.370.5150.8856.716.845000030991
※実際には、様々な要素が年俸に反映されていると思いますので、こちらの結果自体は参考値として捉えていただけると助かります。

まとめ

プロ野球選手の成績・年俸を題材として機械学習の使い方を紹介しました。Pythonで用意されているライブラリ関数を使うことで、複雑なプログラミング無しで機械学習を使った処理が実装できると感じていただけたと思います。今回扱ったLightGBM以外にも、たくさんの機械学習アルゴリズムPythonで用意されていますが、使い方は同様です。今後また紹介していきたいと思います。

今回の内容を動画でも紹介していますので、もしよければこちらもご覧ください。
youtu.be

本記事が皆様のお役に立てば幸いです。最後まで読んでいただき、ありがとうございました!

jQuery csv2tableの使い方

今回は、csv2tableというjQueryプラグインを使って、CSVファイルをWebブラウザ上で表示する方法を紹介します。

JavaScript/jQuery

JavaScriptを使うと、Webページ上の表示をユーザの操作に合わせて動的に変えられます。さらに、jQueryというJavaScriptのライブラリを使用することで、複雑な処理を簡単に実装できます。

jQuery csv2tableの取得

以下のページからcsv2rableのjsファイルを取得します。
https://jsgt.org/lib/jquery/plugin/csv2table/v002/test.htm

「Source」を右クリックしてファイルを保存します。
f:id:dskevin:20211220174226p:plain:h320

HTMLの編集

csv2rableを使って、CSVファイルの読み込みと表示を行います。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <script src="./jquery.csv2table-0.02-b-4.4.js" type="text/javascript" charset="utf-8"></script><!--jsファイルを指定-->
</head>
<body>
    <div id="view0"></div>
    <script>
    $(function(){
      $('#view0').csv2table('./npb_stats_hitter_utf8.csv'); //CSVデータを指定
    });
    </script>
</body>
</html>

HTML表示

Webブラウザで表示したイメージです。
f:id:dskevin:20211220175305p:plain:h320

まとめ

jQueryを使うことで、自分でJavaScriptで複雑な処理を書かずに、簡単に実装できました。今後も便利なプラグインがあれば紹介していきたいと思います。
また、今回も環境の設定方法から実装までの様子を動画にまとめました。よければこちらもご確認ください。
youtu.be

本記事が皆様のお役に立てば幸いです。最後まで読んでいただき、ありがとうございました!

Webページ上でCSVデータを表示・検索するHTML/JavaScript

CSVファイルから読み込んだテーブルデータをWebページ上に表示して、テーブル内の文字を検索するための、HTML/JavaScriptを紹介します。
f:id:dskevin:20211128172158p:plain:h160

HTMLコード

以下の処理を行います。

  • 検索ボックスで文字列を受取る
  • JavaScriptを実行
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>NPB 投手成績一覧 2009年~2021年</title>
</head>
<body>
    <h1>NPB 投手成績一覧 2009年~2021年</h1>
    <!--検索入力-->
    <form action="#">
    <input type="text" name="search" value="" id="search" />
    </form>
    <!--テーブル表示-->
    <table border="1" id="result">
        <tbody id="data_csv"></tbody>
    </table>
    <!--JavaScript-->
    <script type="text/javascript" src='./table_data_search.js'></script><!--JavaScriptを指定-->
    <script>
        getCsvData('http://127.0.0.1:5500/npb_stats_pitcher_utf8.csv');<!--CSVデータを指定-->
    </script>
</body>
</html>

 

JavaScriptコード

以下の処理を行います。

  • CSVファイルの読み込み
  • HTMLのテーブル形式に変換
  • レコード検索機能
// レコード検索処理
window.addEventListener( "DOMContentLoaded", 
    function(){
        const search = document.forms[ 0 ].search;
        const table = document.querySelector( "table" );
        const nohit = table.parentNode.insertBefore(document.createElement( "div" ), table.nextNode);
        nohit.textContent = "該当なし";
        nohit.style.display = "none";
        search.oninput = function(){
            const key = search.value.replace( /([\\\*\+\.\?\{\}\(\)\[\]\^\$\-\|\/])/g, "\\$1" );
            let hit = 0;
            [].forEach.call( table.rows,
                function( row, index ){
                    if( index==0 ){ return false }
                    row.style.display = [].some.call( row.cells,
                        function( cell ){
                            return ( new RegExp( key ) ).test( cell.textContent );
                        }
                    ) ? "table-row" : "none" ;
                    row.style.display=="table-row" ? hit++ : hit ;
                }
            );
            nohit.style.display = hit ? "none" : "block" ;
        }
    },
    false
);

const outputElement = document.getElementById('data_csv');

// CSVデータの読み込み
function getCsvData(dataPath) {
    const request = new XMLHttpRequest();
    request.addEventListener('load',
        (event) => {
            const response = event.target.responseText;
            convertArray(response);
        }
    );
    request.open('GET', dataPath, true);
    request.send();
}

// CSVデータをHTMLのテーブル形式に変換
function convertArray(data) {
    const dataArray = [];
    const dataString = data.split('\n');
    for (let i = 0; i < dataString.length; i++) {
        dataArray[i] = dataString[i].split(',');
    }
    let insertElement = '';
    dataArray.forEach(
        (element) => { insertElement += '<tr>';
            element.forEach(
                (childElement) => { insertElement += `<td>${childElement}</td>` }
            );
            insertElement += '</tr>';
        }
    );
    outputElement.innerHTML = insertElement;
}

 

表示イメージ

検索ボックスに値を入れるとその文字列を含む行が表示されます。




チーム背番号選手名防御率試合勝利敗北セーブホールド勝率打者投球回被安打本塁打与四球死球奪三振失点自責点WHIPDIPS
2021巨人11平内 龍太14.4030100.000245.082205882.007.52
2021巨人12デラロサ2.8346107131.00017541.13831223415131.213.43
2021巨人15サンチェス4.68145500.50031773.082132335440381.445.02
2021巨人17大竹 寛3.8640001.000112.150000112.143.12
2021巨人18菅野 智之3.19196700.462465115.2901525710241410.993.85
2021巨人19山崎 伊織------------------
2021巨人20戸郷 翔征4.27269800.529639151.21301958613875721.244.16
2021巨人21井納 翔一14.4050100.000265.0113105882.409.52
2021巨人23野上 亮磨1.6590114.0006316.1816015330.863.00
2021巨人26今村 信貴2.71173400.42927463.06652235921191.403.47
2021巨人30鍵谷 陽平3.1959301151.00018242.13951803019151.354.51
2021巨人33太田 龍------------------
2021巨人35桜井 俊貴5.402910061.00014533.13571612020201.536.09
2021巨人41中川 皓太2.475843125.57122054.24721054917151.042.57
2021巨人42メルセデス3.77177500.58336986.09652257436361.373.06
2021巨人45畠 世周3.075243111.57139096.283132549737331.123.73
2021巨人46鍬原 拓也------------------
2021巨人47髙橋 優貴3.392711900.550598140.2125186127657531.325.00
2021巨人49ビエイラ2.935603191.00022855.13832616418181.162.98
2021巨人50戸根 千明4.822920101.00016137.12542433620201.314.75
2021巨人53高梨 雄平3.695522120.50017139.03422154717161.413.07
2021巨人54直江 大輔4.9140110.0005111.0151424661.735.21
2021巨人56伊藤 優輔------------------
2021巨人57高木 京介4.421510011.0008118.12217015991.583.34
2021巨人58山本 一輝------------------
2021巨人59田中 豊樹2.84390002.00015238.02252013713121.114.38
2021巨人62横川 凱3.3820100.000378.092209431.384.87
2021巨人63古川 侑利18.0010000.000112.031310443.0014.12
2021巨人64大江 竜聖4.094700013.00014533.02921722316151.394.15
2021巨人90戸田 懐生0.0030000.000123.030100001.334.12
2021巨人91井上 温大------------------
2021巨人92沼田 翔平7.7120000.000112.131103221.716.12
2021巨人95堀岡 隼人------------------
2021巨人99山口 俊3.56152800.20033778.16663738334311.313.49


 
なお、 上記のデータは、以下のサイトから取得しました。
読売ジャイアンツ投手成績 - プロ野球データFreak

まとめ

JavaScriptを使うことで、Webページ上の表示をユーザの操作に合わせて動的に変えられます。このとき、別のページに遷移する場合に比べて、動作が軽いのが特徴です。実際の業務において、社内の情報共有サイトにデータを載せる際に、このような検索機能を付けたところ好評でした。

また、これからHTML/JavaScriptを使ってみたいという方に向けて、環境の設定方法から実装までの様子を動画にまとめました。よければこちらもご確認ください。
youtu.be


本記事が皆様のお役に立てば幸いです。最後まで読んでいただき、ありがとうございました!