13.Pythonではじめるデータ分析:宿泊価格予測入門-データフレームの加工編-

PR表記

※アフィリエイト広告を利用しています

どうもニコイチです。前回の記事では、データ分析の前処理として、特徴量を選んだり、作ったりする基本的な考え方を学びました。今回は、いよいよPythonの力を借りて、DataFrameというデータのかたまりを実際に「加工」していく方法を学んでいきましょう!まるで粘土をこねて、新しい形を作り出すように、DataFrameを自由自在に操るテクニックを身につけましょう!

今回の記事でも、引き続き「宿泊価格について_demo.csv」データを使って、実践的なデータ加工を体験していきましょう。

全編はこちらから

目次

今回のテーマ:DataFrameを「思い通り」に加工する

データ分析の世界では、DataFrameはまさにデータの中心的な存在です。このDataFrameを自由自在に加工できるようになると、分析の幅がぐっと広がります。今回は、DataFrameの各要素に関数を適用する便利な機能と、それを使って特徴量を加工する方法を学びます。

無名関数Lambda: その場で「ちょい足し」関数を作る魔法

まず最初に紹介するのは、Lambda(ラムダ)というちょっと変わった関数です。Lambdaは、名前のない小さな関数を、コードの中にその場で作ってしまうことができる魔法のような機能です。

Lambdaってどんなもの?

例えば、数字を2倍にする関数を作りたいとします。普通なら以下のように書きますよね。

def double(x):
  return x * 2

Lambdaを使うと、これをたった一行で書けちゃいます。

lambda x: x * 2

lambda の後に引数(ここでは x)、コロン : の後に処理内容(ここでは x * 2)を書きます。

Lambdaのメリットは?

Lambdaの一番のメリットは、コードが短く書けることです。特に、後で何度も使い回すわけではない、ちょっとした処理を書きたい場合に便利です。例えるなら、料理で使う「隠し味」のようなもので、コードにサッと加えて、味(機能)をグッと引き締めることができます。

DataFrameの要素に関数を適用!Apply関数の使い方

DataFrameの各要素に対して、同じような処理をまとめて行いたい時に便利なのが、Apply(アプライ)関数です。Apply関数を使うと、DataFrameの特定の列(Series)や、DataFrame全体に対して、自分で作った関数や、あらかじめ用意されている関数を適用することができます。

Apply関数の基本的な使い方

Apply関数は、以下のように記述します。

DataFrame['カラム名'].apply(関数)

apply() のカッコの中に、適用したい関数を入れます。

例えば、value という名前の列に入っているすべての数字を2乗して1を足したい場合、まず以下のような関数を作ります。

def square_plus_one(x):
  return x**2 + 1

そして、Apply関数を使って、この関数を value 列のすべての要素に適用します。

df['value'].apply(square_plus_one)

LambdaとApply関数の最強コンビ!

ここで、先ほど紹介したLambda関数が登場します。Apply関数とLambda関数を組み合わせると、わざわざ関数を定義しなくても、その場で処理内容を記述して、DataFrameの要素に適用することができます。

先ほどの例をLambda関数で書き直すと、以下のようになります。

df['value'].apply(lambda x: x**2 + 1)

たった一行で、同じ処理が実現できました!まるで魔法の呪文ですね!

特徴量加工の実践: Apply関数でデータを見やすく変身させよう!

前回の記事で、宿泊価格に影響を与えそうな特徴量として、cleaning_fee(クリーニング料金)、host_identity_verified(ホスト認証の有無)、instant_bookable(即時予約可能かどうか)の3つを挙げました。しかし、これらの特徴量の値は、”t”(True)や “f”(False)という文字で表現されています。このままでは、機械学習のモデルは理解できないため、数値(1や0)に変換する必要があります。

Apply関数を使って、これらの特徴量の値を数値に変換してみましょう。

文字列を数値に変換する関数を作る

まず、”t” を 1 に、”f” を 0 に変換する関数 change_tf() を作ります。

