どうもニコイチです。前回までの記事では、データを選んだり、そのデータがどんなものか詳しく見たりする方法を学びました。今回は、いよいよデータ同士の「仲良し度」、つまり関連性を探る旅に出かけましょう!今回のテーマは「相関分析」です。
今回の記事でも、引き続き「宿泊価格について_demo.csv」データを使って、データ間の面白い関係性を見つけていきましょう。
全編はこちらから
今回のテーマ:データ同士の「つながり」を見つける
データ分析を進めていくと、「このデータが増えたら、あのデータも増えるのかな?減るのかな?」といった疑問が湧いてくることがあります。例えば、「宿泊施設の収容人数が増えれば、宿泊価格も高くなるのかな?」といった具合です。
このような2つのデータ間の関連性を調べるのが、相関分析です。相関分析を行うことで、モデル作成に役立ちそうな変数を見つけたり、データに潜む意外な関係性を発見したりすることができます。
今回の記事では、
量的データと質的データの場合の違い
モデル作成との関係
を、Pythonのコードを交えながら、わかりやすく解説していきます。
相関ってなに? データ間の「いい関係」「わるい関係」
相関とは、2つの変数(データの項目)の間に、どれくらいの関連性があるかを示すものです。
- 量的データの場合:
- 正の相関: 一方のデータが増えると、もう一方のデータも増える傾向がある場合。「身長が高い人ほど体重が重い」のような関係です。
- 負の相関: 一方のデータが増えると、もう一方のデータが減る傾向がある場合。「気温が高いほど、暖房の利用時間が減る」のような関係です。
- 相関なし: 一方のデータが増えても、もう一方のデータが増えたり減ったり、特に決まった傾向が見られない場合。「今日の天気と、明日の株価」のような関係です。
- 質的データの場合:
- 質的なデータ(例えば、部屋タイプ)が変わると、量的なデータ(例えば、宿泊価格)に変化が見られる場合に、相関があると言えます。例えば、「部屋タイプが『スイート』だと、宿泊価格が高い傾向がある」といった場合です。
- 質的なデータが変わっても、量的なデータに特に変化が見られない場合は、相関がないと言えます。
なぜ相関を確認するの? モデル作りのヒントを探せ!
相関を確認する主な理由は、モデル作成に役立ちそうな変数を見つけるためです。
例えば、宿泊価格を予測するモデルを作りたいとします。もし「収容人数」と「宿泊価格」に強い正の相関があれば、「収容人数」は宿泊価格を予測する上で重要な情報源になる可能性が高いと言えます。
逆に、もし2つの変数にほとんど相関がない場合、一方の変数の値を知っても、もう一方の変数の値を予測することは難しいでしょう。
相関の強さを数値で表現!相関係数
相関の度合いを数値で表したものが相関係数です。相関係数は -1から1の間の値をとり、以下のように解釈します。
- 1に近いほど:強い正の相関
- -1に近いほど:強い負の相関
- 0に近いほど:相関は弱い
相関係数を計算するには、Pandasライブラリの corr() 関数を使います。
# データ全体の相関係数行列を計算
correlation_matrix = data.corr()
print(correlation_matrix)
このコードを実行すると、データに含まれる数値データ同士の相関係数が一覧表示されます。
相関を「見て」理解する!散布図と箱ひげ図
相関は、数値で確認するだけでなく、グラフで見てみることも重要です。
- 散布図: 2つの量的データの関係を見るのに適しています。データを点としてプロットし、点の分布パターンから相関の有無や強さを判断します。
- 右上がりの分布: 正の相関
- 右下がりの分布: 負の相関
- バラバラの分布: 相関は弱い
- 箱ひげ図: 量的データと質的データの関係を見るのに適しています。質的なカテゴリごとに、量的データの分布を箱ひげ図で表示し、分布の違いから相関を判断します。
- 箱ひげ図の形状がカテゴリ間で大きく異なる場合: 相関がある可能性
- 箱ひげ図の形状がカテゴリ間で似ている場合: 相関は弱い可能性
仮説を立てて、データで検証!
データを見る前に、いくつか仮説を立ててみましょう。仮説を立てることで、データ分析の方向性が定まり、効率的に分析を進めることができます。
今回のデータを使って、以下のような仮説を立ててみます。
- (仮説1) 宿泊価格は収容人数に比例しているのではないか?
- (仮説2) シェアルームより、個室、個室より全部貸切の方が宿泊価格は高いのではないか?
- (仮説3) レビュースコアが高い方が宿泊価格も高くなっているのではないか?
- (仮説4) レビュー数が多い方が宿泊価格は高いのではないか?
- (仮説5) ソファー、布団より、ベッドの方が宿泊価格は高いのではないか?
- (仮説6) バスルームが多い方が部屋が広そうなので、宿泊価格は高いのではないか?
これらの仮説を、実際にデータを可視化して検証してみましょう。
いざ実践!相関分析をやってみよう
仮説1を検証:収容人数と宿泊価格の関係(箱ひげ図)
まずは、(仮説1)「宿泊価格は収容人数に比例しているのではないか」を検証するために、accommodates(収容人数)と y(宿泊価格)の関係を箱ひげ図で見てみましょう。
箱ひげ図を描画するには、seaborn ライブラリの boxplot() 関数を使います。
import seaborn as sns
import matplotlib.pyplot as plt
sns.boxplot(data=data, x='accommodates', y='y')
plt.title('収容人数と宿泊価格の関係')
plt.xlabel('収容人数')
plt.ylabel('宿泊価格')
plt.show()
グラフを見ると、収容人数が増えるにつれて、宿泊価格の中央値も高くなる傾向が見られます。これは、仮説1が概ね正しいことを示唆しています。
相関係数で「仲良し度」を数値化:収容人数と宿泊価格
次に、accommodates と y の相関係数を計算して、2つの変数の関係を数値で確認してみましょう。
correlation = data['accommodates'].corr(data['y'])
print(f'収容人数と宿泊価格の相関係数: {correlation:.2f}')
出力結果はおそらく 約0.5 になるでしょう。これは、中程度の正の相関があることを意味します。
仮説2を検証:部屋タイプと宿泊価格の関係(箱ひげ図、表示範囲の調整)
(仮説2)「シェアルームより、個室、個室より全部貸切の方が宿泊価格は高いのではないか」を検証するために、room_type と y の関係を箱ひげ図で見てみましょう。
sns.boxplot(data=data, x='room_type', y='y')
plt.title('部屋タイプと宿泊価格の関係')
plt.xlabel('部屋タイプ')
plt.ylabel('宿泊価格')
plt.show()
ここで注意が必要なのは、外れ値が多いと箱ひげ図が潰れて見えにくくなることです。そのような場合は、表示範囲を制限すると見やすくなります。
sns.boxplot(data=data, x='room_type', y='y')
plt.ylim(0, 600) # y軸の表示範囲を0から600に制限
plt.title('部屋タイプと宿泊価格の関係 (表示範囲調整後)')
plt.xlabel('部屋タイプ')
plt.ylabel('宿泊価格')
plt.show()
グラフを見ると、Shared room(シェアルーム)、Private room(個室)、Entire home/apt(まるまる貸切)の順に、宿泊価格の中央値が高くなっていることがわかります。これは、仮説2が正しいことを示しています。
仮説3と4を検証:レビュースコア、レビュー数と宿泊価格の関係(散布図)
(仮説3)「レビュースコアが高い方が宿泊価格も高くなっているのではないか」と、(仮説4)「レビュー数が多い方が宿泊価格は高いのではないか」を検証するために、それぞれ review_scores_rating、number_of_reviews と y の関係を散布図で見てみましょう。
data.plot.scatter(x='review_scores_rating', y='y')
plt.title('レビュースコアと宿泊価格の関係')
plt.xlabel('レビュースコア')
plt.ylabel('宿泊価格')
plt.show()
data.plot.scatter(x='number_of_reviews', y='y')
plt.title('レビュー数と宿泊価格の関係')
plt.xlabel('レビュー数')
plt.ylabel('宿泊価格')
plt.show()
散布図を見ると、
- (仮説3): レビュースコアが高いほど、高価格帯の物件も多く存在する傾向が見られます。(概ね正しい)
- (仮説4): レビュー数が多いほど、価格が安い物件が多い傾向が見られます。(仮説とは逆)
仮説5と6を検証:ベッドタイプ、バスルーム数と宿泊価格の関係(箱ひげ図)
(仮説5)「ソファー、布団より、ベッドの方が宿泊価格は高いのではないか」と、(仮説6)「バスルームが多い方が部屋が広そうなので、宿泊価格は高いのではないか」を箱ひげ図で検証します。
sns.boxplot(data=data, x='bed_type', y='y')
plt.title('ベッドタイプと宿泊価格の関係')
plt.xlabel('ベッドタイプ')
plt.ylabel('宿泊価格')
plt.show()
sns.boxplot(data=data, x='bathrooms', y='y')
plt.title('バスルーム数と宿泊価格の関係')
plt.xlabel('バスルーム数')
plt.ylabel('宿泊価格')
plt.show()
箱ひげ図から、
- (仮説5): Futon(布団)や Pull-out Sofa(ソファベッド)よりも、Real Bed(普通のベッド)の方が宿泊価格の中央値が高い傾向があります。(概ね正しい)
- (仮説6): バスルームの数が増えるほど、宿泊価格の中央値も高くなる傾向が見られます。ただし、バスルームが0の物件にも高価格帯のものが存在したり、バスルームが非常に多い場合に中央値が下がるケースも見られます。(概ね正しいが、例外あり)
ちょっと変わったデータに注目!
バスルーム数と宿泊価格の箱ひげ図を見てみると、「バスルームが0なのに、1000ドルを超える物件がある」という気になる点が見つかりました。
このような「あれ?なんか変だな?」という気づきは、データ分析において非常に重要です。なぜこのようなことが起こっているのか深掘りしてみましょう。
# バスルームが0で、宿泊価格が1000ドル以上の物件を抽出
anomalies = data[(data['bathrooms'] == 0) & (data['y'] >= 1000)]
print(anomalies['name'])
調べてみると、これらの物件の中には「Wedding Location Malibu Mountains(結婚式場)」のように、通常の宿泊施設とは異なるタイプの物件が含まれていることがわかりました。
初心者がつまずきやすいポイント
- 相関と因果関係の混同: 相関関係があるからといって、必ずしも因果関係があるとは限りません。「相関は恋人、因果関係は夫婦」と覚えておきましょう。
- 相関係数の解釈: 相関係数の値だけで判断せず、散布図などのグラフと合わせて総合的に判断することが大切です。
- 外れ値の影響: 外れ値は相関係数に大きな影響を与えることがあります。外れ値の適切な処理を検討しましょう。
- 質的データの扱い: 質的データ同士の相関を数値で測るには、工夫が必要です(例えば、クラメールのVなど)。今回の記事では、質的データと量的データの関係を箱ひげ図で確認しました。
- 箱ひげ図の解釈: 箱ひげ図はデータの分布を要約して表示するため、データの量が多いか少ないかはわかりません。
まとめ
今回の記事では、相関分析の基本的な考え方と、Pythonを使った実践的な方法を学びました。
- 相関は、2つの変数の関連性を示すもの。
- 相関係数は、相関の強さを数値で表したもの。
- 散布図は、量的データ同士の相関を視覚的に確認するのに便利。
- 箱ひげ図は、量的データと質的データの相関を視覚的に確認するのに便利。
データ間の相関を理解することで、データ分析の幅が広がり、より深い洞察を得ることができます。
次回予告
次回の記事では、分析をさらに進めるために、データの加工について学びます!外れ値をどのように処理するか、新しい変数を作成する方法など、データ分析の準備段階として重要な内容を解説します。お楽しみに!
コメント