はじめに
「この技術を使う求人は年収が高い」という話は、たいてい平均年収で語られます。
ただ、年収のように一部の高い値に引っ張られやすいデータでは、平均と中央値で見え方がかなり変わります。
そこで、求人検索エンジン「Jobmore」の検索結果ページに表示されている**正社員求人の年収(平均・中央値)**を、技術スタック49種について集め、pandas と matplotlib で比べてみました。
先に結論を書くと、こうなりました。
- 平均で1位の React Native(602万円)は、中央値だと12位(451万円)
- 中央値で1位は LLM(588万円)。49技術のうち、平均より中央値の方が高いのは LLM と COBOL だけ
- 中央値は 480万円に5技術が同額で並ぶ。ランキングにするときは注意が必要
グラフの描き方(ダンベルチャート・スロープチャート)もコード付きで載せています。
データについて
| 項目 | 内容 |
|---|---|
| 取得日 | 2026年9月28日 |
| 取得元 | Jobmoreで各技術名を検索した結果ページの「雇用形態別の年収比較」 |
| 使った値 | 正社員求人の年収の平均・中央値・件数 |
| 対象 | 技術スタック49種(言語14・フレームワーク11・クラウド/インフラ8・DB8・モバイル/ゲーム5・AI/機械学習3) |
注意点です。
- 求人票に書かれた年収をもとにした値で、実際に支払われた額ではありません
- 1つの求人に複数の技術名が書かれていれば、それぞれの技術に数えられます
- 記号を含んで検索語として扱いにくい語(C#・C++・.NET)と、親になる技術と求人がほとんど重なる語(Next.js・Nuxt.js)は除外しました
使ったデータ(CSV・49行)
tech,category,mean,median,n
Java,言語,404,360,48824
Python,言語,423,389,34136
JavaScript,言語,413,362,25519
PHP,言語,384,347,29000
TypeScript,言語,469,450,15970
VBA,言語,348,323,5862
Ruby,言語,444,400,9792
COBOL,言語,393,400,6098
Swift,言語,479,425,6559
Kotlin,言語,485,450,7024
Perl,言語,400,362,778
Golang,言語,591,480,1505
Scala,言語,487,473,280
Rust,言語,485,480,1024
Node.js,フレームワーク,426,396,15456
React,フレームワーク,420,376,23735
Vue.js,フレームワーク,425,399,17213
Laravel,フレームワーク,444,400,8657
Spring Boot,フレームワーク,407,368,9444
Ruby on Rails,フレームワーク,470,420,4767
Angular,フレームワーク,483,478,4118
jQuery,フレームワーク,433,420,908
Django,フレームワーク,511,473,4615
Flask,フレームワーク,586,480,1493
FastAPI,フレームワーク,451,400,1445
AWS,クラウド/インフラ,454,400,44457
Linux,クラウド/インフラ,442,400,25876
Azure,クラウド/インフラ,459,399,30191
GCP,クラウド/インフラ,487,428,14871
Docker,クラウド/インフラ,440,396,12377
Terraform,クラウド/インフラ,535,420,5530
Kubernetes,クラウド/インフラ,493,420,4977
Nginx,クラウド/インフラ,433,420,1802
MySQL,DB,411,360,13474
PostgreSQL,DB,490,419,11704
Oracle,DB,419,399,17953
SQL Server,DB,391,347,8413
MongoDB,DB,467,420,2478
Redis,DB,487,420,2120
BigQuery,DB,527,493,1412
Snowflake,DB,520,492,1262
Flutter,モバイル/ゲーム,474,450,4534
React Native,モバイル/ゲーム,602,451,1076
Android,モバイル/ゲーム,412,400,7843
iOS,モバイル/ゲーム,450,400,6835
Unity,モバイル/ゲーム,433,360,5053
PyTorch,AI/機械学習,506,480,1155
TensorFlow,AI/機械学習,487,480,1085
LLM,AI/機械学習,552,588,4219
1. 平均と中央値を並べる(ダンベルチャート)
技術ごとに平均(オレンジ)と中央値(青)を横に並べ、線で結びます。線が長いほど、平均と中央値の差が大きい技術です。
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams["font.family"] = "Hiragino Sans" # Windowsなら "Yu Gothic" など
df = pd.read_csv("salary_by_tech.csv")
df["gap"] = df["mean"] - df["median"] # 平均 − 中央値(万円)
df = df.sort_values(["median", "mean"]).reset_index(drop=True)
fig, ax = plt.subplots(figsize=(8, 13))
y = range(len(df))
# 平均と中央値を線で結ぶ(ダンベルチャート)
ax.hlines(y, df["median"], df["mean"], color="#bbbbbb", lw=2, zorder=1)
ax.scatter(df["median"], y, color="#1f77b4", s=36, label="中央値", zorder=2)
ax.scatter(df["mean"], y, color="#ff7f0e", s=36, label="平均", zorder=2)
# 差が大きい技術と、平均 < 中央値 の技術を強調
for i, r in df.iterrows():
weight = "bold" if abs(r["gap"]) >= 100 or r["gap"] < 0 else "normal"
ax.text(250, i, r["tech"], va="center", ha="left", fontsize=9, fontweight=weight)
ax.set_yticks([])
ax.set_xlim(250, 620)
ax.set_xlabel("正社員の年収(万円)")
ax.set_title("技術スタック別 正社員年収の平均と中央値(上ほど中央値が高い)")
ax.grid(axis="x", ls=":", alpha=0.6)
ax.legend(loc="lower right")
fig.tight_layout()
fig.savefig("dumbbell.png", dpi=150)
49技術のうち**47技術で「平均 > 中央値」**でした。差の平均は +42万円 です。
年収の分布は、少数の高い求人が右に長く伸びる形になりやすく、平均がその裾に引っ張られるためです。
特に差が大きかったのは次の4つです。
| 技術 | 平均 | 中央値 | 差 |
|---|---|---|---|
| React Native | 602万円 | 451万円 | +151万円 |
| Terraform | 535万円 | 420万円 | +115万円 |
| Golang | 591万円 | 480万円 | +111万円 |
| Flask | 586万円 | 480万円 | +106万円 |
差が大きいのは、求人によって年収の幅が大きいということです。
平均だけ見て「この技術なら600万円」と考えると、実際に多い求人の水準とずれてしまいます。
逆に差が小さかったのは Rust(+5万円)、Angular(+5万円)、TensorFlow(+7万円)です。これらは求人ごとの年収のばらつきが小さい技術といえます。
2. 順位はどれくらい入れ替わるか(スロープチャート)
平均で並べた順位と中央値で並べた順位を、左右に置いて線で結びます。どちらかでトップ10に入る技術だけを描いています。
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams["font.family"] = "Hiragino Sans"
df = pd.read_csv("salary_by_tech.csv")
df["rank_mean"] = df["mean"].rank(ascending=False, method="min").astype(int)
df["rank_median"] = df["median"].rank(ascending=False, method="min").astype(int)
# どちらかの指標でトップ10に入る技術だけ描く
top = df[(df["rank_mean"] <= 10) | (df["rank_median"] <= 10)]
fig, ax = plt.subplots(figsize=(8, 7))
for _, r in top.iterrows():
color = "#1f77b4" if r["rank_median"] < r["rank_mean"] else "#d62728"
ax.plot([0, 1], [r["rank_mean"], r["rank_median"]], color=color, marker="o")
# 同順位の技術はラベルを1行にまとめる(中央値は同額が多く、重なるため)
for x, col, ha in [(-0.04, "rank_mean", "right"), (1.04, "rank_median", "left")]:
for rank, g in top.groupby(col):
names = " / ".join(g["tech"])
label = f"{names} {rank}位" if ha == "right" else f"{rank}位 {names}"
ax.text(x, rank, label, ha=ha, va="center", fontsize=9)
ax.invert_yaxis()
ax.set_xlim(-0.9, 2.0)
ax.set_xticks([0, 1], ["平均で並べた順位", "中央値で並べた順位"])
ax.set_yticks([])
for s in ["top", "right", "left"]:
ax.spines[s].set_visible(False)
ax.set_title("平均と中央値で順位が入れ替わる(青=中央値で上がる/赤=下がる)", fontsize=10)
fig.tight_layout()
fig.savefig("rank_shift.png", dpi=150)
- 中央値で順位が下がる(赤): React Native 1位→12位、Terraform 5位→18位、Kubernetes 10位→18位
- 中央値で順位が上がる(青): Rust 16位→4位、Angular 18位→9位、TensorFlow 12位→4位
平均のトップ10と中央値のトップ10(同順位を含めて11技術)で、共通していたのは7技術だけでした。
一方で、49技術全体の順位相関(スピアマン)は 0.88 です。
df[["mean", "median"]].corr(method="spearman")
全体の並びは大きくは変わりません。入れ替わりが目立つのは上位です。平均で並べると、高額な求人が一部に混ざって平均が押し上げられた技術が、上位に入り込みやすいためです。
3. 平均より中央値が高い LLM
LLM は平均552万円に対して、中央値は588万円です。49技術のなかで中央値が最も高く、しかも中央値の方が平均より高いという珍しい形でした。
中央値の方が高いのは、分布の低い側に裾が伸びているときです。
LLMという語を含む求人の多くは中央値付近にある一方で、年収の低い求人も一部含まれていて、それが平均を下げていると考えられます。
4. 中央値が480万円に5技術並ぶ
中央値のランキングを作ると、4位に Golang / Rust / Flask / PyTorch / TensorFlow の5技術が480万円で同額で並びます。
df["median"].value_counts().head(3)
# 400 8
# 420 7
# 480 5
求人票の年収は「月給40万円×12か月=480万円」のように、切りのいい金額に集まりやすいデータです。そのため中央値はその金額に張り付き、同じ値が並びやすくなります。
中央値でランキングを作るときは、次のような工夫をすると読み違えにくくなります。
- 平均も並べて書く(今回のダンベルチャート)
- 同じ順位を1行にまとめて表示する(スロープチャートの
groupbyの部分) - 四分位(25%・75%)も見て、ばらつきを確認する
5. データ基盤系スキルは平均でも中央値でも上位
平均と中央値のどちらで並べても上位に入ったのが、BigQuery(中央値493万円・2位)と Snowflake(492万円・3位)です。
たとえば BigQueryを使う正社員求人 は約1,400件あり、平均527万円・中央値493万円と差も小さめでした。
一部の高額な求人に頼らず、全体として年収水準が高いことがわかります。
まとめ
- 年収のデータは右に裾が長く、49技術中47技術で平均が中央値を上回った
- 平均だけのランキングだと、React Native や Terraform のように求人ごとの差が大きい技術が上に来やすい
- 中央値は切りのいい金額で同額が並びやすい。平均との併記や同順位の表示を工夫する
「技術別の年収ランキング」を見かけたら、平均なのか中央値なのかを確認してみてください。

