SlideShare a Scribd company logo
1 of 36
Download to read offline
Magdalena Wójcik
Data Science na danych
z trackera aktywności - case
Plan prezentacjiPlan prezentacji
1. Hipoteza
2. Opis trackera Fitbit
3. Opis danych
4. Analiza stacjonarności szeregów czasowych
5. Dekompozycja szeregu czasowego
6. Analiza korelacji
7. Podsumowanie wyników
Badana hipotezaBadana hipoteza
Czy jestem meteoropatką?Czy jestem meteoropatką?
Za: Słownik języka polskiego pod red. W. Doroszewskiego, 1958 r.
Tracker - Fitbit Alta HRTracker - Fitbit Alta HR
Jakich danych dostarcza Fitbit?Jakich danych dostarcza Fitbit?
Liczba kroków, pięter na które się weszło, przebytych kilometrów.
Liczba spalonych kalorii w ciągu dnia.
Tętno spoczynkowe, tętno w danym momencie.
Długość i jakość snu.
Dane pochodzą z czujników:
Akcelerometru
Barometru
Żyroskopu
Fotoplezmatografu
Nie mamy dostępu do bezpośredniego sygnału z czujników z poziomu Web API.
Fotopletyzmogra a (PPG)Fotopletyzmogra a (PPG)
Metoda optycznego pomiaru
zmian przepływu krwi przez
naczynia obwodowe położone
blisko powierzchni ciała, może
być stosowana do pomiaru
szybkości pracy serca.
Fitbit używa zielonych LEDów i
fotodiody do pomiaru odbijanego
światła, a dzięki temu pojemności
naczyń krwionośnych pod skórą.
In [6]: sns.lineplot(x=rhr_daily.index, y="value.restingHeartRate", data=rhr_daily)
print("Pierwszy dzień: ", rhr_daily.index.min())
print("Ostatni dzień: ", rhr_daily.index.max())
print("Minimalne tętno: ", rhr_daily["value.restingHeartRate"].min())
print("Maksymalne tętno: ", rhr_daily["value.restingHeartRate"].max())
Pierwszy dzień: 2018-07-11 00:00:00
Ostatni dzień: 2018-10-31 00:00:00
Minimalne tętno: 67.0
Maksymalne tętno: 77.0
In [8]: sleep_sources = ["data/sleep-2018-07-11-2018-09-30.json", "data/sleep-2018-10-01
-2018-10-31.json"]
sleep = load_json(sleep_sources, "sleep")
data_all, data_sleep, data_naps = format_sleep(sleep)
data_sleep = remove_constant_cols(data_sleep)
data_sleep.info()
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 108 entries, 2018-07-12 to 2018-10-31
Data columns (total 22 columns):
duration 108 non-null int64
efficiency 108 non-null int64
endTime 108 non-null datetime64[ns]
levels.summary.deep.count 108 non-null float64
levels.summary.deep.minutes 108 non-null float64
levels.summary.deep.thirtyDayAvgMinutes 108 non-null float64
levels.summary.light.count 108 non-null float64
levels.summary.light.minutes 108 non-null float64
levels.summary.light.thirtyDayAvgMinutes 108 non-null float64
levels.summary.rem.count 108 non-null float64
levels.summary.rem.minutes 108 non-null float64
levels.summary.rem.thirtyDayAvgMinutes 108 non-null float64
levels.summary.wake.count 108 non-null float64
levels.summary.wake.minutes 108 non-null float64
levels.summary.wake.thirtyDayAvgMinutes 108 non-null float64
minutesAfterWakeup 108 non-null int64
minutesAsleep 108 non-null int64
minutesAwake 108 non-null int64
startTime 108 non-null datetime64[ns]
timeInBed 108 non-null int64
weekday 108 non-null int64
dayOfWeek 108 non-null object
dtypes: datetime64[ns](2), float64(12), int64(7), object(1)
memory usage: 19.4+ KB
In [9]: print("Minimalna efektywność snu: ", data_sleep["efficiency"].min())
print("Maksymalna efektywność snu: ", data_sleep["efficiency"].max())
sns.lineplot(data_sleep.index, data_sleep["efficiency"])
Out[9]:
Minimalna efektywność snu: 87
Maksymalna efektywność snu: 100
<matplotlib.axes._subplots.AxesSubplot at 0x7fdd49973198>
In [10]: sns.boxplot(x="dayOfWeek", y="efficiency", data=data_sleep, order=WEEKDAYS)
Out[10]: <matplotlib.axes._subplots.AxesSubplot at 0x7fdd49462908>
Dane meteorologiczne pochodzą ze stronyDane meteorologiczne pochodzą ze strony
meteomodel.plmeteomodel.pl
In [11]: meteo_daily = pd.read_csv("data/Dane meteorologiczne.csv", index_col=[0], parse_
dates=[0])
meteo_daily = meteo_daily.fillna(0)
meteo_daily.info()
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 113 entries, 2018-07-11 to 2018-10-31
Data columns (total 17 columns):
Średnia temperatura powietrza 113 non-null float64
Maksymalna temperatura powietrza 113 non-null float64
Minimalna temperatura powietrza 113 non-null float64
Minimalna temperatura powietrza przy gruncie 113 non-null float64
Średnia wilgotność powietrza 113 non-null float64
Średnia prężność pary wodnej 113 non-null float64
Średnie zachmurzenie 113 non-null float64
Średnia prędkość wiatru 113 non-null float64
Ciśnienie na poziomie morza 113 non-null float64
Ciśnienie na poziomie stacji 113 non-null float64
Dobowa suma opadu 113 non-null float64
Opad - dzień 113 non-null float64
Opad - noc 113 non-null float64
Usłonecznienie 113 non-null float64
Czas trwania opadu deszczu 113 non-null float64
Czas trwania rosy 113 non-null float64
Czas trwania burzy 113 non-null float64
dtypes: float64(17)
memory usage: 15.9 KB
Czy wszystkie analizowane szeregi są stacjonarne?Czy wszystkie analizowane szeregi są stacjonarne?
Stacjonarny szereg czasowy - szereg w którym wartość średnia, wariancja oraz funkcja
autokorelacji nie zmieniają się wraz ze zmianą czasu.
Rozszerzony test Dickeya-Fullera (Augmented Dickey-Rozszerzony test Dickeya-Fullera (Augmented Dickey-
Fuller test)Fuller test)
Test statystyczny, polegający na próbie dopasowania do danych modelu
autoregresyjnego, uwzględniający dwie hipotezy:
: Szereg jest niestacjonarny.
: Szereg jest stacjonarny.
Przy wyniku hipoteza zerowa jest odrzucana - szereg jest
stacjonarny.
H0
H1
p − value < 0.05
In [12]: import statsmodels.tsa.stattools as ts
rhr_series = rhr_daily["value.restingHeartRate"].values
result = ts.adfuller(rhr_series)
print("Wynik testu dla tętna spoczynkowegonp-value: {:.24f}".format(result[1]))
sleep_series = data_sleep["efficiency"].fillna(0).values
result = ts.adfuller(sleep_series)
print("Wynik testu dla efektywności snunp-value: {:.24f}".format(result[1]))
Wynik testu dla tętna spoczynkowego
p-value: 0.026188396618426579981476
Wynik testu dla efektywności snu
p-value: 0.000000000019042035089119
In [13]: meteo_adf = np.zeros(len(meteo_daily.columns))
for i, column in enumerate(meteo_daily.columns):
meteo_series = meteo_daily[column].fillna(0).values
adf = ts.adfuller(meteo_series)[1]
meteo_adf[i] = adf
meteo_adf_df = pd.DataFrame(meteo_adf, index=meteo_daily.columns,
columns=["p-value"])
meteo_adf_df.sort_values(by="p-value", ascending=False, inplace=True)
meteo_adf_df.style.format("{:.6f}")
Out[13]: p-value
Minimalna temperatura powietrza przy gruncie 0.867639
Minimalna temperatura powietrza 0.859623
Średnia prężność pary wodnej 0.699345
Średnia temperatura powietrza 0.614118
Maksymalna temperatura powietrza 0.395975
Czas trwania burzy 0.017540
Ciśnienie na poziomie morza 0.004599
Ciśnienie na poziomie stacji 0.003533
Średnia wilgotność powietrza 0.001089
Czas trwania opadu deszczu 0.000424
Średnie zachmurzenie 0.000000
Usłonecznienie 0.000000
Średnia prędkość wiatru 0.000000
Czas trwania rosy 0.000000
Opad - dzień 0.000000
Dobowa suma opadu 0.000000
Opad - noc 0.000000
In [14]: from statsmodels.tsa.seasonal import seasonal_decompose
def meteo_decompose(dataset, column):
result = seasonal_decompose(meteo_daily[column], model="additive", )
meteo_daily[column + " - resid"] = result.resid
meteo_daily.drop(column, axis=1, inplace=True)
return dataset, result
meteo_daily, result = meteo_decompose(meteo_daily, "Średnia temperatura powietrz
a")
result.plot()
pyplot.show()
Znormalizowana korelacja krzyżowa (normalizedZnormalizowana korelacja krzyżowa (normalized
cross-correlation)cross-correlation)
Korelacja krzyżowa uwzględnia możliwe przesunięcie (shift) szeregów czasowych
względem siebie.
norm_cross_correlation(x(t), y(t)) = (x(t) − ) (y(t) − )
1
n
∑
x,y
1
σx σy
x¯¯¯
y¯¯¯
In [24]: example = rhr_daily.copy()
example.columns = ["Tętno spoczynkowe"]
example["Ciśnienie"] = meteo_daily["Ciśnienie na poziomie morza"]
example["Ciśnienie + 2"] = meteo_daily["Ciśnienie na poziomie morza"].shift(2)
example["Ciśnienie - 2"] = meteo_daily["Ciśnienie na poziomie morza"].shift(-2)
example.head()
Out[24]: Tętno spoczynkowe Ciśnienie Ciśnienie + 2 Ciśnienie - 2
dateTime
2018-07-11 77.0 1013.4 NaN 1012.2
2018-07-12 72.0 1012.6 NaN 1011.6
2018-07-13 71.0 1012.2 1013.4 1012.4
2018-07-14 73.0 1011.6 1012.6 1009.5
2018-07-15 73.0 1012.4 1012.2 1004.8
In [20]: def corr_norm(a, b):
conv = np.correlate(a - np.mean(a), b - np.mean(b))[0]
norm = np.std(a) * np.std(b) * len(a)
return conv / norm
def xcorr(a, b, shifts):
shifts = list(range(-shifts, shifts + 1))
corr = np.full((len(b.columns), len(shifts)), np.inf)
for i, column in enumerate(b.columns):
for j, shift in enumerate(shifts):a
b_in = b[column].shift(shift)
invalid = b_in.isna()
b_in = b_in[~invalid].values
a_in = a[~invalid].values
corr[i][j] = corr_norm(a_in, b_in)
corr_df = pd.DataFrame(corr, columns=shifts, index=b.columns)
return corr_df
In [38]: corr_rhr = xcorr(rhr_daily["value.restingHeartRate"], meteo_daily, 5)
f, ax = plt.subplots(figsize=(6, 7))
ax = sns.heatmap(corr_rhr, cmap="YlGnBu")
In [39]: corr_rhr = xcorr(rhr_daily["value.restingHeartRate"], meteo_daily, 10)
f, ax = plt.subplots(figsize=(10, 7))
ax = sns.heatmap(corr_rhr, cmap="YlGnBu")
In [42]: corr_rhr.stack().abs().sort_values(ascending=False)
Out[42]: Usłonecznienie 6 0.404034
7 0.392621
Średnia prędkość wiatru 5 0.343960
Ciśnienie na poziomie morza -8 0.331546
Średnia wilgotność powietrza 6 0.330481
Średnia prędkość wiatru 4 0.328771
Ciśnienie na poziomie morza -7 0.324229
Ciśnienie na poziomie stacji -8 0.322160
Ciśnienie na poziomie morza -6 0.319641
Ciśnienie na poziomie stacji -7 0.315570
-6 0.310706
Średnie zachmurzenie 6 0.303247
Średnia prędkość wiatru 6 0.302663
Czas trwania opadu deszczu 6 0.301615
Usłonecznienie 5 0.301121
8 0.297127
Czas trwania burzy 2 0.297096
Ciśnienie na poziomie morza -5 0.296600
-9 0.292152
Ciśnienie na poziomie stacji -5 0.286841
Usłonecznienie 9 0.285268
Średnia prędkość wiatru -8 0.284111
Ciśnienie na poziomie stacji -9 0.280799
Średnie zachmurzenie 7 0.280593
Czas trwania opadu deszczu 8 0.278038
Średnia wilgotność powietrza -10 0.277524
7 0.275640
Usłonecznienie 4 0.274867
Ciśnienie na poziomie morza 9 0.270913
Czas trwania opadu deszczu 7 0.270538
...
Minimalna temperatura powietrza - resid -1 0.008364
-6 0.008314
Średnia temperatura powietrza - resid 2 0.007613
Maksymalna temperatura powietrza - resid 1 0.007468
Średnia temperatura powietrza - resid 3 0.007448
Średnia prężność pary wodnej - resid 8 0.007151
Średnia prędkość wiatru 10 0.006572
Minimalna temperatura powietrza - resid 7 0.005815
-10 0.005676
Średnia prędkość wiatru 9 0.005628
Minimalna temperatura powietrza przy gruncie - resid -1 0.005619
Opad - dzień -10 0.005463
Minimalna temperatura powietrza przy gruncie - resid 8 0.004637
Dobowa suma opadu 4 0.004316
Opad - noc 3 0.003697
Minimalna temperatura powietrza przy gruncie - resid -10 0.003537
Minimalna temperatura powietrza - resid -7 0.003211
Dobowa suma opadu 2 0.002903
Średnia prężność pary wodnej - resid -9 0.002869
Minimalna temperatura powietrza przy gruncie - resid -3 0.002641
Średnia temperatura powietrza - resid -4 0.002474
Maksymalna temperatura powietrza - resid 0 0.002445
Ciśnienie na poziomie morza 0 0.002042
3 0.001826
Czas trwania rosy -8 0.001703
Czas trwania burzy -10 0.001640
Średnia temperatura powietrza - resid 10 0.001429
Maksymalna temperatura powietrza - resid -4 0.001039
Średnia temperatura powietrza - resid 1 0.000645
Maksymalna temperatura powietrza - resid 2 0.000056
Length: 357, dtype: float64
In [49]: sns.set()
plt.plot(meteo_daily.index, meteo_daily["Usłonecznienie"].shift(6).apply(lambda
x: x + 40))
plt.plot(meteo_daily.index, meteo_daily["Ciśnienie na poziomie morza"].shift(-8)
.apply(lambda x: x - 900))
plt.plot(meteo_daily.index, meteo_daily["Średnia prędkość wiatru"].shift(5))
plt.plot(rhr_daily.index, rhr_daily["value.restingHeartRate"])
plt.legend(["Usłonecznienie", "Ciśnienie na poziomie morza", "Średnia prędkość w
iatru", "Tętno spoczynkowe"])
Out[49]: <matplotlib.legend.Legend at 0x7fdd41a07b70>
In [52]: corr_sleep_efficiency = xcorr(data_sleep["efficiency"], meteo_daily, 5)
f, ax = plt.subplots(figsize=(6, 7))
ax = sns.heatmap(corr_sleep_efficiency, cmap="YlGnBu")
In [40]: corr_sleep_efficiency = xcorr(data_sleep["efficiency"], meteo_daily, 10)
f, ax = plt.subplots(figsize=(10, 7))
ax = sns.heatmap(corr_sleep_efficiency, cmap="YlGnBu")
In [50]: corr_sleep_efficiency.stack().abs().sort_values(ascending=False)
Out[50]: Średnia prędkość wiatru 6 0.301546
Czas trwania burzy -10 0.242508
Czas trwania rosy -5 0.225645
-3 0.222534
Opad - dzień 1 0.221495
Czas trwania burzy -4 0.220298
Dobowa suma opadu 1 0.219600
Średnia prężność pary wodnej - resid 1 0.205617
-3 0.197595
Minimalna temperatura powietrza przy gruncie - resid 6 0.189702
Opad - noc 5 0.188261
Średnia prężność pary wodnej - resid -4 0.188176
Minimalna temperatura powietrza - resid -4 0.187696
Czas trwania rosy 0 0.185332
Opad - dzień 7 0.184611
Czas trwania burzy -6 0.183412
Średnia prężność pary wodnej - resid -10 0.183362
Dobowa suma opadu 7 0.179223
Ciśnienie na poziomie stacji -1 0.175914
Średnia prężność pary wodnej - resid 7 0.175660
Średnia prędkość wiatru -10 0.175016
Minimalna temperatura powietrza przy gruncie - resid 0 0.174345
Ciśnienie na poziomie morza -1 0.173830
Średnia prędkość wiatru 1 0.173023
Opad - noc 9 0.170768
Średnia wilgotność powietrza -10 0.167220
Opad - dzień 2 0.167063
Maksymalna temperatura powietrza - resid 2 0.161642
Czas trwania rosy 2 0.160725
Czas trwania opadu deszczu 7 0.160224
...
Średnia prężność pary wodnej - resid -9 0.009866
Minimalna temperatura powietrza przy gruncie - resid -10 0.009702
Czas trwania rosy 7 0.008342
Ciśnienie na poziomie morza 10 0.008016
Średnia prężność pary wodnej - resid 3 0.007959
Opad - dzień -6 0.007406
Średnia temperatura powietrza - resid -10 0.007068
Średnia prędkość wiatru -6 0.007031
Opad - dzień 8 0.006915
Minimalna temperatura powietrza przy gruncie - resid -2 0.005759
Czas trwania burzy 10 0.005480
Średnia prężność pary wodnej - resid -2 0.003840
Opad - noc 6 0.003700
Czas trwania opadu deszczu 2 0.003075
Opad - noc -6 0.003004
Usłonecznienie -3 0.002803
Minimalna temperatura powietrza - resid -8 0.002595
Dobowa suma opadu -4 0.002306
Opad - dzień -3 0.002302
Średnia prędkość wiatru -9 0.001755
-8 0.001745
Ciśnienie na poziomie stacji -5 0.001464
Maksymalna temperatura powietrza - resid -5 0.001385
-6 0.001379
Czas trwania rosy 3 0.001218
Średnie zachmurzenie -9 0.000956
-8 0.000954
Ciśnienie na poziomie morza -5 0.000938
Opad - dzień -7 0.000821
Dobowa suma opadu -6 0.000520
Length: 357, dtype: float64
In [51]: sns.set()
plt.plot(meteo_daily.index, meteo_daily["Średnia prędkość wiatru"].shift(-4))
plt.plot(meteo_daily.index, meteo_daily["Czas trwania burzy"].shift(-10))
plt.plot(meteo_daily.index, meteo_daily["Czas trwania rosy"].shift(-5).apply(lam
bda x: x + 10))
plt.plot(data_sleep.index, data_sleep["efficiency"].apply(lambda x: x - 60))
plt.legend(["Średnia prędkość wiatru", "Czas trwania burzy", "Czas trwania rosy"
, "Efektywność snu"])
Out[51]: <matplotlib.legend.Legend at 0x7fdd41a2f4a8>
To czy jestem meteoropatką?To czy jestem meteoropatką?
¯_(ツ)_/¯
PodsumowaniePodsumowanie
Szeregi okazały się być słabo skorelowane, ale widoczne były pewne wzorce.
Do potwierdzenia lub obalenia hipotezy potrzebne są dalsze analizy. Potencjalne kierunki
badań:
Uwzględeninie poziomu aktywności zycznej
Analiza danych na poziomie godzin lub minut
Ponowna analiza po uzyskaniu większej liczby próbek
Dzięki!Dzięki!
magdalena.wojcik@datalove.plmagdalena.wojcik@datalove.pl
https://github.com/Claygirl/ai-roadshow- tbit
(https://github.com/Claygirl/ai-roadshow- tbit)

More Related Content

More from Infoshare

infoShare AI Roadshow 2018 - Barbara Leśniarek (Elitmind) - ”Łapać złodzieja!...
infoShare AI Roadshow 2018 - Barbara Leśniarek (Elitmind) - ”Łapać złodzieja!...infoShare AI Roadshow 2018 - Barbara Leśniarek (Elitmind) - ”Łapać złodzieja!...
infoShare AI Roadshow 2018 - Barbara Leśniarek (Elitmind) - ”Łapać złodzieja!...Infoshare
 
infoShare AI Roadshow 2018 - Wojtek Ptak (Freshmail) - Teraz - najlepszy czas...
infoShare AI Roadshow 2018 - Wojtek Ptak (Freshmail) - Teraz - najlepszy czas...infoShare AI Roadshow 2018 - Wojtek Ptak (Freshmail) - Teraz - najlepszy czas...
infoShare AI Roadshow 2018 - Wojtek Ptak (Freshmail) - Teraz - najlepszy czas...Infoshare
 
infoShare AI Roadshow 2018 - Tomasz Brzeziński (iTaxi) - Niestandardowe metod...
infoShare AI Roadshow 2018 - Tomasz Brzeziński (iTaxi) - Niestandardowe metod...infoShare AI Roadshow 2018 - Tomasz Brzeziński (iTaxi) - Niestandardowe metod...
infoShare AI Roadshow 2018 - Tomasz Brzeziński (iTaxi) - Niestandardowe metod...Infoshare
 
infoShare AI Roadshow 2018 - Rafał Cycoń (ShelfWise.ai) - Wyzwania w tworzeni...
infoShare AI Roadshow 2018 - Rafał Cycoń (ShelfWise.ai) - Wyzwania w tworzeni...infoShare AI Roadshow 2018 - Rafał Cycoń (ShelfWise.ai) - Wyzwania w tworzeni...
infoShare AI Roadshow 2018 - Rafał Cycoń (ShelfWise.ai) - Wyzwania w tworzeni...Infoshare
 
infoShare AI Roadshow 2018 - Paweł Wyborski (QuarticON) - Jak AI pomaga sprze...
infoShare AI Roadshow 2018 - Paweł Wyborski (QuarticON) - Jak AI pomaga sprze...infoShare AI Roadshow 2018 - Paweł Wyborski (QuarticON) - Jak AI pomaga sprze...
infoShare AI Roadshow 2018 - Paweł Wyborski (QuarticON) - Jak AI pomaga sprze...Infoshare
 
infoShare AI Roadshow 2018 - Mateusz Biliński (Niebezpiecznik) - Hackowanie (...
infoShare AI Roadshow 2018 - Mateusz Biliński (Niebezpiecznik) - Hackowanie (...infoShare AI Roadshow 2018 - Mateusz Biliński (Niebezpiecznik) - Hackowanie (...
infoShare AI Roadshow 2018 - Mateusz Biliński (Niebezpiecznik) - Hackowanie (...Infoshare
 
infoShare AI Roadshow 2018 - Krzysztof Kudryński & Błażej Kubiak (TomTom) - D...
infoShare AI Roadshow 2018 - Krzysztof Kudryński & Błażej Kubiak (TomTom) - D...infoShare AI Roadshow 2018 - Krzysztof Kudryński & Błażej Kubiak (TomTom) - D...
infoShare AI Roadshow 2018 - Krzysztof Kudryński & Błażej Kubiak (TomTom) - D...Infoshare
 
infoShare AI Roadshow 2018 - Adrian Boguszewski (Linux Polska) - Czy sieć neu...
infoShare AI Roadshow 2018 - Adrian Boguszewski (Linux Polska) - Czy sieć neu...infoShare AI Roadshow 2018 - Adrian Boguszewski (Linux Polska) - Czy sieć neu...
infoShare AI Roadshow 2018 - Adrian Boguszewski (Linux Polska) - Czy sieć neu...Infoshare
 
infoShare AI Roadshow 2018 - Dorian Nikoniuk (Microsoft) - Usługi poznawcze, ...
infoShare AI Roadshow 2018 - Dorian Nikoniuk (Microsoft) - Usługi poznawcze, ...infoShare AI Roadshow 2018 - Dorian Nikoniuk (Microsoft) - Usługi poznawcze, ...
infoShare AI Roadshow 2018 - Dorian Nikoniuk (Microsoft) - Usługi poznawcze, ...Infoshare
 
infoShare AI Roadshow 2018 - Tomasz Kopacz (Microsoft) - jakie możliwości daj...
infoShare AI Roadshow 2018 - Tomasz Kopacz (Microsoft) - jakie możliwości daj...infoShare AI Roadshow 2018 - Tomasz Kopacz (Microsoft) - jakie możliwości daj...
infoShare AI Roadshow 2018 - Tomasz Kopacz (Microsoft) - jakie możliwości daj...Infoshare
 
infoShare AI Roadshow 2018 - Adam Karwan (Groupon) - Jak wykorzystać uczenie ...
infoShare AI Roadshow 2018 - Adam Karwan (Groupon) - Jak wykorzystać uczenie ...infoShare AI Roadshow 2018 - Adam Karwan (Groupon) - Jak wykorzystać uczenie ...
infoShare AI Roadshow 2018 - Adam Karwan (Groupon) - Jak wykorzystać uczenie ...Infoshare
 
infoShare AI Roadshow 2018 - Michał Ćwiok (Clouds on Mars) - Usługi AI w chmurze
infoShare AI Roadshow 2018 - Michał Ćwiok (Clouds on Mars) - Usługi AI w chmurzeinfoShare AI Roadshow 2018 - Michał Ćwiok (Clouds on Mars) - Usługi AI w chmurze
infoShare AI Roadshow 2018 - Michał Ćwiok (Clouds on Mars) - Usługi AI w chmurzeInfoshare
 
infoShare 2014: Peter Taylor,The Art of Productive Laziness
infoShare 2014: Peter Taylor,The Art of Productive LazinessinfoShare 2014: Peter Taylor,The Art of Productive Laziness
infoShare 2014: Peter Taylor,The Art of Productive LazinessInfoshare
 
infoShare 2014: Paweł Brodziński, Efektywny czy zajęty? Jesteś pewien, że dob...
infoShare 2014: Paweł Brodziński, Efektywny czy zajęty? Jesteś pewien, że dob...infoShare 2014: Paweł Brodziński, Efektywny czy zajęty? Jesteś pewien, że dob...
infoShare 2014: Paweł Brodziński, Efektywny czy zajęty? Jesteś pewien, że dob...Infoshare
 
infoShare 2014: Michał Sierzputowski, Testy automatyczne aplikacji webowych o...
infoShare 2014: Michał Sierzputowski, Testy automatyczne aplikacji webowych o...infoShare 2014: Michał Sierzputowski, Testy automatyczne aplikacji webowych o...
infoShare 2014: Michał Sierzputowski, Testy automatyczne aplikacji webowych o...Infoshare
 
infoShare 2014: Michał Polak, Smart Cities na wyciągnięcie smartfona.
infoShare 2014: Michał Polak, Smart Cities na wyciągnięcie smartfona.infoShare 2014: Michał Polak, Smart Cities na wyciągnięcie smartfona.
infoShare 2014: Michał Polak, Smart Cities na wyciągnięcie smartfona.Infoshare
 
infoShare 2014: Mariusz Róg, Big Data w praktyce -- jak efektywnie przetwarza...
infoShare 2014: Mariusz Róg, Big Data w praktyce -- jak efektywnie przetwarza...infoShare 2014: Mariusz Róg, Big Data w praktyce -- jak efektywnie przetwarza...
infoShare 2014: Mariusz Róg, Big Data w praktyce -- jak efektywnie przetwarza...Infoshare
 
infoShare 2014: Marek Landowski, Architektura SWIFT obiektowego przechowywani...
infoShare 2014: Marek Landowski, Architektura SWIFT obiektowego przechowywani...infoShare 2014: Marek Landowski, Architektura SWIFT obiektowego przechowywani...
infoShare 2014: Marek Landowski, Architektura SWIFT obiektowego przechowywani...Infoshare
 
infoShare 2014: Maciej Saganowski, Designing Mobile Services.
infoShare 2014: Maciej Saganowski, Designing Mobile Services.infoShare 2014: Maciej Saganowski, Designing Mobile Services.
infoShare 2014: Maciej Saganowski, Designing Mobile Services.Infoshare
 
infoShare 2014:Jacek Samsel, Andrzej Pyra, Marketingowa mapa skarbów: w jaki ...
infoShare 2014:Jacek Samsel, Andrzej Pyra, Marketingowa mapa skarbów: w jaki ...infoShare 2014:Jacek Samsel, Andrzej Pyra, Marketingowa mapa skarbów: w jaki ...
infoShare 2014:Jacek Samsel, Andrzej Pyra, Marketingowa mapa skarbów: w jaki ...Infoshare
 

More from Infoshare (20)

infoShare AI Roadshow 2018 - Barbara Leśniarek (Elitmind) - ”Łapać złodzieja!...
infoShare AI Roadshow 2018 - Barbara Leśniarek (Elitmind) - ”Łapać złodzieja!...infoShare AI Roadshow 2018 - Barbara Leśniarek (Elitmind) - ”Łapać złodzieja!...
infoShare AI Roadshow 2018 - Barbara Leśniarek (Elitmind) - ”Łapać złodzieja!...
 
infoShare AI Roadshow 2018 - Wojtek Ptak (Freshmail) - Teraz - najlepszy czas...
infoShare AI Roadshow 2018 - Wojtek Ptak (Freshmail) - Teraz - najlepszy czas...infoShare AI Roadshow 2018 - Wojtek Ptak (Freshmail) - Teraz - najlepszy czas...
infoShare AI Roadshow 2018 - Wojtek Ptak (Freshmail) - Teraz - najlepszy czas...
 
infoShare AI Roadshow 2018 - Tomasz Brzeziński (iTaxi) - Niestandardowe metod...
infoShare AI Roadshow 2018 - Tomasz Brzeziński (iTaxi) - Niestandardowe metod...infoShare AI Roadshow 2018 - Tomasz Brzeziński (iTaxi) - Niestandardowe metod...
infoShare AI Roadshow 2018 - Tomasz Brzeziński (iTaxi) - Niestandardowe metod...
 
infoShare AI Roadshow 2018 - Rafał Cycoń (ShelfWise.ai) - Wyzwania w tworzeni...
infoShare AI Roadshow 2018 - Rafał Cycoń (ShelfWise.ai) - Wyzwania w tworzeni...infoShare AI Roadshow 2018 - Rafał Cycoń (ShelfWise.ai) - Wyzwania w tworzeni...
infoShare AI Roadshow 2018 - Rafał Cycoń (ShelfWise.ai) - Wyzwania w tworzeni...
 
infoShare AI Roadshow 2018 - Paweł Wyborski (QuarticON) - Jak AI pomaga sprze...
infoShare AI Roadshow 2018 - Paweł Wyborski (QuarticON) - Jak AI pomaga sprze...infoShare AI Roadshow 2018 - Paweł Wyborski (QuarticON) - Jak AI pomaga sprze...
infoShare AI Roadshow 2018 - Paweł Wyborski (QuarticON) - Jak AI pomaga sprze...
 
infoShare AI Roadshow 2018 - Mateusz Biliński (Niebezpiecznik) - Hackowanie (...
infoShare AI Roadshow 2018 - Mateusz Biliński (Niebezpiecznik) - Hackowanie (...infoShare AI Roadshow 2018 - Mateusz Biliński (Niebezpiecznik) - Hackowanie (...
infoShare AI Roadshow 2018 - Mateusz Biliński (Niebezpiecznik) - Hackowanie (...
 
infoShare AI Roadshow 2018 - Krzysztof Kudryński & Błażej Kubiak (TomTom) - D...
infoShare AI Roadshow 2018 - Krzysztof Kudryński & Błażej Kubiak (TomTom) - D...infoShare AI Roadshow 2018 - Krzysztof Kudryński & Błażej Kubiak (TomTom) - D...
infoShare AI Roadshow 2018 - Krzysztof Kudryński & Błażej Kubiak (TomTom) - D...
 
infoShare AI Roadshow 2018 - Adrian Boguszewski (Linux Polska) - Czy sieć neu...
infoShare AI Roadshow 2018 - Adrian Boguszewski (Linux Polska) - Czy sieć neu...infoShare AI Roadshow 2018 - Adrian Boguszewski (Linux Polska) - Czy sieć neu...
infoShare AI Roadshow 2018 - Adrian Boguszewski (Linux Polska) - Czy sieć neu...
 
infoShare AI Roadshow 2018 - Dorian Nikoniuk (Microsoft) - Usługi poznawcze, ...
infoShare AI Roadshow 2018 - Dorian Nikoniuk (Microsoft) - Usługi poznawcze, ...infoShare AI Roadshow 2018 - Dorian Nikoniuk (Microsoft) - Usługi poznawcze, ...
infoShare AI Roadshow 2018 - Dorian Nikoniuk (Microsoft) - Usługi poznawcze, ...
 
infoShare AI Roadshow 2018 - Tomasz Kopacz (Microsoft) - jakie możliwości daj...
infoShare AI Roadshow 2018 - Tomasz Kopacz (Microsoft) - jakie możliwości daj...infoShare AI Roadshow 2018 - Tomasz Kopacz (Microsoft) - jakie możliwości daj...
infoShare AI Roadshow 2018 - Tomasz Kopacz (Microsoft) - jakie możliwości daj...
 
infoShare AI Roadshow 2018 - Adam Karwan (Groupon) - Jak wykorzystać uczenie ...
infoShare AI Roadshow 2018 - Adam Karwan (Groupon) - Jak wykorzystać uczenie ...infoShare AI Roadshow 2018 - Adam Karwan (Groupon) - Jak wykorzystać uczenie ...
infoShare AI Roadshow 2018 - Adam Karwan (Groupon) - Jak wykorzystać uczenie ...
 
infoShare AI Roadshow 2018 - Michał Ćwiok (Clouds on Mars) - Usługi AI w chmurze
infoShare AI Roadshow 2018 - Michał Ćwiok (Clouds on Mars) - Usługi AI w chmurzeinfoShare AI Roadshow 2018 - Michał Ćwiok (Clouds on Mars) - Usługi AI w chmurze
infoShare AI Roadshow 2018 - Michał Ćwiok (Clouds on Mars) - Usługi AI w chmurze
 
infoShare 2014: Peter Taylor,The Art of Productive Laziness
infoShare 2014: Peter Taylor,The Art of Productive LazinessinfoShare 2014: Peter Taylor,The Art of Productive Laziness
infoShare 2014: Peter Taylor,The Art of Productive Laziness
 
infoShare 2014: Paweł Brodziński, Efektywny czy zajęty? Jesteś pewien, że dob...
infoShare 2014: Paweł Brodziński, Efektywny czy zajęty? Jesteś pewien, że dob...infoShare 2014: Paweł Brodziński, Efektywny czy zajęty? Jesteś pewien, że dob...
infoShare 2014: Paweł Brodziński, Efektywny czy zajęty? Jesteś pewien, że dob...
 
infoShare 2014: Michał Sierzputowski, Testy automatyczne aplikacji webowych o...
infoShare 2014: Michał Sierzputowski, Testy automatyczne aplikacji webowych o...infoShare 2014: Michał Sierzputowski, Testy automatyczne aplikacji webowych o...
infoShare 2014: Michał Sierzputowski, Testy automatyczne aplikacji webowych o...
 
infoShare 2014: Michał Polak, Smart Cities na wyciągnięcie smartfona.
infoShare 2014: Michał Polak, Smart Cities na wyciągnięcie smartfona.infoShare 2014: Michał Polak, Smart Cities na wyciągnięcie smartfona.
infoShare 2014: Michał Polak, Smart Cities na wyciągnięcie smartfona.
 
infoShare 2014: Mariusz Róg, Big Data w praktyce -- jak efektywnie przetwarza...
infoShare 2014: Mariusz Róg, Big Data w praktyce -- jak efektywnie przetwarza...infoShare 2014: Mariusz Róg, Big Data w praktyce -- jak efektywnie przetwarza...
infoShare 2014: Mariusz Róg, Big Data w praktyce -- jak efektywnie przetwarza...
 
infoShare 2014: Marek Landowski, Architektura SWIFT obiektowego przechowywani...
infoShare 2014: Marek Landowski, Architektura SWIFT obiektowego przechowywani...infoShare 2014: Marek Landowski, Architektura SWIFT obiektowego przechowywani...
infoShare 2014: Marek Landowski, Architektura SWIFT obiektowego przechowywani...
 
infoShare 2014: Maciej Saganowski, Designing Mobile Services.
infoShare 2014: Maciej Saganowski, Designing Mobile Services.infoShare 2014: Maciej Saganowski, Designing Mobile Services.
infoShare 2014: Maciej Saganowski, Designing Mobile Services.
 
infoShare 2014:Jacek Samsel, Andrzej Pyra, Marketingowa mapa skarbów: w jaki ...
infoShare 2014:Jacek Samsel, Andrzej Pyra, Marketingowa mapa skarbów: w jaki ...infoShare 2014:Jacek Samsel, Andrzej Pyra, Marketingowa mapa skarbów: w jaki ...
infoShare 2014:Jacek Samsel, Andrzej Pyra, Marketingowa mapa skarbów: w jaki ...
 

infoShare AI Roadshow 2018 - Magdalena Wójcik (Data Love) - Data Science na danych z trackera aktywności - case

  • 1. Magdalena Wójcik Data Science na danych z trackera aktywności - case
  • 2. Plan prezentacjiPlan prezentacji 1. Hipoteza 2. Opis trackera Fitbit 3. Opis danych 4. Analiza stacjonarności szeregów czasowych 5. Dekompozycja szeregu czasowego 6. Analiza korelacji 7. Podsumowanie wyników
  • 3. Badana hipotezaBadana hipoteza Czy jestem meteoropatką?Czy jestem meteoropatką? Za: Słownik języka polskiego pod red. W. Doroszewskiego, 1958 r.
  • 4. Tracker - Fitbit Alta HRTracker - Fitbit Alta HR
  • 5. Jakich danych dostarcza Fitbit?Jakich danych dostarcza Fitbit? Liczba kroków, pięter na które się weszło, przebytych kilometrów. Liczba spalonych kalorii w ciągu dnia. Tętno spoczynkowe, tętno w danym momencie. Długość i jakość snu. Dane pochodzą z czujników: Akcelerometru Barometru Żyroskopu Fotoplezmatografu Nie mamy dostępu do bezpośredniego sygnału z czujników z poziomu Web API.
  • 6. Fotopletyzmogra a (PPG)Fotopletyzmogra a (PPG) Metoda optycznego pomiaru zmian przepływu krwi przez naczynia obwodowe położone blisko powierzchni ciała, może być stosowana do pomiaru szybkości pracy serca. Fitbit używa zielonych LEDów i fotodiody do pomiaru odbijanego światła, a dzięki temu pojemności naczyń krwionośnych pod skórą.
  • 7. In [6]: sns.lineplot(x=rhr_daily.index, y="value.restingHeartRate", data=rhr_daily) print("Pierwszy dzień: ", rhr_daily.index.min()) print("Ostatni dzień: ", rhr_daily.index.max()) print("Minimalne tętno: ", rhr_daily["value.restingHeartRate"].min()) print("Maksymalne tętno: ", rhr_daily["value.restingHeartRate"].max()) Pierwszy dzień: 2018-07-11 00:00:00 Ostatni dzień: 2018-10-31 00:00:00 Minimalne tętno: 67.0 Maksymalne tętno: 77.0
  • 8. In [8]: sleep_sources = ["data/sleep-2018-07-11-2018-09-30.json", "data/sleep-2018-10-01 -2018-10-31.json"] sleep = load_json(sleep_sources, "sleep") data_all, data_sleep, data_naps = format_sleep(sleep) data_sleep = remove_constant_cols(data_sleep) data_sleep.info() <class 'pandas.core.frame.DataFrame'> DatetimeIndex: 108 entries, 2018-07-12 to 2018-10-31 Data columns (total 22 columns): duration 108 non-null int64 efficiency 108 non-null int64 endTime 108 non-null datetime64[ns] levels.summary.deep.count 108 non-null float64 levels.summary.deep.minutes 108 non-null float64 levels.summary.deep.thirtyDayAvgMinutes 108 non-null float64 levels.summary.light.count 108 non-null float64 levels.summary.light.minutes 108 non-null float64 levels.summary.light.thirtyDayAvgMinutes 108 non-null float64 levels.summary.rem.count 108 non-null float64 levels.summary.rem.minutes 108 non-null float64 levels.summary.rem.thirtyDayAvgMinutes 108 non-null float64 levels.summary.wake.count 108 non-null float64 levels.summary.wake.minutes 108 non-null float64 levels.summary.wake.thirtyDayAvgMinutes 108 non-null float64 minutesAfterWakeup 108 non-null int64 minutesAsleep 108 non-null int64 minutesAwake 108 non-null int64 startTime 108 non-null datetime64[ns] timeInBed 108 non-null int64 weekday 108 non-null int64 dayOfWeek 108 non-null object dtypes: datetime64[ns](2), float64(12), int64(7), object(1) memory usage: 19.4+ KB
  • 9. In [9]: print("Minimalna efektywność snu: ", data_sleep["efficiency"].min()) print("Maksymalna efektywność snu: ", data_sleep["efficiency"].max()) sns.lineplot(data_sleep.index, data_sleep["efficiency"]) Out[9]: Minimalna efektywność snu: 87 Maksymalna efektywność snu: 100 <matplotlib.axes._subplots.AxesSubplot at 0x7fdd49973198>
  • 10. In [10]: sns.boxplot(x="dayOfWeek", y="efficiency", data=data_sleep, order=WEEKDAYS) Out[10]: <matplotlib.axes._subplots.AxesSubplot at 0x7fdd49462908>
  • 11. Dane meteorologiczne pochodzą ze stronyDane meteorologiczne pochodzą ze strony meteomodel.plmeteomodel.pl
  • 12.
  • 13. In [11]: meteo_daily = pd.read_csv("data/Dane meteorologiczne.csv", index_col=[0], parse_ dates=[0]) meteo_daily = meteo_daily.fillna(0) meteo_daily.info() <class 'pandas.core.frame.DataFrame'> DatetimeIndex: 113 entries, 2018-07-11 to 2018-10-31 Data columns (total 17 columns): Średnia temperatura powietrza 113 non-null float64 Maksymalna temperatura powietrza 113 non-null float64 Minimalna temperatura powietrza 113 non-null float64 Minimalna temperatura powietrza przy gruncie 113 non-null float64 Średnia wilgotność powietrza 113 non-null float64 Średnia prężność pary wodnej 113 non-null float64 Średnie zachmurzenie 113 non-null float64 Średnia prędkość wiatru 113 non-null float64 Ciśnienie na poziomie morza 113 non-null float64 Ciśnienie na poziomie stacji 113 non-null float64 Dobowa suma opadu 113 non-null float64 Opad - dzień 113 non-null float64 Opad - noc 113 non-null float64 Usłonecznienie 113 non-null float64 Czas trwania opadu deszczu 113 non-null float64 Czas trwania rosy 113 non-null float64 Czas trwania burzy 113 non-null float64 dtypes: float64(17) memory usage: 15.9 KB
  • 14. Czy wszystkie analizowane szeregi są stacjonarne?Czy wszystkie analizowane szeregi są stacjonarne? Stacjonarny szereg czasowy - szereg w którym wartość średnia, wariancja oraz funkcja autokorelacji nie zmieniają się wraz ze zmianą czasu.
  • 15.
  • 16. Rozszerzony test Dickeya-Fullera (Augmented Dickey-Rozszerzony test Dickeya-Fullera (Augmented Dickey- Fuller test)Fuller test) Test statystyczny, polegający na próbie dopasowania do danych modelu autoregresyjnego, uwzględniający dwie hipotezy: : Szereg jest niestacjonarny. : Szereg jest stacjonarny. Przy wyniku hipoteza zerowa jest odrzucana - szereg jest stacjonarny. H0 H1 p − value < 0.05
  • 17. In [12]: import statsmodels.tsa.stattools as ts rhr_series = rhr_daily["value.restingHeartRate"].values result = ts.adfuller(rhr_series) print("Wynik testu dla tętna spoczynkowegonp-value: {:.24f}".format(result[1])) sleep_series = data_sleep["efficiency"].fillna(0).values result = ts.adfuller(sleep_series) print("Wynik testu dla efektywności snunp-value: {:.24f}".format(result[1])) Wynik testu dla tętna spoczynkowego p-value: 0.026188396618426579981476 Wynik testu dla efektywności snu p-value: 0.000000000019042035089119
  • 18. In [13]: meteo_adf = np.zeros(len(meteo_daily.columns)) for i, column in enumerate(meteo_daily.columns): meteo_series = meteo_daily[column].fillna(0).values adf = ts.adfuller(meteo_series)[1] meteo_adf[i] = adf meteo_adf_df = pd.DataFrame(meteo_adf, index=meteo_daily.columns, columns=["p-value"]) meteo_adf_df.sort_values(by="p-value", ascending=False, inplace=True) meteo_adf_df.style.format("{:.6f}") Out[13]: p-value Minimalna temperatura powietrza przy gruncie 0.867639 Minimalna temperatura powietrza 0.859623 Średnia prężność pary wodnej 0.699345 Średnia temperatura powietrza 0.614118 Maksymalna temperatura powietrza 0.395975 Czas trwania burzy 0.017540 Ciśnienie na poziomie morza 0.004599 Ciśnienie na poziomie stacji 0.003533 Średnia wilgotność powietrza 0.001089 Czas trwania opadu deszczu 0.000424 Średnie zachmurzenie 0.000000 Usłonecznienie 0.000000 Średnia prędkość wiatru 0.000000 Czas trwania rosy 0.000000 Opad - dzień 0.000000 Dobowa suma opadu 0.000000 Opad - noc 0.000000
  • 19. In [14]: from statsmodels.tsa.seasonal import seasonal_decompose def meteo_decompose(dataset, column): result = seasonal_decompose(meteo_daily[column], model="additive", ) meteo_daily[column + " - resid"] = result.resid meteo_daily.drop(column, axis=1, inplace=True) return dataset, result meteo_daily, result = meteo_decompose(meteo_daily, "Średnia temperatura powietrz a") result.plot() pyplot.show()
  • 20. Znormalizowana korelacja krzyżowa (normalizedZnormalizowana korelacja krzyżowa (normalized cross-correlation)cross-correlation) Korelacja krzyżowa uwzględnia możliwe przesunięcie (shift) szeregów czasowych względem siebie. norm_cross_correlation(x(t), y(t)) = (x(t) − ) (y(t) − ) 1 n ∑ x,y 1 σx σy x¯¯¯ y¯¯¯
  • 21. In [24]: example = rhr_daily.copy() example.columns = ["Tętno spoczynkowe"] example["Ciśnienie"] = meteo_daily["Ciśnienie na poziomie morza"] example["Ciśnienie + 2"] = meteo_daily["Ciśnienie na poziomie morza"].shift(2) example["Ciśnienie - 2"] = meteo_daily["Ciśnienie na poziomie morza"].shift(-2) example.head() Out[24]: Tętno spoczynkowe Ciśnienie Ciśnienie + 2 Ciśnienie - 2 dateTime 2018-07-11 77.0 1013.4 NaN 1012.2 2018-07-12 72.0 1012.6 NaN 1011.6 2018-07-13 71.0 1012.2 1013.4 1012.4 2018-07-14 73.0 1011.6 1012.6 1009.5 2018-07-15 73.0 1012.4 1012.2 1004.8
  • 22. In [20]: def corr_norm(a, b): conv = np.correlate(a - np.mean(a), b - np.mean(b))[0] norm = np.std(a) * np.std(b) * len(a) return conv / norm def xcorr(a, b, shifts): shifts = list(range(-shifts, shifts + 1)) corr = np.full((len(b.columns), len(shifts)), np.inf) for i, column in enumerate(b.columns): for j, shift in enumerate(shifts):a b_in = b[column].shift(shift) invalid = b_in.isna() b_in = b_in[~invalid].values a_in = a[~invalid].values corr[i][j] = corr_norm(a_in, b_in) corr_df = pd.DataFrame(corr, columns=shifts, index=b.columns) return corr_df
  • 23. In [38]: corr_rhr = xcorr(rhr_daily["value.restingHeartRate"], meteo_daily, 5) f, ax = plt.subplots(figsize=(6, 7)) ax = sns.heatmap(corr_rhr, cmap="YlGnBu")
  • 24. In [39]: corr_rhr = xcorr(rhr_daily["value.restingHeartRate"], meteo_daily, 10) f, ax = plt.subplots(figsize=(10, 7)) ax = sns.heatmap(corr_rhr, cmap="YlGnBu")
  • 25. In [42]: corr_rhr.stack().abs().sort_values(ascending=False) Out[42]: Usłonecznienie 6 0.404034 7 0.392621 Średnia prędkość wiatru 5 0.343960 Ciśnienie na poziomie morza -8 0.331546 Średnia wilgotność powietrza 6 0.330481 Średnia prędkość wiatru 4 0.328771 Ciśnienie na poziomie morza -7 0.324229 Ciśnienie na poziomie stacji -8 0.322160 Ciśnienie na poziomie morza -6 0.319641 Ciśnienie na poziomie stacji -7 0.315570 -6 0.310706 Średnie zachmurzenie 6 0.303247 Średnia prędkość wiatru 6 0.302663 Czas trwania opadu deszczu 6 0.301615 Usłonecznienie 5 0.301121 8 0.297127 Czas trwania burzy 2 0.297096 Ciśnienie na poziomie morza -5 0.296600 -9 0.292152 Ciśnienie na poziomie stacji -5 0.286841 Usłonecznienie 9 0.285268 Średnia prędkość wiatru -8 0.284111 Ciśnienie na poziomie stacji -9 0.280799 Średnie zachmurzenie 7 0.280593 Czas trwania opadu deszczu 8 0.278038 Średnia wilgotność powietrza -10 0.277524 7 0.275640 Usłonecznienie 4 0.274867 Ciśnienie na poziomie morza 9 0.270913 Czas trwania opadu deszczu 7 0.270538 ... Minimalna temperatura powietrza - resid -1 0.008364 -6 0.008314 Średnia temperatura powietrza - resid 2 0.007613
  • 26. Maksymalna temperatura powietrza - resid 1 0.007468 Średnia temperatura powietrza - resid 3 0.007448 Średnia prężność pary wodnej - resid 8 0.007151 Średnia prędkość wiatru 10 0.006572 Minimalna temperatura powietrza - resid 7 0.005815 -10 0.005676 Średnia prędkość wiatru 9 0.005628 Minimalna temperatura powietrza przy gruncie - resid -1 0.005619 Opad - dzień -10 0.005463 Minimalna temperatura powietrza przy gruncie - resid 8 0.004637 Dobowa suma opadu 4 0.004316 Opad - noc 3 0.003697 Minimalna temperatura powietrza przy gruncie - resid -10 0.003537 Minimalna temperatura powietrza - resid -7 0.003211 Dobowa suma opadu 2 0.002903 Średnia prężność pary wodnej - resid -9 0.002869 Minimalna temperatura powietrza przy gruncie - resid -3 0.002641 Średnia temperatura powietrza - resid -4 0.002474 Maksymalna temperatura powietrza - resid 0 0.002445 Ciśnienie na poziomie morza 0 0.002042 3 0.001826 Czas trwania rosy -8 0.001703 Czas trwania burzy -10 0.001640 Średnia temperatura powietrza - resid 10 0.001429 Maksymalna temperatura powietrza - resid -4 0.001039 Średnia temperatura powietrza - resid 1 0.000645 Maksymalna temperatura powietrza - resid 2 0.000056 Length: 357, dtype: float64
  • 27. In [49]: sns.set() plt.plot(meteo_daily.index, meteo_daily["Usłonecznienie"].shift(6).apply(lambda x: x + 40)) plt.plot(meteo_daily.index, meteo_daily["Ciśnienie na poziomie morza"].shift(-8) .apply(lambda x: x - 900)) plt.plot(meteo_daily.index, meteo_daily["Średnia prędkość wiatru"].shift(5)) plt.plot(rhr_daily.index, rhr_daily["value.restingHeartRate"]) plt.legend(["Usłonecznienie", "Ciśnienie na poziomie morza", "Średnia prędkość w iatru", "Tętno spoczynkowe"]) Out[49]: <matplotlib.legend.Legend at 0x7fdd41a07b70>
  • 28. In [52]: corr_sleep_efficiency = xcorr(data_sleep["efficiency"], meteo_daily, 5) f, ax = plt.subplots(figsize=(6, 7)) ax = sns.heatmap(corr_sleep_efficiency, cmap="YlGnBu")
  • 29. In [40]: corr_sleep_efficiency = xcorr(data_sleep["efficiency"], meteo_daily, 10) f, ax = plt.subplots(figsize=(10, 7)) ax = sns.heatmap(corr_sleep_efficiency, cmap="YlGnBu")
  • 30. In [50]: corr_sleep_efficiency.stack().abs().sort_values(ascending=False) Out[50]: Średnia prędkość wiatru 6 0.301546 Czas trwania burzy -10 0.242508 Czas trwania rosy -5 0.225645 -3 0.222534 Opad - dzień 1 0.221495 Czas trwania burzy -4 0.220298 Dobowa suma opadu 1 0.219600 Średnia prężność pary wodnej - resid 1 0.205617 -3 0.197595 Minimalna temperatura powietrza przy gruncie - resid 6 0.189702 Opad - noc 5 0.188261 Średnia prężność pary wodnej - resid -4 0.188176 Minimalna temperatura powietrza - resid -4 0.187696 Czas trwania rosy 0 0.185332 Opad - dzień 7 0.184611 Czas trwania burzy -6 0.183412 Średnia prężność pary wodnej - resid -10 0.183362 Dobowa suma opadu 7 0.179223 Ciśnienie na poziomie stacji -1 0.175914 Średnia prężność pary wodnej - resid 7 0.175660 Średnia prędkość wiatru -10 0.175016 Minimalna temperatura powietrza przy gruncie - resid 0 0.174345 Ciśnienie na poziomie morza -1 0.173830 Średnia prędkość wiatru 1 0.173023 Opad - noc 9 0.170768 Średnia wilgotność powietrza -10 0.167220 Opad - dzień 2 0.167063 Maksymalna temperatura powietrza - resid 2 0.161642 Czas trwania rosy 2 0.160725 Czas trwania opadu deszczu 7 0.160224 ... Średnia prężność pary wodnej - resid -9 0.009866 Minimalna temperatura powietrza przy gruncie - resid -10 0.009702 Czas trwania rosy 7 0.008342
  • 31. Ciśnienie na poziomie morza 10 0.008016 Średnia prężność pary wodnej - resid 3 0.007959 Opad - dzień -6 0.007406 Średnia temperatura powietrza - resid -10 0.007068 Średnia prędkość wiatru -6 0.007031 Opad - dzień 8 0.006915 Minimalna temperatura powietrza przy gruncie - resid -2 0.005759 Czas trwania burzy 10 0.005480 Średnia prężność pary wodnej - resid -2 0.003840 Opad - noc 6 0.003700 Czas trwania opadu deszczu 2 0.003075 Opad - noc -6 0.003004 Usłonecznienie -3 0.002803 Minimalna temperatura powietrza - resid -8 0.002595 Dobowa suma opadu -4 0.002306 Opad - dzień -3 0.002302 Średnia prędkość wiatru -9 0.001755 -8 0.001745 Ciśnienie na poziomie stacji -5 0.001464 Maksymalna temperatura powietrza - resid -5 0.001385 -6 0.001379 Czas trwania rosy 3 0.001218 Średnie zachmurzenie -9 0.000956 -8 0.000954 Ciśnienie na poziomie morza -5 0.000938 Opad - dzień -7 0.000821 Dobowa suma opadu -6 0.000520 Length: 357, dtype: float64
  • 32. In [51]: sns.set() plt.plot(meteo_daily.index, meteo_daily["Średnia prędkość wiatru"].shift(-4)) plt.plot(meteo_daily.index, meteo_daily["Czas trwania burzy"].shift(-10)) plt.plot(meteo_daily.index, meteo_daily["Czas trwania rosy"].shift(-5).apply(lam bda x: x + 10)) plt.plot(data_sleep.index, data_sleep["efficiency"].apply(lambda x: x - 60)) plt.legend(["Średnia prędkość wiatru", "Czas trwania burzy", "Czas trwania rosy" , "Efektywność snu"]) Out[51]: <matplotlib.legend.Legend at 0x7fdd41a2f4a8>
  • 33. To czy jestem meteoropatką?To czy jestem meteoropatką?
  • 35. PodsumowaniePodsumowanie Szeregi okazały się być słabo skorelowane, ale widoczne były pewne wzorce. Do potwierdzenia lub obalenia hipotezy potrzebne są dalsze analizy. Potencjalne kierunki badań: Uwzględeninie poziomu aktywności zycznej Analiza danych na poziomie godzin lub minut Ponowna analiza po uzyskaniu większej liczby próbek