kNakajima's Blog

技術系のアウトプットブログです。

「いい生活」 サマーインターンに参加しました。

先日、「株式会社いい生活」さんのエンジニアインターンに参加しました。期間は1週間で、とても充実した時間を過ごさせていただきました。記憶が新しいうちに、ここに参加記を書き残しておきます。

 

インターンで行ったこと

5日間のインターンシップで行ったことを日にち毎に記します。

1日目

1日目は、環境構築、チーム開発の進め方に関する講義、インターンで作るアプリの要件定義を行いました。

開発環境がwindowsということで、若干戸惑いつつも、メンターの方が丁寧に質問に答えて下さったため、インターンを通して困ることはありませんでした。

環境構築の後は講義で、主にGitの使い方を教えていただきました。一人で開発を行うだけではあまり使う機会がないbranchやmergeなどのコマンドの使い方を教えていただき、チーム開発に関する知識が得られました。

1日目の最後は、チームごとに作るアプリのアイディア出し、要件定義を行いました。チームは3人でした。不動産データを活用した不動産会社向けアプリを作るというのが、本インターンのテーマだったため、私たちのチームでは、「機械学習を用いて、物件がどの程度契約を取れそうかをスコア化して、スコアの高い順に表示する」アプリを作ることにしました。

作りたいアプリが決まった後は、そのアプリの実現のために必要な機能を列挙して、さらに各機能を実装するのに必要な時間を細かく書き出し、タスクを分割して、GitLabのissueにどんどん追加していきました。

2日目 - 4日目

タスクが大まかに、フロントエンドの実装、バックエンドの実装、機械学習モデルの構築に分割できたため、それぞれを一人一つづつ担当して、私はフロントエンドを担当して、ひたすら実装しました。

一日の流れとしては、9時に出社して12時ごろまで作業をして、会社近隣のお店に社員さんとお昼を食べに行き、午後は18時に作業を終えるという感じです。休憩は自由にとれて、わからない点があっても、slackでメンターさんに質問すればすぐに対応してくださるという環境でした。

タスクを大まかに分割したことで、タスクの分量が偏ってしまったのが反省点です。

5日目

最終日は、作成したアプリをスライドと共に社員の方々に発表しました。発表が終わった後は、今回の開発を振り返り、良かった点(今後もつづけたいこと)、問題だった点(次回の開発では解決したいこと)、次回の開発ではどうするかといったことを書き出し、チームメンバーとメンターさんで議論しました。実際の開発でも、プロジェクトの区切りで、開発の振り返りを行うそうです。

インターンの感想・振り返り

今回のインターンで最もよかったのは、チーム開発を体験できた点でした。初日に講義をしてもらい、二日目以降に演習をするような感じで、チーム開発のインプットとアウトプットを経験できたと思います。また、今まではバックエンドに興味があったのですが、今回のインターンでフロントエンドを担当したことで、そちらにも興味が出てきました。

開発を行う場所が社員の働くオフィスの中だったということもあり、会社の雰囲気を感じながら開発を勧められたのもよかったです。また、お昼休みには、会社近隣の美味しいお店に連れて行ってくださり、メンター以外の社員の方ともお話させていただきました。

総じて、手厚いサポートの中で、良い経験をさせていただき、参加して本当に良かったと思いました。

 

 

「言語処理100本ノック」 第2章をPythonで解く

言語処理100本ノックの2章を解きました。 2章は、ファイル操作に関する問題です。 解答例としてどうぞ。質問,ご指摘などがありましたら、コメントしてください。

言語処理100本ノック第2章

10. 行数のカウント

行数をカウントせよ.確認にはwcコマンドを用いよ

file = open('hightemp.txt')
lines = file.readlines()
file.close()

print(len(lines))

pythonでは、file.readlines()により、一行が一つの要素として配列に格納されるため、配列の要素数が行数になります。

11. タブをスペースに置換

タブ1文字につきスペース1文字に置換せよ.確認にはsedコマンド,trコマンド,もしくはexpandコマンドを用いよ.

