カレーちゃんブログ

Kaggleや競技プログラミングなどのこと

2024年に私のアフィリエイトで売れた本ランキング

2024年に私のAmazonのアフィリエイトで売れた本のランキングです。 毎年どのような本が売れたのかみるのが楽しいので、やっています。

ランキングは冊数で多い順のランキングです。

第1位 Kaggleに挑む深層学習プログラミングの極意 (KS情報科学専門書)

セールの時に紹介したのが、驚くぐらい売れました。
自分の本より売れるのすごいですね、Xで欲しい人にたくさん露出できたんでしょう。

第2位 面倒なことはChatGPTにやらせよう

こちらもセールの時によく売れました。50%オフセールすごいですね。

去年たくさん売れた本なのに、セールの時以外は自分のリンクからはあまり売れていません。買ってもらうということは難しいことだと実感しました。

第3位 PythonではじめるKaggleスタートブック

note.com

ほぼ第2位と同じぐらいの冊数売れています。この記事などよく読んでもらっているので、そこから売れているんだと思います。

第4位 Kaggleで勝つデータ分析の技術

note.com

note.com

この本も継続的に売れます。こちらもこれらの記事からよく買ってもらっている。 素晴らしい本を自信を持って紹介するのが大事。

第5位 【極!合本シリーズ】 Dr.コトー診療所1巻

一冊11円セールはすごいですし、Dr.コトー診療所好きです。

過去の記事

2020年 機械学習関係書籍の売上ランキング上位7冊 - カレーちゃんブログ

2023年に私のアフィリエイトで売れた本ランキング - カレーちゃんブログ

また来年この企画やりたいと思います。

2024年12月時点、Kaggleの国別GrandMasterの数

以前、Kaggleの国ごとのGM、Masterの数を毎週集計してくれるNotebookを公開しました。 この記事では、2024年12月7日時点のGMの数(コンペティション、データセット、ノートブック、ディスカッション)を記録します。

(注) Notebookは途中より、毎週自動実行する設定に変更しました。

さらに詳しい人数などは、Notebookを参照ください。

コンペティション

Number of Competitions Grandmaster by Country

Japan 74
United States 62
China 43
None 24
Russia 16

データセット

Number of Datasets Grandmaster by Country

India 21
None 18
United States 18
Pakistan 8
Egypt 5

ノートブック

Number of Notebooks Grandmaster by Country

United States 23
India 23
None 19
Pakistan 8
United Kingdom 7
Japan 7
Turkey 7
Iran 7

ディスカッション

Number of Discussions Grandmaster by Country

United States 26
India 12
France 7
None 6
United Arab Emirates 4

まとめ

コンペティションのGrandMasterの数が日本74, アメリカ62,中国43となり日本は間違いなくKaggle大国。Masterの数でいってもアメリカ396, 日本291となっており、追いつく日が来そうです。

この記事はKaggle Advent Calendar 2024の6日目の記事として書きました。

2023年に私のアフィリエイトで売れた本ランキング

2023年に私のAmazonのアフィリエイトで売れた本のランキングです。 どのような本を紹介したのか、確認するためにやってみましょう。

以下、7位までランキングと、紹介したブログ記事のリンクです。

第1位 PythonではじめるKaggleスタートブック

自分が書いた本で、自信を持って紹介しているので売れますね。
夏にあったセールでKindle版がとても売れました。

次の記事でもかなり売れました。

第2位 Python実践データ分析100本ノック

以前は紹介したんですが、最近はあまり紹介していないんだけれど、売れ続ける本。すごい。
100本ノック系の本は売れるのでしょうか。

第3位 機械学習プログラミング 達人データサイエンティストによる理論と実践

良い本なので、これも安定して売れます。
LLMとかの時代になっても、こういう機械学習の知識は必須でしょう。

第4位 Kaggleで勝つデータ分析の技術

圧倒的に良い本で、ブログもいくつか書いているのでとても売れます。

第5位 アルゴリズム的思考力が身につく! プログラミングコンテストAtCoder入門

