Pythonによる食事管理アプリのデータの分析

投稿日: 2024年12月11日

最終更新日: 2024年12月13日

問題: 食事管理アプリで29日間、栄養情報を追跡したが、アプリはその間の栄養素の平均値しか表示されない。平均値以上の情報(傾向)を知りたい。


解決策: 29日間の食事データをcsvファイルとしてエクスポートし、Pythonを使用して簡単なデータ分析を行う。


結果: データ解析には以下のライブラリを使用した:

pandas 表形式のデータ分析ライブラリ

seaborn グラフ描画ライブラリ

また、データを可視化するため、データ分析はJupyter Notebook上で行った。今回使用したデータ(29行×54列のcsvファイル)は次のようである。 データを分析する前に行った唯一の調整は、曜日(Day of the week)の列を追加したことである。

Date,Day of the week,Energy (kcal),Alcohol (g),Caffeine (mg),Water (g),B1 (Thiamine) (mg),B2 (Riboflavin) (mg),B3 (Niacin) (mg),B5 (Pantothenic Acid) (mg),B6 (Pyridoxine) (mg),B12 (Cobalamin) (µg),Folate (µg),Vitamin A (µg),Vitamin C (mg),Vitamin D (IU),Vitamin E (mg),Vitamin K (µg),Calcium (mg),Copper (mg),Iodine (µg),Iron (mg),Magnesium (mg),Manganese (mg),Phosphorus (mg),Potassium (mg),Selenium (µg),Sodium (mg),Zinc (mg),Carbs (g),Fiber (g),Starch (g),Sugars (g),Net Carbs (g),Fat (g),Cholesterol (mg),Monounsaturated (g),Polyunsaturated (g),Saturated (g),Trans-Fats (g),Omega-3 (g),Omega-6 (g),Cystine (g),Histidine (g),Isoleucine (g),Leucine (g),Lysine (g),Methionine (g),Phenylalanine (g),Protein (g),Threonine (g),Tryptophan (g),Tyrosine (g),Valine (g),Completed
2024/09/23,Mon,3214.32,0,0,1849.74,4.44,2.62,31.56,7.11,3.61,3.75,1191.36,594.69,115.4,60.6,10.13,107.42,755.21,3.73,74.62,38.1,997.12,11.95,2096.02,5353.35,161.21,1766.33,23.01,382.08,42.49,252.07,56.64,337.95,128.95,81.2,49.01,35.17,28.58,0.96,4.03,30.49,1.93,2.88,5.4,9.44,6.43,1.96,6.36,152.69,4.46,1.49,4.39,6.46,FALSE
2024/09/24,Tue,3575.59,0.09,0,1966.81,8.31,5.94,54.15,7.43,6.45,7.89,1972.98,449.74,100.32,4.32,17.95,126.84,854.95,5.16,148.58,45.14,1209.33,14.17,2617.45,6293.93,219.19,2546.72,28.08,438.68,46.76,283.94,94.84,389.56,127.57,18.56,49.97,42.96,20.5,0.06,4.65,38.05,2.51,3.84,7.25,12.54,8.8,2.48,8.53,193.3,5.99,1.91,6.06,8.44,FALSE
2024/09/25,Wed,3372.4,0,0,1942.35,6.11,4.19,44.07,8.87,6.11,3.04,1150.22,1452.82,158.43,0,10.45,109.2,723.22,4.53,76.4,36.52,930.63,11.12,2322.26,6656.51,179.97,1721.13,20.73,448.1,50,307.59,64.41,396.72,89.77,0,38.43,28.92,13.03,0.07,3.41,25.14,3.45,4.5,7.84,14.19,8.18,3.16,10.01,214.74,6.37,2.41,6.58,9.24,FALSE
2024/09/26,Thu,3371.49,0,0,1576.04,3.63,1.35,18.96,5.84,1.99,0,1550.79,232.33,86.75,0,11.81,278.82,702.4,4.44,2.26,39.57,760.47,11.5,2264.03,5138.5,192.89,1128.05,18.46,473.1,37.79,309.62,108.06,433.83,81.55,0,29.98,30.74,12.32,0.05,3.52,27.06,3.59,4.53,7.83,14.25,8,3.25,9.92,204.63,6.35,2.39,6.4,9.29,FALSE
2024/09/27,Fri,2973.79,0,0,1673.86,2.45,1.15,11.72,3.42,1.32,0,910.36,178.18,86.05,0,10.2,153.93,565.66,3.25,2.7,34.44,733.87,8.6,1483.28,4921.27,112.25,3075.64,16.57,354.99,37,167.65,119.75,316.37,86.28,0,22.7,21.22,19.43,0.07,3.31,17.67,1.55,2.18,4.03,6.91,5.13,1.38,4.68,148.96,3.37,1.14,3.27,4.65,FALSE
2024/09/28,Sat,3128.02,0,0,2187.13,3.07,1.31,17.63,6.05,2.65,0,937.8,94.23,66.1,0,7.44,184.78,619.95,4.48,4.75,33.35,721.55,9.85,1990.92,6406.89,162.61,834.27,15.88,497.99,38.11,284.88,153,458.11,51.1,0,14.42,21.81,7.66,0.06,3.4,18.1,3.32,4.18,7.17,12.97,7.5,2.93,9.09,191.06,5.87,2.27,6.04,8.39,FALSE
2024/09/29,Sun,2754.66,0,0,1989.04,5.36,3.04,28.56,6.32,3.08,2.05,1765.55,1659.92,46.52,0,7.16,108.19,676.28,4.25,73.82,40.98,929.24,12.79,2174.34,5323.05,190.43,844.05,22.49,382.46,32.64,289.05,50.18,347.21,64.77,0,16.67,28.82,9.25,0.05,4.28,24.19,2.31,3.4,6.7,11.43,8.34,2.27,7.68,167.63,5.49,1.76,5.43,7.7,FALSE
2024/09/30,Mon,3530.38,0,0,1646.95,12.74,10.68,75.95,7.9,11.59,8.53,1692.05,2275.97,124.96,0,13.7,100.1,740.1,3.41,74.91,39.11,723.99,11.36,2162.82,5099.27,201.64,1800.3,20.03,470.92,41.95,322.59,79.42,426.52,93.43,0,41.01,23.3,19.28,0.1,3.38,19.47,3.63,4.34,7.6,13.92,7.45,3.21,9.76,209.99,6.28,2.35,6.31,8.96,FALSE
2024/10/01,Tue,3342.86,0,0,1621.02,4.42,2.38,25.95,7.22,3.39,3.55,1523.67,2089.6,118.92,0,11.56,240.44,694.29,4,74.92,38.26,774.3,11.5,2116.18,4916.71,184.66,1253.64,18.36,490.75,43.17,330.3,97.62,444.29,73.4,0,30.35,23.08,11.04,0.06,3.31,19.42,3.46,4.18,7.36,13.43,7.44,3.08,9.35,193.6,6.09,2.26,6.05,8.75,FALSE
2024/10/02,Wed,3113.82,0,0,1366.74,3.11,0.97,17.52,6.66,1.54,0,1442.04,2310.27,83.1,0,8.82,161.42,659,3.75,0.52,37.94,740.12,11.4,2021.59,4058,184.39,861.98,17.67,465.34,36.82,327.02,85.18,426.48,59.09,0,20.68,21.08,9.02,0.04,3.05,17.75,3.39,4.08,7.22,13.19,7.17,3.05,9.2,189.72,5.9,2.23,5.92,8.58,FALSE
2024/10/03,Thu,3048.43,0,0,1242.93,4.36,2.19,24.81,6.38,3.02,3.55,1408.9,2109.98,69.75,0,11.15,68.65,671.4,3.64,73.86,37.14,715.31,11.15,1994.93,4336.43,183.18,1498.11,17.22,422.59,36.13,312.09,51.35,385.49,70.24,0,27.95,23.9,10.87,0.06,3.11,20.57,3.32,4.03,7.07,12.94,6.97,2.98,9.05,188.64,5.8,2.17,5.88,8.36,FALSE
2024/10/04,Fri,3416.71,0,0,1503.67,4.3,2.2,25.85,6.45,3.33,3.55,1064.18,1654.87,74.75,0,18.58,67.67,691.56,3.81,73.86,36.11,764.57,11.45,2094.24,4640.82,193.98,1834.74,18.15,458.51,37.73,312.77,66.25,418.74,95.56,0,34.03,35.99,16.85,0.07,3.22,32.58,3.37,4.12,7.19,13.17,7.12,3.02,9.21,192.16,5.91,2.21,6,8.52,FALSE
2024/10/05,Sat,3182.06,0,0,974.71,1.55,0.57,10.39,3.51,0.97,0,681.86,187.62,132.24,0,10.93,173.99,524.04,1.53,0.94,28.93,439.24,6.52,1104.45,2546.85,104.89,3115.7,10.66,401.65,40.04,195.62,137.28,361.21,79.29,0,28.46,12.19,18.3,0.08,2.12,9.92,2.45,2.64,4.33,8.22,3.63,2.01,5.87,167.52,3.47,1.46,3.59,5.14,FALSE
2024/10/06,Sun,3002.82,0,0,1382.26,3.51,2.31,18.02,5.06,2.66,4.1,1044.56,1340.98,76.16,0,10.15,230.95,1016.1,4.03,148.15,37.08,929.8,11.26,1867.17,4539.94,154.08,2981.54,20.91,346.48,40.91,170.53,34.43,304.79,116,0,42.13,33.7,23.31,0.06,4.2,27.47,1.79,2.74,5.26,8.71,6.52,1.69,5.75,160.32,4.28,1.49,4.01,6.04,FALSE
2024/10/07,Mon,3289.09,0,0,1292.93,3.38,0.96,22.22,6.97,1.99,0,1210.15,1730.75,103.93,0,9.44,220.59,668.03,3.86,0.84,36.06,861.64,14.09,2297.31,4203.32,195.5,988.64,19.39,482.57,37.66,358.36,74.46,443.93,69.95,0,26.5,23.48,10.81,0.05,3.09,20.14,3.39,4.16,7.29,13.43,7.21,3.12,9.33,191.78,5.98,2.26,6.06,8.71,FALSE
2024/10/08,Tue,2917.79,0,0,1446.62,4.28,2.69,29.58,6.02,4.1,2.05,532.85,36.36,49.88,0,7.36,97.89,522.36,3.57,75.29,26.82,783.96,11.59,2092.83,4899.77,167.43,1000.62,17.27,372.91,43.7,269.15,31.61,328.48,76.83,0,27.24,22.65,10.43,0.08,3.29,19.07,3.11,3.96,6.96,12.61,7.13,2.84,8.79,200.58,5.6,2.15,5.87,8.1,FALSE
2024/10/09,Wed,3075.43,0,0,1642.83,3.96,2.21,23.95,7.45,4.01,3.55,956.42,1731.09,98.03,0,8.56,90.9,650.52,4.88,75.27,34.98,838.18,10.29,2158.41,5795.97,164.86,1427.42,18.59,402.08,40.91,289.57,43.74,360.34,83.64,0,36.89,25.3,13.27,0.07,3.34,21.57,3.33,4.13,7.3,13.19,7.52,2.98,9.21,192.59,5.96,2.28,6.06,8.63,FALSE
2024/10/10,Thu,3327.88,0,0,1404.07,4.23,2.27,23.79,6.12,2.83,3.56,1423.35,1794.49,33.61,0,7.73,90.24,521.15,3.99,73.84,40.15,1037.13,11.13,1832.32,4830.04,137.89,5036.04,23.73,469.67,35.53,273.83,37.02,433.05,95.03,0,30.84,25.07,11.93,0.06,3.32,21.43,1.86,2.54,4.89,8.47,5.9,1.76,5.67,162.04,4.07,1.36,3.85,5.81,FALSE
2024/10/11,Fri,2915.66,0,0,1319.63,4.13,2.2,27.57,6.32,3.4,3.55,927.35,2254.14,45.75,0,9.13,73.53,604.59,3.3,74.4,31.35,772.56,12.93,2091.3,4395.19,179.37,1205.7,17.28,408.83,36.18,315.85,43.2,371.56,62.38,0,24.14,21.46,9.07,0.06,3.13,18,3.25,4,7.02,12.86,6.99,2.94,8.96,185.17,5.81,2.16,5.89,8.27,FALSE
2024/10/12,Sat,3196.73,0,0,1468.49,3.06,1,20.06,5.8,1.8,0.56,1011.93,116.74,90.42,0,9.18,233.19,635.64,3.81,74.68,33.37,845.01,13.55,2252.87,4290.47,187.72,1506.03,19.12,444.19,40.64,305.09,93.17,400.25,81.12,0,35.09,24.28,12.19,0.07,3.21,20.86,3.28,4.1,7.18,13.19,7.13,3.01,9.11,188.95,5.83,2.19,5.97,8.51,FALSE
2024/10/13,Sun,2889.39,0,0,1187.11,1.81,0.87,14.88,5.54,1.4,0,659.95,57.28,21.59,0,5.92,99.44,435.12,2.36,0.02,28.1,868.92,11.36,1652.45,3620.44,136.33,3315.27,20.67,400.93,52.3,293.1,49.04,348.15,69.45,0,20.26,17.38,14.67,0.07,2.77,14.54,2.84,3.45,5.51,10.74,5.48,2.56,7.46,182.78,4.53,1.84,4.71,6.53,FALSE
2024/10/14,Mon,3434.76,0,0,1572.96,4.73,2.39,26.93,7.04,3.46,3.55,1520.49,2125.9,148.97,0,10.4,225.53,965.64,3.57,74.85,40.47,759.89,13.36,2136.51,4769.65,211.79,2306.62,17.93,490.75,45.62,342.75,69.73,443.18,81.87,0,29.02,21.62,15.83,0.07,3.86,18.14,3.45,4.19,7.26,13.33,7.15,3.08,9.35,195.77,5.96,2.25,5.96,8.6,FALSE
2024/10/15,Tue,2999.34,0,0,1394.12,2.94,0.98,20.39,6,1.93,0.56,946.17,1524.66,220.14,0,11.02,77.62,603.94,3.31,73.88,32.08,770.28,13.26,2089.17,4199.21,182.45,1699.51,17.53,421.41,37,307.97,66.82,382.2,67.91,0,27.86,22.14,9.86,0.07,3.21,18.55,3.19,3.99,7.01,12.87,6.91,2.94,8.93,184.54,5.73,2.14,5.86,8.27,FALSE
2024/10/16,Wed,3231.6,0,0,1362.15,3.04,0.93,19.81,5.96,2.09,0.56,923.64,1522.82,250.87,0,10.61,71.42,624.33,3.44,73.88,32.71,774.66,13.2,2141.67,4303.81,182.59,1564.22,17.58,479.4,36.22,314.1,100.58,441.13,67.45,0,27.8,21.91,9.78,0.07,3.18,18.45,3.2,3.97,6.96,12.79,6.88,2.94,8.88,184.45,5.69,2.14,5.82,8.22,FALSE
2024/10/17,Thu,3614.63,0,0,1444.6,12.61,10.56,76.12,7.05,11.75,8.53,1163.01,1535.59,256.59,0,15.39,86.48,679.37,3.48,74.01,34.86,804.41,13.2,2353.79,4782.82,203,1605.14,20.75,479.82,39.82,294.24,110.07,437.85,101.78,0,47.82,24.77,18.95,0.11,3.37,21.04,3.46,4.24,7.38,13.61,7.16,3.15,9.49,205.19,6.02,2.29,6.18,8.7,FALSE
2024/10/18,Fri,3429.26,0,0,1197.48,13.58,11.72,79.08,6.66,12.26,11.53,1607.37,1730.79,35.8,0,14.36,86.83,666.49,3.04,74,37.04,650.76,10.5,1966.65,4045.79,196.21,1386.98,18.69,457.16,36.42,281.01,117.65,419.69,93.58,0,43.19,23.01,17.65,0.1,3.3,19.41,3.47,4.13,7.23,13.33,6.96,3.08,9.34,201.44,5.88,2.23,6.03,8.51,FALSE
2024/10/19,Sat,3001.74,0,0,1036.75,1.78,0.71,10.39,4.27,1.25,0.55,731.73,1084.59,244.73,0,9.22,125.94,972.88,2.09,73.85,36.05,759.7,9.01,1418.07,3668.58,146.12,2691.96,17.23,407.14,32.41,205.19,74.65,374.11,74.8,0,26.01,23.16,16.44,0.07,3.24,17.88,2.75,3.36,5.65,10.22,5.25,2.34,7.11,184.68,4.48,1.87,4.47,6.48,FALSE
2024/10/20,Sun,3121.72,0,0,1491.28,2.8,0.95,27.22,7.92,2.69,0,1024.04,2276.8,161.24,0,11.32,479.24,688.69,2.55,3.91,31.47,704.7,10.52,1669.83,4374.4,140.79,746.43,15.39,480.02,45,338.58,57.52,434.02,66.64,0,31.51,16.21,9.88,0.07,2.24,13.57,2.99,3.37,5.56,10.4,4.97,2.55,7.47,163.84,4.74,1.86,4.77,6.75,FALSE
2024/10/21,Mon,3107.63,0,0,1257.48,5.95,4.08,36.84,6.24,4.93,5.6,999.85,1530.28,43.96,0,9.81,104.67,593.71,3.88,147.67,33.66,840.14,13.3,2254.35,4156.08,187.95,1164.43,19.39,427.34,37.21,297.52,80.04,388.12,77.31,0,32.71,23.61,11.6,0.06,3.13,20.24,3.27,4.08,7.15,13.14,7.13,3.01,9.11,190.13,5.83,2.2,5.93,8.48,FALSE

		


