乙Py先生のプログラミング教室
初学者のためのプログラミング学習サイト

ランキング

今回は日本人の年収ランキングを求めてみました

解説動画はこちら



問題

年収500万円の人は、日本の年収ランキングで
何位くらいになるでしょうか?

参考 : 日本の人口 1.245億 (2023年)





年収ランキングを求める



今回は本当に正しい値を求める事は難しいので
ザックリと近似値を求めていきます。

日本人の年収は
対数正規分布
というものに近似しています。

この分布を用いて
ざっくりと計算をしていきます。

今回は日本人の
人口が12450万人
平均年収 450万円
年収中央値を 350万円
で設定して行います。



年収分布と上位何%を計算するコード

対数正規分布と
おおよその順位を計算するコードです

Google Colabなどに貼り付けて
incomeのスライドを変えてみてください。
import numpy as np
import matplotlib.pyplot as plt
import math
import ipywidgets as widgets
from IPython.display import display
%matplotlib inline

# 対数正規分布のパラメータ設定
median_income = 350  # 中央値(単位: 万円)
mean_income = 450    # 平均値(単位: 万円)
sigma = math.sqrt(2 * math.log(mean_income / median_income)) # 標準偏差を計算
mu = np.log(median_income) # 対数正規分布の μ を計算

# x軸の範囲(年収100万円 ~ 3000万円)
x = np.linspace(100, 3000, 1000)

# パーセンタイルランクを計算する関数
def calc_percentile_rank(income):
    return 1 - 0.5 * (1 + np.sign(income - median_income) * np.sqrt(1 - np.exp(-((np.log(income) - mu) ** 2) / (2 * sigma ** 2))))

# プロットを更新する関数
def update_plot(income):
    # 確率密度関数 (PDF) を計算
    pdf = (1 / (x * sigma * np.sqrt(2 * np.pi))) * np.exp(-((np.log(x) - mu) ** 2) / (2 * sigma ** 2))
    percentile_rank = calc_percentile_rank(income) # ランク計算
    total_population = 124_500_000 # 日本の人口
    rank = (percentile_rank) * total_population
    plt.clf()
    
    # 確率密度関数をプロット
    plt.figure(figsize=(12, 4))
    plt.plot(x, pdf, label="Log-normal Distribution", color="blue")
    plt.axvline(income, color="red", linestyle="--", label=f"Income = {income}") # incomeの位置に線を引く
    plt.axvline(median_income, color='orange', linestyle='--', label=f"Median: {median_income}")
    plt.axvline(mean_income, color='green', linestyle='--', label=f"Mean: {mean_income}")
    plt.fill_between(x, pdf, where=(x >= income), color="lightblue", alpha=0.5) # income以上の範囲を薄い青で塗りつぶす
    plt.title(f"nensyu {income} : Top {percentile_rank*100:.4f}% , Rank {rank:.0f}", fontsize=14)
    plt.xlabel("Income", fontsize=12)
    plt.ylabel("Density", fontsize=12)
    plt.legend()
    plt.grid(alpha=0.5)
    plt.show()

# スライダーを作成
income_slider = widgets.IntSlider(value=500, min=100, max=3000, step=1, description='Income:')
interactive_plot = widgets.interactive(update_plot, income=income_slider)
display(interactive_plot)
download


まとめ
日本人の人口が12450万人
平均年収450万円
年収中央値350の設定では

年収500万円くらいの人の年収は
約上位32.76% : 4078万位くらいになる

年収3000万円以上の人は
0.25%くらいしかいないっぽいです
(約30万人)

自分の年収を入れて
どれくらいのランクになるか
遊んでみてくださいね

今回はこれまでです
それでは




 

今回は読売ジャイアンツの
バッターの成績データを見てみました。

解説動画はこちら



さて
データ集めに関しては
色々なサイトにデータが載せられているかと
思いますので、そちらを参考にしてみてください。

データをCSVなどにまとめてたら
pandasなどで集計、可視化が行えますよ。

ここからは少しだけ
内容を見てみましょう。

データは1946-2020年までで
選手数は743名のデータでした。