def change_tf(x):
  if x == "t":
    return 1
  elif x == "f":
    return 0

Apply関数で一気に変換!

次に、Apply関数を使って、cleaning_fee、host_identity_verified、instant_bookable 列のすべての要素に関数 change_tf() を適用します。

data['cleaning_fee'] = data['cleaning_fee'].apply(change_tf)
data['host_identity_verified'] = data['host_identity_verified'].apply(change_tf)
data['instant_bookable'] = data['instant_bookable'].apply(change_tf)

# 変換されたデータを確認
print(data[['cleaning_fee', 'host_identity_verified', 'instant_bookable']].head())

これで、”t” や “f” で表現されていた値が、1 と 0 に変換されました!これで、モデリングの準備が一つ整いました。

Lambda式を使えばもっとスマートに!

先ほどの変換処理は、Lambda式を使ってもっと短く書くことができます。

data['cleaning_fee'] = data['cleaning_fee'].apply(lambda x: 1 if x == "t" else 0)
data['host_identity_verified'] = data['host_identity_verified'].apply(lambda x: 1 if x == "t" else 0)
data['instant_bookable'] = data['instant_bookable'].apply(lambda x: 1 if x == "t" else 0)

こちらの方が、コードがスッキリして見やすいですね。

変換後のデータを確認:箱ひげ図で効果を見てみよう!

数値に変換された cleaning_fee、host_identity_verified、instant_bookable が、宿泊価格にどのような影響を与えているのか、箱ひげ図で確認してみましょう。

import seaborn as sns
import matplotlib.pyplot as plt

# cleaning_feeと宿泊価格の箱ひげ図
sns.boxplot(data=data, x='cleaning_fee', y='y')
plt.ylim(0, 600)
plt.show()

# host_identity_verifiedと宿泊価格の箱ひげ図
sns.boxplot(data=data, x='host_identity_verified', y='y')
plt.ylim(0, 600)
plt.show()

# instant_bookableと宿泊価格の箱ひげ図
sns.boxplot(data=data, x='instant_bookable', y='y')
plt.ylim(0, 600)
plt.show()

箱ひげ図を見ると、例えば cleaning_fee が 1(クリーニング料金あり)の物件の方が、0(クリーニング料金なし)の物件よりも、宿泊価格の中央値が高い傾向にあることがわかります。

初心者がつまずきやすいポイント

  • Lambda関数の書き方: Lambda関数の書き方 lambda 引数: 戻り値 を間違えやすいです。コロン : を忘れないようにしましょう。
  • Apply関数の対象: Apply関数をどの軸(列ごと、行ごと)に適用するのかを意識しないと、意図しない結果になることがあります。今回は列ごとに適用しています。
  • データ型の変換: 文字列から数値への変換など、データ型の変換は間違いやすいポイントです。変換がうまくいっているか、print() 関数などで確認するようにしましょう。
  • 複数の列をまとめて処理: 複数の列に対して同じような処理を行いたい場合、forループなどを使う必要がありますが、Pandasにはもっと効率的な方法があります。これは今後の記事で解説します。

まとめ

今回の記事では、DataFrameを加工するための強力なツールであるApply関数と、その場で関数を作成できるLambda関数について学びました。

  • Lambda関数は、名前のない小さな関数を簡単に定義できる便利な機能。
  • Apply関数は、DataFrameの要素に関数をまとめて適用できる便利な機能。
  • Apply関数とLambda関数を組み合わせることで、簡潔かつ効率的にDataFrameを加工できる。
  • 特徴量の加工は、モデリングの前準備として非常に重要。

これらのテクニックを身につけることで、データ分析のスキルがさらにレベルアップします。

次回予告

次回の記事では、質的なデータをモデリングで扱えるようにするための重要なテクニック、ダミー変数について解説します!カテゴリ変数を数値データに変換する魔法を学び、さらに分析の幅を広げていきましょう。お楽しみに!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次