データを簡単に扱うために、Jupyter Notebookに以下のコードを書いた。
import pandas as pd # pandasライブラリをインポート
data = pd.read_csv("nutritional_data.csv") # 分析をしやすくするために、CSVファイルの内容をdataに読み込む。
print('(行数, 列数):', data.shape) # データの行列情報を表示
display(data.tail(10)) # 最後の10行を表示
			


図1は、その結果を示す。
図1 データ分析の結果(1)
図1に示すように、列が多すぎて、すべての栄養素を見ることができないことがわかる。そのせいで、データの視覚化を難しくなるので、 重要でない列(栄養素)を減らすのが良いかもしれない。これは、Jupyterを使用することで、元のファイルを変更せずに行うことができる。
columns_to_keep = ['Day of the week','Energy (kcal)','Carbs (g)','Protein (g)','Fat (g)','Fiber (g)','Zinc (mg)','Omega-3 (g)','Omega-6 (g)','Sodium (mg)']

data = data[columns_to_keep]
				
		


columns_to_keepに残したい列を書けば、簡単に他の列を取り除ける。変更後データの最初の5行を図2に示す。
図2 データ分析の結果(2)
このデータを見る方法はたくさんあるが、まずはProtein (g)(タンパク質)のヒストグラムを見てみよう。

