diff --git a/docs/src/assets/skew_multimeasure_stats.html b/docs/src/assets/skew_multimeasure_stats.html
new file mode 100644
index 0000000..d7a6705
--- /dev/null
+++ b/docs/src/assets/skew_multimeasure_stats.html
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/examples/clock_skew_stats.svg b/examples/clock_skew_stats.svg
new file mode 100644
index 0000000..db3a99c
--- /dev/null
+++ b/examples/clock_skew_stats.svg
@@ -0,0 +1,922 @@
+
+
diff --git a/examples/skew_multimeasure_stats.jl b/examples/skew_multimeasure_stats.jl
new file mode 100644
index 0000000..a87a381
--- /dev/null
+++ b/examples/skew_multimeasure_stats.jl
@@ -0,0 +1,279 @@
+### A Pluto.jl notebook ###
+# v0.19.46
+
+using Markdown
+using InteractiveUtils
+
+# โโโก 7c69d12c-80a5-11ef-2674-e155a3483342
+begin
+ using Pkg
+ Pkg.activate("..")
+ Pkg.status()
+ true || include("../src/PSBoardDataBase.jl")
+end
+
+# โโโก effa7ed9-2ac4-4468-a474-e2bb662580fe
+begin
+ using PSBoardDataBase
+ using SQLite
+ using DataFrames
+ using DBInterface
+ using Tables
+ using CairoMakie
+ using Statistics
+ using PlutoUI
+end
+
+# โโโก f25e7e08-8a73-4cac-ac7c-d310725c558d
+md"""
+# Detailed research on clock skew measurement
+- distribution of clock skews
+- consistency of multiple measurement on the same board
+"""
+
+# โโโก 1a6322d4-9deb-4709-aa2e-df7d8be5b16f
+TableOfContents()
+
+# โโโก 11537f91-e16b-45f0-9768-6df842371d36
+db = SQLite.DB("../psboard_qaqc.db")
+
+# โโโก 268d3015-b8d3-48d9-b74a-062e258e0ec1
+SQLite.tables(db)
+
+# โโโก 62105832-df1f-4834-8da6-c542e22207d1
+md"""
+## Single runs
+"""
+
+# โโโก dea6f143-7916-4765-92f6-2bfb97a72835
+qaqc_single_results =
+ DBInterface.execute(db, sql"select * from qaqc_single_run_results") |> DataFrame
+
+# โโโก 41543c0c-d7c4-447b-a268-0d356c88d92c
+md"""
+## PS Board list
+"""
+
+# โโโก 633ecdee-7e2f-4de8-833a-21cd0351c1f1
+DBInterface.execute(
+ db,
+ sql"""
+ select * from ps_boards
+ """,
+) |> DataFrame
+
+# โโโก 87f1966e-3b07-4f9d-8fc4-7b7aa4319d50
+md"""
+## Run list
+"""
+
+# โโโก f379d43c-9300-41f4-b0fc-3c9d749e3105
+qaqc_runs = DBInterface.execute(db, sql"select * from qaqc_runs") |> DataFrame
+
+# โโโก 33e099bc-ac4b-4b5f-88e7-20f4463c98ef
+md"""
+## Positions
+"""
+
+# โโโก 0e13f848-0efb-4775-9e3e-518b32588a79
+qaqc_positions = DBInterface.execute(db, sql"select * from qaqc_positions") |> DataFrame
+
+# โโโก 181c3fe6-d087-42e2-b175-3fb84c42e3e8
+position_id_skew_map = select(qaqc_positions, [:id, :rising_ns]) |> Tables.rowtable |> Dict
+
+# โโโก 322cb530-65a5-4973-86f8-01ccc2439cc4
+md"""
+# Clock Analysis
+main part
+"""
+
+# โโโก c1caca5f-4cfd-4f22-82b4-7925002359e6
+clk_files =
+ readdir("../test/input/slavelogs/main/", join = true) |>
+ filter(endswith("_clk.txt")) |>
+ filter(!contains("nagoya")) |>
+ filter(!contains("630_190"))
+
+# โโโก 3e5607fd-2a8a-4a1a-9e7b-3f23ef216fad
+"""
+Get `(psbid, runid)`.
+"""
+function parse_filename(filename::AbstractString)
+ m = match(r"(?\d+)_(?\d+)_clk\.txt", filename)
+ parse(Int64, m[:psbid]), parse(Int64, m[:runid])
+end
+
+# โโโก c1b9c0c3-00f8-4199-b07f-8888f1be625c
+parse_filename("190_23_clk.txt")
+
+# โโโก d6d04013-e0e4-49d5-a450-07ae164bfaa3
+# Get skew and rise up time from clock measurement files
+# Use measurements recorded in qaqc_single_results
+df_rawskews =
+ clk_files .|>
+ (
+ file -> begin
+ skew_width = PSBoardDataBase.ClockParser.get_skew_and_riseup(file)
+ psbid, runid = parse_filename(file)
+ (psbid = psbid, runid = runid, skew = skew_width[1], width = skew_width[2])
+ end
+ ) |>
+ filter(
+ x ->
+ filter(
+ [:psboard_id, :runid] =>
+ ((psbid, runid) -> (psbid == x.psbid && runid == x.runid)),
+ qaqc_single_results,
+ ) |> !isempty,
+ ) |>
+ DataFrame
+
+# โโโก d7541b93-4c49-4dcd-bda0-91e447f44596
+# substract result of measurements of position dependency
+df_skews = let
+ df = leftjoin(
+ df_rawskews,
+ @view(qaqc_single_results[!, [:psboard_id, :runid, :position]]),
+ on = [:psbid => :psboard_id, :runid],
+ )
+ leftjoin!(df, @view(qaqc_positions[!, [:id, :rising_ns]]), on = [:position => :id])
+ transform!(df, [:skew, :rising_ns] => ByRow((x, y) -> x - y) => :skew)
+ select!(df, Not(:rising_ns))
+ select!(df, Not(:position))
+end
+
+# โโโก 420dce0e-4757-48d9-84ec-7ddfac2fdff6
+stephist(df_skews.width |> skipmissing |> collect)
+
+# โโโก d082e07c-3b42-4362-bebf-63356979a49b
+gdf_skews_on_psbid = groupby(df_skews, :psbid)
+
+# โโโก 25688d24-5aee-43d3-aff9-b9efa0556070
+combine(nrow, gdf_skews_on_psbid)
+
+# โโโก 239a808c-0411-4542-ae68-6ae6af333bd2
+df_nrow_ordered = let
+ df = combine(nrow, gdf_skews_on_psbid)
+ sort!(df, :nrow, rev = true)
+end
+
+# โโโก 8e57bde1-5f97-483d-906e-8ebfb65016d0
+@view(df_nrow_ordered[findall(>(1), df_nrow_ordered.nrow), :])
+
+# โโโก 92c2ac3f-8034-4e9e-aadb-8bb166fbc948
+df_skew_stats = let
+ df = combine(
+ gdf_skews_on_psbid,
+ sdf -> begin
+ if nrow(sdf) == 1
+ (; mean_skew = mean(sdf.skew), std_skew = missing, n = 1)
+ else
+ (; mean_skew = mean(sdf.skew), std_skew = std(sdf.skew), n = nrow(sdf))
+ end
+ end,
+ )
+ dropmissing!(df)
+ df
+end
+
+# โโโก 893253c3-f0b2-401f-b892-b23291bcf5c1
+fig_skew_stats = let
+ fig, ax, sc = scatter(
+ df_skew_stats.mean_skew,
+ df_skew_stats.std_skew,
+ marker = :x,
+ color = (Makie.wong_colors()[1], 0.8),
+ axis = (title = "skew mean vs std", xlabel = "mean", ylabel = "std"),
+ )
+ text!(
+ ax,
+ df_skew_stats.mean_skew,
+ df_skew_stats.std_skew,
+ text = string.(df_skew_stats.psbid),
+ color = (:gray, 0.5),
+ )
+ fig
+end
+
+# โโโก 6467dcaa-6bd6-45c7-8c08-b310a09b8b0b
+save("clock_skew_stats.svg", fig_skew_stats)
+
+# โโโก 79e2f5d8-4609-4e9f-949e-6dc1f88c0b19
+df_skew_stats_abnormals =
+ filter([:mean_skew, :std_skew] => ((m, s) -> m > -5 && s > 1), df_skew_stats)
+
+# โโโก d607e10e-854f-4652-9a34-9e22a188e315
+let
+ df = df_skew_stats_abnormals
+ fig, ax, sc = scatter(
+ df.mean_skew,
+ df.std_skew,
+ marker = :x,
+ color = (Makie.wong_colors()[1], 0.8),
+ axis = (title = "skew mean vs std", xlabel = "mean", ylabel = "std"),
+ )
+ text!(
+ ax,
+ df.mean_skew,
+ df.std_skew,
+ text = string.(df.psbid) .* "," .* string.(df.n),
+ color = (:gray, 0.7),
+ )
+ fig
+end
+
+# โโโก 2795fd06-2f59-4e5b-829d-a8e428646790
+md"""
+## ๅๆฃใ็ฐๅธธใซๅคงใใใใค
+ๅบๆฌ็ใซไบๆณ้ใใๅๆฃใฏๅฐใใ่คๆฐๅใฎๆธฌๅฎใงๆดๅ็ใช็ตๆใๅพใใใฆใใใใใใใคใไพๅคใใใฃใใ
+
+ใฏใใใฏpsbid 127(4ๅๆธฌๅฎ)ใๅซใพใใฆใใใใใใใฏใใผใฟใใผในใฎ็ทจ้ใในใงใใใใจใใใใใไฟฎๆญฃใใ็ตๆใๆถใใใ
+
+### psbid: 291
+- run: 83, 94
+- 83ใงcommunication error(SFPๅๆใ)
+### psbid: 460
+- run: 105, 132
+- psbid 444ใจๅใใ้ปๆบใฎๆใๅทฎใใซใใฃใฆใฏใญใใฏใฎ0ใจ1000ใ็นฐใ่ฟใใใใใฟใผใณ
+- ่ฟฝ่ฉฆใซ้ใใใฆใ
+### psbid: 545 (**ๅ้กใฎ**)
+- run: 126, 132
+- ใฉใกใใๆธฌๅฎ็ตๆ่ชไฝใซใฏๅคใชใจใใใฏใชใ
+ - ใฉใกใใ1ๅใ ใ็ซใกไธใใใใใ
+ - ็ซใกไธใใใใใใปใฉ้ทใใชใ
+- 126ใ้ปๆบใไธๅฎๅฎใชใจใใ ใฃใใใใใใชใใใ่จ้ฒใใชใ
+"""
+
+# โโโก Cell order:
+# โโf25e7e08-8a73-4cac-ac7c-d310725c558d
+# โ โ7c69d12c-80a5-11ef-2674-e155a3483342
+# โ โeffa7ed9-2ac4-4468-a474-e2bb662580fe
+# โ โ1a6322d4-9deb-4709-aa2e-df7d8be5b16f
+# โ โ11537f91-e16b-45f0-9768-6df842371d36
+# โ โ268d3015-b8d3-48d9-b74a-062e258e0ec1
+# โโ62105832-df1f-4834-8da6-c542e22207d1
+# โ โdea6f143-7916-4765-92f6-2bfb97a72835
+# โโ41543c0c-d7c4-447b-a268-0d356c88d92c
+# โ โ633ecdee-7e2f-4de8-833a-21cd0351c1f1
+# โโ87f1966e-3b07-4f9d-8fc4-7b7aa4319d50
+# โ โf379d43c-9300-41f4-b0fc-3c9d749e3105
+# โโ33e099bc-ac4b-4b5f-88e7-20f4463c98ef
+# โ โ0e13f848-0efb-4775-9e3e-518b32588a79
+# โ โ181c3fe6-d087-42e2-b175-3fb84c42e3e8
+# โโ322cb530-65a5-4973-86f8-01ccc2439cc4
+# โ โc1caca5f-4cfd-4f22-82b4-7925002359e6
+# โ โ3e5607fd-2a8a-4a1a-9e7b-3f23ef216fad
+# โ โc1b9c0c3-00f8-4199-b07f-8888f1be625c
+# โ โd6d04013-e0e4-49d5-a450-07ae164bfaa3
+# โ โd7541b93-4c49-4dcd-bda0-91e447f44596
+# โ โ420dce0e-4757-48d9-84ec-7ddfac2fdff6
+# โ โd082e07c-3b42-4362-bebf-63356979a49b
+# โ โ25688d24-5aee-43d3-aff9-b9efa0556070
+# โ โ239a808c-0411-4542-ae68-6ae6af333bd2
+# โ โ8e57bde1-5f97-483d-906e-8ebfb65016d0
+# โ โ92c2ac3f-8034-4e9e-aadb-8bb166fbc948
+# โ โ893253c3-f0b2-401f-b892-b23291bcf5c1
+# โ โ6467dcaa-6bd6-45c7-8c08-b310a09b8b0b
+# โ โ79e2f5d8-4609-4e9f-949e-6dc1f88c0b19
+# โ โd607e10e-854f-4652-9a34-9e22a188e315
+# โ โ2795fd06-2f59-4e5b-829d-a8e428646790