探索的データ分析を改善するための実践的なヒント!

 データホエール乾物 

翻訳者: Zhang Feng、Datawhale メンバー

EDA をよりシンプルに (そしてより美しく) 作るための実践的なガイドです。

元のリンク: https://towardsdatascience.com/practical-tips-for-improving-exploratory-data-analysis-1c43b3484577

導入

探索的データ分析 (EDA) は、機械学習モデルを使用する前に必要なステップです。EDA プロセスには、データ アナリストとデータ サイエンティストの集中力と忍耐力が必要です。多くの場合、データ分析から有意義な洞察を得るまでに、1 つ以上の視覚化ライブラリを積極的に使用するには、多くの時間がかかります。

この記事では、私の個人的な経験に基づいて、EDA プログラムを簡素化し、より便利にする方法に関するヒントをいくつか紹介します。特に、EDA を「殺す」過程で私が学んだ 3 つの重要なヒントを紹介します。

1. タスクに最適な重要なグラフを使用します。

可視化ライブラリの機能を最大限に活用する 3.

3. 同じコンテンツをより迅速に作成する方法を見つけます。

注: この投稿では、 Kaggle [2] が提供する風力エネルギー データを使用してインフォグラフィックを作成します。はじめましょう!

ヒント 1: 自明ではないグラフを使用することを恐れないでください

私は、風力エネルギーの解析と予測に関する研究論文 [1] を執筆中に、このテクニックの適用方法を学びました。このプロジェクトで EDA を実行する際、どのパラメータが相互に最も影響を与えるかを調べるために、風力エネルギー パラメータ間のすべての関係を反映する概要マトリックスを作成する必要がありました。私の頭に浮かんだ最初のアイデアは、多くのデータ サイエンス/データ分析プロジェクトで見てきたような、「昔ながらの」相関行列を構築することでした。

ご存知のとおり、相関行列は、変数間の線形関係を定量化して要約するために使用されます。以下のコード スニペットでは、corrcoef 関数が風力エネルギー データの特徴列で使用されています。ここでは、Seaborn のヒートマップ関数も適用して、相関行列配列をヒートマップとしてプロットしました。

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np

# 读取数据
data = pd.read_csv('T1.csv')
print(data)

# 为列重命名,使其标题更简短
data.rename(columns={'LV ActivePower (kW)':'P',
                     'Wind Speed (m/s)':'Ws',
                     'Theoretical_Power_Curve (KWh)':'Power_curve',
                     'Wind Direction (°)': 'Wa'},inplace=True)
cols = ['P', 'Ws', 'Power_curve', 'Wa']

# 建立矩阵
correlation_matrix = np.corrcoef(data[cols].values.T)
hm = sns.heatmap(correlation_matrix,
                 cbar=True, annot=True, square=True, fmt='.3f',
                 annot_kws={'size': 15},
                 cmap='Blues',
                 yticklabels=['P', 'Ws', 'Power_curve', 'Wa'],
                 xticklabels=['P', 'Ws', 'Power_curve', 'Wa'])

# 保存图表
plt.savefig('image.png', dpi=600, bbox_inches='tight')
plt.show()
77796c98e00344648d54c98e55a18986.png

図1 相関行列の構築例

チャート結果の分析から、風速と実際の電力の間には強い相関関係があると結論付けることができますが、この視覚化方法を使用すると、これは説明にならないことに多くの人が同意すると思います。結果の単純な方法であるため、ここには数字しかありません。

散布図行列は相関行列の優れた代替手段であり、データセットのさまざまな特徴間のペアごとの相関を 1 か所で視覚化できます。この場合、 sns.pairplot を使用する必要があります。

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd

# 读取数据
data = pd.read_csv('T1.csv')
print(data)

# 为列重命名,使其标题更简短
data.rename(columns={'LV ActivePower (kW)':'P',
                     'Wind Speed (m/s)':'Ws',
                     'Theoretical_Power_Curve (KWh)':'Power_curve',
                     'Wind Direction (°)': 'Wa'},inplace=True)
