ちくわ君と学ぶデータサイエンス

初夏の朝、森の研究所では、ちくわ君が赤い木の実をかじりながら大きな表とにらめっこしていた。画面には森の気温の記録がずらりと並んでいる。

「ちくわさん!大変です!」勢いよく扉が開いて、はんぺん君が一冊のノートを抱えて駆け込んできた。

「おはよう、はんぺん君。今日はずいぶん大きな荷物だね」ちくわ君は木の実を置いて振り返った。

「これ、僕のドングリ記録ノートなんです!日付と、天気と、気温と、拾えたドングリの数を、毎日きちんとつけてみたんです。もう一か月分も溜まりました!」はんぺん君は誇らしげにノートを開いた。

「おお、これはすごいね」ちくわ君は身を乗り出して、嬉しそうにページをめくった。「一か月も毎日続けたのかい?大したものだよ、はんぺん君」

「えへへ、我ながらがんばりました!」はんぺん君は胸を張った。「でも……せっかく集めたのに、この数字の山をどうしたらいいのか分からなくて。眺めているだけだと、ただの数字なんです」

「いい質問だね」ちくわ君は嬉しそうに目を細めて、新しい木の実を口に放り込んだ。「それこそ、僕の大好きな『データサイエンス』の出番なんだ。聞いたことはあるかな?」

「データ……サイエンス?データの科学、ですか?」

「そのとおり。データサイエンスは、集めたデータから役に立つ知識を取り出すための学問なんだ。料理に例えると分かりやすいかな。ドングリの記録は集めたばかりの食材。泥を落として、下ごしらえをして、調理して、最後にお皿に盛りつける。データも同じで、整えて、分析して、分かりやすく見せる。その一連の流れ全部がデータサイエンスなんだよ」

「料理ですか!それなら僕、得意かもしれません!」はんぺん君の目が輝いた。

「はは、はんぺん君の食いしん坊ぶりは折り紙つきだからね。じゃあ最初の工程、『下ごしらえ』から始めよう。はんぺん君のノートをコンピューターに入力して、Pythonで読み込んでみるよ」ちくわ君は楽しそうにキーボードを叩き始めた。

import pandas as pd

df = pd.read_csv("donguri.csv")
print(df.head())

#          date weather  temp  count
# 0  2026-05-01    晴れ  18.5     42
# 1  2026-05-02    曇り  16.0     31
# 2  2026-05-03    雨    14.5     12
# 3  2026-05-04    晴れ  19.0     45
# 4  2026-05-05    晴れ  20.5    NaN

「あれ?最後の行、ドングリの数がNaNになってます。これは何ですか?」はんぺん君が画面を覗き込んだ。

「NaNは『データがない』という印だよ。5月5日のページ、何があったか覚えてるかい?」

「あっ……その日は拾ったドングリを数える前に、全部食べちゃった日です……」はんぺん君は小さくなった。

「はは、正直でよろしい。現実のデータには、こういう抜けや間違いがつきものなんだ。だからまず、欠けているデータがどれだけあるかを確認して、扱いを決める。これを『データクリーニング』と呼ぶんだよ」

print(df.isnull().sum())  # 欠損値の数を確認

df = df.dropna()  # 今回は欠損のある行を取り除く

「下ごしらえが済んだら、次は食材をよく観察する番だ。データの特徴をつかむために、まずは基本的な統計量を見てみよう」

print(df["count"].describe())

# mean     32.4   ← 平均
# std      11.8   ← 標準偏差(ばらつき)
# min       8.0   ← 最小値
# max      52.0   ← 最大値

「平均は32個くらいなんですね。でも8個の日もあれば52個の日もある……ずいぶん差がありますね」

「いい観察だね!その『差』の理由を探るのが、データサイエンスの一番ワクワクするところなんだよ。数字の表だけだと分かりにくいから、グラフにしてみよう。きっと驚くよ」

import matplotlib.pyplot as plt

df.groupby("weather")["count"].mean().plot(kind="bar")
plt.ylabel("ドングリの数(平均)")
plt.show()

画面に棒グラフが現れた。晴れの日の棒がひときわ高く、雨の日の棒は半分以下しかない。

40 30 20 10 0 44個 30個 13個 晴れ 曇り
図:天気ごとのドングリの平均個数。晴れの日は雨の日の3倍以上

