データ分析に興味を持ち始めたって方へ
今回はPythonのPandasを使って
dataframeの基本的な操作から
欠損値の確認方法までを基礎から解説します
- Pandas DataFrameの基本的な使い方を知りたい方
- dataframeの作成方法や読み込み方法を知りたい方
- dataframe内の欠損値のいろんな確認方法を学びたい方
DataFrameの基本(データ作成・読み込み・書き込み)
Pandasは、Pythonでデータを扱うための強力なライブラリです
特に、DataFrameというデータ構造が非常に便利で
Excelの表のような形式でデータを管理できます
データの作成方法
例えば、次のようにして簡単にDataFrameを作成できます。
import pandas as pd
# サンプルデータを辞書形式で作成
data = {
'名前': ['田中', '佐藤', '鈴木'],
'年齢': [23, 30, 25],
'職業': ['エンジニア', 'デザイナー', 'データサイエンティスト']
}
# dataframeの作成
df = pd.DataFrame(data)
print(df)
# 出力結果
# 名前 年齢 職業
# 0 田中 23 エンジニア
# 1 佐藤 30 デザイナー
# 2 鈴木 25 データサイエンティスト
データの読み込み/書き込みの方法
dataframeは以下のように他のデータ形式
に書き込んだり,読み込んだりすることができます
import pandas as pd
# DataFrameを作成
df = pd.DataFrame({
'A': [1, 2, 3],
'B': [4, 5, 6],
'C': [7, 8, 9]
})
# 1. CSVファイルとして保存
# 書き込み (CSV形式)
df.to_csv('temporary_data.csv', index=False)
# 読み込み (CSV形式)
df_csv = pd.read_csv('temporary_data.csv')
# 2. Excelファイルとして保存
# 書き込み (Excel形式)
df.to_excel('temporary_data.xlsx', index=False)
# 読み込み (Excel形式)
df_excel = pd.read_excel('temporary_data.xlsx')
# 3. Pickle形式で保存
# 書き込み (Pickle形式)
df.to_pickle('temporary_data.pkl')
# 読み込み (Pickle形式)
df_pickle = pd.read_pickle('temporary_data.pkl')
# 4. HDF5形式で保存
# 書き込み (HDF5形式)
df.to_hdf('temporary_data.h5', key='df', mode='w')
# 読み込み (HDF5形式)
df_hdf = pd.read_hdf('temporary_data.h5', key='df')
# 5. JSON形式で保存
# 書き込み (JSON形式)
df.to_json('temporary_data.json')
# 読み込み (JSON形式)
df_json = pd.read_json('temporary_data.json')
dataframeの基本情報を確認する方法
次にデータの構造や内容を
確認する方法を紹介します
行数/列数/データ型の確認
行数やデータ型の確認をしたいときは
以下のようにdf.info()を使用します
# dfの中身
# 名前 年齢 職業
# 0 田中 23 エンジニア
# 1 佐藤 30 デザイナー
# 2 鈴木 25 データサイエンティスト
# dataframeの基本情報を表示
print(df.info())
# 出力結果
#
# RangeIndex: 3 entries, 0 to 2
# Data columns (total 3 columns):
# # Column Non-Null Count Dtype
# 0 名前 3 non-null object
# 1 年齢 3 non-null int64
# 2 職業 3 non-null object
# dtypes: int64(1), object(2)
# memory usage: 200.0+ bytes
# None
df.info()で、各列のデータ型や
欠損値の有無が確認できます
データ型には主に以下のような形式があります
- int64: 64ビット整数
- float64: 64ビット浮動小数点数
- object: 文字列または任意のオブジェクト
- bool: 真偽値(True/False)
- datetime64: 日付と時間
- category: カテゴリデータ
データの統計量を確認
データの平均値などの統計量を確認するには
describe()関数を使います
# dfの中身
# 名前 年齢 職業
# 0 田中 23 エンジニア
# 1 佐藤 30 デザイナー
# 2 鈴木 25 データサイエンティスト
# 数値データの統計量を表示
print(df.describe())
# 出力結果
# 年齢
# count 3.000000
# mean 26.000000
# std 3.605551
# min 23.000000
# 25% 24.000000
# 50% 25.000000
# 75% 27.500000
# max 30.000000
describe()を使うことでデータ型が数値の列の
平均値、最大値、最小値などの基本統計量を把握できます
欠損値の確認方法とその具体例の紹介
データ分析を行う際
欠損値の確認は重要です
参考程度にしてください
1. 欠損値の有無を確認
isnull()関数を使って
データが欠損しているか確認できます
# サンプルデータを作成
data = {
'名前': ['田中', '佐藤', None, '高橋', '木村'],
'年齢': [23, None, 25, 28, 22],
'職業': ['エンジニア', 'デザイナー', 'データサイエンティスト', None, 'アナリスト'],
'給与': [500, 600, 700, None, 500]
}
df = pd.DataFrame(data)
print(df)
# df
# 名前 年齢 職業 給与
# 0 田中 23.0 エンジニア 500.0
# 1 佐藤 NaN デザイナー 600.0
# 2 None 25.0 データサイエンティスト 700.0
# 3 高橋 28.0 None NaN
# 4 木村 22.0 アナリスト 500.0
# 欠損値の有無を確認
print(df.isnull())
# df.isnull() 出力結果
# 名前 年齢 職業 給与
# 0 False False False False
# 1 False True False False
# 2 True False False False
# 3 False False True True
# 4 False False False False
この結果では、True部分が欠損値です
2. 欠損値の数を列ごとに確認
欠損値の数を列ごとに確認するには
isnull()とsum()を組み合わせます
# df
# 名前 年齢 職業 給与
# 0 田中 23.0 エンジニア 500.0
# 1 佐藤 NaN デザイナー 600.0
# 2 None 25.0 データサイエンティスト 700.0
# 3 高橋 28.0 None NaN
# 4 木村 22.0 アナリスト 500.0
# 列ごとの欠損値の数を確認
print(df.isnull().sum())
# df.isnull().sum() 出力結果
# 名前 1
# 年齢 1
# 職業 1
# 給与 1
# dtype: int64
ここでは各列に1つずつ欠損値があることがわかります
3. 欠損値の割合を確認
欠損値の割合を確認するには
isnull()とmean()を組み合わせます
# df
# 名前 年齢 職業 給与
# 0 田中 23.0 エンジニア 500.0
# 1 佐藤 NaN デザイナー 600.0
# 2 None 25.0 データサイエンティスト 700.0
# 3 高橋 28.0 None NaN
# 4 木村 22.0 アナリスト 500.0
# 列ごとの欠損値の割合を確認
print(df.isnull().mean() * 100)
# 出力結果
# 名前 20.0
# 年齢 20.0
# 職業 20.0
# 給与 20.0
# dtype: float64
ここでは各列2割欠損値があることがわかります
4. 欠損値が含まれる行/列を抽出
欠損値がある行・列は以下のようなコードで
確認することができます
# df
# 名前 年齢 職業 給与
# 0 田中 23.0 エンジニア 500.0
# 1 佐藤 NaN デザイナー 600.0
# 2 None 25.0 データサイエンティスト 700.0
# 3 高橋 28.0 None NaN
# 4 木村 22.0 アナリスト 500.0
# 欠損値を含む行を抽出
print(df[df.isnull().any(axis=1)])
# 出力結果
# 名前 年齢 職業 給与
# 1 佐藤 NaN デザイナー 600.0
# 2 None 25.0 データサイエンティスト 700.0
# 3 高橋 28.0 None NaN
# 欠損値を含む列を抽出
print(df.loc[:, df.isnull().any()])
# 出力結果
# 名前 年齢 職業 給与
# 0 田中 23.0 エンジニア 500.0
# 1 佐藤 NaN デザイナー 600.0
# 2 None 25.0 データサイエンティスト 700.0
# 3 高橋 28.0 None NaN
# 4 木村 22.0 アナリスト 500.0
any関数は行・列に対して欠損値が
あるどうかをTrue/Falseで返します
5. 特定の列に欠損値がある行/ない行を抽出
任意の列(例: 年齢列)に
欠損値がある行だけを抽出します
# df
# 名前 年齢 職業 給与
# 0 田中 23.0 エンジニア 500.0
# 1 佐藤 NaN デザイナー 600.0
# 2 None 25.0 データサイエンティスト 700.0
# 3 高橋 28.0 None NaN
# 4 木村 22.0 アナリスト 500.0
# '年齢'列に欠損値がある行を抽出
print(df[df['年齢'].isnull()])
# 出力結果
# 名前 年齢 職業 給与
# 1 佐藤 NaN デザイナー 600.0
欠損値がない行を抽出する場合は
ある行を抽出するコードに”~”をつけるだけです
# '年齢'列に欠損値がない行を抽出
print(df[~df['年齢'].isnull()])
# 出力結果
# 名前 年齢 職業 給与
# 0 田中 23.0 エンジニア 500.0
# 2 None 25.0 データサイエンティスト 700.0
# 3 高橋 28.0 None NaN
# 4 木村 22.0 アナリスト 500.0
6. 欠損値がない行のみを抽出
欠損値がない行のみを取得するには
dropna関数を使用します
# df
# 名前 年齢 職業 給与
# 0 田中 23.0 エンジニア 500.0
# 1 佐藤 NaN デザイナー 600.0
# 2 None 25.0 データサイエンティスト 700.0
# 3 高橋 28.0 None NaN
# 4 木村 22.0 アナリスト 500.0
# 全ての列が欠損値でない行を抽出
print(df.dropna())
# 出力結果
# 名前 年齢 職業 給与
# 0 田中 23.0 エンジニア 500.0
# 4 木村 22.0 アナリスト 500.0
7. 欠損値があるかどうかを簡易に確認
dataframeに欠損値が
含まれているかどうかだけをTrue/Falseで確認します
# dataframeに欠損値があるか確認
print(df.isnull().values.any())
# 出力結果
# True
8. 欠損値を視覚的に確認する
欠損値を視覚的に確認するためには
ヒートマップを作成します
# df
# 名前 年齢 職業 給与
# 0 田中 23.0 エンジニア 500.0
# 1 佐藤 NaN デザイナー 600.0
# 2 None 25.0 データサイエンティスト 700.0
# 3 高橋 28.0 None NaN
# 4 木村 22.0 アナリスト 500.0
import seaborn as sns
import matplotlib.pyplot as plt
# 欠損値のヒートマップを表示
sns.heatmap(df.isnull(), cbar=False, cmap='viridis')
plt.show()
このコードを実行すると、以下のような
欠損値の分布を示すヒートマップで表示されます
欠損値が薄黄色で
表示されるので、一目で欠損値の分布を確認できます
dorpnaを使用した欠損値の取り扱い
具体例の方でも紹介しましたが
欠損値を取り扱う際に便利なdropna関数があります
引数を設定することでさまざまな操作が可能ですので
いくつか紹介しておきます
# 欠損値を含む列を削除(axis)
df.dropna(axis=1)
# すべての値が欠損している行を削除(how)
df.dropna(how='all')
# 非NaN値が2つ未満の行を削除(thresh)
df.dropna(thresh=2)
# 元のdataframeを直接変更(inplace)
df.dropna(inplace=True)
# 列 'A' と 'B' に NaN がある行を削除(subset)
df.dropna(subset=['A', 'B'])
dropnaの各引数について説明しておきます
axis
行 (0 または ‘index’) または列 (1 または ‘columns’) の削除を指定
how
・’any’:1つでも欠損値がある行または列を削除
・’all’:すべてが欠損値の場合のみ行または列を削除
thresh
指定した数以上の非NaN値がある行または列を保持
subset
特定の行または列に対してのみ欠損値を確認し、削除を適用
inplace
・True:元のdataframeを直接変更
・False(デフォルト):変更後の新しいdataframeを返す
ignore_index
・True:削除後にインデックスをリセットし、新しいインデックスを割り当てる
・False(デフォルト):元のインデックスを保持
このよう欠損値を確認することで
データの傾向を把握したり
データの補完方法の検討につなげたりすることができます
pythondataframeの使い方をマスターして
データ分析などができるように一緒にがんばっていきましょう!