本塁打の分布を見てみると
ほとんどの人が100本以下だったので
100本以上のみを可視化してみました。
download-2
100本以上本塁打を打てた選手は
30名ほどしかいないようです。

本塁打を多く打つのが大変だということが
分かると思います。

本塁打を打つには思い切りバットを振らないと
飛ばないはずなので、三振も多くなると思いました。

本塁打と三振の関係性を見てみると
download
一人だけ本塁打がかけ離れている人がいるので
これを除外してみると
download-1
傾向として本塁打が増えると三振も増えるようですが
この直線よりも下に位置する人は
三振するよりも本塁打を打つのが多いので
優秀な選手であると考えられると思います。


その他
色々なランキングや
個人の生涯成績なども解説していますので
興味のある方は動画をご覧くださいませ。

他のチームや
日本球界を見たいという要望があれば
是非コメントください。

それでは。


ある番組でとあるクイズ王の
出身高校の話が出ていて
気になって調べてしまいました。

解説動画はこちら



さて今回はこちらのサイトさんの
データを参考にさせていただいております。

参考:みんなの高校情報



さて
データはCSVなどにして
pandasのデータフレームに取り込みます。

こんな感じのデータになりました。
偏差値ランク学校名住所形態評判
0791灘高等学校兵庫県神戸市東灘区私立4.51
1782お茶の水女子大学附属高等学校東京都文京区国立4.14
2782開成高等学校東京都荒川区私立4.96
3782筑波大学附属高等学校東京都文京区国立4.27
4782筑波大学附属駒場高等学校東京都世田谷区国立4.56

これを使って行きたいと思います。

まず最初は統計情報です。
df['偏差値'].describe()
count    7765.000000
mean       50.005151
std         9.265878
min        35.000000
25%        42.000000
50%        48.000000
75%        57.000000
max        79.000000
Name: 偏差値, dtype: float64

全部で7765校分のデータで
平均偏差値は50ですが
中央値は48とやや低いので
低めにデータが偏っていそうですね。

と言うことで
偏差値ごとの学校数で
グラフ化してみましょう。

偏差値を横軸に
学校数を縦軸にとった
ヒストグラムを生成します。
divine_df  = pd.DataFrame(df['偏差値'].value_counts().sort_index())
divine_df['累積'] = divine_df['偏差値'].cumsum()/sum(divine_df['偏差値'])
divine_df.head()
偏差値累積
3570.000901
36930.012878
371810.036188
382560.069156
393500.114231

fig, ax1 = plt.subplots(figsize=(16,10))
ax2 = ax1.twinx()
ax1.bar(divine_df.index, divine_df['偏差値'], label="偏差値")
ax2.plot(divine_df.index, divine_df['累積'],label="累積",c='orange')
ax1.xaxis.set_ticks(pd.np.arange(35, 80, 1))
for i,d in enumerate(divine_df['偏差値']):
    ax1.text(divine_df.index[i], d, "{0}".format(d), size=10)
plt.show()
download

中央値は48でしたが
一番高校が多い偏差値は42ですね。

大体偏差値57位で
全体の80%の高校がおさまります。


ここからは偏差値TOPの学校を
みていきましょう。
df[df['ランク']<=10]
偏差値ランク学校名住所形態評判
0791灘高等学校兵庫県神戸市東灘区私立4.51
1782お茶の水女子大学附属高等学校東京都文京区国立4.14
2782開成高等学校東京都荒川区私立4.96
3782筑波大学附属高等学校東京都文京区国立4.27
4782筑波大学附属駒場高等学校東京都世田谷区国立4.56
5782東大寺学園高等学校奈良県奈良市私立4.44
6782ラ・サール高等学校鹿児島県鹿児島市私立4.09
7778慶應義塾女子高等学校東京都港区私立4.09
8778東京学芸大学附属高等学校東京都世田谷区国立4.49
9778神戸高等学校兵庫県神戸市灘区公立4.10


偏差値70以上の学校をみるには
こんなコードになりますが
数は218校あるようです。
df[df['偏差値']>=70]

逆にげべはどうなんだって
話になると思うので
げべはこんな感じでした。

