Pandasを用いたCSVファイルのデータ可視化は、データ分析や意思決定を迅速かつ効率的に行うための重要な技術です。データを視覚的に表現することで、傾向やパターンを簡単に見つけられるため、ビジネス分析や科学研究、学術プロジェクトで幅広く活用されています。本記事では、PandasでCSVデータを読み込む基本操作から始め、MatplotlibやSeabornなどのライブラリを使用して、データを魅力的でわかりやすい形に可視化する方法を解説します。Pythonを活用したデータ分析のスキル向上に役立ててください。
CSVファイルの読み込みとデータ概要確認
Pandasを使用してCSVファイルを読み込むことで、データの解析を効率的に始めることができます。以下の手順でCSVファイルを読み込み、データの概要を確認します。
CSVファイルの読み込み
Pandasのread_csv()
関数を使用してCSVファイルを読み込みます。例えば、data.csv
というファイルを読み込む場合、以下のコードを使用します。
import pandas as pd
# CSVファイルを読み込む
df = pd.read_csv('data.csv')
# データフレームの先頭数行を表示
print(df.head())
このコードにより、CSVデータがPandasのデータフレームに格納され、データの先頭5行を確認できます。
データ概要の確認
読み込んだデータの構造や基本的な統計情報を把握するには、以下の方法を活用します。
- データの行数と列数を確認
print(df.shape)
# 出力: (行数, 列数)
- データ型や欠損値の確認
print(df.info())
- 基本統計量の確認
print(df.describe())
- 特定の列の確認
print(df['列名'].unique()) # 列のユニークな値を表示
print(df['列名'].value_counts()) # 値の出現回数をカウント
これらの手法を使用して、データの大まかな内容を理解し、次の可視化ステップに進む準備を整えます。
Matplotlibを用いた基本的なグラフの作成
PandasとMatplotlibを組み合わせることで、CSVデータを手軽に可視化できます。ここでは、基本的なグラフの作成方法を紹介します。
Matplotlibのセットアップ
まず、Matplotlibをインポートします。pyplot
モジュールを使うことで、簡単にグラフを作成できます。
import matplotlib.pyplot as plt
# データフレームを読み込み済みの df を使用
df = pd.read_csv('data.csv')
折れ線グラフの作成
時系列データや連続するデータを視覚化するには折れ線グラフが便利です。
# x軸に「日付」、y軸に「売上」のデータをプロット
plt.plot(df['日付'], df['売上'])
plt.title('売上の推移')
plt.xlabel('日付')
plt.ylabel('売上')
plt.xticks(rotation=45) # x軸のラベルを回転
plt.show()
棒グラフの作成
カテゴリごとの値を視覚化する際には棒グラフが適しています。
# 商品カテゴリごとの売上を集計して棒グラフを作成
category_sales = df.groupby('カテゴリ')['売上'].sum()
category_sales.plot(kind='bar', color='skyblue')
plt.title('カテゴリ別売上')
plt.xlabel('カテゴリ')
plt.ylabel('売上')
plt.show()
散布図の作成
2つの変数間の相関関係を視覚化するには散布図を使用します。
# 価格と売上の関係をプロット
plt.scatter(df['価格'], df['売上'], alpha=0.7, color='green')
plt.title('価格と売上の相関')
plt.xlabel('価格')
plt.ylabel('売上')
plt.show()
ヒストグラムの作成
データの分布を確認するためにはヒストグラムが有効です。
# 売上データの分布をプロット
df['売上'].plot(kind='hist', bins=20, color='orange', edgecolor='black')
plt.title('売上の分布')
plt.xlabel('売上')
plt.ylabel('頻度')
plt.show()
これらのグラフを活用することで、データの特性を視覚的に理解できるようになります。次に、Seabornを用いたさらに高度な可視化を学びます。
Seabornによる高度なプロットの活用方法
SeabornはPandasやMatplotlibと連携し、高品質なグラフを簡単に作成できるライブラリです。複雑なプロットやスタイリングが直感的に行えます。ここでは、Seabornを使用した高度な可視化方法を紹介します。
Seabornのセットアップ
まず、Seabornをインポートし、スタイルを設定します。
import seaborn as sns
# スタイルを設定
sns.set(style="whitegrid")
df = pd.read_csv('data.csv') # データを読み込み
カテゴリデータの可視化: 箱ひげ図
カテゴリごとのデータ分布を可視化するには、箱ひげ図が有効です。
# カテゴリごとの売上の分布を可視化
sns.boxplot(x='カテゴリ', y='売上', data=df, palette='pastel')
plt.title('カテゴリ別売上の分布')
plt.xlabel('カテゴリ')
plt.ylabel('売上')
plt.show()
相関関係の可視化: 散布図と回帰直線
Seabornのregplot
を使用すると、散布図に回帰直線を追加できます。
# 価格と売上の相関関係をプロット
sns.regplot(x='価格', y='売上', data=df, scatter_kws={'alpha':0.6}, line_kws={'color':'red'})
plt.title('価格と売上の相関関係')
plt.xlabel('価格')
plt.ylabel('売上')
plt.show()
データの分布可視化: ヒートマップ
データの相関行列を視覚化するにはヒートマップを使用します。
# 相関行列を計算
correlation_matrix = df.corr()
# ヒートマップを作成
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', fmt='.2f')
plt.title('相関行列ヒートマップ')
plt.show()
カテゴリと数値の関係: バイオリンプロット
バイオリンプロットは、カテゴリごとのデータ分布を滑らかに表現します。
# カテゴリごとの売上分布をプロット
sns.violinplot(x='カテゴリ', y='売上', data=df, palette='muted', inner='quartile')
plt.title('カテゴリ別売上分布(バイオリンプロット)')
plt.xlabel('カテゴリ')
plt.ylabel('売上')
plt.show()
データの傾向を強調: カウントプロット
カテゴリデータの出現頻度を視覚化するにはカウントプロットが便利です。
# 商品カテゴリの出現頻度をプロット
sns.countplot(x='カテゴリ', data=df, palette='viridis')
plt.title('商品カテゴリの頻度')
plt.xlabel('カテゴリ')
plt.ylabel('頻度')
plt.show()
Seabornの洗練されたグラフを活用することで、データの洞察がさらに深まります。次に、特定のカラムを抽出してデータを可視化する方法を解説します。
特定のカラムを抽出したデータの可視化
データ分析では、関心のある特定のカラムや条件に基づいたデータを抽出し、それを可視化することが重要です。Pandasを使用してデータをフィルタリングし、適切なプロットを作成する方法を紹介します。
特定のカラムを抽出してプロット
特定の列に注目してデータを可視化する場合、DataFrame
の列名を指定してデータを取り出します。
# 売上データのみをヒストグラムで表示
df['売上'].plot(kind='hist', bins=15, color='skyblue', edgecolor='black')
plt.title('売上の分布')
plt.xlabel('売上')
plt.ylabel('頻度')
plt.show()
複数カラムの組み合わせでプロット
複数のカラムを選択して相関を可視化します。
# 売上と価格の関係を散布図で表示
plt.scatter(df['価格'], df['売上'], color='green', alpha=0.6)
plt.title('価格と売上の相関')
plt.xlabel('価格')
plt.ylabel('売上')
plt.show()
条件に基づいたデータの可視化
条件を指定してデータを抽出し、その結果を可視化することで、特定のデータ群を詳しく分析できます。
# 売上が1000以上のデータを抽出してプロット
high_sales = df[df['売上'] >= 1000]
plt.plot(high_sales['日付'], high_sales['売上'], marker='o', color='orange')
plt.title('売上が1000以上の日付別推移')
plt.xlabel('日付')
plt.ylabel('売上')
plt.xticks(rotation=45)
plt.show()
グループ化したデータの集計と可視化
カテゴリや特定の属性でデータをグループ化し、その結果を視覚化します。
# 商品カテゴリごとの平均売上を計算
category_avg_sales = df.groupby('カテゴリ')['売上'].mean()
# 棒グラフで表示
category_avg_sales.plot(kind='bar', color='coral')
plt.title('カテゴリ別平均売上')
plt.xlabel('カテゴリ')
plt.ylabel('平均売上')
plt.show()
複数条件でのデータ抽出と可視化
複数条件を指定することで、さらに絞り込んだデータを可視化できます。
# 売上が1000以上かつ価格が500未満のデータを抽出
filtered_data = df[(df['売上'] >= 1000) & (df['価格'] < 500)]
# 散布図で可視化
plt.scatter(filtered_data['価格'], filtered_data['売上'], color='purple', alpha=0.7)
plt.title('売上1000以上かつ価格500未満の関係')
plt.xlabel('価格')
plt.ylabel('売上')
plt.show()
これにより、特定のカラムや条件に注目したデータの分析が可能となり、重要なパターンを発見するのに役立ちます。次は、時系列データの可視化手法を解説します。
時系列データのプロット手法
時系列データは、時間に基づくトレンドや季節性を分析する際に重要です。Pandasと可視化ライブラリを使用して、時系列データを効果的にプロットする方法を紹介します。
時系列データの準備
まず、データの時系列カラムをPandasのdatetime
形式に変換します。これにより、Pandasの時系列機能を利用できるようになります。
# 日付カラムをdatetime形式に変換
df['日付'] = pd.to_datetime(df['日付'])
# データフレームを日付でソート
df = df.sort_values('日付')
# 日付をインデックスに設定(オプション)
df.set_index('日付', inplace=True)
単一時系列データのプロット
時系列データを折れ線グラフで可視化します。
# 売上データをプロット
df['売上'].plot(figsize=(10, 5), color='blue', linewidth=2)
plt.title('売上の時系列推移')
plt.xlabel('日付')
plt.ylabel('売上')
plt.grid(True)
plt.show()
複数時系列データの比較
複数の時系列データを同じグラフに重ねて比較します。
# 売上と利益を同時にプロット
df[['売上', '利益']].plot(figsize=(10, 5), linewidth=2)
plt.title('売上と利益の時系列推移')
plt.xlabel('日付')
plt.ylabel('金額')
plt.legend(['売上', '利益'])
plt.grid(True)
plt.show()
季節性やトレンドの分析
時系列データに季節性やトレンドが含まれる場合、それを分解して分析できます。
from statsmodels.tsa.seasonal import seasonal_decompose
# 売上データの季節性分解
decomposition = seasonal_decompose(df['売上'], model='additive', period=12)
# 各要素(トレンド、季節性、残差)をプロット
decomposition.plot()
plt.show()
特定の期間に限定したプロット
特定の期間を抽出してプロットします。
# 2023年のデータを抽出してプロット
df_2023 = df['2023']
df_2023['売上'].plot(figsize=(10, 5), color='green', linewidth=2)
plt.title('2023年の売上推移')
plt.xlabel('日付')
plt.ylabel('売上')
plt.grid(True)
plt.show()
可視化のカスタマイズ
時系列グラフを強調するため、プロットにマーカーや注釈を追加します。
# 売上データにマーカーを追加
plt.plot(df.index, df['売上'], marker='o', color='red', linewidth=2)
plt.title('売上の時系列推移(マーカー付き)')
plt.xlabel('日付')
plt.ylabel('売上')
plt.grid(True)
# 特定の日付に注釈を追加
peak_date = df['売上'].idxmax() # 最大売上の日付
peak_value = df['売上'].max()
plt.annotate(f'最大売上: {peak_value}', xy=(peak_date, peak_value), xytext=(peak_date, peak_value + 100),
arrowprops=dict(facecolor='black', arrowstyle='->'), fontsize=10)
plt.show()
インタラクティブな時系列プロット
インタラクティブなプロットを作成するには、Plotly
などのライブラリを利用します。
import plotly.express as px
# 売上データのインタラクティブな時系列プロット
fig = px.line(df.reset_index(), x='日付', y='売上', title='売上の時系列推移')
fig.show()
これらの手法を活用することで、時系列データを効果的に可視化し、トレンドや季節性を把握できるようになります。次は、複数グラフを同時にプロットする方法を解説します。
複数グラフを同時にプロットする方法
データ分析の際に、複数のグラフを一度に表示することで、異なる視点からデータを比較しやすくなります。ここでは、MatplotlibとSeabornを用いて複数のグラフを同時にプロットする方法を解説します。
Matplotlibで複数グラフを描画
Matplotlibのsubplot
を使用すると、1つの図内に複数のグラフを描画できます。
import matplotlib.pyplot as plt
# グラフを2行2列で配置
fig, axes = plt.subplots(2, 2, figsize=(12, 8))
# グラフ1: 売上の時系列推移
axes[0, 0].plot(df.index, df['売上'], color='blue', linewidth=2)
axes[0, 0].set_title('売上の時系列推移')
axes[0, 0].set_xlabel('日付')
axes[0, 0].set_ylabel('売上')
# グラフ2: 利益の時系列推移
axes[0, 1].plot(df.index, df['利益'], color='green', linewidth=2)
axes[0, 1].set_title('利益の時系列推移')
axes[0, 1].set_xlabel('日付')
axes[0, 1].set_ylabel('利益')
# グラフ3: 売上の分布(ヒストグラム)
axes[1, 0].hist(df['売上'], bins=15, color='orange', edgecolor='black')
axes[1, 0].set_title('売上の分布')
axes[1, 0].set_xlabel('売上')
axes[1, 0].set_ylabel('頻度')
# グラフ4: 価格と売上の相関(散布図)
axes[1, 1].scatter(df['価格'], df['売上'], color='purple', alpha=0.7)
axes[1, 1].set_title('価格と売上の相関')
axes[1, 1].set_xlabel('価格')
axes[1, 1].set_ylabel('売上')
# レイアウト調整
plt.tight_layout()
plt.show()
Seabornを用いた複数グラフの描画
SeabornのFacetGrid
を使用すると、特定のカテゴリごとにデータを分割して複数のグラフを描画できます。
import seaborn as sns
# カテゴリごとの売上の時系列プロット
g = sns.FacetGrid(df, col="カテゴリ", col_wrap=3, height=4)
g.map(sns.lineplot, "日付", "売上")
g.set_titles("{col_name}")
g.set_axis_labels("日付", "売上")
plt.show()
Matplotlibで異なるグラフを1つの図に重ねる
異なる種類のグラフを1つの図に重ねて表示することで、データを比較できます。
fig, ax1 = plt.subplots(figsize=(10, 6))
# 売上を折れ線グラフでプロット
ax1.plot(df.index, df['売上'], color='blue', label='売上')
ax1.set_xlabel('日付')
ax1.set_ylabel('売上', color='blue')
ax1.tick_params(axis='y', labelcolor='blue')
# 利益を棒グラフで重ねる
ax2 = ax1.twinx() # 2つ目のy軸を作成
ax2.bar(df.index, df['利益'], color='orange', alpha=0.6, label='利益')
ax2.set_ylabel('利益', color='orange')
ax2.tick_params(axis='y', labelcolor='orange')
# タイトルと凡例
fig.suptitle('売上と利益の比較')
fig.legend(loc='upper left', bbox_to_anchor=(0.1, 0.9))
plt.show()
複数のプロットを個別に保存
各グラフを個別に保存する場合は、プロットごとにsavefig()
を呼び出します。
# 売上の時系列推移を保存
df['売上'].plot()
plt.title('売上の時系列推移')
plt.savefig('sales_trend.png')
plt.clf() # 現在の図をクリア
# 売上の分布を保存
df['売上'].plot(kind='hist', bins=15, color='orange', edgecolor='black')
plt.title('売上の分布')
plt.savefig('sales_distribution.png')
plt.clf()
インタラクティブな複数グラフの描画
Plotly
を使用して、インタラクティブな複数グラフを作成します。
import plotly.subplots as sp
import plotly.graph_objects as go
# サブプロット作成
fig = sp.make_subplots(rows=2, cols=2, subplot_titles=("売上", "利益", "売上分布", "価格と売上の相関"))
# 売上の時系列
fig.add_trace(go.Scatter(x=df.index, y=df['売上'], name='売上'), row=1, col=1)
# 利益の時系列
fig.add_trace(go.Scatter(x=df.index, y=df['利益'], name='利益'), row=1, col=2)
# 売上の分布
fig.add_trace(go.Histogram(x=df['売上'], name='売上分布'), row=2, col=1)
# 価格と売上の相関
fig.add_trace(go.Scatter(x=df['価格'], y=df['売上'], mode='markers', name='価格 vs 売上'), row=2, col=2)
# レイアウト調整
fig.update_layout(title_text="複数グラフの比較", showlegend=False, height=800)
fig.show()
複数のグラフを同時に描画することで、異なるデータ視点を組み合わせた分析が可能になります。次は、グラフのカスタマイズ手法について解説します。
グラフのカスタマイズ方法(色、スタイル、注釈など)
グラフを見やすく、情報量豊かにするためには、色やスタイル、注釈を適切にカスタマイズすることが重要です。ここでは、Matplotlibを中心に、グラフのカスタマイズ方法を紹介します。
色とスタイルの変更
グラフの色やスタイルを変更することで、視認性を向上させることができます。
import matplotlib.pyplot as plt
# 基本的なカスタマイズ
plt.plot(df.index, df['売上'], color='blue', linestyle='--', linewidth=2, label='売上')
plt.plot(df.index, df['利益'], color='green', linestyle='-', linewidth=2, label='利益')
# タイトルと軸ラベル
plt.title('売上と利益の推移', fontsize=16, fontweight='bold')
plt.xlabel('日付', fontsize=12)
plt.ylabel('金額', fontsize=12)
# 凡例の追加
plt.legend(fontsize=10, loc='upper left')
# グリッドの追加
plt.grid(color='gray', linestyle=':', linewidth=0.5)
plt.show()
フォントとサイズの調整
グラフ内の文字サイズやフォントスタイルを変更することで、視認性を高めます。
# 全体のフォントサイズを変更
plt.rcParams.update({'font.size': 12})
# 特定の要素のみ変更
plt.title('カスタマイズされたタイトル', fontsize=16, fontweight='bold')
plt.xlabel('日付', fontsize=12, fontstyle='italic')
plt.ylabel('売上', fontsize=12, fontstyle='italic')
注釈の追加
特定のデータポイントを強調するために注釈を追加します。
# 売上のピーク値を注釈で表示
peak_date = df['売上'].idxmax()
peak_value = df['売上'].max()
plt.plot(df.index, df['売上'], color='blue')
plt.annotate(f'ピーク: {peak_value}',
xy=(peak_date, peak_value),
xytext=(peak_date, peak_value + 500),
arrowprops=dict(facecolor='red', arrowstyle='->'),
fontsize=10, color='darkred')
plt.title('売上のピークを注釈付きで表示')
plt.xlabel('日付')
plt.ylabel('売上')
plt.grid(True)
plt.show()
カラーマップの利用
カラーマップを使うと、値の大小によって色を変化させることができます。
# 売上の散布図にカラーマップを適用
plt.scatter(df['価格'], df['売上'], c=df['売上'], cmap='viridis', alpha=0.8)
plt.title('価格と売上(カラーマップ)')
plt.xlabel('価格')
plt.ylabel('売上')
plt.colorbar(label='売上')
plt.show()
サブプロットのレイアウト調整
複数グラフを含む図の配置を調整して見やすくします。
fig, axes = plt.subplots(2, 2, figsize=(12, 8))
# 各グラフの描画
axes[0, 0].plot(df.index, df['売上'], color='blue')
axes[0, 0].set_title('売上の推移')
axes[0, 1].plot(df.index, df['利益'], color='green')
axes[0, 1].set_title('利益の推移')
axes[1, 0].hist(df['売上'], bins=15, color='orange')
axes[1, 0].set_title('売上の分布')
axes[1, 1].scatter(df['価格'], df['売上'], color='purple', alpha=0.7)
axes[1, 1].set_title('価格と売上の相関')
# レイアウト調整
plt.tight_layout()
plt.show()
グラフのテーマ変更
Seabornを使うと、テーマを変更してグラフ全体のスタイルを統一できます。
import seaborn as sns
# テーマ設定
sns.set_theme(style="whitegrid", palette="muted")
# 売上の時系列をプロット
sns.lineplot(x=df.index, y=df['売上'], color='blue', label='売上')
sns.lineplot(x=df.index, y=df['利益'], color='green', label='利益')
plt.title('売上と利益の推移(テーマ適用)')
plt.xlabel('日付')
plt.ylabel('金額')
plt.legend()
plt.show()
プロットの保存
作成したグラフを画像として保存します。
# グラフを保存
plt.plot(df.index, df['売上'], color='blue', label='売上')
plt.title('売上の推移')
plt.xlabel('日付')
plt.ylabel('売上')
plt.legend()
plt.savefig('sales_trend.png', dpi=300, bbox_inches='tight') # 高解像度で保存
plt.show()
これらのカスタマイズ手法を組み合わせることで、視覚的に優れたグラフを作成できます。次は、可視化したデータを保存する方法を解説します。
可視化したデータの保存方法(画像ファイル出力)
データを可視化したグラフは、分析結果を共有したり、レポートに使用したりするために画像ファイルとして保存することが重要です。ここでは、Matplotlibを使用してグラフを保存する基本的な方法とカスタマイズオプションを紹介します。
基本的な保存方法
Matplotlibのsavefig()
関数を使用してグラフを画像ファイルとして保存します。以下は基本的なコード例です。
import matplotlib.pyplot as plt
# グラフを作成
plt.plot(df.index, df['売上'], color='blue', label='売上')
plt.title('売上の推移')
plt.xlabel('日付')
plt.ylabel('売上')
plt.legend()
# 画像として保存
plt.savefig('sales_trend.png')
plt.show()
このコードは、現在のグラフをsales_trend.png
という名前のPNG形式で保存します。
画像形式の指定
MatplotlibはPNGだけでなく、JPEG、PDF、SVGなどさまざまな形式で保存可能です。
# JPEG形式で保存
plt.savefig('sales_trend.jpg', format='jpg')
# PDF形式で保存
plt.savefig('sales_trend.pdf', format='pdf')
# SVG形式で保存
plt.savefig('sales_trend.svg', format='svg')
解像度(DPI)の設定
画像の解像度を指定して、より高品質な画像を保存します。
# 高解像度(300 DPI)で保存
plt.savefig('sales_trend_high_res.png', dpi=300)
余白の調整
デフォルトではグラフ周辺に余白が含まれることがあります。余白を調整するには、bbox_inches='tight'
を使用します。
# 余白を取り除いて保存
plt.savefig('sales_trend_tight.png', bbox_inches='tight')
複数グラフの保存
複数のグラフを作成して、それぞれを個別のファイルに保存します。
# グラフ1: 売上
plt.plot(df.index, df['売上'], color='blue')
plt.title('売上の推移')
plt.savefig('sales_plot.png')
plt.clf() # 現在のグラフをクリア
# グラフ2: 利益
plt.plot(df.index, df['利益'], color='green')
plt.title('利益の推移')
plt.savefig('profit_plot.png')
plt.clf()
インタラクティブなプロットの保存
Plotly
を使用して作成したインタラクティブなプロットは、HTML形式で保存できます。
import plotly.express as px
# 売上のインタラクティブプロット
fig = px.line(df.reset_index(), x='日付', y='売上', title='売上の推移')
# HTMLファイルとして保存
fig.write_html('interactive_sales_plot.html')
保存後の確認
保存された画像を確認するために、Python内で簡易的に画像を開くコードを追加することもできます。
from PIL import Image
# 保存した画像を開く
img = Image.open('sales_trend.png')
img.show()
これらの方法を活用することで、分析結果を適切に保存し、共有やプレゼンテーションに活用できます。次に、記事のまとめを解説します。
まとめ
本記事では、PythonのPandasライブラリを活用してCSVデータを可視化する方法について詳しく解説しました。データの読み込みから、基本的なグラフの作成、時系列データのプロット、複数グラフの表示、そしてグラフのカスタマイズや保存方法まで、幅広く網羅しました。
データの視覚化は、情報を分かりやすく伝えるための重要なスキルです。PandasやMatplotlib、Seabornを適切に組み合わせることで、データのパターンやトレンドを簡単に発見できます。さらに、画像の保存やインタラクティブなプロットを使用することで、分析結果を効果的に共有できるようになります。
これらの手法を活用して、より効率的なデータ分析とプレゼンテーションを実現してください。
コメント