J'ai les données suivantes

df = pd.DataFrame({ 
'region'  : ['a', 'a', 'a','a',' a','a','a', 's', 's','s','l','a','c','a', 'e','a','g', 'd','c','d','a','f','a','a','a'],
'month_number' : [5, 12, 3, 12, 3, 6,7,8,9,10,11,12,4,5,2,6,7,8,3, 4, 7, 6,7,8,8],
'score' : [2.5, 5, 3.5, 2.5, 5.5, 3.5,2,3.5,4,2,1.5,1,1.5,4,5.5,2,3,1,2,3.5,4,2,3.5,3,4]})

Je veux calculer la moyenne du score dans une région et créer sa tendance au cours de l'année, comme dernière je veux avoir une ligne de meilleur ajustement pour voir si la tendance augmente ou diminue au fil du temps. (Pas pour les valeurs prédites, simplement sur la moyenne)

J'ai filtré une région 'a':

filtered = df[(df['region'] == 'a')]

Et créé une tendance:

filtered.groupby(['month_number','region']).mean()['score'].unstack().plot(figsize=(10,6))

Cela donne ce qui suit : entrez la description de l'image ici

Maintenant, je suis coincé sur la façon de faire correspondre la meilleure ligne à la tendance. Mon objectif après tout est de créer une colonne avec des valeurs de plus ou moins indiquant une tendance à la hausse ou à la baisse dans cette région. S'il existe une autre approche à ce sujet, j'aimerais l'entendre.

1
Reda S 14 mars 2019 à 19:18

2 réponses

Meilleure réponse

Si vous souhaitez simplement tracer l'ajustement en ligne droite, utilisez Seaborn.

Cependant, si vous souhaitez calculer l'ajustement de ligne droite pour les données, utilisez numpy.polyfit.

import numpy as np
f1 = filtered.groupby('month_number').mean().reset_index()
x = f1.month_number.values
y = f1.score.values
m, c = np.polyfit(x, y, 1)

Vous avez calculé la pente et l'ordonnée à l'origine de votre point.

Vous pouvez calculer les points au-dessus et en dessous de vos positions comme suit:

yHat = m*x + c
yError = y - yHat

Pour votre nouvelle colonne, utilisez simplement les valeurs d'erreur:

f1['HiLo'] = [ ('+' if m else '-')  for m in yError>0]

Vous obtiendrez vos avantages et inconvénients ..

month_number     score HiLo
           3  3.500000    +
           5  3.250000    -
           6  2.750000    -
           7  3.166667    +
           8  3.500000    +
          12  2.833333    -
1
ssm 14 mars 2019 à 16:47

Vous pouvez le faire en utilisant le tracé de régression de seaborn regplot comme suit. La zone ombrée est l'intervalle de confiance.

import seaborn as sns
import pandas as pd

df = pd.DataFrame({ 
'region'  : ['a', 'a', 'a','a',' a','a','a', 's', 's','s','l','a','c','a', 'e','a','g', 'd','c','d','a','f','a','a','a'],
'month_number' : [5, 12, 3, 12, 3, 6,7,8,9,10,11,12,4,5,2,6,7,8,3, 4, 7, 6,7,8,8],
'score' : [2.5, 5, 3.5, 2.5, 5.5, 3.5,2,3.5,4,2,1.5,1,1.5,4,5.5,2,3,1,2,3.5,4,2,3.5,3,4]})

filtered = df[(df['region'] == 'a')]
df1 = filtered.groupby(['month_number','region']).mean()['score'].unstack()
sns.regplot(x=df1.index.tolist(), y=df1['a'], data=df1)

enter image description here

Si vous ne voulez pas d'intervalle de confiance ombré, vous pouvez utiliser ci=0 comme

sns.regplot(x=df1.index.tolist(), y=df1['a'], data=df1, ci=0)

enter image description here

1
Sheldore 14 mars 2019 à 16:35