Pythonでデータ分析入門:pandas、NumPy、Matplotlibの基礎

Pythonを使ったデータ分析の基礎を、実践的なコード例とともに解説します。

はじめに

データ分析は現代のビジネスにおいて必須スキルとなっています。PythonとそのライブラリであるPandas、NumPy、Matplotlibを使えば、効率的にデータ分析を行うことができます。

環境構築

必要なライブラリのインストール

1
pip install pandas numpy matplotlib seaborn jupyter

Jupyter Notebookの起動

1
jupyter notebook

NumPy:数値計算の基礎

配列の作成と操作

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import numpy as np

# 配列の作成
arr = np.array([1, 2, 3, 4, 5])
matrix = np.array([[1, 2, 3], [4, 5, 6]])

# 統計量の計算
print(f"平均: {arr.mean()}")
print(f"標準偏差: {arr.std()}")
print(f"最大値: {arr.max()}")

行列演算

1
2
3
4
5
6
7
8
9
# 行列の積
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])

# 要素ごとの積
element_wise = A * B

# 行列積
matrix_product = A @ B

Pandas:データ操作の要

DataFrameの基本操作

1
2
3
4
5
6
7
8
9
import pandas as pd

# CSVファイルの読み込み
df = pd.read_csv('sales_data.csv')

# データの概要確認
print(df.head())
print(df.info())
print(df.describe())

データのフィルタリングと集計

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 条件によるフィルタリング
high_sales = df[df['売上'] > 100000]

# グループ化と集計
monthly_sales = df.groupby('月')['売上'].agg(['sum', 'mean', 'count'])

# ピボットテーブル
pivot = df.pivot_table(
    values='売上',
    index='商品カテゴリ',
    columns='地域',
    aggfunc='sum'
)

欠損値の処理

1
2
3
4
5
6
7
8
# 欠損値の確認
print(df.isnull().sum())

# 欠損値の補完
df['価格'].fillna(df['価格'].mean(), inplace=True)

# 欠損値を含む行の削除
df_clean = df.dropna()

Matplotlib:データの可視化

基本的なグラフ

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import matplotlib.pyplot as plt
import matplotlib as mpl

# 日本語フォントの設定
mpl.font_manager.fontManager.addfont('/System/Library/Fonts/ヒラギノ角ゴシック W3.ttc')
plt.rcParams['font.family'] = 'Hiragino Sans'

# 折れ線グラフ
plt.figure(figsize=(10, 6))
plt.plot(df['日付'], df['売上'], marker='o')
plt.title('月別売上推移')
plt.xlabel('月')
plt.ylabel('売上(円)')
plt.grid(True)
plt.show()

複数のグラフを組み合わせる

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
fig, axes = plt.subplots(2, 2, figsize=(12, 10))

# ヒストグラム
axes[0, 0].hist(df['価格'], bins=20, edgecolor='black')
axes[0, 0].set_title('価格分布')

# 散布図
axes[0, 1].scatter(df['広告費'], df['売上'])
axes[0, 1].set_title('広告費 vs 売上')

# 箱ひげ図
axes[1, 0].boxplot([df[df['地域']=='東京']['売上'],
                    df[df['地域']=='大阪']['売上']])
axes[1, 0].set_xticklabels(['東京', '大阪'])
axes[1, 0].set_title('地域別売上分布')

# 円グラフ
category_sales = df.groupby('カテゴリ')['売上'].sum()
axes[1, 1].pie(category_sales, labels=category_sales.index, autopct='%1.1f%%')
axes[1, 1].set_title('カテゴリ別売上構成')

plt.tight_layout()
plt.show()

実践例:売上データの分析

データの準備

1
2
3
4
5
6
7
8
9
# サンプルデータの作成
np.random.seed(42)
dates = pd.date_range('2024-01-01', periods=365)
sales_data = pd.DataFrame({
    '日付': dates,
    '売上': np.random.normal(100000, 20000, 365) + np.sin(np.arange(365) * 2 * np.pi / 365) * 30000,
    '広告費': np.random.normal(10000, 2000, 365),
    '気温': np.random.normal(20, 10, 365)
})

時系列分析

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 移動平均の計算
sales_data['売上_7日移動平均'] = sales_data['売上'].rolling(window=7).mean()
sales_data['売上_30日移動平均'] = sales_data['売上'].rolling(window=30).mean()

# グラフ化
plt.figure(figsize=(14, 6))
plt.plot(sales_data['日付'], sales_data['売上'], alpha=0.3, label='日次売上')
plt.plot(sales_data['日付'], sales_data['売上_7日移動平均'], label='7日移動平均')
plt.plot(sales_data['日付'], sales_data['売上_30日移動平均'], label='30日移動平均')
plt.legend()
plt.title('売上推移と移動平均')
plt.show()

相関分析

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 相関係数の計算
correlation_matrix = sales_data[['売上', '広告費', '気温']].corr()

# ヒートマップで可視化
import seaborn as sns

plt.figure(figsize=(8, 6))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', center=0)
plt.title('変数間の相関係数')
plt.show()

データ分析のベストプラクティス

1. データの前処理は丁寧に

  • 欠損値の確認と処理
  • 外れ値の検出と対処
  • データ型の確認と変換

2. 可視化は目的に応じて

  • 分布を見る:ヒストグラム、箱ひげ図
  • 関係性を見る:散布図、相関行列
  • 推移を見る:折れ線グラフ
  • 構成を見る:円グラフ、積み上げ棒グラフ

3. 再現性の確保

1
2
3
4
5
6
# 乱数のシード固定
np.random.seed(42)

# バージョン情報の記録
print(f"pandas: {pd.__version__}")
print(f"numpy: {np.__version__}")

まとめ

Pythonでのデータ分析は、pandas、NumPy、Matplotlibの3つのライブラリを使いこなすことから始まります。基本的な操作を習得したら、実際のデータセットで練習を重ねることが上達への近道です。

次回は、scikit-learnを使った機械学習入門について解説予定です。

技術ネタ、趣味や備忘録などを書いているブログです
Hugo で構築されています。
テーマ StackJimmy によって設計されています。