「わぁ!晴れの日はドングリがたくさん拾えて、雨の日は少ないんだ!グラフにすると一目で分かりますね!」はんぺん君は興奮して尻尾を振った。

「これが『可視化』の力だよ。人間も動物も、数字の列より絵のほうがずっと早く理解できるからね。じゃあ今度は、気温との関係を数字で確かめてみよう。『相関係数』という、二つの量がどれくらい一緒に動くかを表す指標があるんだ」

print(df["temp"].corr(df["count"]))
# 0.72

「0.72……これは大きいんですか?」はんぺん君は首をかしげた。

「相関係数は−1から1までの値をとるんだ。1に近いほど『一方が増えるともう一方も増える』関係が強い。0.72はかなり強い正の相関だね。つまり、気温が高い日ほどドングリがたくさん拾えている、ということになる」

「すごい!じゃあ、暖かくなればなるほどドングリが増えるんですね!」

ちくわ君は木の実を持つ手を止めて、少し真剣な顔になった。「そこは気をつけてほしいんだ。相関があることと、原因であることは別なんだよ。例えばこの一か月、セミの声が大きい日ほどドングリが多かったかもしれない。でも、セミがドングリを増やしているわけじゃないよね?」

「た、確かに……どちらも『暖かい日』に起きてるだけですね」

「そのとおり!本当の原因は気温や天気のほうで、セミは関係ない。これを『相関は因果を意味しない』と言うんだ。データサイエンスで一番有名な落とし穴だから、ぜひ覚えておいてね」

「はい!……でもちくわさん、観察して、グラフにして、関係を調べて。この先には何があるんですか?」

「いよいよ仕上げの料理、『予測』だよ」ちくわ君は嬉しそうにコードを書き足した。「気温とドングリの数の関係を直線で表してみる。これは『回帰分析』といって、機械学習の入り口でもあるんだ」

from sklearn.linear_model import LinearRegression

X = df[["temp"]]
y = df["count"]
model = LinearRegression().fit(X, y)

print(model.predict([[22.0]]))  # 気温22度の日の予測
# [44.6]

「気温22度の日は、だいたい45個くらい拾えそう、という予測だね」

「45個!明日の気温が分かれば、お出かけ前にどれくらい拾えるか分かっちゃうんですね!魔法みたいです!」

「ふふ、魔法じゃなくて、はんぺん君が一か月コツコツ記録したデータの力だよ。世の中でも同じことが行われているんだ。お店が明日の売り上げを予測したり、動画サイトが君の好きそうな動画をおすすめしたり、お医者さんが検査データから病気の兆候を見つけたり。全部、データサイエンスの応用なんだよ」

「僕のドングリ予測と同じ仕組みが、そんなところにも……」はんぺん君は感慨深げにノートを撫でた。

「ただし、一つだけ大事な約束があるんだ」ちくわ君は木の実を手のひらで転がしながら、いたずらっぽく笑った。「どんなに立派な分析も、元のデータが偏っていたら正しい答えは出ない。例えばはんぺん君が、雨の日はお布団でゴロゴロしていて散歩に出なかったとしたら、どうなると思う?」

「えっと……あっ!雨の日のデータが、ぜんぶ抜けちゃいます!」

「大正解!そうすると『雨の日はドングリが少ない』ことに、いつまでも気づけないままになる。自分のデータがどんなふうに偏っているか想像できること。それが、いいデータサイエンティストの条件なんだよ」

日が高く昇り、研究所の窓から明るい光が差し込んでいた。はんぺん君は大切そうにノートを抱え直した。

「ちくわさん、ありがとうございました!ただの数字の山だと思っていたノートが、宝の山に見えてきました。家に帰ったら、早速続きのデータを集めて、自分で分析してみます!」

「それはいいね。次は場所ごとの記録も足してみるといいよ。どの木の下が一番拾えるか分かったら、もっと面白い分析ができるからね。分析できたら、ぜひ僕にも見せてよ。楽しみにしてるから」ちくわ君は温かく手を振って見送った。

はんぺん君が元気に駆けていったあと、ちくわ君は森の気温データの表に向き直った。次の研究は、森全体のドングリ豊作予測なんてどうだろう。そう考えると少し心が弾んで、ちくわ君は新しい赤い木の実へ手を伸ばした。

森の研究所には、今日もデータと発見の喜びが満ちていた。

教育 データサイエンス Python 統計 友情