はじめに
Pythonでデータ分析を始めたいけど、「難しそう」「何から始めればいいかわからない」という人に朗報です!
この記事では、CSVファイルの読み込みからデータの集計、グラフの可視化までを、人気ライブラリ「pandas(パンダス)」を使ってサクッと体験してみましょう🐼
一番下にプログラムおいてありますのでその説明となります。
📦 使うライブラリ
import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib
-
pandas
: データ分析の定番ライブラリ -
matplotlib
: グラフ描画用 -
japanize_matplotlib
: matplotlibを日本語対応にする神ライブラリ
📂 CSVファイルの読み込み
df = pd.read_csv('pandas_test/sample.csv', encoding='utf-8')
CSVファイルを読み込んで、df
という名前のデータフレームとして扱います。
print(df.head())
最初の5行を表示するとこんな感じ👇
名前 年齢 都道府県 血液型
0 田中 28 東京 A
1 佐藤 34 大阪 B
...
📏 データのサイズを確認!
print(f"行数: {len(df)}, 列数: {len(df.columns)}")
➡️ データの「行数」と「列数」がわかります。大量データでもビビらず安心!
📊 基本統計:年齢の平均・最大・最小・合計
print(df['年齢'].mean()) # 平均
print(df['年齢'].max()) # 最大
print(df['年齢'].min()) # 最小
print(df['年齢'].sum()) # 合計
👉 年齢
列のデータを一発で分析!初心者でも使いやすい構文です。
🗾 都道府県ごとの人数を集計してみる
print(df['都道府県'].value_counts())
このコードで、どの都道府県に何人いるかが一目瞭然!
🔍 groupbyで都道府県ごとの平均年齢を出す
print(df.groupby('都道府県')['年齢'].mean())
都道府県単位での分析が可能に。これだけで中級者感出せます!
🎯 locで条件に合うデータを抽出
df.loc[(df['都道府県'] == '大阪') & (df['年齢'] >= 30)]
「大阪」かつ「30歳以上」の人だけをピックアップできます!
SQL感覚で書けて超便利。
➕ データフレームを結合する【concat】
df_concat = pd.concat([df, df_extra], ignore_index=True)
別のデータフレーム(df_extra
)をくっつけることも可能!
🔗 データをキーで結合する【merge】
df_merged = pd.merge(df, extra_info, on='名前', how='left')
「名前」で2つのデータを結合(=JOIN)。SQLを知ってる人にはおなじみの操作です。
🧠 lambda × mapで新しい列を追加!
df['年齢区分'] = list(map(lambda x: '大人' if x >= 30 else '若者', df['年齢']))
年齢が30歳以上かどうかで「年齢区分」を追加します。
名前 | 年齢 | 年齢区分
田中 | 28 | 若者
佐藤 | 34 | 大人
➡️ 「新しい指標を作る」って、分析感あってワクワクしません?
📈 折れ線グラフで年齢を可視化!
plt.plot(df['名前'], df['年齢'], marker='o')
plt.title('名前ごとの年齢(折れ線グラフ)')
plt.show()
見た目にもわかりやすいグラフで、年齢の違いが一目でわかる!
表示結果はこんな感じ。思ったよりきれいにグラフを作れる!📈
📊 棒グラフで都道府県ごとの人数を可視化!
df['都道府県'].value_counts().plot(kind='bar')
plt.title('都道府県ごとの人数(棒グラフ)')
plt.show()
**人数の多い都道府県はどこか?**を直感的に把握できます!
表示結果はこんな感じ。思ったよりきれいにグラフを作れる!📊
🎉 おわりに:Pandasって実はカンタン!
ここまでできたら、もうあなたは立派なデータ分析ビギナーです!
やったことをまとめると:
- CSVファイルの読み込み
- データの基本統計
- 条件による抽出
- データフレームの結合
- グラフでの可視化
💡 次にチャレンジしたいこと
- Seabornでさらにオシャレなグラフに挑戦
- Jupyter Notebookでインタラクティブに操作
- Excelとの連携
🙌 この記事が役に立ったら...
いいね❤️・ストック⭐・フォロー👤よろしくお願いします!
📁 サンプルCSVの例(参考)
以下のようなCSVを使うとスムーズに再現できます!
名前,年齢,都道府県,血液型
田中,23,東京,A
佐藤,31,大阪,O
鈴木,29,愛知,B
高橋,25,福岡,AB
山本,28,北海道,A
小林,34,東京,O
加藤,22,大阪,B
斎藤,27,愛知,A
サンプルプログラム全体(参考)
import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib
# CSVファイル読み込み(例: sample.csv)
df = pd.read_csv('pandas_test/sample.csv', encoding='utf-8')
# データ表示
print('--- CSVデータ ---')
print(df.head())
# 行数・列数
print('\n--- 行数・列数 ---')
print(f"行数: {len(df)}, 列数: {len(df.columns)}")
# 例: 年齢カラムがあれば平均を計算
if '年齢' in df.columns:
print('\n--- 年齢の平均 ---')
print(df['年齢'].mean())
# 年齢の最大・最小・合計
if '年齢' in df.columns:
print('\n--- 年齢の最大 ---')
print(df['年齢'].max())
print('\n--- 年齢の最小 ---')
print(df['年齢'].min())
print('\n--- 年齢の合計 ---')
print(df['年齢'].sum())
# 例: 都道府県ごとの人数集計
if '都道府県' in df.columns:
print('\n--- 都道府県ごとの人数 ---')
print(df['都道府県'].value_counts())
# groupbyによる都道府県ごとの平均年齢
if '都道府県' in df.columns and '年齢' in df.columns:
print('\n--- 都道府県ごとの平均年齢 ---')
print(df.groupby('都道府県')['年齢'].mean())
# locを使ったサンプル(大阪在住かつ年齢30以上の人を抽出)
osaka_30_df = df.loc[(df['都道府県'] == '大阪') & (df['年齢'] >= 30)]
print('\n--- 大阪在住かつ年齢30以上 ---')
print(osaka_30_df)
# concatでデータフレームを結合するサンプル
extra_data = {
'名前': ['松本', '石田'],
'年齢': [26, 32],
'都道府県': ['京都', '東京'],
'血液型': ['B', 'A']
}
df_extra = pd.DataFrame(extra_data)
df_concat = pd.concat([df, df_extra], ignore_index=True)
print('\n--- concatで結合したデータフレーム ---')
print(df_concat)
# mergeでデータフレームを結合するサンプル
# 例: extra_info(名前と趣味)をdfと名前で結合
extra_info = pd.DataFrame({
'名前': ['田中', '佐藤', '鈴木', '高橋', '山本'],
'趣味': ['読書', 'サッカー', '料理', '映画', '旅行']
})
df_merged = pd.merge(df, extra_info, on='名前', how='left')
print('\n--- mergeで結合したデータフレーム ---')
print(df_merged)
# map + lambda式で「年齢区分」列を追加
# 30歳以上→'大人'、それ以外→'若者'
df['年齢区分'] = list(map(lambda x: '大人' if x >= 30 else '若者', df['年齢']))
print('\n--- 年齢区分を追加したデータフレーム ---')
print(df[['名前', '年齢', '年齢区分']])
# 年齢の折れ線グラフ
plt.figure(figsize=(8,4))
plt.plot(df['名前'], df['年齢'], marker='o')
plt.title('名前ごとの年齢(折れ線グラフ)')
plt.xlabel('名前')
plt.ylabel('年齢')
plt.grid(True)
plt.tight_layout()
plt.show()
# 都道府県ごとの人数の棒グラフ
plt.figure(figsize=(8,4))
df['都道府県'].value_counts().plot(kind='bar')
plt.title('都道府県ごとの人数(棒グラフ)')
plt.xlabel('都道府県')
plt.ylabel('人数')
plt.tight_layout()
plt.show()
実行結果(参考)
--- CSVデータ ---
名前 年齢 都道府県 血液型
0 田中 23 東京 A
1 佐藤 31 大阪 O
2 鈴木 29 愛知 B
3 高橋 25 福岡 AB
4 山本 28 北海道 A
--- 行数・列数 ---
行数: 8, 列数: 4
--- 年齢の平均 ---
27.375
--- 年齢の最大 ---
34
--- 年齢の最小 ---
22
--- 年齢の合計 ---
219
--- 都道府県ごとの人数 ---
都道府県
東京 2
大阪 2
愛知 2
福岡 1
北海道 1
Name: count, dtype: int64
--- 都道府県ごとの平均年齢 ---
都道府県
北海道 28.0
大阪 26.5
愛知 28.0
東京 28.5
福岡 25.0
Name: 年齢, dtype: float64
--- 大阪在住かつ年齢30以上 ---
名前 年齢 都道府県 血液型
1 佐藤 31 大阪 O
--- concatで結合したデータフレーム ---
名前 年齢 都道府県 血液型
0 田中 23 東京 A
1 佐藤 31 大阪 O
2 鈴木 29 愛知 B
3 高橋 25 福岡 AB
4 山本 28 北海道 A
5 小林 34 東京 O
6 加藤 22 大阪 B
7 斎藤 27 愛知 A
8 松本 26 京都 B
9 石田 32 東京 A
--- mergeで結合したデータフレーム ---
名前 年齢 都道府県 血液型 趣味
0 田中 23 東京 A 読書
1 佐藤 31 大阪 O サッカー
2 鈴木 29 愛知 B 料理
3 高橋 25 福岡 AB 映画
4 山本 28 北海道 A 旅行
5 小林 34 東京 O NaN
6 加藤 22 大阪 B NaN
7 斎藤 27 愛知 A NaN
--- 年齢区分を追加したデータフレーム ---
名前 年齢 年齢区分
0 田中 23 若者
1 佐藤 31 大人
2 鈴木 29 若者
3 高橋 25 若者
4 山本 28 若者
5 小林 34 大人
6 加藤 22 若者
7 斎藤 27 若者