Как найти площадь под графиком python

Вопрос задан
5 лет 7 месяцев назад

Просмотрен
3k раз

Собственно, имеем подобную ломанную кривую хочется найти апроксимирующую функцию, и посчитать площадь под ней. Хочется не наводящие ответы, вроде, посмотри есть math или scipy, а ссылки на то где есть подобная реализация, или хотя бы. Схожее, я новичок, и реализовать самостоятельно подобное не получается.retention plot

jfs's user avatar

jfs

51.8k11 золотых знаков107 серебряных знаков306 бронзовых знаков

задан 17 окт 2017 в 14:19

2

Можно воспользоваться numpy.trapz()

Пример с использованием Numpy:

import numpy as np
from scipy.integrate import simps
from numpy import trapz

x = np.linspace(0, 5, 21)

y = np.pi / np.exp(x)

# dx - растояние между соседними X координатами
area = trapz(y, dx=5/20)

Результат:

In [19]: simps(y, dx=5/20)
Out[19]: 3.1204919857832971

In [20]: trapz(y, dx=5/20)
Out[20]: 3.1366600769000623

График:

In [21]: plt.grid()

In [22]: plt.plot(x, y)
Out[22]: [<matplotlib.lines.Line2D at 0xd5a5c50>]

In [23]: plt.grid()

In [24]: plt.savefig('c:/temp/a.png')

введите сюда описание изображения

ответ дан 17 окт 2017 в 15:41

MaxU - stand with Ukraine's user avatar

I have one list of 100 numbers as height for Y axis, and as length for X axis: 1 to 100 with a constant step of 5. I need to calculate the Area that it is included by the curve of the (x,y) points, and the X axis, using rectangles and Scipy. Do I have to find the function of this curve? or not? … almost all the examples I have read are about a specific equation for the Y axis. In my case there is no equation, just data from a list. The classic solution is to add or the Y points and multiple by the step X distance… using Scipy any idea?

Please, can anyone recommend any book which focusing on numerical (finite elementary) methods, using Scipy and Numpy? …

nbrooks's user avatar

nbrooks

18.1k5 gold badges52 silver badges66 bronze badges

asked Nov 10, 2012 at 7:42

user1640255's user avatar

0

The numpy and scipy libraries include the composite trapezoidal (numpy.trapz) and Simpson’s (scipy.integrate.simpson) rules.

Here’s a simple example. In both trapz and simpson, the argument dx=5 indicates that the spacing of the data along the x axis is 5 units.

import numpy as np
from scipy.integrate import simpson
from numpy import trapz


# The y values.  A numpy array is used here,
# but a python list could also be used.
y = np.array([5, 20, 4, 18, 19, 18, 7, 4])

# Compute the area using the composite trapezoidal rule.
area = trapz(y, dx=5)
print("area =", area)

# Compute the area using the composite Simpson's rule.
area = simpson(y, dx=5)
print("area =", area)

Output:

area = 452.5
area = 460.0

answered Nov 10, 2012 at 16:38

Warren Weckesser's user avatar

Warren WeckesserWarren Weckesser

109k19 gold badges189 silver badges209 bronze badges

4

If you have sklearn installed, a simple alternative is to use sklearn.metrics.auc

This computes the area under the curve using the trapezoidal rule given arbitrary x, and y array

import numpy as np
from sklearn.metrics import auc

dx = 5
xx = np.arange(1,100,dx)
yy = np.arange(1,100,dx)

print('computed AUC using sklearn.metrics.auc: {}'.format(auc(xx,yy)))
print('computed AUC using np.trapz: {}'.format(np.trapz(yy, dx = dx)))

both output the same area: 4607.5

the advantage of sklearn.metrics.auc is that it can accept arbitrarily-spaced ‘x’ array, just make sure it is ascending otherwise the results will be incorrect

answered Aug 13, 2018 at 19:39

khuang834's user avatar

khuang834khuang834

9011 gold badge9 silver badges12 bronze badges

You can use Simpsons rule or the Trapezium rule to calculate the area under a graph given a table of y-values at a regular interval.

Python script that calculates Simpsons rule:

def integrate(y_vals, h):
    i = 1
    total = y_vals[0] + y_vals[-1]
    for y in y_vals[1:-1]:
        if i % 2 == 0:
            total += 2 * y
        else:
            total += 4 * y
        i += 1
    return total * (h / 3.0)

h is the offset (or gap) between y values, and y_vals is an array of well, y values.

Example (In same file as above function):