data['Protein (g)'].hist()
		


上のコードを実行すれば、[]内に書いた列名のデータのヒストグラムを見られる。縦軸は日数、横軸はたんぱく質の量(グラム)を表している。
図3 摂取したタンパク質のヒストグラム(1)


データの詳細には触れたくないが、ある傾向はすでに見られる。例えば、私は通常1日190グラム 前後を摂っているようだが、何故か170グラムから180グラムの間の値を得ることはない。 ヒストグラムに曲線を描くことで、より簡単に傾向を見ることができる。 そのためには、seabornライブラリを使うことができる。

import seaborn as sns
		
曲線を描くには、次のコードを実行する必要がある。

sns.displot(data['Protein (g)'], kde=True, bins=10, alpha=0.5) 
		


displot()はデータの分布を可視化するためのプロットを作成するが、デフォルト状態ではヒストグラムが描かれる。 kde=Trueは曲線を追加する。binsはヒストグラムの棒の数を設定し、alphaは透明度を設定する。図4は、 曲線付きのヒストグラムを示している。2つのヒストグラムはわずかに異なっているが、図4の方がより調整しやすいことがわかる。
図4 摂取したタンパク質のヒストグラム(2)


seabornのjointplot()を使えば、ヒストグラムと散布図を組み合わせたグラフを作ることもできる。