file = open('hightemp.txt')
lines = file.read()
lines = lines.replace('\t', ' ')

replace('\t', ' ')でタブをスペースに変換します。

12. 1列目をcol1.txtに,2列目をcol2.txtに保存

「各行の1列目だけを抜き出したものをcol1.txtに,2列目だけを抜き出したものをcol2.txtとしてファイルに保存せよ.確認にはcutコマンドを用いよ.

file = open('hightemp.txt')
lines = file.readlines()

file1 = lines[0]
file2 = lines[1]

with open('./files/chapter2/col1.txt', 'a') as col1:
    col1.write(file1)
    
with open('./files/chapter2/col2.txt', 'a') as col2:
    col2.write(file2)

どちらの単語も4文字なので、forループ4回で終了です。

13. col1.txtとcol2.txtをマージ

"Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."という文を単語に分解し,各単語の(アルファベットの)文字数を先頭から出現順に並べたリストを作成せよ.

file1 = open('./files/chapter2/col1.txt')
file2 = open('./files/chapter2/col2.txt')

col1 = file1.read()
col2 = file2.read()

with open('./files/chapter2/merge.txt', 'a') as merge:
    merge.write(col1)
    merge.write(col2)

14. 先頭からN行を出力

自然数Nをコマンドライン引数などの手段で受け取り,入力のうち先頭のN行だけを表示せよ.確認にはheadコマンドを用いよ.

N = int(input())

if N > 24:
    print('24以下の数字でお願いします')

else:
    file = open('hightemp.txt')
    lines = file.readlines()
    
    i = 0
    for line in lines:
        if i >= N:
            break
        
        print(line)
        
        i += 1

15. 末尾のN行を出力

自然数Nをコマンドライン引数などの手段で受け取り,入力のうち末尾のN行だけを表示せよ.確認にはtailコマンドを用いよ.

N = int(input())

if N > 24:
    print('24以下の数字でお願いします')

else:
    file = open('hightemp.txt')
    lines = file.readlines()
   
    for i in range(len(lines)):
        if i >= N:
            break
        
        print(Lines[-i-1])

16. ファイルをN分割する

自然数Nをコマンドライン引数などの手段で受け取り,入力のファイルを行単位でN分割せよ.同様の処理をsplitコマンドで実現せよ.

import math

N = int(input())

with open('hightemp.txt', 'r') as file:
    lines = file.readlines()
    
    count = len(lines) // N 
    
    i = 1
    number = 1
    text = ''
    
    for line in lines:
        text += line
            
        if number < N:
            if i % count == 0 or i == len(lines):
                with open('split_file_{}.txt'.format(number), 'w') as split_file:
                    split_file.write(text)
            
                number += 1
                text = ''
                
        else:
            if i == len(lines):
                with open('split_file_{}.txt'.format(number), 'w') as split_file:
                    split_file.write(text)                  
            

17. 1列目の文字列の異なり

1列目の文字列の種類(異なる文字列の集合)を求めよ.確認にはsort, uniqコマンドを用いよ.

file = open('hightemp.txt')
lines = file.readlines()

results = []
for line in lines:
    line = line.split("\t")
    
    if line[0] not in results:
        results.append(line[0]) 
        
for result in results:
    print(result)

18. 各行を3コラム目の数値の降順にソート

各行を3コラム目の数値の逆順で整列せよ(注意: 各行の内容は変更せずに並び替えよ).確認にはsortコマンドを用いよ(この問題はコマンドで実行した時の結果と合わなくてもよい).

file = open('hightemp.txt')
lines = file.readlines()

results = []
for line in lines:
    line = line.split("\t")
    results.append(line)
    
results = sorted(results, key=lambda x: x[2], reverse=True)

for result in results:
    print(result)

19. 各行の1コラム目の文字列の出現頻度を求め,出現頻度の高い順に並べる

各行の1列目の文字列の出現頻度を求め,その高い順に並べて表示せよ.確認にはcut, uniq, sortコマンドを用いよ.