y_values = [13, 45.3, 12, 1, 476, 0]
interval = 1.2
area = integrate(y_values, interval)
print("The area is", area)

answered Nov 10, 2012 at 7:53

Will Richardson's user avatar

Will RichardsonWill Richardson

7,6907 gold badges42 silver badges56 bronze badges

6

  • Редакция Кодкампа

17 авг. 2022 г.
читать 1 мин


Логистическая регрессия — это статистический метод, который мы используем для подбора модели регрессии, когда переменная отклика является бинарной.

Чтобы оценить, насколько хорошо модель логистической регрессии соответствует набору данных, мы можем взглянуть на следующие две метрики:

  • Чувствительность: вероятность того, что модель предсказывает положительный результат для наблюдения, когда результат действительно положительный. Это также называется «истинно положительным показателем».
  • Специфичность: вероятность того, что модель предсказывает отрицательный результат для наблюдения, когда результат действительно отрицательный. Это также называется «истинной отрицательной ставкой».

Один из способов визуализировать эти две метрики — создать кривую ROC , которая означает кривую «рабочей характеристики приемника».

Это график, отображающий чувствительность по оси ординат и (1 — специфичность) по оси абсцисс.

Одним из способов количественной оценки того, насколько хорошо модель логистической регрессии справляется с классификацией данных, является вычисление AUC , что означает «площадь под кривой».

Чем ближе AUC к 1, тем лучше модель.

В следующем пошаговом примере показано, как рассчитать AUC для модели логистической регрессии в Python.

Шаг 1: Импорт пакетов

Во-первых, мы импортируем пакеты, необходимые для выполнения логистической регрессии в Python:

import pandas as pd
import numpy as np
from sklearn. model_selection import train_test_split
from sklearn. linear_model import LogisticRegression
from sklearn import metrics

Шаг 2: Подберите модель логистической регрессии

Далее мы импортируем набор данных и подгоним к нему модель логистической регрессии:

#import dataset from CSV file on Github
url = "https://raw.githubusercontent.com/Statology/Python-Guides/main/default.csv"
data = pd.read_csv (url)

#define the predictor variables and the response variable
X = data[['student', 'balance', 'income']]
y = data['default']

#split the dataset into training (70%) and testing (30%) sets
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size= 0.3 ,random_state= 0 ) 

#instantiate the model
log_regression = LogisticRegression()

#fit the model using the training data
log_regression. fit (X_train,y_train)

Шаг 3: Рассчитайте AUC

Мы можем использовать функцию metrics.roc_auc_score() для расчета AUC модели:

#use model to predict probability that given y value is 1
y_pred_proba = log_regression. predict_proba (X_test)[::, 1 ]

#calculate AUC of model
auc = metrics. roc_auc_score (y_test, y_pred_proba)

#print AUC score
print(auc)

0.5602104030579559

AUC (площадь под кривой) для этой конкретной модели составляет 0,5602 .

Напомним, что модель с показателем AUC, равным 0,5 , ничем не лучше модели, выполняющей случайное угадывание.

Таким образом, в большинстве случаев модель с показателем AUC 0,5602 будет считаться плохой при классификации наблюдений по правильным классам.

Дополнительные ресурсы

Следующие руководства предлагают дополнительную информацию о кривых ROC и оценках AUC:

Как интерпретировать кривую ROC (с примерами)
Что считается хорошей оценкой AUC?

Вычисление пло­щади фигуры, ограниченной двумя кривыми с помощью Python

Следующий пример, который мы рассмотрим — задача о вычислении площади фигуры, ограниченной двумя кривыми. Здесь, в этом примере, мы используем вложенные операторы цикла(то есть один оператор цикла вызывается в теле другого оператора цикла).

Что касается непосредственно решаемой задачи, то нам предстоит вычислить площадь фигуры, которая ограничена двумя кривыми, уравнения которых y(x) = x и y(x) = x^2. Графики этих кривых представлены на рис. 1.

Это прямая линия и парабола. Кривые пересекаются в двух точках: в точке x = 0, y = 0 и в точке x = 1, y = 1(точки определяются как решение уравнения x = x^2). Получается такой своеобразный «лепесток», площадь которого нам и предстоит вычислить.

Наша задача имеет точное решение. А именно, площадь S указанной фигуры следующая:

Вычисление пло­щади фигуры, ограниченной двумя кривыми с помощью Python

Однако мы будем использовать несколько иной подход.

