SEOにPythonを活用するために基礎から学び直す(CSVインポート・欠損値の処理)
しばらくnoteを書いていなかったのですが、自分の学びの記録の意味も込めて、少しずつ書いていこうと思います。
当面はPython×SEOをテーマにして、かなり基本的なことから書いていきます。
なんでPython×SEO?
SEOの分析ではAhrefsやSearch ConsoleからダウンロードしたCSVの加工・分析を頻繁に行います。
SEOの業務を行っている方であれば、ツールからCSVファイルをダウンロード▶Excelに貼り付け▶関数やピボットテーブルで加工▶分析、といった作業を頻繁に行われているかと思います。
しかし、これらのデータは数万行を超えることが多く、Excelで読み込むのも一苦労。関数を組もうものなら、Excelがクラッシュしてしまうことも珍しくありません。
※というかDB系サイトのキーワードデータなんてExcelでは太刀打ちできません…
対して、Pythonなら数十万行のデータでも問題なく読み込めます。
Excel関数を書くときくらい、何も考えなくてもPythonのコードを書けるようになることを目標に、改めてPythonを学んでいこうと思います。
そんな訳で、ここから本題に入ります。
pandasとnumpyのインポート
まずは最低限のライブラリをインポートします。今回はpandasとnumpyを入れておきます。
import pandas as pd
import numpy as np
CSVファイルからDataFrameを作成する
CSVファイルからpandasのDataFrameを作成するには「pd.read_csv」を使用します。
read_csvに指定できる引数は非常にたくさんあるのですが、今回はシンプルに以下の3つだけを指定します。
読み込みたいCSVファイルのパス(filepath_or_buffer)
エンコーディング(encoding)
区切り文字(delimiter)
df = pd.read_csv(filepath_or_buffer='./data/sample_data_01.csv', encoding='utf-16', delimiter='\t')
※今回はAhrefsのOrganic Keywords 2.0からUTF-16形式のデータをダウンロードしていると想定して、encodingはutf-16、delimiterは\t(タブ区切り)を指定しています。
※読み込むCSVに合わせてutf-8_sigにしたり、カンマ区切りにしたり調整してみてください
正しく読み込めているかを確認するために、一度DataFrameの中身を見てみましょう。私はVSCodeのJupyter Notebook上で作業をしているので、displayを使ってDataFrameの確認を行います。
display(df.head())
正しく読み込めていますね。
カラム名のルールを統一する
カラム名にスペースが含まれていると、意図しないところで正しく読み込まれないなど、作業を行うにあたって不都合があります。
なので、まずはカラム名の半角スペースをアンダースコアに置換していきましょう。また同時に大文字のアルファベットを小文字にしておきます。
DataFrameのカラム名一覧は「df.columns」で取得することができるので、リスト内包表記を使って置換後のカラム名一覧を変数に代入します。
column_names = [column_name.replace(' ', '_').lower() for column_name in df.columns]
置換後のカラム名を、既存のDataFrameに適用するには以下のコードを実行します。
df.columns = column_names
これで以下のように、カラム名の置換ができました。
欠損データの処理をする
データの分析を行う前に、DataFrame内の欠損データがどれくらいあるのかを調べます。以下のコードを実行すると、カラムごとのNaNの数を表示することが可能です。
display(df.isna().sum())
今回のデータでは以下の結果となりました。
keyword 0
serp_features 23
volume 0
kd 0
cpc 0
previous_traffic 3
current_traffic 3
traffic_change 0
previous_position 4
current_position 3
position_change 0
previous_url_inside 23
previous_url 3
current_url_inside 23
current_url 3
previous_date 0
current_date 0
dtype: int64
サンプルデータには23行のデータが含まれているのですが、serp_features, previous_url_inside, current_url_insideは何も値を入れていなかったので23行すべてがNaNに。その他のカラムにおいても、いくつかNaNが存在していることがわかります。
NaNに別の値を埋める
NaNのままではデータの加工時に不便なので、それぞれ値を書き換えていきます。
今回はprevious_traffic, current_trafficがNaNの場合はゼロに。previous_position, current_positionがNaNの場合は101にします(Ahrefsのデータが100位までなので、それ以下という意味で101に)
NaNを別の値で埋めるには、df.fillna()の引数に「カラム名:値」のdictを渡します。
values_to_fill = {
'previous_traffic': 0,
'current_traffic': 0,
'previous_position': 101,
'current_position': 101,
}
df = df.fillna(values_to_fill)
このコードを実行すると、上記4つのカラム上でNaNだった値が書き換わっています。
他のカラムに対してもNaNの書き換えを行っても良いのですが、すべてのカラムが必要なケースは稀です。そこで不要なカラムの削除を行ってみます。
不要なカラムを削除する
不要なカラムを削除するには、df.dropの引数columnsに対して、削除したいカラム名が格納されたlistを指定します。
drop_columns = ['kd', 'previous_url_inside', 'current_url_inside', 'previous_date', 'current_date']
df = df.drop(columns=drop_columns)
このコードを実行すると、以下のように最低限のカラムだけが抽出されます。
必要なカラムだけを抽出するには?
不要なカラムの削除ではなく、指定したカラムだけを抽出することももちろん可能です。
以下のようにDataFrameに抽出したいカラム名のlistを渡すだけなので、削除よりもこちらのほうが覚えやすいかも知れませんね。
extract_columns = ['keyword', 'volume']
extract_df = df[extract_columns]
まとめ
今回はpandasでのCSVインポートから、欠損データの処理を行いました。
次回はapplyやmapを使って、DataFrame上の値から、新しいカラムを作成する方法を紹介したいと思います。
この記事が気に入ったらサポートをしてみませんか?