file = open('./files/chapter2/hightemp.txt')
lines = file.readlines()

count_dict = {}
for line in lines:
    line = line.split("\t")
    
    if line[0] in count_dict:
        count_dict[line[0]] += 1
        
    else:
        count_dict[line[0]] = 1
        
        
results = sorted(count_dict, key=lambda x: x[1], reverse=True)

for result in results:
    print(result)

 

整数問題用のライブラリ

競技プログラミングでは、数学の整数分野の問題がよく出題されます。
この記事では、書くことが多い処理をpythonで関数化したコードを紹介します。
詳しくは、下記のGitHubの方も参考にしてみて下さい。

github.com

最大公約数, 最小公倍数

#a,bの最大公約数
def gcd(a, b):
    while b:
        a, b = b, a % b
    return a

#a,bの最小公倍数
def lcm(a, b):
    return a * b // gcd (a, b)

2つの整数の最大公約数、最小公倍数を返します。

約数

def divisor(n):
    i = 1
    table = []
    while i * i <= n:
        if n%i == 0:
            table.append(i)
            table.append(n//i)
        i += 1
    table = list(set(table))
    table.sort()
    return table

入力された整数の約数の一覧をリストで返します。

素因数分解

#nを素因数分解したリストを返す
def prime_factor(n):
    i = 2
    table = []
    while i * i <= n:
        while n % i == 0:
            n //= i
            table.append(i)
        i += 1
    if n > 1:
        table.append(n)
    return table

整数を素因数分解して、要素をリストで返します。

素数判定

#引数nが素数かどうかを判定
def is_prime(n):
    for i in range(2, n + 1):
        if i * i > n:
            break
        if n % i == 0:
            return False
    return n != 1

入力された整数が素数であるか判定

エラトステネスの篩

#nまでの素数を列挙(エストラステネスの篩)
def sieve(n):
    is_prime = [True for _ in range(n+1)]
    is_prime[0] = False

    for i in range(2, n+1):
        if is_prime[i-1]:
            j = 2 * i
            while j <= n:
                is_prime[j-1] = False
                j += i

    table = [ i for i in range(1, n+1) if is_prime[i-1]]
    return is_prime, table

入力された整数までの素数をリストで返します。 また、それぞれが素数であるかを判定したリストも返します。

順列、組み合わせ

import math
def P(n, r):
    return math.factorial(n)//math.factorial(n-r)
def C(n, r):
    return P(n, r)//math.factorial(r)

順列、組み合わせの数を返します。

「言語処理100本ノック」 第1章をPythonで解く

言語処理100本ノック

第1章の問題の自分なりの解答例を一通り貼っておきます。参考にしていただけると幸いです。

質問,ご指摘などがありましたら、コメントしてください。

言語処理100本ノック第1章

00. 文字列の逆順

文字列"stressed"の文字を逆に(末尾から先頭に向かって)並べた文字列を得よ.

query = 'stressed'
print(query[-1::-1])
desserts

pythonのスライスという機能を利用しました。
文字列の表示は、query[開始位置:終了位置:ステップ数] という感じでそれぞれをの値を指定します。

開始位置: -1で一番最後の文字を指定
終了位置: 何も指定しないことで、最後(先頭)の文字まで表示
ステップ数: -1を指定することで開始位置から逆順で1文字づつ表示

01. パタトクカシーー

「パタトクカシーー」という文字列の1,3,5,7文字目を取り出して連結した文字列を得よ.

query = 'パタトクカシーー'
print(query[0] + query[2] + query[4] + query[6])
パトカー

文字列の先頭を0番目として、任意の順番の文字列はquery[番号]で参照できます。

02. 「パトカー」+「タクシー」=「パタトクカシーー」

「パトカー」+「タクシー」の文字を先頭から交互に連結して文字列「パタトクカシーー」を得よ.

query1 = 'パトカー'
query2 = 'タクシー'
result = ''

for i in range(4):
    result += query1[i] + query2[i]
    
print(result)
パタトクカシーー

どちらの単語も4文字なので、forループ4回で終了です。

03. 円周率

"Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."という文を単語に分解し,各単語の(アルファベットの)文字数を先頭から出現順に並べたリストを作成せよ.

text = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."
text = text.replace('.', '') #ピリオドを削除
text = text.replace(',', '') # カンマを削除
words = text.split(' ')     #空白で単語を分割

word_list = []
for word in words:
    word_list.append(len(word))

print(word_list)
[3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9]

正しく処理をすると、リストに円周率が格納される問題。

空白を区切りにして、単語に分割するだけだとカンマとピリオドが単語が直前の単語にくっついてしまいます。そのため、replace()を用いて分割する前にカンマとビリオドを削除する必要があります。

04. 元素記号

"Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."という文を単語に分解し,1, 5, 6, 7, 8, 9, 15, 16, 19番目の単語は先頭の1文字,それ以外の単語は先頭に2文字を取り出し,取り出した文字列から単語の位置(先頭から何番目の単語か)への連想配列(辞書型もしくはマップ型)を作成せよ.

text = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."
words = text.split(" ") #空白で単語を分割

first_only = [1, 5, 6, 7, 6, 9, 15, 16, 19] #1文字目のみを取り出す単語の番号
number = 1 #番号をメモ
element = {}  #番号に対応した元素を格納する辞書

for word in words:
    if number in first_only:
        element[word[0]] = number

    else:
        element[word[0] + word[1]] = number
    
    number += 1
    
print(element)
{'H': 1, 'He': 2, 'Li': 3, 'Be': 4, 'B': 5, 'C': 6, 'N': 7, 'Ox': 8, 'F': 9, 'Ne': 10, 'Na': 11, 'Mi': 12, 'Al': 13, 'Si': 14, 'P': 15, 'S': 16, 'Cl': 17, 'Ar': 18, 'K': 19, 'Ca': 20}

元素記号をkeyとして、元素番号を返す辞書を作成する問題。

まずは、単語を空白で区切り、リストにします。また、一文字目のみをkeyにするように指定されている番号をリスト first_onlyに格納にしておきます。その後、for文内でfirst_onlyに格納されている番号かを判別して、適切な元素記号をkeyとして、対応する番号が辞書 elementにされます。

05. n-gram

与えられたシーケンス(文字列やリストなど)からn-gramを作る関数を作成せよ.この関数を用い,"I am an NLPer"という文から単語bi-gram,文字bi-gramを得よ.

def word_n_gram(text, n): #単語nグラム, 引数: (文書, グラム数)
    word_list = text.split(" ") #空白で単語分割
    result = []  
    
    for i in range(len(word_list)-n+1):
        result.append(word_list[i:i+n:1]) #スライスを活用
        
    return result
            

def str_n_gram(text, n): #文字nグラム, 引数: (文書, グラム数)
    str_list = [ s for s in text] #一文字ずつリストに格納
    result = []  
    
    for i in range(len(str_list)-n+1):
        result.append(str_list[i:i+n:1]) #スライスを活用
        
    return result


print(word_n_gram("I am an NLPer", 2)) #単語bi-gram
print(str_n_gram("I am an NLPer", 2)) #文字bi-gram
[['I', 'am'], ['am', 'an'], ['an', 'NLPer']]
[['I', ' '], [' ', 'a'], ['a', 'm'], ['m', ' '], [' ', 'a'], ['a', 'n'], ['n', ' '], [' ', 'N'], ['N', 'L'], ['L', 'P'], ['P', 'e'], ['e', 'r']]

テキストから単語n-gramと文字n-gramを生成する関数を作成。引数にテキストとグラム数をとります。
単語分割はsplit(" ")を利用して、文字分割は内包表記を活用しました。

06. 集合

"paraparaparadise"と"paragraph"に含まれる文字bi-gramの集合を,それぞれ, XとYとして求め,XとYの和集合,積集合,差集合を求めよ.さらに,'se'というbi-gramがXおよびYに含まれるかどうかを調べよ.

def str_n_gram(text, n): #文字nグラム, 引数: (文書, グラム数)
    result = []  
    
    for i in range(len(text)-n+1):
        result.append(text[i:i+n:1]) #スライスを活用
        
    return set(result) #文字n-gramを集合型で返す

query1 = "paraparaparadise"
query2 = "paragraph"

X = str_n_gram(query1, 2)
Y = str_n_gram(query2, 2)

print(X | Y) #和集合
print(X & Y) #積集合
print(X - Y) #差集合

# 'se'が集合X, Yに含まれるか
print('se' in X)
print('se' in Y)
{'gr', 'ap', 'ar', 'ag', 'di', 'ra', 'ad', 'is', 'se', 'pa', 'ph'}
{'pa', 'ap', 'ra', 'ar'}
{'is', 'di', 'ad', 'se'}
True
False

05で作成した文字n-gramを返す関数を少し書き換えて、set型で返すようにしました。

07. テンプレートによる文生成

引数x, y, zを受け取り「x時のyはz」という文字列を返す関数を実装せよ.さらに,x=12, y="気温", z=22.4として,実行結果を確認せよ.

def make_template(x, y, z):
    return str(x) + '時の' + y + 'は' + str(z)

print(make_template(12, "気温", 22.4))
12時の気温は22.4

x, y, zを引数にとる関数を作成して終了。(yだけ文字列という点に注意)

08. 暗号文

与えられた文字列の各文字を,以下の仕様で変換する関数cipherを実装せよ.

英小文字ならば(219 - 文字コード)の文字に置換 その他の文字はそのまま出力 この関数を用い,英語のメッセージを暗号化・復号化せよ.

def cipher(word):
    result = ''
    
    for i in range(len(word)):
        if word[i].islower():
            result += chr(219 - ord(word[i]))
        else:
            result += word[i]

    return result

query = "'I can speak English' と彼女は言った"
output1 = cipher(query)
output2 = cipher(output1)

print(query) #元の文
print(output1) #暗号化
print(output2) #復号化
'I can speak English' と彼女は言った
'I xzm hkvzp Emtorhs' と彼女は言った
'I can speak English' と彼女は言った

Pythonord(文字))文字コードを求められます。文字コードからの復号はchr(文字コード)で可能です。
また、文字.islower()で英小文字かどうかの判別ができるため、これを利用して英語小文字の場合は、暗号化するように条件分岐を指定します。