Вычисление пло­щади фигуры, ограниченной двумя кривыми с помощью Python

Рис. 1. Вычисление области фигуры, ограниченной двумя кривыми

Метод, который описывается далее и применяется нами для вычисления площади фигуры, имеет отношение к теории вероятностей и математической статистике(обычно такой подход называют методами Монте-Карло).

При вычислении площади фигуры мы будем исходить из следующих соображений. Во-первых, замечаем, что область ограниченная кривыми, полностью попадает в единичный квадрат с левой нижней вершиной в точке начала координат и правой верхней вершиной в точке с единичными координатами. Если мы случайным образом выберем точку внутри этого квадрата, то она с некоторой вероятностью попадает в область, что ограничена кривыми (то есть попадает внутрь «лепестка»).

Теория вероятностей утверждает, что эта самая вероятность равна отношению площадей «лепестка» и квадрата. У квадрата с единичной стороной площадь равна единице. Поэтому площадь «лепестка»(которую нам необходимо вычислить) равняется вероятности, с которой случайным образом выбранная точка попадает внутрь «лепестка». Это будет «во вторых».

В третьих, если взять очень много случайных точек, равномерно распределенных по квадрату, и вычислить отношение количества точек внутри «лепестка» к общему количеству точек, в идеале получим оценку, близкую к вероятности попадания случайно выбранной точки внутрь «лепестка».

Мы всю эту процедуру немного модифицируем и поступим следующим образом. Вместо того чтобы генерировать случайны точки, покроем весь квадрат равноотстоящими узловыми точками. Посчитаем, сколько их попало внутрь «лепестка»(то есть области, ограниченной кривыми), и поделим на общее количество точек. Это и будет результат.

Программный код, в котором реализован такой подход, представлен ниже:


#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Количество равных интервалов, на которые
# делятся стороны единичного квадрата
n = 500
# "Цена деления" - расстояние между соседними точками
dz = 1 / n;
# Количество точек, которые попадают внутрь области
pts = 0
# Начальное значение индекса, определяющего столбец точек
i = 0
# Внешний оператор цикла. Перебираем столбцы точек
while i <= n:
    # x - координата точки
    x = dz * i
    # Начальное значение второго индекса для точек столбца
    j = 0
    # Внутренний оператор цикла. Перебираем точки
    # в одном столбце
    while j <= n:
        # y - координата точки
        y = dz * j
        # Условный оператор: проверяем, попала ли точка
        # внутрь области
        if y <= x and y >= x**2:
            # Еще одна точка внутри области
                pts += 1
        # Значение второго индекса увеличиваем на единицу
        j += 1
    # Значение первого индекса увеличиваем на единицу
    i += 1
# Вычисляем площадь фигуры
S = pts / (n + 1) ** 2
# Отображаем результат
print("Площадь фигуры: " + str(S))

Результат, который приведен ниже, достаточно близок к точному решению:

Вычисление пло­щади фигуры, ограниченной двумя кривыми с помощью Python

Чтобы понять логику вычислений, имеет смысл мысленно представить, как мы разбиваем каждую из сторон квадрата на определенное количество интервалов. Количество этих интервалов записывается в переменную n(то есть значение 500).

Границу интервалов будем называть узловыми точками. Через каждую узловую точку на сторонах квадрата проводим горизонтальные и вертикальные линии. Точки пересечений этих линий — это именно те точки, которые нам нужны. Каждую такую точку можно «идентифицировать» с помощью двух индексов.

Первый индекс определяет узловую точку по горизонтали, а второй — узловую точку по вертикали. На пересечении линий, проходящих через эти узловых точки, находится «идентифицируемая» точка внутри квадрата.

Если мы зафиксируем первый индекс, и будем брать разные значения для второго индекса, то все соответствующие точки будут находится на одной вертикальной прямой. Про такие точки будем говорить, что они находятся в одном столбце. Если зафиксировать второй индекс и брать разные значения первого индекса, то все соответствующие точки будут находиться на одной горизонтальной прямой. Про такие точки можем говорить, что они формируют ряд точек.

В каждому ряду и в каждом столбце размещено ровно n + 1 точек ( если учитывать и те точки, что находятся на координатных осях).

Расстояние (по горизонтали или по вертикали) между двумя соседними узловыми точками равняется, очевидно, единице, деленной на количество интервалов, на которые разбивалась каждая из сторон квадрата: такая «цена деления» записывается в переменную dz(значение 1/n). В переменную pts(начальное значение 0) будем записывать количество точек, которые попали внутрь «лепестка».

