Pythonデータ分析入門:Pandasを使った実践ハンズオン
Pythonは、データサイエンスやデータ分析において最も人気のある言語の一つです。この記事では、データ分析で欠かせないライブラリであるPandasを使い、実際のデータセットを分析する方法を学びます。
初心者でも理解できるよう、基本的な操作から始めて、最終的には複雑なデータ分析まで行えるようになることを目指します。
1. 環境の準備
まずは、必要なライブラリをインストールしましょう。仮想環境を作成してからインストールすることをお勧めします。
# 仮想環境の作成
python -m venv venv
# 仮想環境の有効化(Windows)
venv\Scripts\activate
# 仮想環境の有効化(Mac/Linux)
source venv/bin/activate
# 必要なライブラリのインストール
pip install pandas numpy matplotlib seaborn
Jupyter Notebookを使用する場合は、以下のコマンドも実行してください。
pip install jupyter
jupyter notebook
2. Pandasの基本概念
Pandasには、データを扱うための2つの主要なデータ構造があります。
2.1 Series(1次元データ)
Seriesは、1次元のラベル付き配列です。NumPyの配列にインデックスが付いたようなものと考えると分かりやすいでしょう。
import pandas as pd
import numpy as np
# Seriesの作成
data = pd.Series([1, 3, 5, np.nan, 6, 8])
print(data)
2.2 DataFrame(2次元データ)
DataFrameは、2次元のラベル付きデータ構造で、ExcelのスプレッドシートやSQLのテーブルのようなものです。
# DataFrameの作成
data = {
'名前': ['山田太郎', '佐藤花子', '鈴木一郎', '田中次郎'],
'年齢': [25, 30, 35, 28],
'都市': ['東京', '大阪', '名古屋', '福岡']
}
df = pd.DataFrame(data)
print(df)
3. データの読み込みと確認
実際のデータ分析では、CSVファイルやExcelファイルからデータを読み込むことが多いです。
3.1 CSVファイルの読み込み
# CSVファイルの読み込み
df = pd.read_csv('data.csv')
# データの最初の5行を表示
print(df.head())
# データの基本情報を確認
print(df.info())
# データの統計サマリーを表示
print(df.describe())
3.2 サンプルデータの作成
実際のデータがない場合でも、Pandasの機能を使ってサンプルデータを作成できます。
# ランダムなサンプルデータの作成
np.random.seed(42)
dates = pd.date_range('20230101', periods=100)
df = pd.DataFrame({
'日付': dates,
'売上': np.random.randn(100).cumsum(),
'訪問者数': np.random.randint(100, 1000, 100),
'カテゴリ': np.random.choice(['A', 'B', 'C'], 100)
})
print(df.head(10))
4. データの選択とフィルタリング
データ分析では、特定の列や行を選択したり、条件に合致するデータをフィルタリングすることが頻繁にあります。
4.1 列の選択
# 単一の列を選択
print(df['売上'])
# 複数の列を選択
print(df[['日付', '売上', '訪問者数']])
# 列の存在確認
if '売上' in df.columns:
print("売上列が存在します")
4.2 行の選択
# 最初の5行を選択
print(df.head(5))
# 最後の5行を選択
print(df.tail(5))
# 特定の行をインデックスで選択
print(df.iloc[0:5]) # 0から4行目まで
# 条件によるフィルタリング
high_sales = df[df['売上'] > 0]
print(high_sales.head())
4.3 複合条件でのフィルタリング
# 複数の条件を組み合わせる
filtered = df[(df['売上'] > 0) & (df['訪問者数'] > 500)]
print(filtered)
# isin()を使ったフィルタリング
categories = df[df['カテゴリ'].isin(['A', 'B'])]
print(categories.head())
5. データの操作と変換
5.1 新しい列の追加
# 計算による新しい列の追加
df['単価'] = df['売上'] / df['訪問者数']
df['売上ランク'] = pd.cut(df['売上'], bins=3, labels=['低', '中', '高'])
print(df.head())
5.2 データの並び替え
# 売上で降順にソート
sorted_df = df.sort_values('売上', ascending=False)
print(sorted_df.head(10))
# 複数列でのソート
sorted_df = df.sort_values(['カテゴリ', '売上'], ascending=[True, False])
print(sorted_df.head(10))
5.3 欠損値の処理
# 欠損値の確認
print(df.isnull().sum())
# 欠損値の削除
df_clean = df.dropna()
# 欠損値の補完(平均値で埋める)
df_filled = df.fillna(df.mean())
# 特定の値で埋める
df_filled = df.fillna(0)
6. データの集約とグループ化
データ分析の核心となる部分です。グループ化して集計することで、新しい洞察を得られます。
6.1 基本的な集計
# 基本的な統計量
print(df['売上'].sum())
print(df['売上'].mean())
print(df['売上'].median())
print(df['売上'].std())
# 複数の集計を一度に行う
print(df['売上'].agg(['sum', 'mean', 'std', 'min', 'max']))
6.2 グループ化
# カテゴリごとの集計
category_summary = df.groupby('カテゴリ').agg({
'売上': ['sum', 'mean'],
'訪問者数': 'sum'
})
print(category_summary)
# カテゴリごとの平均売上
category_avg = df.groupby('カテゴリ')['売上'].mean()
print(category_avg)
6.3 ピボットテーブル
# ピボットテーブルの作成
df['月'] = df['日付'].dt.month
pivot = pd.pivot_table(df, values='売上', index='カテゴリ', columns='月', aggfunc='sum')
print(pivot)
7. データの結合
複数のデータソースを結合することも、データ分析では重要なスキルです。
7.1 異なるDataFrameの結合
# サンプルデータの作成
df1 = pd.DataFrame({
'ID': [1, 2, 3, 4],
'名前': ['山田', '佐藤', '鈴木', '田中'],
'部門': ['営業', '開発', '営業', '開発']
})
df2 = pd.DataFrame({
'ID': [1, 2, 3, 5],
'給与': [500, 600, 550, 700],
'入社年': [2020, 2019, 2021, 2020]
})
# 内部結合
merged = pd.merge(df1, df2, on='ID', how='inner')
print(merged)
# 左結合
left_merged = pd.merge(df1, df2, on='ID', how='left')
print(left_merged)
# 外部結合
outer_merged = pd.merge(df1, df2, on='ID', how='outer')
print(outer_merged)
8. 時系列データの処理
日付や時刻を含むデータは、特別な処理が必要になることがあります。
8.1 日付の変換と抽出
# 日付列をdatetime型に変換
df['日付'] = pd.to_datetime(df['日付'])
# 年、月、日を抽出
df['年'] = df['日付'].dt.year
df['月'] = df['日付'].dt.month
df['日'] = df['日付'].dt.day
df['曜日'] = df['日付'].dt.day_name()
print(df.head())
8.2 時系列データのリサンプリング
# 日次から週次へのリサンプリング
weekly = df.set_index('日付').resample('W').sum()
print(weekly.head())
# 月次へのリサンプリング
monthly = df.set_index('日付').resample('M').agg({
'売上': 'sum',
'訪問者数': 'mean'
})
print(monthly.head())
9. データの可視化
データを理解するために、可視化は非常に有効な手段です。MatplotlibやSeabornと組み合わせて使用します。
9.1 基本的なプロット
import matplotlib.pyplot as plt
import seaborn as sns
# スタイルの設定
sns.set_style("whitegrid")
plt.rcParams['font.family'] = 'DejaVu Sans' # 日本語フォントの設定
# 折れ線グラフ
df.plot(x='日付', y='売上', kind='line', figsize=(10, 6))
plt.title('売上の推移')
plt.xlabel('日付')
plt.ylabel('売上')
plt.show()
# 棒グラフ
category_summary = df.groupby('カテゴリ')['売上'].sum()
category_summary.plot(kind='bar', figsize=(8, 6))
plt.title('カテゴリ別売上')
plt.ylabel('売上')
plt.show()
9.2 高度な可視化
# ヒストグラム
df['売上'].hist(bins=20, figsize=(8, 6))
plt.title('売上の分布')
plt.xlabel('売上')
plt.ylabel('頻度')
plt.show()
# 箱ひげ図
df.boxplot(column='売上', by='カテゴリ', figsize=(8, 6))
plt.title('カテゴリ別売上の分布')
plt.suptitle('') # デフォルトタイトルを削除
plt.show()
# 相関行列のヒートマップ
numeric_df = df.select_dtypes(include=[np.number])
correlation = numeric_df.corr()
sns.heatmap(correlation, annot=True, cmap='coolwarm', figsize=(8, 6))
plt.title('変数間の相関')
plt.show()
10. 実践的な分析例:売上データの分析
ここまで学んだ知識を活用して、実際のデータ分析を行ってみましょう。
# 1. データの読み込みと前処理
df = pd.read_csv('sales_data.csv') # 実際のデータがある場合
df['日付'] = pd.to_datetime(df['日付'])
# 2. データの探索
print("データの基本情報:")
print(df.info())
print("\n欠損値の確認:")
print(df.isnull().sum())
# 3. 基本的な統計量
print("\n基本的な統計量:")
print(df.describe())
# 4. カテゴリ別の分析
print("\nカテゴリ別の売上:")
category_analysis = df.groupby('カテゴリ').agg({
'売上': ['sum', 'mean', 'count'],
'訪問者数': 'mean'
}).round(2)
print(category_analysis)
# 5. 時系列分析
df['月'] = df['日付'].dt.to_period('M')
monthly_trend = df.groupby('月')['売上'].sum()
print("\n月次売上の推移:")
print(monthly_trend)
# 6. トレンドの可視化
monthly_trend.plot(kind='line', figsize=(12, 6), marker='o')
plt.title('月次売上の推移')
plt.xlabel('月')
plt.ylabel('売上')
plt.xticks(rotation=45)
plt.grid(True)
plt.show()
# 7. 上位カテゴリの特定
top_categories = df.groupby('カテゴリ')['売上'].sum().sort_values(ascending=False).head(5)
print("\n売上上位5カテゴリ:")
print(top_categories)
11. データのエクスポート
分析結果を保存する方法も学びましょう。
# CSVファイルとして保存
df.to_csv('analyzed_data.csv', index=False)
# Excelファイルとして保存
df.to_excel('analyzed_data.xlsx', index=False, sheet_name='分析結果')
# 特定の列のみを保存
df[['日付', '売上', 'カテゴリ']].to_csv('sales_summary.csv', index=False)
# 集計結果の保存
summary = df.groupby('カテゴリ').agg({
'売上': ['sum', 'mean'],
'訪問者数': 'mean'
})
summary.to_csv('category_summary.csv')
12. パフォーマンスの最適化
大規模なデータを扱う際には、パフォーマンスを意識することが重要です。
12.1 データ型の最適化
# データ型の確認
print(df.dtypes)
# メモリ使用量の確認
print(df.memory_usage(deep=True))
# データ型の最適化
df['訪問者数'] = df['訪問者数'].astype('int32') # int64からint32に
df['カテゴリ'] = df['カテゴリ'].astype('category') # objectからcategoryに
# 最適化後のメモリ使用量
print(df.memory_usage(deep=True))
12.2 効率的な処理
# apply()の代わりにベクトル化された操作を使用
# 遅い例
df['売上2倍'] = df['売上'].apply(lambda x: x * 2)
# 速い例
df['売上2倍'] = df['売上'] * 2
# イテレーションの回避
# 遅い例
for index, row in df.iterrows():
df.at[index, '新しい列'] = row['売上'] * 2
# 速い例
df['新しい列'] = df['売上'] * 2
13. まとめと次のステップ
このハンズオンを通じて、以下の重要な概念とスキルを学びました。
学んだこと
- Pandasの基本データ構造: SeriesとDataFrame
- データの読み込みと確認: CSVファイルの読み込み、データの探索
- データの選択とフィルタリング: 列・行の選択、条件によるフィルタリング
- データの操作と変換: 新しい列の追加、ソート、欠損値の処理
- データの集約とグループ化: groupby()を使った集計、ピボットテーブル
- データの結合: merge()を使った複数DataFrameの結合
- 時系列データの処理: 日付の変換、リサンプリング
- データの可視化: MatplotlibとSeabornを使ったグラフ作成
- パフォーマンスの最適化: データ型の最適化、効率的な処理
次のステップ
- より高度な分析: 統計的検定、機械学習モデルの構築
- データベースとの連携: SQLAlchemyを使ったデータベースからの読み込み
- APIからのデータ取得: requestsライブラリを使ったAPIデータの取得
- 大規模データの処理: DaskやPySparkを使った分散処理
- データパイプラインの構築: 自動化された分析ワークフローの作成
Pandasは非常に強力なライブラリで、データ分析の基礎となるツールです。実際のデータセットを使って練習を重ねることで、さらにスキルを向上させることができます。継続的な学習と実践を通じて、データ分析のエキスパートを目指しましょう!
Happy Data Analysis!
コメント
コメントを読み込み中...