df[df['ランク']==max(df['ランク'])]
偏差値ランク学校名住所形態評判
7758357759田口高等学校愛知県北設楽郡設楽町公立3.30
7759357759真壁高等学校茨城県桜川市公立2.77
7760357759京都国際高等学校京都府京都市東山区私立2.19
7761357759西山学院高等学校宮城県刈田郡七ヶ宿町私立2.75
7762357759東大阪大学柏原高等学校大阪府柏原市私立2.83
7763357759耶麻農業高等学校福島県喜多方市公立2.75
7764357759霞城学園高等学校山形県山形市公立2.91

次に都道府県別の偏差値を見てみましょう。

都道府県別などにしたい場合は
カテゴリとして都道府県が必要です。

住所から都道府県を抜き出す関数を作って
うまくデータ化します。
def function(se):
    if '北海道' in se:
        return '北海道'
    elif '東京都' in se:
        return '東京都'
    elif '大阪府' in se or '京都府' in se:
        return '大阪府'
    elif '京都府' in se:
        return '京都府'
    else:
        return se.split('県')[0]+'県'

df['都道府県'] = df['住所'].apply(function)
df[['都道府県','偏差値']].groupby("都道府県").describe().sort_values(('偏差値',  'mean'),ascending=False)
偏差値
countmeanstdmin25%50%75%max
都道府県
埼玉県352.053.9119329.41754940.045.053.061.076.0
東京都585.053.8581209.35388938.046.053.060.078.0
千葉県304.051.9802639.67387038.043.050.059.076.0
大阪府713.051.7082759.40246535.044.050.058.076.0
兵庫県334.051.5838328.87909336.044.050.058.079.0

平均偏差値だと埼玉がTOPになるようです。

偏差値70以上の高校だけに絞るコードは
次のようになりました。
df[df['偏差値']>=70][['都道府県','偏差値']].groupby("都道府県").describe().sort_values(('偏差値',  'count'),ascending=False)

40以下をみる場合は条件を40以下に
変更すれば見られます。

最後に都道府県別での箱ヒゲ図を
見ていたいと思います。

都道府県ごとの分布のような
ものを見たい場合にこの箱ヒゲ図は
非常に役立ちます。

seabornと言うライブラリを用いると
箱ヒゲ図を作ることができます。
import seaborn as sns

plt.figure(figsize=(16,10))
idx = df[['都道府県','偏差値']].groupby("都道府県").agg(np.median).sort_values('偏差値',ascending=False).index
sns.boxplot(x="都道府県", y="偏差値", data=df,order=idx)
plt.xticks(rotation=90)
plt.show()
download-1


まとめですが
埼玉県 , 東京都 , 千葉県 , 大阪府 , 兵庫県
この5県は偏差値の平均が高く

この近隣に住むと偏差値の高い高校に
通いやすいでしょうね。

自分は近所の高校で
卒業時の偏差値20くらいなので
今だとどの高校にも入れなさそうwww

今回はこれまでです
それでは


今回はとある映像コンテンツの
タイトルを調べてみました。

解説動画はこちら




ラグジュTVは凄まじく
素晴らしい映像コンテンツの
シリーズ物で1326本(動画作成時)
ありました。

さて調査方法ですが
次のような手順で行っています。

1.タイトルをスクレイピング
2.データ化
3.前処理(辞書作成,不要文字削除)
4.形態素解析
5.キーワードカウント

Pythonではスクレイピングや
形態素解析を簡単に行うことができます。

とあるサイトをスクレイピングするコードは
お伝えできないのですが、
形態素解析は janome ライブラリを用いて
タイトルをキーワードに分割し
その出現頻度でランク付けしました。


TOP41-50
41自ら
42スタイル
43彼氏
44よう
45男性
46全身
47濃厚
48敏感
49スレンダー
50興奮

TOP31-40
31カラダ
32美女
33
34旦那
35男根
36ランジェリー
37卑猥
38責め
39本能
40彼女



TOP21-30
21恍惚
22グラマラスボディ
23AV
24
25オイル
26必見
27性欲
28何度
29ボディ
30

口に出すのも恥ずかしい
言葉がたくさん並んでいますねーーーー

TOP20からは動画の方をご覧くださいませ

それでは。
 

このページのトップヘ