В условном операторе проверяется условие y <= x and y >= x**2. Это и есть условие попадания точки с координатами X(переменная x) и Y(переменная y) внутрь области, ограниченной кривыми y = x и y = x ^ 2. Чтобы точка попадала в это область, необходимо чтобы одновременно выполнялись два условия. Во-первых, точка должна находиться ниже прямой y = x, а это имеет место, если y <= x (нестрогое неравенство — если мы допускаем, чтобы точка могла оказаться не только ниже прямой, но и непосредственно на прямой.)

Во-вторых, точка должна находиться выше параболы y = x ^ 2 (или на самой параболе — такой вариант мы тоже допускаем). Соответствующее условие выглядит как y >= x ^ 2. Следовательно, должно выполняться соотношение x ^ 2 <= y <= x. Если перевести это на язык Python, то получим y <= x and y >= x**2. Кстати, вместо инструкции y <= x and y >= x**2 вполне законно можно было использовать выражение x ** 2 <= y <= x. Такого типа выражения в Python допустимы.

Начальное значение индекса i , определяющего столбец точек, должно быть нулевым (нулевой индекс соответствует точке на координатной оси). Через первый индекс, напомним, «нумеруются» столбцы точек. Когда запускается внешний оператор цикла, в нем проверяется условие i <=n. Поэтому цикл выполняется до тех пор, пока значение индексной переменной i не превы­сит значение переменной n.

В теле оператора цикла командой x = dz * i вычисляется координата х (вдоль горизонтальной оси — абсцисса) для точек, находящихся в данном столбце (столбец, напомним, определяется значением индекса i ). Также поскольку далее мы планируем перебирать точки в столбце, командой j = О устанавли­ваем начальное ну левое значение для второго индекса, (определяющего по­ложение внутренних точек). После этого выполняется второй, внутренний оператор цикла. В нем проверяется условие j <= n — то есть второй индекс j будет увеличиваться (об этом мы узнаем позже) до тех пор, пока он не пре­высит граничное значение n.

В теле внутреннего оператора цикла командой y = dz * j вычисляется коор­дината у для точки в столбце (координата вдоль вертикальной оси-ордина­та). С помощью условного оператора проверяем, попадает ли точка внутрь «лепестка», и если так, то командой pts += 1 на единицу увеличиваем значение переменной рts (в которую, напомним, записывается количество точек, попадающих внутрь «лепестка»).

Перед завершением внутреннего оператора цикла командой j = j + 1 второй индекс увеличивается на единицу. Это последняя команда внутреннего опе­ратора цикла. Внутренний оператор цикла является предпоследней «коман­дой» внешнего оператора цикла. А последняя команда внешнего оператора цикла — это инструкция i += 1 , которой на единицу увеличивается значе­ние первого индекса.

После выполнения внешнего оператора цикла, переменная pts содержит значение количества точек, которые попадают внутрь «лепестка». Общее количество точек, как несложно догадаться, равняется (n + 1) ** 2 (в каждом из n + 1 столбцов по n + 1 точек — всегда (n + 1)^2 точек). Поэтому если мы поделим одно значение на другое, получим площадь «лепестка». Соответствующее значение вычисляется командой S = рts / (n + 1) ** 2. Наконец, командой print отображаем результат.

Интересное видео в тему:

Студворк — интернет-сервис помощи студентам

В физике часто используют прием, когда значение одной физической величины можно определить как площадь под графиком зависимости других величин. Например, если есть график зависимости скорости от времени, то площадь под графиком – это перемещение.

Для простоты будем рассматривать линейные зависимости. Тогда возможны три фигуры под графиком: в общем случае это трапеция, может быть прямоугольник, и может быть треугольник. Во втором и третьем случае площадь можно находить тоже по формуле трапеции, только у прямоугольника стороны одинаковы, а у треугольника одна сторона равна нулю.

Напишите функцию square() – принимает список кортежей из трех значений: два основания и высота трапеции, а выводит сумму площадей всех этих трапеций.

Пример
Ввод Вывод
data = [(5, 3, 2), (3, 0, 6), (0, 12, 4), (12, 7, 3), (7, 7, 2)]
square(data)
83.5

Понравилась статья? Поделить с друзьями:
  • Как найти феи по настоящему
  • Контакт как найти по улице человека
  • Как составить план конспект логопедического занятия
  • Как найти блютуз в биосе асус
  • Как в майнкрафте найти алмазы по координатам