質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

13136閲覧

帯状の標準偏差をつけた折れ線グラフの作成法(Python,jupyter)

ZJXestGVdjaPalt

総合スコア3

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/07/22 17:53

前提・実現したいこと

(1)標準偏差を帯状につけた折れ線グラフを作りたい。
エクセルファイルに以下のようなデータが入っています。
day1からday28までのデータの平均値の折れ線グラフを、sexやconditionごとに作成したいです。標準偏差は「エ」でなく、https://seaborn.pydata.org/generated/seaborn.lineplot.htmlにでているような帯状にしたいです。

(2)統計解析
また、条件ごと(maleとfemaleであればMann-Whitney検定、A,B,CであればANOVA検定)での統計解析も行いたいです。

Num sex condition day1 day3 day5 Day7 Day14 Day28
0 M1 male A 16.0 19 NaN NaN NaN NaN
1 M2 male B 12.0 19 5.0 12.0 1.0 0.0
2 M3 male C 10.0 22 4.0 22.0 NaN NaN
3 M4 male C 5.0 34 12.0 10.0 NaN NaN
4 F1 female B 6.0 11 22.0 24.0 20.0 16.0
5 F2 female A 19.0 4 6.0 NaN 4.0 0.0
6 F3 female A 20.0 23 19.0 15.0 10.0 1.0
7 F4 female B 22.0 7 4.0 2.0 2.0 14.0
8 F5 male C 5.0 7 13.0 19.0 9.0 4.0
9 F6 male C NaN 0 20.0 5.0 11.0 9.0

試したこと

https://stats.biopapyrus.jp/python/plot.htmlを参考にエクセルで作成したい折れ線グラフの条件(sexやcondition)で平均値と標準偏差を求め、それらの値を入力するとエラーバーつきの折れ線グラフを作成することはできました。

補足情報

プログラミング初心者です。これまでエクセルでの解析を行っていました。現在、エクセルにデータが大量に保存されているため、エクセルファイルをpython pupyterに読み込んで作業ができないかと考えています。

※jupyter Note book 6.0.1を使用しています。

ご教授のほど何卒よろしくお願いもうしあげます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jeanbiego

2020/07/22 23:16

「やりたいです」ではほとんど回答がこないと思います。 下記ヘルプを参考に、ご自分で書かれたコードを載せて、どこでつまずいているのか具体的に書かれると良いです。 https://teratail.com/help/question-tips
aokikenichi

2020/07/23 02:56

標準偏差ではなく標準誤差ではないでしょうか
ZJXestGVdjaPalt

2020/07/23 13:40

jeanbiego様 ご教示ありがとうございます。大変勉強になります。次回は「自分が作成しているコード」及び「なぜ上手くいかないか」を記載して質問したいと思います。ありがとうございました。 aokikenichi様 ご指摘の通り、標準偏差でなく標準誤差でした。ご教授ありがとうございました。
guest

回答1

0

ベストアンサー

行いたいことが

  1. Excelのファイルを読み込めること
  2. 統計解析を行いたい

ということですのでデータ加工のためにpandasというパッケージを使うのが良いです。「pandas」「Excel」というキーワードで検索して頂ければ情報はたくさん見つかると思います。データが読み込めた後の話を書きます。

(1)標準偏差を帯状につけた折れ線グラフを作りたい。

day1, day2, ...が列となっていますので、df.melt()を使用して下記のような形に変形します。

Numsexconditiondayvalue
0M1maleA116.0
1M1maleA319
2M1maleA5NaN
3M1maleA7NaN
4M1maleA14NaN
5M1maleA28NaN
6M2maleB112.0
...

このような形式を作ればURLの例のようにプロットできます。以下サンプルコードです。

python

1import pandas as pd 2import matplotlib.pyplot as plt 3import seaborn as sns 4from io import StringIO 5 6# サンプルデータの準備 7input_str = """ 8Num sex condition day1 day3 day5 Day7 Day14 Day28 90 M1 male A 16.0 19 NaN NaN NaN NaN 101 M2 male B 12.0 19 5.0 12.0 1.0 0.0 112 M3 male C 10.0 22 4.0 22.0 NaN NaN 123 M4 male C 5.0 34 12.0 10.0 NaN NaN 134 F1 female B 6.0 11 22.0 24.0 20.0 16.0 145 F2 female A 19.0 4 6.0 NaN 4.0 0.0 156 F3 female A 20.0 23 19.0 15.0 10.0 1.0 167 F4 female B 22.0 7 4.0 2.0 2.0 14.0 178 F5 male C 5.0 7 13.0 19.0 9.0 4.0 189 F6 male C NaN 0 20.0 5.0 11.0 9.0 19""" 20df = pd.read_csv(StringIO(input_str), delim_whitespace=True) 21 22# DataFrameの形をNum, sex, condition, dayに変更 23df2 = df.melt(id_vars=["Num", "sex", "condition"], var_name="days") 24df2["days"] = df2.days.str.replace("day", "").str.replace("Day", "").astype(int) 25 26ax = sns.lineplot(x="days", y="value", hue="sex", style="sex", data=df2) 27plt.show() 28