09. Typoglycemia

スペースで区切られた単語列に対して,各単語の先頭と末尾の文字は残し,それ以外の文字の順序をランダムに並び替えるプログラムを作成せよ.ただし,長さが4以下の単語は並び替えないこととする.適当な英語の文(例えば"I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind .")を与え,その実行結果を確認せよ.

import random

query = "I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind ."
words = query.split(" ")
result = "" 

for word in words:
    if len(word) > 4: #4文字以上はシャッフル
        shuffle_list = []
        
        for i in range(1, len(word)-1):
            shuffle_list.append(word[i]) #先頭と最後以外の文字をshuffle_listに格納
            
        random.shuffle(shuffle_list) #先頭と最後以外の文字をシャッフル
        shuffle_word = word[0] 
        
        for s in shuffle_list:
            shuffle_word += s
            
        shuffle_word += word[-1]
        result += shuffle_word 
    
    else: #4文字以下はそのまま
        result += word
    
    if word != words[-1]: #最後の単語以外は, 後ろにスペースも加える
        result += " "

print(query) #元の文書
print(result) #シャッフル後の文書
I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind .
I coln'udt believe that I could atcullay uretsndand what I was rideang : the pnnohmaeel poewr of the hmaun mind .

まずは文字列を空白で区切り、リストに格納します。(今回は、ピリオドやコロンの前にも空白が入るようなので、03のような処理は不要です。)
その後、単語を一つずつ確認していき、5文字以上の単語は先頭と最後をのぞいてリストに格納し、random.shuffle()を用いて、リストをシャッフルします。
最後に、先頭の文字 + シャッフルしたリスト + 最後の文字 の順番で文字をつないで、単語を作ります。

 

