Pandas Series.corr() 関数
Series.corr()Pandas において2つの Series 間の相関係数を計算するための関数です。相関係数は2つの変数間の線形関係の強さを測定し、値の範囲は -1 から 1 です。
相関係数が 1 に近いと正の相関を表し、-1 に近いと負の相関を表し、0 に近いとほぼ無相関を表します。データ分析、特徴量選択、回帰分析などの場面で広く応用されています。
基本構文とパラメータ
corr()Series オブジェクトのメンバー関数であり、別の Series をパラメータとして渡す必要があります。
構文
Series.corr(other, method='pearson', min_periods=None, **kwargs)
パラメータの説明
| パラメータ | 型 | 説明 | デフォルト値 |
|---|---|---|---|
| other | Series | 相関係数の計算に使用するもう1つの Series。 | 必須 |
| method | str | 相関係数の計算方法。指定可能な値:'pearson'(ピアソン)、'spearman'(スピアマン)、'kendall'(ケンドール)。 | 'pearson' |
| min_periods | int | 計算に必要な最小有効観測値数。有効値がこの数より少ない場合は NaN を返します。 | None |
戻り値
- 戻り値の型:
float - 説明:2つの Series 間の相関係数を返します。値の範囲は [-1, 1] です。
例
簡単なものから複雑なものまでの一連の例を通じて、徹底的にSeries.corr()の使い方をマスターしましょう。
例1:基本の使い方 - ピアソン相関係数
ピアソン相関係数は最も一般的に使用される相関係数であり、2つの変数間の線形関係を測定します。
例
import pandas as pd
# 2つのSeriesを作成:学習時間と試験の成績
study_hours = pd.Series([1, 2, 3, 4, 5, 6, 7, 8])
exam_scores = pd.Series([55, 60, 65, 70, 75, 80, 85, 90])
print("学习时间(小时):")
print(study_hours)
print()
print("考试成绩(分):")
print(exam_scores)
print()
# 计算皮尔逊相关系数
correlation = study_hours.corr(exam_scores)
print(f"皮尔逊相关系数:{correlation:.4f}")
print()
print("分析:相関係数が1に近く、学習時間と試験の成績には強い正の相関関係があることを示しています。")
# 2つのSeriesを作成:学習時間と試験の成績
study_hours = pd.Series([1, 2, 3, 4, 5, 6, 7, 8])
exam_scores = pd.Series([55, 60, 65, 70, 75, 80, 85, 90])
print("学习时间(小时):")
print(study_hours)
print()
print("考试成绩(分):")
print(exam_scores)
print()
# 计算皮尔逊相关系数
correlation = study_hours.corr(exam_scores)
print(f"皮尔逊相关系数:{correlation:.4f}")
print()
print("分析:相関係数が1に近く、学習時間と試験の成績には強い正の相関関係があることを示しています。")
実行結果:
学习时间(小时): 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 dtype: int64 考试成绩(分): 0 55 1 60 2 65 3 70 4 75 5 80 6 85 7 90 dtype: int64 皮尔逊相关系数:1.0000
コードの解説:
- 相関係数は 1.0 で、完全な正の相関を示しています。
- これは、学習時間が 1 時間増えるごとに、試験の点数が固定的に 5 点増えることを意味します。
例2:負の相関と無相関の例
異なるタイプの相関を示しています。
例
import pandas as pd
# 正の相関データ:年齢と収入
ages = pd.Series([25, 30, 35, 40, 45, 50])
income = pd.Series([4000, 5000, 6000, 7000, 8000, 9000])
print("正の相関の例 - 年齢と収入:")
print(f"相关系数:{ages.corr(income):.4f}")
print()
# 負の相関データ:ゲーム時間と学業成績
game_hours = pd.Series([1, 2, 3, 4, 5, 6])
grades = pd.Series([95, 90, 82, 75, 65, 55])
print("負の相関の例 - ゲーム時間と学習成績:")
print(f"相关系数:{game_hours.corr(grades):.4f}")
print()
# 無相関データ:靴のサイズとIQ
shoe_sizes = pd.Series([36, 37, 38, 39, 40, 41])
iq_scores = pd.Series([100, 105, 95, 110, 98, 102])
print("相関なしの例 - 靴のサイズとIQ:")
print(f"相关系数:{shoe_sizes.corr(iq_scores):.4f}")
print()
print("相关系数解读:")
print(" |r| > 0.7:强相关")
print(" 0.4 < |r| <= 0.7:中等相关")
print(" 0.2 < |r| <= 0.4:弱相关")
print(" |r| <= 0.2:几乎无相关")
# 正の相関データ:年齢と収入
ages = pd.Series([25, 30, 35, 40, 45, 50])
income = pd.Series([4000, 5000, 6000, 7000, 8000, 9000])
print("正の相関の例 - 年齢と収入:")
print(f"相关系数:{ages.corr(income):.4f}")
print()
# 負の相関データ:ゲーム時間と学業成績
game_hours = pd.Series([1, 2, 3, 4, 5, 6])
grades = pd.Series([95, 90, 82, 75, 65, 55])
print("負の相関の例 - ゲーム時間と学習成績:")
print(f"相关系数:{game_hours.corr(grades):.4f}")
print()
# 無相関データ:靴のサイズとIQ
shoe_sizes = pd.Series([36, 37, 38, 39, 40, 41])
iq_scores = pd.Series([100, 105, 95, 110, 98, 102])
print("相関なしの例 - 靴のサイズとIQ:")
print(f"相关系数:{shoe_sizes.corr(iq_scores):.4f}")
print()
print("相关系数解读:")
print(" |r| > 0.7:强相关")
print(" 0.4 < |r| <= 0.7:中等相关")
print(" 0.2 < |r| <= 0.4:弱相关")
print(" |r| <= 0.2:几乎无相关")
実行結果:
正相关示例 - 年龄与收入: 相关系数:1.0000 负相关示例 - 游戏时间与学习成绩: 相关系数:-0.9856 无相关示例 - 鞋码与智商: 相关系数:0.0857
例3:異なる相関係数の方法を使用
スピアマン相関係数とケンドール相関係数の使い方を示しています。
例
import pandas as pd
# 非線形関係のデータを作成
x = pd.Series([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
# 指数関係を使用し、完全な線形関係ではない
y = pd.Series([1, 4, 9, 16, 25, 36, 49, 64, 81, 100])
print("数据 X:")
print(x)
print()
print(データ Y(X の二乗):)
print(y)
print()
# 皮尔逊相关系数(衡量线性关系)
pearson_corr = x.corr(y, method='pearson')
print(f"皮尔逊相关系数:{pearson_corr:.4f}")
# 斯皮尔曼相关系数(衡量单调关系)
spearman_corr = x.corr(y, method='spearman')
print(f"斯皮尔曼相关系数:{spearman_corr:.4f}")
# 肯德尔相关系数
kendall_corr = x.corr(y, method='kendall')
print(f"肯德尔相关系数:{kendall_corr:.4f}")
print()
print("分析:")
print("XとYには完全な単調関係(y = x^2)が存在するが、")
print(しかし、ピアソン相関係数は 1 ではありません。なぜなら、それらは線形関係ではないからです。)
print(スピアマンとケンドールの相関係数は、単調な関係を測定するため、1になります。)
# 非線形関係のデータを作成
x = pd.Series([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
# 指数関係を使用し、完全な線形関係ではない
y = pd.Series([1, 4, 9, 16, 25, 36, 49, 64, 81, 100])
print("数据 X:")
print(x)
print()
print(データ Y(X の二乗):)
print(y)
print()
# 皮尔逊相关系数(衡量线性关系)
pearson_corr = x.corr(y, method='pearson')
print(f"皮尔逊相关系数:{pearson_corr:.4f}")
# 斯皮尔曼相关系数(衡量单调关系)
spearman_corr = x.corr(y, method='spearman')
print(f"斯皮尔曼相关系数:{spearman_corr:.4f}")
# 肯德尔相关系数
kendall_corr = x.corr(y, method='kendall')
print(f"肯德尔相关系数:{kendall_corr:.4f}")
print()
print("分析:")
print("XとYには完全な単調関係(y = x^2)が存在するが、")
print(しかし、ピアソン相関係数は 1 ではありません。なぜなら、それらは線形関係ではないからです。)
print(スピアマンとケンドールの相関係数は、単調な関係を測定するため、1になります。)
実行結果:
数据 X: 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 dtype: int64 数据 Y(X 的平方): 0 1 1 4 2 9 3 16 4 25 5 36 6 49 7 64 8 81 9 100 dtype: int64 皮尔逊相关系数:0.9746 斯皮尔曼相关系数:1.0000 肯德尔相关系数:1.0000
例4:min_periods パラメータの使用
計算に必要な最小有効観測値数を制御します。
例
import pandas as pd
import numpy as np
# 欠損値を含む2つの Series を作成
s1 = pd.Series([1, 2, np.nan, 4, 5, np.nan, 7, 8])
s2 = pd.Series([2, 4, 6, 8, 10, 12, 14, 16])
print("Series 1:")
print(s1)
print()
print("Series 2:")
print(s2)
print()
# 默认需要至少 2 个有效值
corr_default = s1.corr(s2)
print(f"默认(min_periods=None)相关系数:{corr_default:.4f}")
# 设置最少需要 6 个有效值
corr_6 = s1.corr(s2, min_periods=6)
print(f"min_periods=6 相关系数:{corr_6:.4f}")
# 设置最少需要 7 个有效值(只有 6 个有效值,返回 NaN)
corr_7 = s1.corr(s2, min_periods=7)
print(f"min_periods=7 相关系数:{corr_7}")
import numpy as np
# 欠損値を含む2つの Series を作成
s1 = pd.Series([1, 2, np.nan, 4, 5, np.nan, 7, 8])
s2 = pd.Series([2, 4, 6, 8, 10, 12, 14, 16])
print("Series 1:")
print(s1)
print()
print("Series 2:")
print(s2)
print()
# 默认需要至少 2 个有效值
corr_default = s1.corr(s2)
print(f"默认(min_periods=None)相关系数:{corr_default:.4f}")
# 设置最少需要 6 个有效值
corr_6 = s1.corr(s2, min_periods=6)
print(f"min_periods=6 相关系数:{corr_6:.4f}")
# 设置最少需要 7 个有效值(只有 6 个有效值,返回 NaN)
corr_7 = s1.corr(s2, min_periods=7)
print(f"min_periods=7 相关系数:{corr_7}")
実行結果:
Series 1: 0 1.0 1 2.0 2 NaN 3 4.0 4 5.0 5 NaN 6 7.0 7 8.0 dtype: float64 Series 2: 0 2 1 4 2 6 3 8 4 10 5 12 6 14 7 16 dtype: int64 默认(min_periods=None)相关系数:1.0000 min_periods=6 相关系数:1.0000 min_periods=7 相关系数:nan
例5:実際の応用 - 経済指標の相関分析
実際のデータ分析における相関係数の応用を示しています。
例
import pandas as pd
# 模擬マクロ経済データの作成
gdp_growth = pd.Series([6.5, 7.2, 8.1, 7.8, 6.9, 5.5, 4.8])
unemployment = pd.Series([4.2, 3.8, 3.5, 3.7, 4.0, 4.8, 5.2])
inflation = pd.Series([2.1, 2.5, 3.2, 3.0, 2.4, 1.8, 1.5])
stock_index = pd.Series([3000, 3200, 3500, 3400, 3100, 2800, 2600])
print("宏观经济数据:")
print(f"GDP 增长率:{gdp_growth.values}")
print(f"失业率:{unemployment.values}")
print(f"通胀率:{inflation.values}")
print(f"股指:{stock_index.values}")
print()
# 各指標間の相関の分析
print("相关性分析:")
print(f"GDP 增长率 vs 失业率:{gdp_growth.corr(unemployment):.4f}")
print(f"GDP 增长率 vs 股指:{gdp_growth.corr(stock_index):.4f}")
print(f"失业率 vs 股指:{unemployment.corr(stock_index):.4f}")
print(f"通胀率 vs 股指:{inflation.corr(stock_index):.4f}")
print()
print("结论:")
print("- GDP成長率と失業率は負の相関関係にある(景気が良いときは失業率が低い)")
print("- GDP成長率と株価指数は強い正の相関関係にある(景気が良いときは株式市場が上昇する)")
print(- 失業率と株価指数は負の相関関係にある)
# 模擬マクロ経済データの作成
gdp_growth = pd.Series([6.5, 7.2, 8.1, 7.8, 6.9, 5.5, 4.8])
unemployment = pd.Series([4.2, 3.8, 3.5, 3.7, 4.0, 4.8, 5.2])
inflation = pd.Series([2.1, 2.5, 3.2, 3.0, 2.4, 1.8, 1.5])
stock_index = pd.Series([3000, 3200, 3500, 3400, 3100, 2800, 2600])
print("宏观经济数据:")
print(f"GDP 增长率:{gdp_growth.values}")
print(f"失业率:{unemployment.values}")
print(f"通胀率:{inflation.values}")
print(f"股指:{stock_index.values}")
print()
# 各指標間の相関の分析
print("相关性分析:")
print(f"GDP 增长率 vs 失业率:{gdp_growth.corr(unemployment):.4f}")
print(f"GDP 增长率 vs 股指:{gdp_growth.corr(stock_index):.4f}")
print(f"失业率 vs 股指:{unemployment.corr(stock_index):.4f}")
print(f"通胀率 vs 股指:{inflation.corr(stock_index):.4f}")
print()
print("结论:")
print("- GDP成長率と失業率は負の相関関係にある(景気が良いときは失業率が低い)")
print("- GDP成長率と株価指数は強い正の相関関係にある(景気が良いときは株式市場が上昇する)")
print(- 失業率と株価指数は負の相関関係にある)
実行結果:
宏观经济数据: GDP 增长率:[6.5 7.2 8.1 7.8 6.9 5.5 4.8] 失业率:[4.2 3.8 3.5 3.7 4. 4. 5.2] 通胀率:[2.1 2.5 3.2 3. 2.4 1.8 1.5] 股指:[3000 3200 3500 3400 3100 2800 2600] 相关性分析: GDP 增长率 vs 失业率:-0.9036 GDP 增长率 vs 股指:0.9434 失业率 vs 股指:-0.9712 通胀率 vs 股指:-0.9712
コードの解説:
- GDP 成長率と失業率の相関係数は -0.9036 で、強い負の相関を示しています。
- GDP 成長率と株価指数の相関係数は 0.9434 で、強い正の相関を示しています。
- これらの相関は経済学の直感と一致しています。
注意事項
- 相関係数は線形関係のみを測定できるため、非線形関係に対しては正確でない場合があります。
- 相関係数が 0 に近いことは関連がないことを意味せず、非線形の関係が存在する可能性があります。
- 相関は因果関係を意味するものではなく、ビジネスロジックと組み合わせて判断する必要があります。
- スピアマン相関係数は順序データや非線形の単調関係に適しています。
- ケンドール相関係数はデータ内のノイズに対してより頑健ですが、計算が遅くなります。
まとめ
Series.corr()2つの変数の関係を分析するための強力なツールです。その主な特徴は次の通りです:
- 3つの相関係数の計算方法をサポートしています:ピアソン、スピアマン、ケンドール。
- ピアソン相関係数は線形関係を測定するのに適しています。
- スピアマンとケンドールの相関係数は単調関係を測定するのに適しています。
- 最小有効観測値数を制御できます。
実際の応用では、相関係数は特徴量選択、データ探索、仮説検証によく使用されます。ただし、相関分析は統計的な関連性を明らかにするだけで、因果関係を直接推定できないことに注意してください。
その他の拡張機能
Pandas よく使う関数