毎日テキストマイニング

180日間、毎日テキストマイニングをするブログです

2018/7/14【22日目】高速で学ぶ統計学その1

データもたまってきましたので、連休中に統計学を高速で学びたいと思います。 やり方としましては、

  1. 『心理統計学の基礎』で統計の基礎を学び、
  2. 『あたらしいPythonで学ぶ統計学の教科書』で実装し、
  3. 統計学入門』で定義を確認していきたいとおもいます。

それではやっていきます。

用語の確認

  • 横断的研究

    ある1つの時点で集団を比較する研究

  • 縦断的研究

    同一の集団について2つ以上の時点でデータを取って比較する研究 今回のは同一の集団について日付毎に行なっているので、おそらく縦断的研究になるのでしょう。

  • 母集団

    仮説が少なくとも暗黙的に想定している対象集団

  • サンプル

    実際にデータを収集する対象集団 今回の例でいうとAKB48が母集団で、Twiiterからデータを取得しているメンバーがサンプルですね。もしくは一人の全Tweetが母集団で100個取り出したのがサンプル。

  • 変数

    統計学の変数は、個人内で変化する値のことらしい。 今回の例でいうと、呟きとか、リツイート数とかのこと。

  • 相関

    2つの間の区別をつけず対等にみる見方。

  • 相関関係

    2つの変数間の関係のこと。統計学では2つの変数の間に直線関係に近い傾向があるときに「相関関係がある」、と言える。 Twiiterで言うと、リツイート数が高いとファボ数が高いとか、呟きの回数が多いとフォロワーが多いとか、の間稀。

代表値とは

  • 代表値

    分布全体を1つの値で表す数値。平均値や中央値、または最大値や最小値を使うことが多い。

  • 平均値

    分布全体の平均値。

  • 中央値

    値を順番に並んでいって、丁度真ん中にある数値。 平均は大きく外れた値(外れ値)の影響を受けやすいので、どちらかと言うと中央値の方が的確になりやすい。

以下、Pythonでの表し方。使用しているデータは7月14日から15日のメンバー全員を対象にしたTweet毎のリツイートされた回数を記録した1列の68行のデータです。

import numpy as np
import scipy as sp

favorite_count = pd.read_csv(‘retweet_count.csv',
                   sep='\n',
                   encoding='utf-8',)
#平均の出し方。NumPyでも可
print(int(sp.average(favorite_count, axis = 0)))
#meanを使っても平均を出せる。NumPyでも可
print(int(sp.mean(favorite_count, axis = 0)))
#中央値はmedian()。NumPyでも可
print(int(sp.median(favorite_count, axis = 0)))

実行結果。

220
220
108

小数点以下まで出すと、後で詰みそうなので、intを使って整数にしています。 220が平均値、108が中央値です。結構違いますね。SciPyを使うと簡単に表示ができますね。

どれだけ離れているかを表す。

  • 平均偏差

    各データが中央値から平均してどれだけ離れているかを示す。 どれだけ離れているかを示すものなので、「平均からの平均偏差」と「中央値からの平均偏差」の2種類がある。(マイナスの値になることがあるが)この数値には絶対値を使われている。

  • 分散

    平均偏差を絶対値ではなく、2乗してマイナスの数を消す方法。2乗になるので単位が変わる

  • 標準偏差

    分散に√をかけて単位を戻した数値。 このどれだけ離れているかがわかることによって、分布の広がりを表す散布図を得られる。偏差値は平均が50が標準偏差が10になるように標準化された分布らしいです。偏差値のようにある平均と標準偏差を持った変数は標準得点といい、標準得点を求めることを標準化というらしいです。

以下、pythonでの表し方。

#分散
print(int(sp.var(retweet_count, ddof=0)))
#標準偏差
print(int(sp.std(retweet_count, ddof=1)))

実行結果。

76486
278

なお、ddofという引数はDelta Degrees of Freedomというものを表しており、現状は何を表しているのか謎です。分散の時は0、標準偏差の時は1を指定するらしいです。 また、平均偏差だけはSciPyにないらしく、statsmodelsを使います。論文などでは平均偏差を使われることはなく、標準偏差が用いられるそうです。

from statsmodels import robust
print(int(robust.mad(retweet_count, axis=0)))

実行結果

79

標準化の手続き

何をやっているかというと、元の数字から平均を引いて、平均を0にして、標準偏差で割っているそうです。 ちなみに標準偏差はシグマで表すそうです。

heikin = int(sp.mean(retweet_count))
sigma = sp.std(retweet_count, ddof = 1)
hyouzyunka = (retweet_count - heikin) / sigma
#平均
print(sp.mean(hyouzyunka))
#標準偏差
print(sp.std(hyouzyunka, ddof = 1))

実行結果。

retweet    0.00285
dtype: float64
retweet    1.0
dtype: float64

平均がほぼ0、標準偏差が1になりました。

まだ全然意味がわからないので、その2に続きます。