AtCoder 緑になるまでにやったこと

f:id:kNakajima3027:20181028115437p:plain

はじめに

2018年10月27日の Tenka1 Programmer Beginner Contestにて,レート800に到達して緑レートになりました.というわけで今回は,自分がAtCoderを始めた時から緑レートになるまでを振り返ろうと思います.

2018年6月(AtCoder開始)

4年生になって研究室に配属され, 研究でPythonを使うことになりました.
Pythonに慣れるためにAtCoderをはじめて,漠然と緑になることを目標としました.

やったこと

qiita.com

AtCoderの入門として有名だったので, とりあえずやってみたという感じです.
プログラミングの経験はあったため, 100点, 200点の問題はサクサク解けました.
自分の場合, 300点問題に壁があるということをここで確認しました.

自分のレベル的に100点, 200点は解けて, 300点から解けなくなることがわかったため, ABCの過去問をD問題を除いて埋めていくことにしました.
1日2, 3回分くらいのペースでABC過去問を埋めていきました.
研究が忙しくなる7月半ばまでは,こんな感じで, ひたすら過去問を埋めていき,レートも右肩上がりでした. (約1ヶ月で茶色に到達)

 

2018年8月(停滞期)

研究の方が忙しくなってきたため,AtCoderの過去問を解く日課が消えました.
毎週コンテストにだけは参加していましたが,パフォーマンは上がらず, 8月, 9月はずっとレートが横ばいの状態でした.

