Pythonを使って自分の電話とタブレットのバッテリー寿命を調べた方法
要約
- Pythonと統計分析は、モバイルデバイスの画面オン時間とバッテリー寿命との線形関係を探るために使用できます。
- Seaborn、pandas、Pythonは回帰をプロットするために使用でき、Pingouinはモデルを構築します。
- 電話とタブレットのバッテリー使用は直線的であり、Pythonにおける統計分析の実用的な価値を示しています。
最近、電話やタブレットの画面時間がバッテリーの消耗にどのように影響しているのかを調べたいと思いました。そのためにPythonに行くことは考えないかもしれませんが、基本的な統計ツールは実際に答えを提供できます。
私の研究課題:スクリーンオン時間とバッテリー寿命はどのように関連していますか?
もしかしたら、私はバッテリーの持ちについて悩んでいるように見える人の一人かもしれませんが、実際にはそれほど必要ないと思います。私は、Androidの電話とタブレットの両方で、日が終わる頃には常に十分なバッテリーを持っていますし、在宅勤務をしているので、コンセントから遠く離れることはありません。
画面がオンになっているとバッテリーをより多く消費することは明らかですが、実際に二つがどのように関連しているのか興味がありました。それは線形の関係なのでしょうか?それとも、バッテリーの消費が急激に増加する指数関数的な関係なのでしょうか?
最近、データ分析に興味を持っています。大学時代に基礎統計学と確率のコースを受講し、物理実験室でデータポイントが二つの軸に沿ってプロットされ、その間に線が引かれる線形回帰の概念に初めて出会いました。
私の電話とタブレットが画面オン時間とバッテリー使用量の統計を記録していることに気づいたとき、私は以前の経験を思い出しました。大学時代に使っていたTIグラフ計算機は家のどこかにありますが、Pythonがあるので計算機はもう必要ありません。私はPythonの統計計算ツールの配列を使って、画面オン時間とバッテリー寿命の関係があるかどうかを調べることにしました。
仮説を立てる
統計学の一部は仮説検定です。これは良い科学の鍵です。これがこのような小さなプロジェクトには過剰だったかもしれませんが、たとえ短い間でも良い統計学者であり、科学者でありたいと思っていました。
統計学では、帰無仮説と対立仮説を形成します。これらはそれぞれ「H0」と「H1」として知られています。
帰無仮説は、統計的検定の形での証拠がそれを棄却することを正当化する場合に、棄却し代替仮説を選択できるものであるべきです。
スクリーンオン時間とバッテリー寿命の場合について。私の電話とタブレットのバッテリー寿命に関して:
帰無仮説 (H0) | 画面オン時間とバッテリー寿命の間に関係はありません。 |
帰無仮説(H1) | 画面オン時間とバッテリー寿命の間には関係があります。 |
帰無仮説と対立仮説が定義されたので、データの収集と分析を進めることができました。
データをPythonに取り込む
最初のステップは、データを整理することでした。私のサムスンの電話とタブレットに搭載された改良版Python OSは、過去1週間のバッテリー使用量と画面オン時間を記録しています。
私は義務感を持って、タブレットと電話を診断ページに切り替え、そのデータをLibreOffice Calcのスプレッドシートにコピーし、CSVファイルとして保存しました。
私は、携帯電話とタブレットの報告されたスクリーンオン時間のために、各デバイスに二つの列を作成しました。スクリーンオン時間をコード化する最も簡単な方法は、時間を60で掛けて分を加えることだと考え、電話のスクリーンがオンになっていた合計分数を求めました。(最初はスプレッドシートで時間と分としてコード化しましたが、pandasはその形式を好まないようだったので、最終的に再コード化しました。)
私はPythonのpandasライブラリを使用してデータを読み込みました。pandasはCSVファイルを含む多くのデータ形式を読み取ることができます。pandasは行と列に配置されたデータを扱うのを簡単にし、スプレッドシートからPythonへの移行を容易にします。
Jupyterノートブックを開いて、環境を設定するためにいくつかのPythonコマンドを実行しました。
import numpy as np
import pandas as pd
import seaborn as sns
import pingouin as pg
%matplotlib inline
これらのコマンドは、私が使用する予定のライブラリを設定します。NumPyは、統計を含むあらゆる種類の数値操作に便利です。データを扱うときはいつもインポートするので、統計的な安全ブランケットのようなものです。2番目の文は明らかにpandasをインポートしますが、"pd"と省略しているのは、"pandas"と何度も入力しなくて済むようにするためです。Seabornは統計的なプロットを作成するための素晴らしいツールで、散布図や回帰を作成するために使用しました。Pingouin(フランス語で"ペンギン")は統計テストを行うライブラリで、モデルを構築し、データにどれだけ適合しているかを確認するために使用しました。
そのブロックの最後の行は、すべてのプロットをJupyterノートブック内に表示させるためのものです。そうでなければ、別のウィンドウに表示されます。
必要なライブラリがすべて読み込まれたので、データを使ってpandasデータフレームを作成することができました。
battery = pd.read_csv("data/device_batteries.csv")
新しいデータフレームをhead関数を使って確認することができます:
battery.head()
これはデータの最初の数行を示し、どのように整理されているかを見ることができます。もちろん、私はそれを作成したので、すでに知っていました。このコマンドは、Kaggleのような場所からダウンロードするデータセットにとって便利です。
次のステップは、データセットからいくつかの記述統計を取得することでした。私のデータフレームのdescribeメソッドはまさにそれを行います。
batteries.describe()
これは、データフレーム内のすべての数値列に対して、カウント、平均、標準偏差、最小値および最大値、さらに下四分位数(25パーセンタイル)、中央値(50パーセンタイル)、上四分位数(75パーセンタイル)などの基本的な記述統計を印刷します。これらの統計は、全体の状況を把握するのに役立ちます。
回帰をプロットする
データが入力され、インポートされたので、関係を探る時が来ました。
私は、電話の画面オン時間とバッテリー消耗のパーセンテージポイントの散布図を作成することから始めました。
sns.relplot(x='phone_screen_on',y='phone_battery',data=battery)
これは、Seabornに画面オン時間をx軸、バッテリー消耗をy軸としてプロットを作成するよう指示します。よく見ると、データポイントはほぼ直線に沿っているようです。回帰をプロットして、どれだけうまく線がフィットするかを見てみることにしました。
sns.regplot(x='phone_screen_on',y='phone_battery',data=battery)>
その線はかなりうまくフィットしました。
しかし、どのようにフィットを確認し、線を生成するために使用された方程式を再構築することができるのでしょうか?そこにPingouinが登場します。他のいくつかのライブラリは統計テストを行い回帰分析を行うことができますが、Pingouinは私のお気に入りです。なぜなら、使いやすいと感じるからです。
私は、画面オン時間とバッテリー消耗の関係に対してPingouinの線形回帰関数を使用しました。
pg.linear_regression(battery['phone_screen_on'],battery['phone_battery'])
Pingouinは表を生成します。これは何を意味するのでしょうか。非常に重要な数字は左端にあります。代数を思い出すと、直線の方程式はy=mx + bです。線形回帰では、これを少しひっくり返してy=b + mx、またはy=a + bxという「標準方程式」を作ります。y切片、つまり直線がy軸と交差する点はaで、「切片」とラベル付けされているのは5.339232であり、xの係数、つまり画面オン時間は0.201630で、直線の傾きや急勾配を決定します。したがって、私たちのモデルの方程式はy=5.339232 + 0.201630xです。
他の数値は、この線がどれだけデータに適合しているかを示しています。「se」は「標準誤差」を表し、線がデータポイントからどれだけ離れているかを測定します。標準誤差が低いほど、適合度は良くなります。スクリーンオン時間の場合、値は約0.20であり、これは線がデータポイントに対して良い適合であることを意味します。Tスコアは、学生のt検定のt統計量であり、以下に示す相関係数が0であるという仮説を検定します。これは相関がないことを意味します。2を超えるか-2未満の値は、結果が統計的に有意であることを意味します。 p値は、帰無仮説が真である場合に、サンプル統計量(この場合はt値)がどれほど極端であるか、またはそれ以上である確率です。ほとんどの統計学者は、帰無仮説を受け入れるか拒否するために、通常は最大0.05の特定の閾値を使用します。t統計量が2より大きく、p値が0.05未満であるため、画面オン時間とバッテリー消耗の間に関係がないという帰無仮説を、0.05および0.01の有意水準の両方で拒否することができます。
「r2」と「r2_adusted」は相関係数の二乗です。ここでの高い値は、線が良いフィットであることを意味します。最後の数列は信頼区間であり、これは方程式の値が2.7%および97.5%の信頼レベルで落ちる可能性のある領域を表します。回帰プロットの陰影部分も信頼区間を表しています。
モデルができたので、スクリーンオン時間の変数に値を入れて、バッテリーがどれだけ減るかを予測できます。
これに対してPython関数を定義できます。
def phone_battery_usage(minutes):
return 5.339232 + 0.201630 * minutes
3時間または180分の使用量を計算するには:
phone_battery_usage(180)
私のタブレットでも同じことをしましょう。まずは散布図から:
sns.relplot(x='tablet_screen_on',y='tablet_battery',data=battery)
再び、線形相関があるようです。回帰をプロットしてみましょう:
sns.regplot(x='tablet_screen_on',y='tablet_battery',data=battery)
もう一つの良い適合です。Pingouin線形回帰を試してみましょう:
pg.linear_regression(battery['tablet_screen_on'],battery['tablet_battery'])
モデルはバッテリー使用量=5.017013 + 0.112511(画面オン時間)です。適合度は良好で、T=6.202436、p=0.001591、r²=0.884979です。
私が小さな科学プロジェクトから学んだこと
私を驚かせた一つは、実世界における線形関係の維持でした。私の電話とタブレットのバッテリー使用は線形でした。これは、使用を始めたときや充電の終わりにバッテリーが早く drain するリチウムイオンバッテリーについての私の研究と一致するかもしれませんが、Ufine Batteryによると、放電曲線はその間線形のままです。このプロジェクトは、統計分析の価値を証明しています。
それは質問に答えるためのより厳密な方法を提供しますが、Python、Seaborn、Pingouinのような現代のソフトウェアを使えば、研究者や私のような一般の人々が探求するのがこれまで以上に簡単です。