データ分析 2群間の代表値の検定:実践例1
前回までの記事です
今回は、別のデータを使用して、より実践ベースで検定を行ってみたいと思います
使用したデータ
あるジュエリーショップのアンケート結果を集めたデータです。
使用したデータ
データは適当に作ったものです
性別 | 年齢 | 購入形態 | 購入の目的 | 商品のデザイン | 納品の迅速さ | サイトの使いやすさ | 価格の妥当性 | 商品への満足度 | ショップの雰囲気 | スタッフの対応 | アフターサービス | 包装の状態 | 満足度 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
女性 | 50 | プレゼント用 | 記念日 | 4 | 4 | 4 | 4 | 3 | 4 | 4 | 4 | 4 | 4 |
女性 | 35 | 自分用 | 婚約 | 4 | 5 | 4 | 4 | 1 | 1 | 5 | 4 | 1 | 2 |
女性 | 22 | プレゼント用 | 日常使い | 1 | 1 | 1 | 4 | 1 | 5 | 1 | 3 | 1 | 3 |
男性 | 30 | 自分用 | 記念日 | 3 | 4 | 3 | 4 | 5 | 1 | 4 | 4 | 5 | 3 |
男性 | 59 | プレゼント用 | 婚約 | 4 | 3 | 3 | 3 | 4 | 4 | 3 | 5 | 4 | 4 |
男性 | 52 | プレゼント用 | 日常使い | 2 | 3 | 3 | 3 | 2 | 2 | 1 | 3 | 2 | 2 |
男性 | 10 | 自分用 | 記念日 | 2 | 5 | 1 | 3 | 3 | 3 | 5 | 5 | 3 | 3 |
女性 | 19 | 自分用 | 婚約 | 3 | 5 | 2 | 4 | 2 | 5 | 5 | 5 | 5 | 4 |
女性 | 24 | プレゼント用 | 日常使い | 4 | 2 | 3 | 4 | 1 | 1 | 4 | 4 | 1 | 2 |
女性 | 39 | プレゼント用 | 記念日 | 5 | 5 | 5 | 5 | 3 | 5 | 5 | 4 | 5 | 5 |
女性 | 55 | プレゼント用 | 婚約 | 3 | 5 | 5 | 5 | 1 | 3 | 2 | 3 | 4 | 3 |
女性 | 59 | 自分用 | 日常使い | 1 | 3 | 1 | 3 | 3 | 3 | 4 | 4 | 2 | 2 |
男性 | 30 | プレゼント用 | 記念日 | 1 | 1 | 1 | 1 | 4 | 4 | 4 | 4 | 4 | 3 |
男性 | 58 | プレゼント用 | 婚約 | 2 | 2 | 2 | 2 | 2 | 4 | 3 | 4 | 4 | 3 |
以下略
テーマ
満足度に対して性別(男性/女性)は何らかの影響があるかを分析してみます。
分析
必要なライブラリをインストールし、データを読み込んでおきます
import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib
import seaborn as sns
from scipy import stats
plt.style.use("seaborn")
plt.rcParams['font.family'] = 'IPAexGothic'
plt.figure(figsize=(10, 5))
# データ読込
df = pd.read_csv('/content/drive/MyDrive/jewelry_shop_reviews.csv')
df.head(3)
まずはデータを確認して欠損値の有無などを確認しておきます
df.info()
データ数は1000件で欠損値はありません。
棒グラフで可視化してみます
sns.countplot(x='満足度', hue='性別', data=df)
満足度3に違いはあるようだけど、ほぼ違いはない気がします・・・
女性グループ と 男性グループで それぞれの平均値と中央値を確認してみます
# 性別でグループかし、満足度の平均と中央値を確認する
group = df.groupby('性別')
group['満足度'].agg(['mean', 'median'])
中央値に違いはないですが、平均値は少し違いがあります
性別 | mean | median |
---|---|---|
女性 | 3.2196382428940566 | 3.0 |
男性 | 3.183940430670155 | 3.0 |
検定の目的
女性グループ と 男性グループ で満足度の平均値の違いが母集団でも有意な差かどうかを検定してみます。
女性の満足度の平均と、男性の満足度の平均の差が、標本集団だけでなく母集団でも有意な差であるとすれば、性別の違いは満足度に影響を及ぼしていると判断できます。
それでは女性グループ と 男性グループ での平均値の差が母集団でも有意な差であるかを検定してみます。
仮説:性別によって、満足度に差がある
正規性を確認
まずは使用する検定を判断するために、女性グループ と 男性グループ の正規性の確認を行います。
女性のデータと男性のデータを作成し満足度だけを抽出します。
dfW = group.get_group('女性')['満足度']
dfM = group.get_group('男性')['満足度']
男性データと女性データの正規性を可視化で確認してみます。
plt.subplot(1, 2, 1)
sns.histplot(dfW, kde=True)
plt.subplot(1, 2, 2)
sns.histplot(dfM, kde=True)
グラフからは正規性があるのではないかと思われます
検定
正規性の検定を行って検証してみます。
データ数が多いのでコルモゴロフ・スミルノフ検定を使用します。
- 帰無仮説:正規分布である
- 対立仮説:正規分布でない
男性データの正規性を確認してみます
stats.kstest(dfM, "norm")
KstestResult(statistic=0.9297554023645598, pvalue=0.0, statistic_location=2, statistic_sign=-1)
有意水準 0.05 > P値 0 なので 帰無仮説を棄却し、正規分布でないとなります
女性データの正規性を確認してみます
stats.kstest(dfW, "norm")
KstestResult(statistic=0.9460433484732081, pvalue=0.0, statistic_location=2, statistic_sign=-1)
有意水準 0.05 > P値 0 なので 帰無仮説を棄却し、正規分布でないとなります
男性データも女性データも正規分布ではないので
「ノンパラメトリック」で「データに対応がない」場合になり、「マンホイットニーのU検定」を使用します。
帰無仮説:平均値に有意な差はない
対立仮説:平均値に有意な差がある
stats.mannwhitneyu(dfW, dfM, alternative='two-sided')
有意水準 0.05 < P値 0.170 → 帰無仮説を採用し、平均値に有意な差がないといえます。
検定の結果:
性別の違いは満足度に影響を及ぼしているかはわからない
Discussion