やったこと

授業で教科書として利用していたことを思い出し,再び読み直すことにしました.
レート向上に直結したか言うとイマイチな気がします.
(探索,動的計画法を学べたのはよかったと思います)

 

9月, 10月 (緑到達)

再び過去問を埋める作業を開始.(少しだけ蟻本を眺めた)
この辺りで, ようやくコンテストの時間内に300点問題が解けるようになってきました.
解いた問題数も, 200AC突破.
レートの停滞も抜けだし無事, 緑に到達することができました.

 

まとめ (AtCoderで緑になるには,これをやりましょう!)

  • レートを上げるにはAtCoderの過去問を解く(多分一番効率が良い)  AtCoder Problems
  • AtCoderで緑に到達するにはABCで,100点, 200点問題を合わせて15〜20分で解けるようにする.300点も(3〜4回に1回くらいは)時間内に解けるようにする.
  • 400点以上の問題は解ける必要なし

 

問題集

300点問題まではアルゴリズムの知識がなくても解ける問題が多いですが,初歩的なアルゴリズムの知識を要求される問題も出ます.下記の問題は, 基本的なアルゴリズムの演習問題として優れていると思うので, ぜひやってみてください.

「プログラミングコンテスト攻略のためのアルゴリズムとデータ構造」を読んだ感想

 

プログラミングコンテスト攻略のためのアルゴリズムとデータ構造

プログラミングコンテスト攻略のためのアルゴリズムとデータ構造

 

学部2年生の時のアルゴリズム演習の授業で教科書に指定されていました。基本的なアルゴリズムの復習とC++の勉強ということで2章までの問題を一通り解いてみたので、身についたこと、感想を記します。

 

本書本をやって身についたこと

基本的なアルゴリズムとデータ構造

ここでいう「基本的なアルゴリズムとデータ構造」とは、大学の教科書に載っているような内容のことです。例えば、ソートやスタック、キューなどといった多くの言語でライブラリとして用意されている処理も、理論の解説とコード例が記載されていて、自分で手を動かして動作を確認することができます。

競技プログラミングで必要な知識

本書では競技プログラミングで重要な、再帰動的計画法、グラフの内容も含まれています。そしてそれらの知識を演習問題を解きながら身につけていくことができます。また、言語はC++で書かれていますが、C++STLの利用例も載っているため、C++の知識が不足している(制御文,配列が分かる程度)人にもおすすめだと思います。