sns.jointplot(x='Energy (kcal)',y='Protein (g)', data=data) 
		


data=dataの部分は、seabornがdata(csvファイルから読み込まれたデータ)から'Energy(kcal)'と'Protein(g)'の列を取得するすることを意味する。図5はその結果を示す。 この方法では、2つのヒストグラムとその散布図が表示される。横はキロカロリー(Energy (kcal))のヒストグラムで、縦は図3と同じようなヒストグラムである。 理解するには時間がかかるが、一石二鳥のようなものである。スペースが限られている場合(論文の要旨)、役に立つだろう。
図5 ヒストグラムと散布図を組み合わせたグラフ(たんぱく質とキロカロリー)


データの分布をヒストグラムだけでなく、箱ひげ図というものでも表現できる。次のコードを実行すれば、それは容易にできる。
import matplotlib.pyplot as plt	
		
plt.figure(figsize=(2,4))
sns.boxplot(y='Protein (g)', data=data) 
		


matplotlib.pyplotというライブラリを使えば、画質に影響を与えることなくグラフの長さや幅を調整することができる。 図6は、その結果を示す。
図6 たんぱく質の箱ひげ図
中央の線は中央値を表し、端の点はデータセット(たんぱく質の列)の最小値と最大値を表す。 長方形は、どの範囲にデータがもっとも集中しているかを示している。このような図で、データ分布より見やすくなり、 一目で多くの情報を理解できるだろう。