cols = ['P', 'Ws', 'Power_curve', 'Wa']

# 建立矩阵
sns.pairplot(data[cols], height=2.5)
plt.tight_layout()

# 保存图表
plt.savefig('image2.png', dpi=600, bbox_inches='tight')
plt.show()
38a6e3cb9dfc6750bef567a4e044155c.png

図 2 散布図行列の例

散布図マトリックスを見ることで、データがどのように分布しているか、データに外れ値が含まれているかどうかをすぐに視覚化できます。ただし、このタイプのグラフの主な欠点は、データをペアごとにプロットするため、重複したデータが存在することです。

最終的に、上記のグラフを 1 つに結合することにしました。左下の部分には選択したパラメータの散布図が含まれ、右上の部分にはさまざまなサイズと色のバブルが含まれます。円が大きいほど、その効果は強くなります。研究対象のパラメータの線形依存性。マトリックスの対角線は各特徴の分布を示します。ここでの狭いピークは、その特定のパラメーターがあまり変化しない一方、他の特徴は変化することを意味します。

集計表を作成するコードは次のとおりです。ここのマップは、fig.map_ lower、fig.map_diag、fig.map_upper の 3 つの部分で構成されています。

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# 读取数据
data = pd.read_csv('T1.csv')
print(data)

# 为列重命名,使其标题更简短
data.rename(columns={'LV ActivePower (kW)':'P',
                     'Wind Speed (m/s)':'Ws',
                     'Theoretical_Power_Curve (KWh)':'Power_curve',
                     'Wind Direction (°)': 'Wa'},inplace=True)
cols = ['P', 'Ws', 'Power_curve', 'Wa']

# 建立矩阵
def correlation_dots(*args, **kwargs):
    corr_r = args[0].corr(args[1], 'pearson')
    ax = plt.gca()
    ax.set_axis_off()
    marker_size = abs(corr_r) * 3000
    ax.scatter([.5], [.5], marker_size,
               [corr_r], alpha=0.5,
               cmap = 'Blues',
               vmin = -1, vmax = 1,
               transform = ax.transAxes)
    font_size = abs(corr_r) * 40 + 5

sns.set(style = 'white', font_scale = 1.6)
fig = sns.PairGrid(data, aspect = 1.4, diag_sharey = False)
fig.map_lower(sns.regplot)
fig.map_diag(sns.histplot)
fig.map_upper(correlation_dots)

# 保存图表
plt.savefig('image3.jpg', dpi = 600, bbox_inches = 'tight')
plt.show()
d10406027d1434310fb9a6b08e154e13.png

図3 集計表の例

概要テーブルは、以前に検討した 2 つのグラフの最良の部分を組み合わせたものです。下側 (左) セクションは散布図マトリックスを模倣し、上側 (右) セクションは相関マトリックスの数値結果をグラフで反映しています。

ヒント 2: 視覚化ライブラリの機能を最大限に活用する

時々、EDA の結果を同僚や顧客に提示する必要があるため、視覚化はこの作業において私にとって重要なアシスタントです。私は、図をより魅力的で読みやすくするために、矢印や注釈などのさまざまな要素を図に追加するように常に努めています。

上で説明した風力エネルギー プロジェクトの EDA 実装例に戻りましょう。風力エネルギーに関して言えば、最も重要なパラメータの 1 つは電力曲線です。風力タービン (または風力発電所全体) の電力曲線は、さまざまな風速でどれだけの電力が生成されるかを示すグラフです。タービンは風速が低い場合には作動しないことに注意してください。それらの活性化はカットイン速度に関連しており、通常は 2.5 ~ 5 m/s の間です。風速が 12 ~ 15 m/s の場合、タービンは定格出力を達成します。最後に、各タービンには安全に動作できる風速の上限があります。この制限に達すると、風速が動作範囲に戻らない限り、風力タービンは発電できなくなります。