私のアフィリエイトで、競技プログラミングの本が5位に入ってくるとは思いませんでした。
次の記事を読んで買ってくれたのだと思います。この本を読んで緑色になれましたというのは説得力がありそう。

第6位 Approaching (Almost) Any Machine Learning Problem

英語版の方が翻訳版より売れるのは珍しいと思います。Kindle版が安いからでしょうか。

第7位 Kaggleのチュートリアル第6版

こちらも私が書いた本。多くの人にKindle Unlimitedで読んでもらっているのですが、購入して読んでくれる人もいました。

番外 面倒なことはChatGPTにやらせよう

私が書いた本で2024年1月の発売ですが、まだ売り上げ計上されていないので、ランキングには含めず。 来年もこのランキングをやるとしたら、1位か2位でしょうか。

過去の記事

2020年 機械学習関係書籍の売上ランキング上位7冊 - カレーちゃんブログ

KaggleNotebookでPyPy、Cythonの速度比較

Kaggle NotebookでPyPyやCythonがどれぐらい使えるか試してみましたという記事です。
【競プロ】PythonとPyPyの速度比較 - Qiitaを参考にしています。
時間は1度の計測で測っており、コードの書き方も色々とあるので、大体こんな感じと捉えてもらえると良いんじゃないでしょうか。

PythonとPyPyは同じコードで実行。Cythonは型を指定しないと遅いので、指定する方法で実行しました。

この記事はKaggle Advent Calendar 2022の15日目の記事です。

NotebookでPyPyとCythonの使うための準備

PyPy

!apt-get install pypy -y

PyPyは、このコマンドでインストールした後、マジックコマンド%%pypyで使用することができます。

Cython

Cythonは、%load_ext Cythonでマジックコマンドを有効にした後、マジックコマンド%%cythonで使用することができます。

実際に動かしたnotebookを公開していますので、こちらを見てもらうと使い方がすぐにわかると思います。
https://www.kaggle.com/code/currypurin/python-pypy-cython-comparison-v2

ループ

for i in range(10**8):  # 10^8
    pass
Python PyPy Cython
4.13s 376ms 388ms

PyPy、Cythonにすることで早くなります

Cythonは型を指定する場合、例えば次のように書く。
以降は個別には書かないのでどのようなコードにしたかは、notebookを見てもらえれば。

cdef long i
for i in range(10**8):
    pass

代入文

ans = 0
for i in range(10**8):
    ans = i
Python PyPy Cython
8.21.s 603ms 405ms

単純なloopと比べて、PythonとPyPyはやや遅くなる。Cythonはほぼ変わりません。

四則演算(定数)

for i in range(10**8):
    1 + 1
    1 - 1
    1 * 1
    1 // 1
Python PyPy Cython
3.79s 377ms 370ms

四則演算しても、単純なloopと変わらないということなんでしょうか。

四則演算(変数)

for i in range(2, 10**8):
    i * (i % (i - 1)) + i
Python PyPy Cython
19.6s 1.78ms 356ms

変数の四則演算は、PythonとPyPyは定数の四則演算に比べて遅い。Cythonは変わらず。

大きい数の演算

prd = 1
for a in range(1, 110000):
    prd *= a

print(len(str(prd)))
Python PyPy Cython
7.88s 5.67s -

大きい数(ここでは、最終的に50万桁)は、PythonとPyPyはあまり変わらす。 Cythonは大きい数を扱うことができず。逆に大きい数を扱うときはオーバーフローしないように注意する必要がある。Cythonを使うときは整数型のオーバーフローに気を付けよう: 笑い猫の科学技術の備忘録が参考になりました。

if文

for i in range(10**8):
    if i == 0:
        pass
Python PyPy Cython
8.74s 346ms 360ms

if文は単純はloopとほぼ変わらず。Pythonは単純なloopよりやや遅い。

ここからリストです

シーケンシャルアクセス

A = [i for i in range(10**7)]

for a in A:
    pass
Python(全体) Python(ループのみ) PyPy(全体) PyPy(ループのみ) Cython(全体)
1.1s 398ms 247ms 34ms 540ms

