第9回 Python によるデータ解析1
データサイエンス/2021|2021.11.12
AGENDA
- 以下名簿が表示されます。出欠確認・座席記録をお願いします。
出欠確認・座席記録 - 講義はこのページの内容を解説するかたちで遠隔 LIVE 配信します。
- 質問等は YouTubeLive のチャットまたは LINEの 20ASグループからどうぞ。
- 学科サイトの各自のページを更新して下さい。
学科サイト|受講生一覧
以下、LIVE動画をご覧下さい。記事に沿って解説します。
記録動画は後日、学科サイトの特設ページ(要ログイン)に移動します。
- 配信開始:2021.11.12 09:00 -
- 動画は授業直前に有効になります(準備段階では黒い画面)。授業開始時にページを再読み込みしていただくと、視聴が有効になります。
CONTENTS
はじめに
各回の内容
- 第8回 データサイエンスとPython
- 第9回 Python によるデータ解析1(GitHub CSV)
- 第10回 Python によるデータ解析2(GoogleDrive Excel)
- 第11回 Python によるデータビジュアライゼーション1
- 第12回 Python によるデータビジュアライゼーション2
- 第13回 Python によるデータビジュアライゼーション3
- 第14回 機械学習・序説
前回 事後質問への回答
「パクる」と「真似る」の違い
- パクる:単にオリジナルを移動・複製して所有すること(盗むと同義)
「パクる」だけでは何の学びにもなりません。 - 真似る:しくみを理解した上で、自分の力で同様のものを作り出すこと
「真似る」は「学ぶ」の語源とも言われる行為。子供は大人のやることを真似することで生きる術を身につけます。同様に、多くの学びは、憧れや理想を契機として、誰かの行為や創造物を真似ることからはじまります。
21世紀、インターネットの文化圏には、誰もが自由に情報共有できることを前提としたオープンな仕組みが数多く存在します。誰かの情報があなたの学びに役立つと同時に、あなたが公開する情報が誰かの役に立っています。
データの取り扱い
データとは
データ(Data)とは、一般に情報伝達、解釈、処理を目的として符号化された情報(与件・所与)のことです。
- 日本工業規格:X0001 情報処理用語-基本用語
情報の表現であって、伝達、解釈または処理に適するように形式化され、 再度情報として解釈できるもの
データファイルの基本構造
データファイルは一般に2次元の表形式で与えられます。以下の用語を理解しておくことが必要です。
- テーブル / Table(表):通常1つのファイル
- レコード / Row(行):1件分のデータセット
- フィールド / Column(列):特定項目に関するデータセット
表の先頭行にはフィールド名(項目見出し)が並ぶのが一般的です。
出典:https://commons.wikimedia.org/wiki/File:Table_Elements.svg
様々なデータファイル形式
- CSV(.csv)
CSV(Comma-Separated Values)は、表形式のデータ等でフィールド項目をカンマ [ , ] で区切ったテキストデータです。データ交換用の標準形式として、多くのスプレッドシートやデータベースソフトで活用されています。ちなみに、タブで区切られたものをTSV(Tab-Separated Values)、半角スペースで区切られたものを Space-Separated Values といいます。 - EXCEL(.xlsx)
みなさんお馴染み、スプレッドシートの代表的なデータ形式です。データとして読ませること前提とした Excelシートの場合、表の先頭行がフィールド項目名になるようにしましょう(視覚的な配慮のための余白や、大見出し等は省略してシンプルな表にします)。 - JSON(.json)
JavaScript Object Notation >JSON
オープンデータについて
オープンデータとは、著作権、特許などの制限なしで、全ての人が自由に利用・再掲載できるデータ(またその考え方)です。
>OpenData
データ解析のキーワード
要約統計量(記述統計量)
標本の性質を要約するための統計量を「要約統計量」といいます。Python では、これを一行のコードで一覧出力することができます。
- 代表値(measure of central tendency):データの分布の特徴を表す値
- 平均(mean):データの総和をデータ数で割った値。最も一般的。
- 中央値(median):データを大きさの順に並べたときに中央にくる値。
- 最頻値(mode):度数分布において最も高い度数を示す値。
- 散布度 (dispersion):データの散らばりぐあいを表す値
- 分散(population variance):偏差平方和をデータ数で割った値。
- 標準偏差(standard deviation):分散のルートをとった値。
- 四分位点:データを昇順に並べたときに、25%, 75% の位置にくる値。
- 参考:Distribution
相関
2つの変数の間の関係を測る指標で、「身長が高い人は体重が大きい」、「数学の点数が高い人は物理の点数も高い」など、「ああであれば、こうである」ということの程度を示します。相関係数 r が正のとき確率変数には正の相関が、負のとき確率変数には負の相関があるといいます。
レポート等で相関の有無について語る場合、一般的な目安は以下です。
- | r | = 0.7~1.0 かなり強い相関がある
- | r | = 0.4~0.7 やや相関あり
- | r | = 0.2~0.4 弱い相関あり
- | r | = 0~0.2 ほとんど相関なし
クロス集計
2つないし3つの情報に限定して、データの分析や集計を行なう方法。 縦軸と横軸に項目を割り振って、項目間の相互関係を視覚的に見やすくしたものです。アンケート調査の手法としては、ポピュラーなものの一つです。
参考:GoogleImage:クロス集計
Pythonによるデータ解析
Python言語を用いたデータ解析には、Pandas という定番のライブラリーがあります。今回の演習でも、これを使ってデータ解析を行います。
DataFrame
Pandas を使用するにあたって重要な概念が DataFrame と呼ばれる表構造です。 そこでは「表」を data、index、columns で把握しています。
- data:表内の個々のデータ値(成績表で言えば、行列に並ぶ点数データ)
- index:行ラベル(レコードを代表する値。成績表で言えば、学籍番号)
- columns:列ラベル(項目名。成績表で言えば、国語・算数・理科・・)
行ラベル、列ラベルとも、指定されない場合は 0, 1, 2,・・・となります。
一般にデータフレームは、CSV や Excel 等のデータを読み込んで生成しますが、直接書いて定義する場合は、以下のように書きます。
df = pd.DataFrame( data = [ [ '佐藤', 170, 60 ] , ['田中', 160, 50 ] , [ '鈴木', 165, 58 ] ] , index = ['S01', 'S02', 'S03'], columns =[ 'name' , 'height', 'weight'] ) df ------------------------------------- name height weight S01 佐藤 170 60 S02 田中 160 50 S03 鈴木 165 58
df は DataFrame の略として一般によく用いられる変数名で、これが表の全体を包括して把握している・・というイメージになります。
解析自体は1行のコードで実現
- 要約統計量の表示:DataFrame.describe()
df.describe()
- 相関行列の表示:DataFrame.corr()
df.corr()
- クロス集計:pandas.crosstab( )
pd.crosstab( df['学部'] , df['性別'] )
関連リンク
https://pandas.pydata.org/
https://github.com/pandas-dev
https://pandas.pydata.org/Pandas_Cheat_Sheet.pdf
https://ja.wikipedia.org/wiki/Pandas
データ解析体験1|Web上の CSVデータの活用
CSVデータのサンプルとして著名な Tips(チップ) を使って、統計処理を体験します。 Tipsでは、レストラン利用者の支払総額、チップの額、性別、喫煙の有無などが一覧表になっています。
ノートブックの新規作成
- Google Colaboratory でノートブックを新規作成
- Untitled0.ipynb というファイル名を変更 > StatisticsCSV.ipynb
サンプルデータ
- はじめに Tips の内容を確認しましょう。以下にアクセスして下さい。
https://github.com/mwaskom/seaborn-data/blob/master/tips.csv
- データが見えるブロック上の raw(生データ)をクリックすると、以下のように、CSVデータを直接表示することができます。
https://raw.githubusercontent.com/mwaskom/seaborn-data/master/tips.csv
プログラムではこのアドレスに直接アクセスする形でデータを利用します。
- ちなみにこの状態で、ブラウザの「ファイル>保存」を行うと、あなたのPCにデータをダウンロードすることができます。
- PCで .csv をダブルクリックすると 、Excel 等のスプレッドシートが対応するデフォルトアプリケーションとして起動すると思います。
- .csv はプレーンテキストなので TextEditor で開くことが可能です。
サンプルコード
- JupyterNotebook形式(.ipynb)でプログラムを提供します。
https://github.com/koichi-inoue/DataScience/blob/main/StatisticsCSV.ipynb - 資料が見えているブロックの一番上「Open in Colab」をクリックすると、Google Colab で開くので、そのまま「ドライブにコピー」であなたの Colab Notebooks フォルダに保存されます。
プログラムの解説
- ライブラリの読み込み
import pandas as pd
Pandas は、データの読込、集計、並べ替え、欠損値の補完などを行うことができるライブラリで、データ分析の前処理段階で多く利用されます。.csv、.xlsx 他、多様な形式のデータを読み込みに対応しています。
Pandas の特徴は DataFrame にあります。DataFrame にはデータの平均値や行数などの情報把握、並替え、列名変更といったデータ整形機能があります。
上記の1行で、以後 pd という変数を用いて pandas の機能を使えます。
- CSVデータの読み込み
df = pd.read_csv('(URL)')
Pandas のデータ読み込み機能を使ってCSVデータを DataFrame として読み込んで、df という変数に渡しています。
- データフレームの基本情報を表示
print('行数・列数:', df.shape) print('項目名:', df.columns) print('各列のデータ型:\n', df.dtypes)
- Print 文は、データを表示する命令です。df.shape は行・列の数、df.columns は項目名の一覧、df.dtypes は各項目のデータ型を意味します。
- df.dtypes で表示される「データ型」の違いが重要です。
- int64 , float64: 数値項目(量的データ)で、計算の対象になります
- object:名義項目(質的データ)で、データを分類する際のカテゴリーキーワードになります。
- 要約統計量を表示|describe( )
df.describe()
各項目のデータ件数、平均、標準偏差、四分位点が表示されます。
- 相関係数を表示|df.corr( )
df.corr()
わずか一行の文で、すべての数値項目間の相関を一覧できます。
- データを total_bill の順で並べ替え|sort_values( )
df_sort = df.sort_values('total_bill', ascending=False ) df_sort
データを降順に並べ替える事例です(参考までにご紹介です)。
- 女性の行のみ抽出|query( )
df_female = df.query( " sex == 'Female' ") df_female
データを特定の条件で絞り込む事例です。df.query は DataFrame に問い合わせを行うメソッドで、ここでは「性別」の項目が「女性」の行のみを抽出して、新たな DataFrame として df_female に渡した後、それを表示しています。
- Dinner に 5名以上で来た客のみ抽出
df_male_smoker = df.query( ' time == "Dinner" and size >= 5 ' )
df_male_smoker
- 曜日別のデータ件数|value_counts( )
df_day_counts = df['day'].value_counts() df_day_counts
df['day'] で DataFrame の「曜日」の項目に注目した上で、その値(曜日)別の件数をカウントしています。
- 曜日別の平均|groupby( ) , mean( )
df_day_mean = df.groupby('day').mean() df_day_mean
曜日の値別にグルーピングした上で、それぞれの平均を求めています。
- クロス集計 曜日別の男女の数|crosstab( )
cross_table = pd.crosstab( df['day'] , df['sex'] ) cross_table
曜日と性別の2項目に注目して、クロス集計表を出力しています。これを正規化( 0.0 - 1.0 の値に変換)して表示するには、normalize='index' と追記します。
学科サイトにリンク掲載(その3)
ノートを、学科サイトの個人ページからリンクして下さい。以下、手順です。
- 1. 自分のノートを開いた状態で、右上の「共有」をクリック
- 2. 共有設定を変更して、以下のように表示される状態にします。
このリンクを知っているインターネット上の全員が閲覧できます。
- 3. 「リンクをコピー」をクリックして、そのアドレスを、以下の形式で、学科サイトの「Jupyter Notebooks」の部分に掲載して下さい。
-[[StatisticsCSV>https://colab.research.go・・=sharing]]
- 4. 以下のようになればOKです。
https://design.kyusan-u.ac.jp/socialdesign/?JohnSmith/DataScience
自主演習のススメ
今回の演習では、Web上に公開されている既存のCSVデータを利用しましたが、GitHubのアカウントや、Webサーバーがあれば、そこへ、ご自身がアンケート等で取得したデータをアップロードして解析することが可能です。
ちなみに、次回の演習では、GoogleDrive に置いた Excel ファイルの活用を事例に演習を行います。
本日作成した2つのノートについては、各自の関心に応じてコードやコメントを追記してください。
APPENDIX
表形式のデータから見えてくるもの
大量の表データからは、何らかの「グループ」や、フィールド項目間の「関係」を見出すことができます。それらは判別や予測に活用することが可能です。
コンピュータがなかった時代は、みんな年長者の勘(つまり過去の経験の蓄積)を頼りに、物事の計画や準備を行っていました。
- 蕎麦屋の主人の勘:今日のような暑い日には、お昼時にざる蕎麦の注文が増えるから、事前に多めに仕込みをしておこう
- 刑事の勘:満月の日の21時ごろには、このあたりで事件が起きることが多いから、パトロールを強化しよう
と、こんな感じです。しかし現在では、過去の購買行動や犯罪事象などのデータが大量に蓄積(データベース化)されています。
例えば、購買行動については、日時、場所、購入商品、年齢、性別等、購入時点の複数のフィールド項目にデータが入る形で、購買行動1件(1レシート)がひとつのレコードとして記録されます。
さらに、その日の天候や気温、道路交通情報などの時系列データなども別のテーブルに記録されているので、複数のテーブルを時刻をキーとして照合すると、天候や気温のデータと売れる商品との関係を調べることも可能になります。
人間が経験的に参照・蓄積できるデータには限りがありますが、コンピュータを使えば、大量のデータを一括処理して、これまでは気づかなかったような「知見」を得ることが可能になります。まずは、データに潜む「グループの存在」や「項目間の関係」を人間の目に見えるかたちに「視覚化」すること。これがデータサイエンスの第一歩です(ここまでは、従来の「統計」の延長にあると言えます)。
で、さらにそれをもとに、自動的な判別(パターン認識)や予測を行うことができるようになります。これが A.I. ということになります。今日の A.I. やロボットの多くは、この大量のデータをもとに得られた「知見」にもとづいて、自動的に判断して行動しています。 データサイエンスと A.I. はその意味で、切っても切れない関係にあると言えます。