調査されたデータセットには、理論上の出力曲線 (外れ値のないメーカーが提供する典型的な曲線) と実際の曲線 (風力と風速をプロットした場合) が含まれています。後者には通常、理論上の理想的な形状から外れた多くの点が含まれており、ファンの故障、SCADA 測定エラー、または計画外のメンテナンスによって引き起こされる可能性があります。

ここで、両方のタイプの風曲線を示す図を作成します。1 つ目は、凡例以外は何も追加していないものです。

import pandas as pd
import matplotlib.pyplot as plt

# 读取数据
data = pd.read_csv('T1.csv')
print(data)

# 为列重命名,使其标题更简短
data.rename(columns={'LV ActivePower (kW)':'P',
                     'Wind Speed (m/s)':'Ws',
                     'Theoretical_Power_Curve (KWh)':'Power_curve',
                     'Wind Direction (°)': 'Wa'},inplace=True)

# 建立图表
plt.scatter(data['Ws'], data['P'], color='steelblue', marker='+', label='actual')
plt.scatter(data['Ws'], data['Power_curve'], color='black', label='theoretical')
plt.xlabel('Wind Speed')
plt.ylabel('Power')
plt.legend(loc='best')

# 保存图表
plt.savefig('image4.png', dpi=600, bbox_inches='tight')
plt.show()
43fb5c6e1aa8c92680090d457785523a.png

図 4 「静かな」風力エネルギー曲線

ご覧のとおり、この図にはその他の詳細が含まれていないため、説明が必要です。

しかし、カットイン速度、定格速度、カットアウト速度を指定するグラフの 3 つの主要領域を強調表示する線を追加し、外れ値の 1 つを示す矢印付きの注記を追加した場合はどうなるでしょうか。

この場合、グラフがどのように見えるかを見てみましょう。

import pandas as pd
import matplotlib.pyplot as plt

# 读取数据
data = pd.read_csv('T1.csv')
print(data)

# 为列重命名,使其标题更简短
data.rename(columns={'LV ActivePower (kW)':'P',
                     'Wind Speed (m/s)':'Ws',
                     'Theoretical_Power_Curve (KWh)':'Power_curve',
                     'Wind Direction (°)': 'Wa'},inplace=True)

# 建立图表
plt.scatter(data['Ws'], data['P'], color='steelblue', marker='+', label='actual')
plt.scatter(data['Ws'], data['Power_curve'], color='black', label='theoretical')

# 添加垂直线、文字注释和箭头
plt.vlines(x=3.05, ymin=10, ymax=350, lw=3, color='black')
plt.text(1.1, 355, r"cut-in", fontsize=15)
plt.vlines(x=12.5, ymin=3000, ymax=3500, lw=3, color='black')
plt.text(13.5, 2850, r"nominal", fontsize=15)
plt.vlines(x=24.5, ymin=3080, ymax=3550, lw=3, color='black')
plt.text(21.5, 2900, r"cut-out", fontsize=15)
plt.annotate('outlier!', xy=(18.4,1805), xytext=(21.5,2050),
            arrowprops={'color':'red'})

plt.xlabel('Wind Speed')
plt.ylabel('Power')
plt.legend(loc='best')

# 保存图表
plt.savefig('image4_2.png', dpi=600, bbox_inches='tight')
plt.show()
714322190595c5efb11beb77d73e5253.png

図5 「よく話す」の風力エネルギー曲線図

ヒント 3: より速く作成する方法を常に見つける

風力エネルギー データを分析するとき、多くの場合、風力エネルギーの可能性に関する包括的な情報を取得したいと考えます。したがって、風力エネルギーのダイナミクスに加えて、風速が風向きによってどのように変化するかを示すグラフが必要です。

風力エネルギーの変化を考慮するには、次のコードを使用できます。

import pandas as pd
import matplotlib.pyplot as plt

# 读取数据
data = pd.read_csv('T1.csv')
print(data)

# 为列重命名,使其标题更简短
data.rename(columns={'LV ActivePower (kW)':'P',
                     'Wind Speed (m/s)':'Ws',
                     'Theoretical_Power_Curve (KWh)':'Power_curve',
                     'Wind Direction (°)': 'Wa'},inplace=True)