Cythonは次のようなコードで、全体でどれぐらいかかっているかという時間です。(以降同じ)

cdef long a
cdef long[10_000_000] A

for a in A:
    pass

ランダムアクセス(Read)

A = [i for i in range(10**7)]

for i in range(10**7):
    A[i]
Python(全体) Python(ループのみ) PyPy(全体) PyPy(ループのみ) Cython(全体)
1.79s 1020ms 278ms 31ms 554ms

シーケンシャルアクセスと比べ、やや遅くなる。CythonよりもPyPyの方がやや早い。

ランダムアクセス(Write)

A = [i for i in range(10**7)]

for i in range(10**7):
    A[i] = 0
Python(全体) Python(ループのみ) PyPy(全体) PyPy(ループのみ) Cython(全体)
1.75s 1070ms 238ms 32ms 586ms

書き込みしてもほぼ時間は変わらず。

ソート

from random import randint, seed
seed(0)
A = [randint(1, 1000000) for _ in range(10**6)]  # 10^6
Python(全体) Python(ソートのみ) PyPy(全体) PyPy(ソートのみ) Cython(全体)
1.85s 338ms 440ms 228ms 715ms

PyPYのソートは早いんでしょうか。

文字列結合 (+による結合)

ans = ''
for i in range(10**5):  # 10**5 or 10**6
    ans += 'a'
Python(105) Python(106) PyPy(105) Cython(105)
20.1ms 180ms 180ms 910ms

PyPyもCythonも文字列の結合は遅いので、Pythonを使うとよさそうです。

文字列結合 (joinによる結合)

A = [str(i) for i in range(10**7)]  # 10^7
ans = ''.join(A)
Python PyPy Cython
2.89s 1.73s 3.26s

joinによる結合は、PyPyがやや早いが、これもPythonで良さそう。

deque

from collections import deque

que = deque(range(10**7))

for i in range(10**7):  # 10^7
    que.append(que.popleft())
Python PyPy Cython
2.26s 1.26s 3.18s

優先度付きキュー

import heapq

que = [0]
for i in range(10**7):  # 10^7
    heapq.heappush(que, i)

for i in range(10**7):
    heapq.heappop(que)
Python PyPy Cython
11.2s 5.35s 9.77s

dequeも優先度付きキューもPyPyはPythonの半分の時間くらい。

組み込み関数呼び出し

for i in range(10**7):  # 10^7
    max(0, i)
Python PyPy Cython
2.63s 165ms 505ms

PyPyが早いです。

ユーザ関数呼び出し

def func():
    return 0

for _ in range(10**7):  # 10^7
    func()
Python PyPy Cython
1.38s 172ms 563ms
cdef long i

cdef func():
    return 0

for i in range(10**7):  # 10^7
    func()

Cythonの場合は、このようにcdefと定義すると早い。
それでもPyPyの方が早かったです。

再帰関数

import sys
sys.setrecursionlimit(10**7)

def dp(N):
    if N == 0:
        return 0
    else:
        return 1 + dp(N - 1)

print(dp(10**4))  # 10^4
Python PyPy Cython
16.1ms 153ms 656ms

再帰関数は10**5だとnotebookが落ちてしまう。なぜだろう。
再帰関数はPythonを使うのが良さそうです。

参考にしたページ

気になることがあれば、コメントかtwitterまでお願いします。

もらったコメント

AtCoder緑色になりました

AtCoder緑色になったので、ここまでやったことと、どうやって始めたか、これから何をやるかなど書いてみます。
Atcoderの世界では、色変記事というらしい。

これからはじめる人の少しでも参考になってくれたら嬉しいですし、自分のモチベーションのアップになることも期待して書いています。

緑になるためにやったこと

Pythonで競技プログラミングをはじめることにして、「鹿本」、「鉄則本」という今年に入って発売された、次の2冊の本をやりました。
この2冊の本により、競技プログラミングに入門し一通りの知識を得ることができました。
とてもわかりやすい本で、もう神の本です。競技プログラミングを始める人にはとてもおすすめしたい。

