見出し画像

スギ花粉飛散量のデータ分析@データ前処理編①

さぁ、続いてはデータ前処理です。
正直、ここで8割くらい時間を割きましたww

たくさんあって、全て書き込めないので、コンパクトにしてます。
もし興味ありましたら、答えますので、コメントください^^

データの結合

まずは平成のデータと令和のデータをそれぞれ結合することにしました。
と思って、df = pd.concat()を用いたけど

…できねぇじゃねぇか!!!!

元データを確認すると、そりゃできねぇわ…と

この他にも、八王子の列があったりなかったり、変な列が追加されていたり………めちゃくちゃでしたww

ということで、色々やって、以下のコードを書きました!

import pandas as pd
import os

#平成データ前処理
dfs1 = {}
RANGE = range(17, 32)
for i in RANGE:
    file_path = f"/content/drive/MyDrive/スギ花粉データ/h{i}_cedar_data.csv"

    if os.path.exists(file_path):
        df = pd.read_csv(file_path, encoding="shift-jis")

        #日付列で、合計セルなどの特殊な行を削除(〇月〇日の行だけ使用)
        mask = df['日付'].str.match('(0?[1-9]|1[0-2])月(0?[1-9]|[12][0-9]|3[01])日')
        df = df[mask]
        
        #文字前後のスペースを削除
        cols = []
        for c in df.columns:
          cols.append(str(c).strip())

        df.columns = cols
        
        #以下の列だけ使用
        df = df.loc[:,["日付", "千代田", "葛飾", "杉並", "北", "大田", "青梅", "多摩", "町田", "立川", "府中", "小平"]]
          
        # 日付列を変更
        year = 1988 + i #h17は2005年など、年次を追加
        df['日付'] = df['日付'].apply(lambda x: f"{year}/{x.replace('月', '/').replace('日', '')}")

        # 日付列を datetime 型に変換し、新しい書式に変換
        df['日付'] = pd.to_datetime(df['日付'], format='%Y/%m/%d').dt.strftime('%Y-%m-%d')

        # データフレームを辞書に格納
        dfs1[i] = df
    else:
        print(f"File not found: {file_path}")

#h17からh31まで結合
merged_df = pd.concat([dfs1[i] for i in RANGE], axis = 0, ignore_index=True)

#各地域の花粉飛散量のデータを数値型に変換。変換できないものはNANとなる。
date = merged_df.loc[:, "日付"]
merged_df = merged_df.iloc[:,1:].apply(pd.to_numeric, errors='coerce')
merged_df = pd.concat([date, merged_df], axis = 1)
merged_df.dropna(inplace = True)

自分で調べたり、ChatGPT使ったり、アイデミーさんのカウンセリングを活用して、ここまでできました。

何をやっているか、各コードの上に#で説明してますので、見てみてください。

これと同じものを令和のデータで行い、平成と令和のデータを合わせたものがこちらです。

今回のNaNの行数は、全体の中で2, 3%でしたので、すべて削除しました。
NaNの行数は、


nan_rows_count = merged_df_temp.isnull().any(axis=1).sum()
print(f"NaNを含む行の数: {nan_rows_count}")

こちらで、表示させることができますので、どうやってNaNを処理するかは、こちらを見て判断するのが良いですね。

平均気温のデータと花粉飛散量のデータの結合

同じように平均気温も簡単に結合できるーー!!

と思っていたのですが、気が付いたのです。。。

花粉のデータは各年1月4日から5月11日なのに
気温のデータは各年1月1日から12月31日まであるやないかい……

そんなときはこれ!(今回は東京の平均気温データ使用)

mask = (
    (df_tokyo["日付"].dt.month == 1) & (df_tokyo["日付"].dt.day >= 4) |
    (df_tokyo["日付"].dt.month > 1) & (df_tokyo["日付"].dt.month < 5) |
    (df_tokyo["日付"].dt.month == 5) & (df_tokyo["日付"].dt.day <= 11))

これを使用することで、簡単に花粉飛散量の日付データを合わせることができます。

そして、先の花粉飛散量データと結合すると

できましたー!!!(色々な場所の平均気温を結合しました)

データフレームは、列の名前や形式、セルデータのタイプなどすべてが一致しないとエラーになるので、ほんと注意です。

ちなみにエラーが発生した場合、そのエラーをコピペすると、ChatGPTが原因を調べてくれます。だいたい2, 3回やり取りすると、大半のエラーは解決できます。みなさんもやってみてください!

次の記事では、ヒートマップなどを用いて、特徴量を少なくしていきます。
そのあとはお待ちかねの機械学習です!

最後までお読みいただき、ありがとうございました!


この記事が気に入ったらサポートをしてみませんか?