# 将 10 分钟数据重采样为每小时测量值
data['Date/Time'] = pd.to_datetime(data['Date/Time'])
fig = plt.figure(figsize=(10,8))
group_data = (data.set_index('Date/Time')).resample('H')['P'].sum()

# 绘制风能动态图
group_data.plot(kind='line')
plt.ylabel('Power')
plt.xlabel('Date/Time')
plt.title('Power generation (resampled to 1 hour)')

# 保存图表
plt.savefig('wind_power.png', dpi=600, bbox_inches='tight')
plt.show()

以下の図は描画結果です。

3aabda59736106422072c5d909fe9513.png

図6 風力エネルギーの動的変化

お気づきのとおり、風力エネルギーの動的プロファイルはかなり複雑で不規則な形をしています。

風配図またはポーラー ローズ プロットは、気象データの分布、通常は風速の方向分布を表すために使用される特別なグラフです [3]。matplotlib ライブラリには、このような視覚化を簡単に構築できる単純なモジュール Windrose があります。次に例を示します。

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from windrose import WindroseAxes

# 读取数据
data = pd.read_csv('T1.csv')
print(data)

#为列重命名,使其标题更简短
data.rename(columns={'LV ActivePower (kW)':'P',
                     'Wind Speed (m/s)':'Ws',
                     'Theoretical_Power_Curve (KWh)':'Power_curve',
                     'Wind Direction (°)': 'Wa'},inplace=True)
wd  = data['Wa']
ws = data['Ws']

# 以堆叠直方图的形式绘制正态化风玫瑰图
ax = WindroseAxes.from_ax()
ax.bar(wd, ws, normed=True, opening=0.8, edgecolor='white')
ax.set_legend()

# 保存图表
plt.savefig('windrose.png', dpi = 600, bbox_inches = 'tight')
plt.show()
e3d2ff042d7afd6b48ee563fab43d4c2.png

図 7 入手可能なデータに基づく風配図

風配図を見ると、主に北東と南西の 2 つの風向きがあることがわかります。

しかし、これら 2 つの画像を 1 つに結合するにはどうすればよいでしょうか? 最も明白な方法は、add_subplot を使用することです。ただし、Windrose ライブラリの仕様により、これは簡単な作業ではありません。

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from windrose import WindroseAxes

# 读取数据
data = pd.read_csv('T1.csv')
print(data)

# 为列重命名,使其标题更简短
data.rename(columns={'LV ActivePower (kW)':'P',
                     'Wind Speed (m/s)':'Ws',
                     'Theoretical_Power_Curve (KWh)':'Power_curve',
                     'Wind Direction (°)': 'Wa'},inplace=True)
data['Date/Time'] = pd.to_datetime(data['Date/Time'])

fig = plt.figure(figsize=(10,8))

# 将两个图都绘制为子图
ax1 = fig.add_subplot(211)
group_data = (data.set_index('Date/Time')).resample('H')['P'].sum()
group_data.plot(kind='line')
ax1.set_ylabel('Power')
ax1.set_xlabel('Date/Time')
ax1.set_title('Power generation (resampled to 1 hour)')

ax2 = fig.add_subplot(212, projection='windrose')

wd  = data['Wa']
ws = data['Ws']

ax = WindroseAxes.from_ax()
ax2.bar(wd, ws, normed=True, opening=0.8, edgecolor='white')
ax2.set_legend()

# 保存图表
plt.savefig('image5.png', dpi=600, bbox_inches='tight')
plt.show()

この場合、結果は次のようになります。

9525f787f6e096c605de0ace30cceabb.png

図 8 風力エネルギーのダイナミクスと風配図を示す 1 つの写真

この主な欠点は、2 つのサブプロットのサイズが異なるため、風配図プロットの周囲に多くの空白ができることです。

便宜上、Python Imaging Library (PIL) [4] を使用する代替アプローチを提案します。これに必要なコードは数十行だけです。

import numpy as np
import PIL
from PIL import Image