この2冊をどこまで読み進めたかというと、1冊目の鹿本は、ほぼ全て読了。2冊目の鉄則本は半分程度読了しました。

どちらも、C++とPythonに対応で(鉄則本はJavaにも対応)、多くの人におすすめできます。 鹿本のほうが初級者向けだと思うので鹿本→鉄則本の順に読み進めるのが良いかなと思いました。(ある程度アルゴリズムができる人は鉄則本からでも良いのかもとも思いました)
練習問題がとても多いので、全部解きながら進めるとかなりの時間がかかります。
本については説明が長くなるので、細かい紹介は、今後公開するYoutubeでもう少し詳しく説明したいと思います。

これらの本がどこまで対応しているかは、鉄則本著者のE869120さんがまとめられていました。

競技プログラミングをはじめるにあたり役立ったこと

AtCoderを続けるにあたり使っているルールや環境です。これからはじめる人の役に立ってもらえると良いなというところ。

環境構築

Dockerで環境構築しました。PCが変わっても同じ環境で取り組めるので便利です。 適当にPython環境を作ってしまったので、これが最善かはわかりませんが特に不具合はおこっていません。 環境を作ったDockerfileなど一式を公開しておきます。(参考にした記事があったのですが、どれだっただろう...あとで探します)

この環境には、AtCoderからのテストケースなどのファイルのダウンロードや、提出ができるatcoder-cliと、online-judge-toolsといツールを入れています。これについて説明します。

atcoder-cli

コマンドラインツールatcoder-cliを公開しましたを見てもらうのがわかりやすいと思います。 私が使っているコマンドはコンテスト用ディレクトリ作成と提出機能。

例えば、abc(AtCoder Begiiner Contest)279のディレクトリを作成するときは
$ acc new abc279 とします。すると次のようにディレクトリが作成され、サンプルケースもダウンロードされる。

そこで私は、各問題毎にmain.pyというファイルを作って、問題を解いています。

AtCoderへの提出の時には、
$ acc submit main.py とします。PyPy3の時は、
$ acc submit main.py -- --guess-python-interpreter pypy
で提出。

online-judge-tools

提出する前は、テストケースで全てACするか試しておいたほうが良いので、その場合に使うのがonline-judge-toolsです。

main.pyにコードが書き終わったら $ oj t -c " python3 ./main.py" -d ./tests/
でテスト。次のようにテストケースがACするかテストできます。テストケースに通らないコードを提出してしまうのは、ペナルティがついてしまい損なので、このようなテストケースのACを確認できるツールは初心者には必須です。

AtCoder Problems

AtCoder Problemsというとても便利なサイトです。とても機能が多いのですが特に便利な点を3つ紹介します。

過去の問題の難易度を確認できる

まず便利なのが、過去の問題の難易度を見ることができるところ。(次の画像参照)ABCコンテストだと緑の人は大体Dぐらいまで解いているんだなーとか、この問題は茶色の人は大体解けるんだなーということがわかります。

易・適・難の3つで問題をレコメンドしてくれる

UserのRecommendationの箇所には、自分のランクに応じて、Easy、Moderate、Difficultの3つに分けて解くべき問題をレコメンドしてくれます。(詳しくはUser Guideのレコメンド参照) 私のランクだと、EasyだとDifficulty574~558、Moderateだと884~864、Difficultだと1193から1177の問題がレコメンドされました。(次の画像はDifficultのレコメンド)

簡単すぎる問題や、難しすぎる問題を解いても実力の向上にはつながらないので、ちょうど良い難易度の問題をレコメンドしてくれる機能は便利です。

Virtual Contests

AtCoder Problems上でAtCoderの過去の問題と時間を決めて、コンテスト形式で問題を解いて行くことができます。
他の人を誘って複数人でコンテスト形式で問題を解くこともできるし、1人でもコンテスト形式にすることで集中して解けるので重宝しています。
パフォーマンスの推定値も出るのて、単純に解いていても楽しいです。

提出されたコードの並び替え

