0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

統計ど素人がpythonでt検定をした

Last updated at Posted at 2022-05-20

1. 初めに

初めに断りを入れておくと、大学時代から一応軽く統計を学んできたがいまいち自信がない
何か間違っていたり、勘違いをしていそうでしたらどんどんご指摘をいただきたいです

2. 背景

emacsのpython設定も(なんとか?)終了し、kaggleを物色していたところSpotifyのデータを見つけた。このデータの中身は2010年〜2019年のtop100のデータが入っている
https://www.kaggle.com/datasets/muhmores/spotify-top-100-songs-of-20152019

面白そうだなーとなんか分析できないかなーと考えた結果、年を1つの標本として差がありそうなところをt検定してみることにした。(この時点で無作為抽出ではないのではないかとヒヤヒヤしている)

3. データ観察

ということで、時系列とデータに分けてグラフに書き出してみた
横軸は年の推移を表しており、縦軸にそれぞれの属性の値の平均値が入る
縦の棒は標準偏差を表している
Figure_1.png

うーーん...ばらつきすぎかな??
年別に見ていくとnrgyとdnceとpopの2010 vs 2019がいいのかなあと思い、そこを分析していく

要素説明(かなりそのまま)
nrgy:enrgic the song is
dnce:danceability of the song
pop :populality of the song

4. ヒストグラム

分布を見るためにnrgyとdnceとpopの2010 vs 2019の個数をヒストグラムに書き出してみた
Figure_2.png

あ、でもなんか正規分布っぽさがありそうな気がしないでもない...
中心極限定理で正規分布に従うと仮定する(ここも完璧な理解では無い)

そしてここからは有意差が出る可能性があるnrgyについて検定を行っていこうと思う

5. F検定

分散によってウェルチを使うかスチューデントを使うか変化するので調べる
ソースコードは以下

python
from typing import Any
import pandas as pd
import numpy as np
import scipy.stats as st

data = pd.read_csv("Spotify2010-2019Top100.csv")

data: Any
d_2010 = data[["topyear","nrgy"]].query("topyear == 2010")
d_2019 = data[["topyear","nrgy"]].query("topyear == 2019")
d_2010 = d_2010[["nrgy"]]
d_2019 = d_2019[["nrgy"]]
d_2010 = d_2010.values
d_2019 = d_2019.values

d_2010Var = np.var(d_2010,ddof=1)
d_2019Var = np.var(d_2019,ddof=1)
d_2010df = len(d_2010)-1
d_2019df = len(d_2019)-1
f = d_2010Var/d_2019Var
one_sided_pval1 = st.f.cdf(f, d_2010df, d_2019df)  # 片側検定のp値 1
one_sided_pval2 = st.f.sf(f, d_2010df, d_2019df)   # 片側検定のp値 2
two_sided_pval = min(one_sided_pval1, one_sided_pval2) * 2  # 両側検定のp値

print("F:      ",round(f,3))
print("p-value:",round(two_sided_pval,3))

F検定は以下のようになった
F:0.71 ,p-value: 0.09
0.05 < p なので、スチューデントのt検定かな

6. t検定

先ほどのデータに追加して以下を記述
print(st.ttest_ind(d_2010,d_2019))
結果は以下のようになった

Ttest_indResult(statistic=array([7.11047038]), pvalue=array([2.05645336e-11]))

一般的な有意水準は5%なので
p<0.05で有意差ありと

つまり2010のSpotify Top100 の方が 2019のSpotify Top100より曲がエネルギッシュということが示された(多分)

7. 感想

なんとか一通りのt検定を行った。
ツッコミどころだらけだと思いますので、何かあればコメントをよろしくお願いします。

8. 参考文献

https://www.kaggle.com/datasets/muhmores/spotify-top-100-songs-of-20152019
https://qiita.com/suaaa7/items/745ac1ca0a8d6753cf60
https://qiita.com/code0327/items/a96dd2fbd8a491d2eeaa

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?