折れ線グラフ

(2)統計解析

こちらについてはscipyというパッケージがありますので、それを使用します。例えばMann-Whitney検定の場合はscipy.stats.mannwhitneyu()が利用できます。day1,day3等を等価に扱って良いということであれば、以下のようになります。

python

1from scipy import stats 2 3group1 = df2[df2.sex == "male"]["value"].dropna() 4group2 = df2[df2.sex == "female"]["value"].dropna() 5result = stats.mannwhitneyu(group1, group2) 6print(result) 7 8# 結果 9# MannwhitneyuResult(statistic=295.0, pvalue=0.3849284125651019)

投稿2020/07/23 02:43

編集2020/07/23 15:59
yymmt

総合スコア1615

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ZJXestGVdjaPalt

2020/07/23 13:41

yymmt様 大変詳細なご説明ありがとうございます。 jeanbiego様にご指摘頂きましたが、私の不適切な質問にも関わらず丁寧なコードを載せてい頂きありがとうございます。お陰様で下記コードにて上手く実行できました。キモはmelt関数を用いて「整然データに書き換える(https://qiita.com/ishida330/items/922caa7acb73c1540e28)」ということなのですね、大変勉強になりました。 大変申しわけありませんが、可能であれば追加で2点質問させて下さい。 (1)df2["days"] = df2.days.str.replace("day", "").str.replace("Day", "").astype(int)の意味について replace関数について調べてみましたが、「""」が理解できていません。「dayとDayを""に変換する」ということだと思っていますが、、、また、「df2.days.str.replace」も理解できていません。大変申しわけありませんが、簡単で結構で御座いますのでご説明頂けると幸いです。 (2)標準誤差の帯様表示 aokikenichi様にご指摘頂きました通り、正しくは標準偏差でなく標準誤差でした。ご教示頂いたseabornのlineplotのデフォルトは95%信頼区間のようです。https://sabopy.com/py/seaborn-4/を参考に「ax = sns.lineplot(x="days", y="value", hue="sex", style="sex", data=df2)」を「ax = sns.lineplot(x="days", y="value", ci='sd', hue="sex", style="sex", data=df2」とする(ci='sd'を追加する)と、標準偏差表示ができました。しかし、標準誤差を表示する方法を探せませんでした。もしご存じであればご教授お願い申し上げます。 ~上手くいったコード~ import matplotlib.pyplot as plt import seaborn as sns import numpy as np import pandas as pd df = pd.read_excel('Python_test.xlsx') df2 = df.melt(id_vars=["Num", "sex", "condition"], var_name="days") df2["days"] = df2.days.str.replace("day", "").str.replace("Day", "").astype(int) ax = sns.lineplot(x="days", y="value", hue="sex", style="sex", data=df2) plt.show()
yymmt

2020/07/23 15:58

(1)について ""は空の文字列を示していてreplace("day","")は"day"という文字列を消すという意味です(例示されたデータが先頭が小文字のdayと大文字のDayと2種類ありましたので2回行っています)。 df2.daysはdf2["days"]と同じ意味です。したがってdf2.days.str.replaceはdf2["days"].str.replaceと同じ意味になります。新たに作成したdaysという列を文字列として扱いreplaceで変換するという意味になります。詳細は公式ページのマニュアルを参照するのが良いです。 https://pandas.pydata.org/pandas-docs/stable/reference/series.html#api-series-str (2)について seabornのマニュアルを見ると確かにciで設定はできなさそうです。もしこれを行いたいとすると 1. sns.lineplot()を使うのをあきらめてmatplotlib.pyplot.fill_between()を使って頑張る 2. sns.lineplot()でci="se"のように標準誤差を使えるようにモンキーパッチを当てる どちらもこのコメント欄に書くにはボリュームが多いです。
ZJXestGVdjaPalt

2020/07/23 16:40

yymmt様 お返事ありがとうございます。 (1)大変よく理解できました。公式ページを参照しながら理解を深めたいと思います。 (2)今の私の力では解決できなさそうですので、今は諦めます。コード作成を継続し後日リトライしたいと思います。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問