感想

結論として、基礎からアルゴリズムを学びつつ、競技プログラミングの基礎を身につけたいという人にはオススメです。理論を読むだけでは定着しにくい内容に対して、自分で手を動かしてコードを書いて確認できるという点が良いです。一方、競技プログラミングに特化した勉強がしたい人、ある程度コンテストに参加して、基本的なプログラミング、アルゴリズムが身についている人は、本書はスキップして蟻本に手をつけてよいと思います。

 

マンガでわかる統計学 内容整理

 

マンガでわかる統計学

マンガでわかる統計学

 

統計学の学び直しシリーズ第一弾として上記の本を読んだために簡単にまとめ。
統計学自体は一通り勉強したことがあったので、サクサク読めました。
今まであやふやだった基本用語の整理はできたと思います。
今後、復習しやすいように本書で出てきた統計学の基本用語をまとめておこうと思います。

  

1章 データの種類

数量データ
定量的に扱うことができるデータ
例. 気温, 身長など

カテゴリデータ
定量的に扱うことができないデータ
例. 天気, 資格の難易度など

2章 数量データ

階級
データを値の範囲ごとに分ける区切り

階級値
その階級の範囲の真ん中の値

度数
その階級に属するデータ数

相対度数
全データに対して、その階級に属するデータの割合

平均
一般的な平均は相加平均と呼ばれる。
他にも、幾何平均, 調和平均などがある。

中央値
データをソートしたときに、真ん中に来るデータの値

標準偏差
データの散らばりの度合い
(最小で0となる。)

推測統計学
標本から母集団の状態を推測することを目的とした統計学

記述統計学
母集団 = 標本 として、集団の状況を表すことを目的とした統計学

3章 カテゴリデータ

単純集計表
カテゴリデータの状況の雰囲気を掴むために利用

4章 基準値と偏差値

基準化(標本化)
データ値の価値を検討しやすくするためのデータ変換

基準値
基準化されたデータの値
特徴として、平均値 0, 標準偏差 1となる。

偏差値
偏差値 = 基準値 × 10 + 50 
平均値 50,  標準偏差 10 となる。

5章 確率

確率密度関数
階級の幅を極限まで狭めることでできる曲線
積分すると1になり、面積は確率と等しい。
代表例として、正規分布, 標準正規分布, カイ二乗分布, t分布, F分布などがある。

正規分布
引数として平均と標準偏差をとる。
平均を中心に左右対称となる。

標準正規分布
正規分布において、平均を0, 標準偏差を1とした場合
基準化したデータの分布は標準正規分布に従う。

6章 相関

相関係数
数量データと数量データの直線的な関連度合いを示す値
範囲は -1 ~ 1であり、-1に近いほど負の相関があると言い、
1に近いほど正の相関があると言う。また、0のときは無相関と言う。

相関比
数量データとカテゴリデータの関連度合いを示す値
範囲は 0 ~ 1であり、1に近いほど相関が強いと言い、0に近いほど相関が弱いと言う。

クラメールの連関係数
カテゴリデータとカテゴリデータの関連度合いを示す値
範囲は 0 ~ 1であり、1に近いほど相関が強いと言い、0に近いほど相関が弱いと言う。

7章 検定

検定
母集団について分析者が立てた仮説が正しいかどうかを、
標本データから推測する分析手法のこと。
目的に合わせて、どの検定手法を利用するかを決める。

帰無仮説
立証が難しい肯定的な仮定を充てる。

対立仮説
帰無仮説に対立する仮定

棄却域
確率密度関数において、対立仮説が正しいとみなす範囲
検定手法によりどの分布に従うかは異なる。
(帰無仮説が正しい確率は最大で有意水準と等しい。)

有意水準
棄却域の範囲を決める値
(一般的に0.05か0.01とする。)

検定統計量
標本データを一つの値に変換したもの
求め方は検定手法により異なる。