AtCoderの過去問を解いて、他の人のコードを参考にする場合に、問題、言語、結果を入れて検索をするのはよくやると思います。
ただこれだけだと、とても数が多いので、ここから更に絞り込むための方法です。

問題、言語、結果で絞り上の画像のようになった画面で、提出日時、コード長、実行時間をクリックすることで、それぞれ提出日時の早い順、コード長の短い順、実行時間の短い順に並び変えることができます。 多くの場合は、強い人のコードを見ると参考になることが多いので、提出日時が一番早い順に並び替えて上から見ると参考になることが多かったです。
その他、コード長の短い順と実行時間の短い順も参考になることがありました。

AtCoderのお気に入り機能

AtCoderのサイト上で、参加者をお気に入りに追加することができます。
知り合いをお気に入りにしておき、コンテスト中はお気に入りが表示される順位表にしておくと、知り合いと勝負している感じになり、コンテスト中も楽しいです。

これから水色になるためにやること

競技プログラミングは楽しいですし勉強になるので、少なくても黄色になるぐらいまでは続けたいと思っています。
次の目標は水色になることです。 水色になるためにですが、
まだ鉄則本を半分までしか読めていないので、鉄則本を12月中くらいで読み切り、読み切った後は、鹿本と鉄則本の理解が不十分なところを復習したいと思っています。
おそらくそれで水色ぐらいには行くのではないでしょうか。 終わったら次のことも進めたい。

水色になった後に何をやるかは、水色になった記事でまた考えたいと思います。

その他参考にした資料など

終わりに

アウトライン書いてから時間がかかったけれど、緑になって次のコンテストに出る前に書けてよかった。茶色に落ちてしまったら書きづらいし笑
後ほど、Youtubeの動画も作ります。

Kaggle notebookの環境が変わったのでメモ

2022年10月20日、KaggleのnotebookのGPUとCPUのメモリが変わったとアナウンスがあったので、どう変更になったのか確認したメモです。

変更点は次の2点

  • GPUでは、T4x2が選択可能になった
  • CPUのメモリが16GBから30GBになった

GPU

GPUはT4x2とP100とどちらか選択することができる。

T4のメモリは約15GB。

CPUのメモリ

GPU使用時のCPUメモリは16GB、GPUなしの時はCPUメモリが32GB

コア数

コア数は、確認する時によって異なるのかよくわからないのですが、おそらくこのKaggle bookに記載があるものから変更はないようです。

Colaboratoryの有料プランの仕組みが変更となったので仕様を確認しました(2022年9月)

Google Colaboratoryの有料プランが、これまでの定額使い放題から、クレジット制に移行となりました。
変更点を確認したいと思います。

料金

これまでと変わらずに、Colab Proは月あたり1,072円、Colab Pro+は5,243円となっています。(https://colab.research.google.com/signup?utm_source=faq&utm_medium=link&utm_campaign=seems_too_good)

それにより、Colab Proは100コンピューティングユニット、Colab Pro+は500コンピューティングユニットというGPUを使用できるクレジットがもらえます。

GPU

GPUは、notebook起動時の「標準」と「プレミアム」の選択に応じ、「T4」か「V100 or A100」が通常は与えられるとのこと

コンピューティングユニットの消費

Colab Pro+のアカウントで試してみたところ1時間あたり次の消費量でした。

T4: 1.96
A100: 13.08
V100: 5.36

TPUは1時間約2の消費でした。

1ヶ月あたりどれぐらい使えるか

Colab pro+の500コンピューティングユニットで計算すると

  • A100を使うとすると、約38.2時間 (500/13.08)
  • V100を使うとすると、約93.3時間 (500/5.36)

これまでの、ずっとV100やA100を使えていた環境とは大きく変わりそうです。

感想

画像生成を試してみる人が増えてきたことにより、格安なcolaboratoryをを使う人が増えてきたので、この制限もしょうがないかもしれません。 この金額だとすると、GCPでインスタンスをスポットで借りた方が安いです。 これからは少し割高だけれどすぐに使えるGoogle Colaboratory、格安なGCP(Google Compute Engine)のスポットインスタンスという使い分けになってくると思います。