ヒストグラムっぽい2次元グラフも表示することができる。次のコードでそれが可能になる。
sns.set()
sns.set_context('talk') # グラフの字の大きさを調整
plt.figure(figsize=(20, 8))
sns.lineplot(x='Day of the week', y='Energy (kcal)', data=data)
		
図7 キロカロリーと曜日の比較
図7に示すように、中央の線はそれぞれの曜日のキロカロリーの平均値を辿っているが、そのまわりにある水溜りのようなものによってそれぞれの範囲も確認できる。 この種のグラフは視覚によって有用な情報を与える一方で、個々の値を読み取るのは他のグラフに比べて難しいだろう。

グラフなしでデータの主要な値のみの表も作成できる。これは describe() コマンドで実行でき、round() コマンドでその結果を四捨五入することができる。 以下のコードを実行すれば、図8に示すような結果が出た。
round(data.describe(), 2)
		
図8 今回使用したデータの主要な値

考察:

数字から得られる情報が、平均値以上の価値を持つことを改めて実感した。 今回は、自分の食事傾向を理解するために、食事摂取量のデータを分析してみたが、 このような分析手法は工学の分野にも応用できるのではないかと考えている。例えば、 故障した機器のデータを一定期間収集し、それを分析することで、故障の原因が明らかになる可能性があるだろう。

今回のデータサンプルは非常に限られていたため、分析結果の信頼性があまりよくない。 信頼性を上げるには、より多くのデータを収集する必要がある。また、今回のように50種類以上の栄養素といった多くの異なるカテゴリー が存在する場合、データの傾向を見つけるのに時間がかかるため、手動で行うのは難しい。こうした場合には、機械学習を活用して、有用な比較のみを抽出し、視覚化するのが有効だろう。