# 列出需要合并的图片 
list_im = ['wind_power.png','windrose.png']
imgs = [PIL.Image.open(i) for i in list_im]

# 调整所有图片的大小,使其与最小图片相匹配
min_shape = sorted([(np.sum(i.size), i.size) for i in imgs])[0][1]

# 对于垂直堆叠,我们使用 vstack
images_comb = np.vstack((np.asarray(i.resize(min_shape)) for i in imgs))
images_comb = PIL.Image.fromarray(imgs_comb)

# 保存图表
imgages_comb.save('image5_2.png', dpi=(600,600))

ここでは、コードが最小の画像を選択し、一致するように他の画像を再スケールするため、出力は少しきれいに見えます。両方の画像は同じサイズです。

PIL を使用して取得した風のダイナミクスと風配図を含む 1 つの画像

ちなみに、PIL を使用する場合は、水平スタッキングも使用できます。たとえば、「静かな」風と「おしゃべりな」風カーブを比較対照することができます。

import numpy as np
import PIL
from PIL import Image

list_im = ['image4.png','image4_2.png']
imgs = [PIL.Image.open(i) for i in list_im]

# 选取最小的图片 ,并调整其他图片 的大小以与之匹配(此处可任意调整图片形状)
min_shape = sorted([(np.sum(i.size), i.size) for i in imgs])[0][1]

imgs_comb = np.hstack((np.asarray(i.resize(min_shape)) for i in imgs))

# 保存图表
imgs_comb = PIL.Image.fromarray(imgs_comb)
imgs_comb.save('image4_merged.png', dpi=(600,600))
1bcb2c3e234b7383ba5096614af8135e.png

図 9 2 つの風速曲線の比較と対比

結論は

この記事では、EDA プロセスを容易にする方法に関する 3 つのヒントを紹介します。これらの提案が、学習者がデータ タスクに適用し始めるのに役立つことを願っています。

これらのテクニックは、私が EDA を実行するときに適用しようとしてきた公式、つまりCustom → Itemsized → Optimizedに完全に適合します。

これが一体何の意味があるのか​​と疑問に思うかもしれません。これは実際に重要であると言えるのは、次のような理由からです。

  • 当面の特定のニーズに応じてチャートをカスタマイズすることが非常に重要です。たとえば、大量のインフォグラフィックスを作成する代わりに、散布図と相関図の両方の長所を組み合わせた要約マトリックスを作成したときと同じように、複数のグラフを 1 つに結合する方法を考えます。

  • すべてのチャートがそれ自体を物語っているはずです。したがって、グラフ内で重要なことを箇条書きにして詳細かつ読みやすくする方法を知る必要があります。Silent と Eloquent のパワー カーブの違いがどれだけ大きいかを比較してください。

  • 最後に、すべてのデータ サイエンティストは、EDA プロセスを最適化して仕事を (そして生活を) 楽にする方法を学ぶ必要があります。2 つのプロットを 1 つにマージする必要がある場合、add_subplot オプションを使用する必要は必ずしもありません。

ほかに何か?EDA は、データを扱うプロセスにおいて非常に創造的で興味深いステップであると断言できます (非常に重要であることは言うまでもありません)。

インフォグラフィックをダイヤモンドのように輝かせ、そのプロセスを楽しむことを忘れないでください。

参考文献リスト

  1. 風力エネルギーの分析と予測のデータ駆動型アプリケーション:「ラ・オート・ボルヌ」風力発電所の事例 https://doi.org/10.1016/j.dche.2022.100048

  2. 風力エネルギー データ: https://www.kaggle.com/datasets/bhavkhikadara/wind-power-generated-data?resource=download

  3. Windrose ライブラリのチュートリアル: https://windrose.readthedocs.io/en/latest/index.html

  4. PIL ライブラリ: https://pillow.readthedocs.io/en/stable/index.html

cddff4287a01ed165f093cffbd09b529.png

整理整頓が難しくて3好き

おすすめ

転載: blog.csdn.net/Datawhale/article/details/132505341