domingo, 9 de febrero de 2025

Microsoft Learn / Exploración y análisis de datos con Python / Ejercicio con datos del mundo real

 

Explorando datos con Python - Datos del mundo real

En el último cuaderno, observamos las calificaciones de los datos de nuestros estudiantes e investigamos los datos visualmente con histogramas y parcelas de caja. Ahora analizaremos casos más complejos, describiremos los datos más plenamente y discutiremos cómo hacer comparaciones básicas entre los datos.

Distribuciones de datos del mundo real

Anteriormente, analizamos las calificaciones para los datos de nuestros estudiantes y estimamos a partir de esta muestra cómo podría ser la población completa de calificaciones. Actualicemos nuestra memoria y echemos un vistazo a estos datos nuevamente.

Ejecute el siguiente código para imprimir los datos y hacer un diagrama de cuadro de histograma más que muestra las calificaciones para nuestra muestra de estudiantes. 

 >>import pandas as pd

>>from matplotlib import pyplot as plt

>># Load data from a text file
>>!wget https://raw.githubusercontent.com/MicrosoftDocs/mslearn-introduction
-to-machine-learning/main/Data/ml-basics/grades.csv
>>df_students = pd.read_csv('grades.csv',delimiter=',',header='infer')

>># Remove any rows with missing data
>>df_students = df_students.dropna(axis=0, how='any')

>># Calculate who passed, assuming '60' is the grade needed to pass>>
>>passes  = pd.Series(df_students['Grade'] >= 60)

>># Save who passed to the Pandas dataframe
>>df_students = pd.concat([df_students, passes.rename("Pass")], axis=1)


>># Print the result out into this notebook
>>print(df_students)


>># Create a function that we can re-use
>>def show_distribution(var_data):
    '''
    This function will make a distribution (graph) and display it
    '''

>>    # Get statistics
>>    min_val = var_data.min()
>>    max_val = var_data.max()
>>    mean_val = var_data.mean()
>>  med_val = var_data.median()
>>    mod_val = var_data.mode()[0]

>>    print('Minimum:{:.2f}\nMean:{:.2f}\nMedian:{:.2f}\nMode:{:.2f}\n 
>>  Maximum:{:.2f}\n'.format(min_val,
                             mean_val,
                             med_val,
                             mod_val,
                             max_val))

>>    # Create a figure for 2 subplots (2 rows, 1 column)
>>    fig, ax = plt.subplots(2, 1, figsize = (10,4))

>>    # Plot the histogram  
>>    ax[0].hist(var_data)
>>    ax[0].set_ylabel('Frequency')

>>    # Add lines for the mean, median, and mode
>>    ax[0].axvline(x=min_val, color = 'gray', linestyle='dashed', linewidth = 2)
>>    ax[0].axvline(x=mean_val, color = 'cyan', linestyle='dashed', linewidth = 2)
>>    ax[0].axvline(x=med_val, color = 'red', linestyle='dashed', linewidth = 2)
>>    ax[0].axvline(x=mod_val, color = 'yellow', linestyle='dashed', linewidth = 2)
>>    ax[0].axvline(x=max_val, color = 'gray', linestyle='dashed', linewidth = 2)

>>    # Plot the boxplot  
>>    ax[1].boxplot(var_data, vert=False)
>>    ax[1].set_xlabel('Value')

>>    # Add a title to the Figure
>>    fig.suptitle('Data Distribution')

>>    # Show the figure
>>    fig.show()

>>show_distribution(df_students['Grade'])
 
>>>
grades.csv          100%[===================>]     322  --.-KB/s    in 0s      

2025-02-09 13:10:55 (4.34 MB/s) - ‘grades.csv’ saved [322/322]

         Name  StudyHours  Grade   Pass
0         Dan       10.00   50.0  False
1       Joann       11.50   50.0  False
2       Pedro        9.00   47.0  False
3       Rosie       16.00   97.0   True
4       Ethan        9.25   49.0  False
5       Vicky        1.00    3.0  False
6    Frederic       11.50   53.0  False
7      Jimmie        9.00   42.0  False
8      Rhonda        8.50   26.0  False
9    Giovanni       14.50   74.0   True
10  Francesca       15.50   82.0   True
11      Rajab       13.75   62.0   True
12    Naiyana        9.00   37.0  False
13       Kian        8.00   15.0  False
14      Jenny       15.50   70.0   True
15     Jakeem        8.00   27.0  False
16     Helena        9.00   36.0  False
17      Ismat        6.00   35.0  False
18      Anila       10.00   48.0  False
19       Skye       12.00   52.0  False
20     Daniel       12.50   63.0   True
21      Aisha       12.00   64.0   True
Minimum:3.00
Mean:49.18
Median:49.50
Mode:50.00
Maximum:97.00 
 
 
Como recordarán, nuestros datos tenían la media y el modo en el centro, con datos
extendidos simétricamente desde allí.

Ahora echemos un vistazo a la distribución de los datos de las horas de estudio.

>># Get the variable to examine
>>col = df_students['StudyHours']
>># Call the function
>>show_distribution(col)

>>>
Minimum:1.00
Mean:10.52
Median:10.00
Mode:9.00
Maximum:16.00

 

La distribución de los datos del tiempo de estudio es significativamente diferente de la de las calificaciones.

Tenga en cuenta que los bigotes de la gráfica de la caja solo comienzan alrededor de 6.0, lo que indica que la gran mayoría del primer trimestre de los datos está por encima de este valor. El mínimo está marcado con una O , lo que indica que es estadísticamente un atípico : un valor que se encuentra significativamente fuera del rango del resto de la distribución.

Los valores atípicos pueden ocurrir por muchas razones. Tal vez un estudiante tenía la intención de registrar "10" horas de tiempo de estudio, pero ingresó "1" y se perdió el "0". ¡O tal vez el estudiante fue anormalmente perezoso cuando se trata de estudiar! De cualquier manera, es una anomalía estadística que no representa a un estudiante típico. Veamos cómo se ve la distribución sin ella.

>># Get the variable to examine
>># We will only get students who have studied more than one hour
>>col = df_students[df_students.StudyHours>1]['StudyHours']

>># Call the function
>>show_distribution(col)

>>>
Minimum:6.00
Mean:10.98
Median:10.00
Mode:9.00
Maximum:16.00

 

Para fines de aprendizaje, acabamos de tratar el valor 1 como un verdadero atípico aquí y lo excluyeron. En el mundo real, sería inusual excluir los datos en los extremos sin más justificación cuando el tamaño de nuestra muestra es tan pequeño. Esto se debe a que cuanto más pequeño nuestro tamaño de muestra, más probabilidades es que nuestro muestreo sea una mala representación de toda la población. (Aquí, la población significa calificaciones para todos los estudiantes, no solo para nuestros 22.) Por ejemplo, si probamos el tiempo de estudio para otros 1,000 estudiantes, ¡podríamos encontrar que en realidad es bastante común no estudiar mucho!

Cuando tenemos más datos disponibles, nuestra muestra se vuelve más confiable. Esto hace que sea más fácil considerar los valores atípicos como valores que caen por debajo o por encima de los percentiles dentro de los cuales la mayoría de los datos se encuentran. pandas de cuantil para excluir las observaciones por debajo del percentil 0.01 (el valor por encima del cual residen el 99% de los datos).

>># calculate the 0.01th percentile
>>q01 = df_students.StudyHours.quantile(0.01)
>># Get the variable to examine
>>col = df_students[df_students.StudyHours>q01]['StudyHours']
>># Call the function
>>show_distribution(col)
>>>
Minimum:6.00
Mean:10.98
Median:10.00
Mode:9.00
Maximum:16.00

Consejo : también puede eliminar los valores atípicos en el extremo superior de la distribución definiendo un umbral con un valor de percentil alto. Por ejemplo, puede usar la cuantil para encontrar el percentil 0.99, por debajo del cual residen el 99% de los datos.

Con los valores atípicos eliminados, el diagrama de cuadro muestra todos los datos dentro de los cuatro cuartiles. Tenga en cuenta que la distribución no es simétrica como es para los datos de grado. Hay algunos estudiantes con tiempos de estudio muy altos de alrededor de 16 horas, pero la mayor parte de los datos es de entre 7 y 13 horas. Los pocos valores extremadamente altos tiran de la media hacia el extremo superior de la escala.

Veamos la densidad para esta distribución.

>>def show_density(var_data):

>>    fig = plt.figure(figsize=(10,4))

>>    # Plot density
>>    var_data.plot.density()

>>    # Add titles and labels
>>    plt.title('Data Density')

>>    # Show the mean, median, and mode
>>    plt.axvline(x=var_data.mean(), color = 'cyan', linestyle='dashed', linewidth = 2)
>>    plt.axvline(x=var_data.median(), color = 'red', linestyle='dashed', linewidth = 2)
>>    plt.axvline(x=var_data.mode()[0], color = 'yellow', linestyle='dashed', linewidth = 2)

>>    # Show the figure
>>    plt.show()

>># Get the density of StudyHours
>>show_density(col)

>>>


Este tipo de distribución se llama rectamente sesgado . La masa de los datos está en el lado izquierdo de la distribución, creando una cola larga a la derecha debido a los valores en el extremo alto extremo, que tiran de la media hacia la derecha.

Medidas de varianza

Así que ahora tenemos una buena idea de dónde están las distribuciones de datos en la mitad de la calificación y el estudio de las horas de estudio. Sin embargo, hay otro aspecto de las distribuciones que debemos examinar: ¿cuánta variabilidad hay en los datos?

Las estadísticas típicas que miden la variabilidad en los datos incluyen:

  • Rango : la diferencia entre lo máximo y mínimo. No hay una función incorporada para esto, pero es fácil de calcular usando las Min y Max .
  • Varianza : el promedio de la diferencia cuadrada de la media. incorporada VAR para encontrar esto.
  • Desviación estándar : la raíz cuadrada de la varianza. incorporada STD para encontrar esto.

>>for col_name in ['Grade','StudyHours']:

>>   col = df_students[col_name]
>>   rng = col.max() - col.min()
>>   var = col.var()
>>   std = col.std()
>>   print('\n{}:\n - Range: {:.2f}\n - Variance: {:.2f}\n
  - Std.Dev: {:.2f}'.format(col_name, rng, var, std))
>>>
Grade:
 - Range: 94.00
 - Variance: 472.54
 - Std.Dev: 21.74

StudyHours:
 - Range: 15.00
 - Variance: 12.16
 - Std.Dev: 3.49

De estas estadísticas, la desviación estándar es generalmente la más útil. Proporciona una medida de varianza en los datos en la misma escala que los datos en sí (por lo tanto, los puntos de grado para la distribución de calificaciones y las horas para la distribución del estudio). Cuanto mayor sea la desviación estándar, más varianza hay al comparar valores en la distribución con la media de distribución; En otras palabras, los datos están más extendidos.

Cuando se trabaja con una normal distribución Ejecute la siguiente celda para ver la relación entre las desviaciones estándar y los datos en la distribución normal.

>>import scipy.stats as stats

>># Get the Grade column
>>col = df_students['Grade']

>># get the density
>>density = stats.gaussian_kde(col)

>># Plot the density
>>col.plot.density()

>># Get the mean and standard deviation
>>s = col.std()
>>m = col.mean()

>># Annotate 1 stdev
>>x1 = [m-s, m+s]
>>y1 = density(x1)
>>plt.plot(x1,y1, color='magenta')
>>plt.annotate('1 std (68.26%)', (x1[1],y1[1]))

>># Annotate 2 stdevs
>>x2 = [m-(s*2), m+(s*2)]
>>y2 = density(x2)
>>plt.plot(x2,y2, color='green')
>>plt.annotate('2 std (95.45%)', (x2[1],y2[1]))

>># Annotate 3 stdevs
>>x3 = [m-(s*3), m+(s*3)]
>>y3 = density(x3)
>>plt.plot(x3,y3, color='orange')
>>plt.annotate('3 std (99.73%)', (x3[1],y3[1]))

>># Show the location of the mean
>>plt.axvline(col.mean(), color='cyan', linestyle='dashed', linewidth=1)

>>plt.axis('off')

>>plt.show()
 


Las líneas horizontales muestran el porcentaje de datos dentro de uno, dos y tres desviaciones estándar de la media (más o menos).

En cualquier distribución normal:

  • Aproximadamente el 68.26% de los valores caen dentro de una desviación estándar de la media.
  • Aproximadamente el 95.45% de los valores caen dentro de dos desviaciones estándar de la media.
  • Aproximadamente el 99.73% de los valores caen dentro de tres desviaciones estándar de la media.

Entonces, debido a que sabemos que la calificación media es 49.18, la desviación estándar es 21.74, y la distribución de grados es aproximadamente normal, podemos calcular que el 68.26% de los estudiantes deben alcanzar una calificación entre 27.44 y 70.92.

Las estadísticas descriptivas que hemos utilizado para comprender la distribución de las variables de datos del estudiante son la base del análisis estadístico. Debido a que son una parte tan importante de explorar sus datos, hay un incorporado describe Método del objeto DataFrame que devuelve las principales estadísticas descriptivas para todas las columnas numéricas.

>>df_students.describe()

>>>


StudyHours Grade
count 22.000000 22.000000
mean 10.522727 49.181818
std 3.487144 21.737912
min 1.000000 3.000000
25% 9.000000 36.250000
50% 10.000000 49.500000
75% 12.375000 62.750000
max 16.000000 97.000000
 
>>from matplotlib import pyplot as plt
>>_df_2.plot(kind='scatter', x='StudyHours', y='Grade', s=32, alpha=.8)
>>plt.gca().spines[['top', 'right',]].set_visible(False)


>>from matplotlib import pyplot as plt
>>_df_0['StudyHours'].plot(kind='hist', bins=20, title='StudyHours')
>>plt.gca().spines[['top', 'right',]].set_visible(False)
 
 

>>from matplotlib import pyplot as plt
>>_df_1['Grade'].plot(kind='hist', bins=20, title='Grade')
>>plt.gca().spines[['top', 'right',]].set_visible(False)




Comparación de datos

Ahora que sabe algo sobre la distribución estadística de los datos en su conjunto de datos, está listo para examinar sus datos para identificar cualquier relación aparente entre variables.

En primer lugar, eliminemos de cualquier fila que contenga valores atípicos para que tengamos una muestra que sea representativa de una clase típica de estudiantes. Identificamos que la columna StudyHours contiene algunos valores atípicos con valores extremadamente bajos, por lo que eliminaremos esas filas.

>>df_sample = df_students[df_students['StudyHours']>1]
>>df_sample
>>> 

Name StudyHours Grade Pass
0 Dan 10.00 50.0 False
1 Joann 11.50 50.0 False
2 Pedro 9.00 47.0 False
3 Rosie 16.00 97.0 True
4 Ethan 9.25 49.0 False
6 Frederic 11.50 53.0 False
7 Jimmie 9.00 42.0 False
8 Rhonda 8.50 26.0 False
9 Giovanni 14.50 74.0 True
10 Francesca 15.50 82.0 True
11 Rajab 13.75 62.0 True
12 Naiyana 9.00 37.0 False
13 Kian 8.00 15.0 False
14 Jenny 15.50 70.0 True
15 Jakeem 8.00 27.0 False
16 Helena 9.00 36.0 False
17 Ismat 6.00 35.0 False
18 Anila 10.00 48.0 False
19 Skye 12.00 52.0 False
20 Daniel 12.50 63.0 True
21 Aisha 12.00 64.0 True
 
>># @title StudyHours vs Grade

>>from matplotlib import pyplot as plt
>>df_sample.plot(kind='scatter', x='StudyHours', y='Grade', s=32, alpha=.8)
>>plt.gca().spines[['top', 'right',]].set_visible(False)
 
 

 

Comparación de variables numéricas y categóricas

Los datos incluyen dos numéricas variables casas de estudio y grado ) y dos categóricas variables nombre y pase ). Comencemos por comparar la StudyHours columna de pase para ver si hay una relación aparente entre el número de horas estudiadas y una calificación pasajera.

Para hacer esta comparación, creemos gráficos de caja que muestren la distribución de casas de estudio para cada valor de aprobación posible (verdadero y falso).

>>df_sample.boxplot(column='StudyHours', by='Pass', figsize=(8,5))
>>>
<Axes: title={'center': 'StudyHours'}, xlabel='Pass'>

Comparando las distribuciones de las casas de estudio, es inmediatamente evidente (si no particularmente sorprendente) que los estudiantes que aprobaron el curso tendieron a estudiar durante más horas que los estudiantes que no lo hicieron. Entonces, si desea predecir si es probable que un estudiante pase o no el curso, la cantidad de tiempo que pasa estudiando puede ser un buen indicador predictivo.

Comparación de variables numéricas

Ahora comparemos dos variables numéricas. Comenzaremos creando un gráfico de barras que muestre horas de grado y estudio.

>># Create a bar plot of name vs grade and study hours
>>df_sample.plot(x='Name', y=['Grade','StudyHours'], kind='bar', figsize=(8,5))

>>>

<Axes: xlabel='Name'>

El gráfico muestra barras para las horas de grado y de estudio para cada estudiante, pero no es fácil de comparar porque los valores están en diferentes escalas. Se mide una calificación en puntos de grado (y varía de 3 a 97), y el tiempo de estudio se mide en horas (y varía de 1 a 16).

Una técnica común cuando se trata de datos numéricos en diferentes escalas es normalizar los datos para que los valores retengan su distribución proporcional, pero se miden en la misma escala. Para lograr esto, utilizaremos una técnica llamada Minmax Scaling que distribuye los valores proporcionalmente en una escala de 0 a 1. Puede escribir el código para aplicar esta transformación, pero la Scikit-Learn proporciona un escalador para hacerlo por usted .

>>from sklearn.preprocessing import MinMaxScaler

>># Get a scaler object
>>scaler = MinMaxScaler()

>># Create a new dataframe for the scaled values
>>df_normalized = df_sample[['Name', 'Grade', 'StudyHours']].copy()

>># Normalize the numeric columns
>>df_normalized[['Grade','StudyHours']] = scaler.fit_transform(df_normalized[['Grade','StudyHours']])

>># Plot the normalized values
>>df_normalized.plot(x='Name', y=['Grade','StudyHours'], kind='bar', figsize=(8,5))

>>>

<Axes: xlabel='Name'>

 Con los datos normalizados, es más fácil ver una relación aparente entre el grado y el tiempo de estudio. No es un partido exacto, pero definitivamente parece que los estudiantes con calificaciones más altas tienden a haber estudiado más.

Así que parece haber una correlación entre el tiempo de estudio y el grado. De hecho, hay una de correlación que podemos usar para cuantificar la relación entre estas columnas.

>>df_normalized.Grade.corr(df_normalized.StudyHours)

>>>

0.9117666413789677

La estadística de correlación es un valor entre -1 y 1 que indica la fuerza de una relación. Los valores anteriores 0 indican una positiva (los valores altos de una variable tienden a coincidir con los valores altos del otro), mientras que los valores inferiores 0 indican una negativa (valores altos de una variable tienden a coincidir con valores bajos del otro). En este caso, el valor de correlación es cercano a 1, que muestra una correlación muy positiva entre el tiempo de estudio y el grado.

Nota : Los científicos de datos a menudo citan la máxima " La correlación no es causalidad ". En otras palabras, por tentador que pueda ser, no debe interpretar la correlación estadística como explicar por qué uno de los valores es alto. En el caso de los datos del estudiante, las estadísticas demuestran que los estudiantes con altos calificaciones tienden a tener altas cantidades de tiempo de estudio, pero esto no es lo mismo que demostrar que lograron calificaciones altas porque estudiaron mucho. Podría usar igualmente la estadística como evidencia para apoyar la conclusión sin sentido de que los estudiantes estudiaron mucho porque sus calificaciones iban a ser altas.

Otra forma de visualizar la correlación aparente entre dos columnas numéricas es usar una de dispersión .

 >># Create a scatter plot

>>df_sample.plot.scatter(title='Study Time vs Grade', x='StudyHours', y='Grade')

>>>

<Axes: title={'center': 'Study Time vs Grade'}, xlabel='StudyHours', ylabel='Grade'>

Una vez más, parece que hay un patrón discernible en el que los estudiantes que estudiaron la mayoría de las horas también son los estudiantes que obtuvieron las calificaciones más altas.

Podemos ver esto más claramente agregando una de regresión línea línea de mejor ajuste ) a la trama que muestra la tendencia general en los datos. Para hacer esto, utilizaremos una técnica estadística llamada regresión de mínimos cuadrados .

Recuerde cuando estaba aprendiendo a resolver ecuaciones lineales en la escuela y recuerde que la la pendiente-intersección de una ecuación lineal se ve así:

En esta ecuación, y y x son las variables de coordenadas, M es la pendiente de la línea, y B es la intersección y (donde la línea pasa por el eje y).

En el caso de nuestra gráfica de dispersión para los datos de nuestros estudiantes, ya tenemos nuestros valores para X ( estudio de estudio ) e y ( grado ), por lo que solo necesitamos calcular la intersección y la pendiente de la línea recta que se encuentra más cerca de esos puntos. Luego, podemos formar una ecuación lineal que calcule un nuevo Y en esa línea para cada uno de nuestros X ( StudyHours ). Para evitar confusiones, llamaremos a este nuevo Y valor F (x) (porque es la salida de una ecuación lineal de Finción basada en x ). La diferencia entre el Y ( grado ) original y el F (x) es el error entre nuestra línea de regresión y la calificación alcanzada por el estudiante. Nuestro objetivo es calcular la pendiente e intercepción para una línea con el error general más bajo.

Específicamente, definimos el error general tomando el error para cada punto, cuadrarlo y agregar todos los errores al cuadrado juntos. La línea de mejor ajuste es la línea que nos da el valor más bajo para la suma de los errores al cuadrado, de ahí la regresión de mínimos cuadrados .

Afortunadamente, no necesita codificar el cálculo de la regresión usted mismo. El SciPy incluye una de estadísticas que proporciona un Linregress para hacer el trabajo duro por usted. Esto devuelve (entre otras cosas) los coeficientes que necesita para la ecuación de pendiente: pendiente ( m ) e intercepción ( b ) basada en un par dado de muestras variables que desea comparar.

>>from scipy import stats

>>#
>>df_regression = df_sample[['Grade', 'StudyHours']].copy()

>># Get the regression slope and intercept
>>m, b, r, p, se = stats.linregress(df_regression['StudyHours'], df_regression['Grade'])
>>print('slope: {:.4f}\ny-intercept: {:.4f}'.format(m,b))
>>print('so...\n f(x) = {:.4f}x + {:.4f}'.format(m,b))

>># Use the function (mx + b) to calculate f(x) for each x (StudyHours) value
>>df_regression['fx'] = (m * df_regression['StudyHours']) + b

>># Calculate the error between f(x) and the actual y (Grade) value
>>df_regression['error'] = df_regression['fx'] - df_regression['Grade']

# Create a scatter plot of Grade vs StudyHours
>>df_regression.plot.scatter(x='StudyHours', y='Grade')

>># Plot the regression line
>>plt.plot(df_regression['StudyHours'],df_regression['fx'], color='cyan')

>># Display the plot
>>plt.show()

>>>

slope: 6.3134
y-intercept: -17.9164
so...
 f(x) = 6.3134x + -17.9164

Tenga en cuenta que esta vez, el código trazó dos cosas distintas: la gráfica de dispersión de las horas de estudio y las calificaciones de la muestra se traza como antes, y luego se traza una línea de mejor ajuste basada en los coeficientes de regresión de mínimos cuadrados.

Los coeficientes de pendiente e intercepción calculados para la línea de regresión se muestran sobre la gráfica.

La línea se basa en los F (x) calculados para cada de estudio . Ejecute la siguiente celda para ver una tabla que incluya los siguientes valores:

  • El estudio de las casas para cada estudiante
  • La calificación alcanzada por cada estudiante
  • El F (x) calculado utilizando los coeficientes de la línea de regresión
  • El error entre el F (x) y el de grado valor

Algunos de los errores, particularmente en los extremos, son bastante grandes (hasta más de 17.5 puntos de grado). Pero, en general, la línea está bastante cerca de las calificaciones reales.

>># Show the original x,y values, the f(x) value, and the error
>>df_regression[['StudyHours', 'Grade', 'fx', 'error']]
>>>
StudyHours Grade fx error
0 10.00 50.0 45.217846 -4.782154
1 11.50 50.0 54.687985 4.687985
2 9.00 47.0 38.904421 -8.095579
3 16.00 97.0 83.098400 -13.901600
4 9.25 49.0 40.482777 -8.517223
6 11.50 53.0 54.687985 1.687985
7 9.00 42.0 38.904421 -3.095579
8 8.50 26.0 35.747708 9.747708
9 14.50 74.0 73.628262 -0.371738
10 15.50 82.0 79.941687 -2.058313
11 13.75 62.0 68.893193 6.893193
12 9.00 37.0 38.904421 1.904421
13 8.00 15.0 32.590995 17.590995
14 15.50 70.0 79.941687 9.941687
15 8.00 27.0 32.590995 5.590995
16 9.00 36.0 38.904421 2.904421
17 6.00 35.0 19.964144 -15.035856
18 10.00 48.0 45.217846 -2.782154
19 12.00 52.0 57.844698 5.844698
20 12.50 63.0 61.001410 -1.998590
21 12.00 64.0 57.844698 -6.155302
>>from matplotlib import pyplot as plt
>>_df_9.plot(kind='scatter', x='StudyHours', y='Grade', s=32, alpha=.8)
>>plt.gca().spines[['top', 'right',]].set_visible(False)

Usar los coeficientes de regresión para la predicción

Ahora que tiene los coeficientes de regresión para el tiempo de estudio y la relación de grado, puede usarlos en una función para estimar la calificación esperada para una cantidad dada de estudio.

# Define a function based on our regression coefficients
>>def f(x):
>>    m = 6.3134
>>    b = -17.9164
>>    return m*x + b

>>study_time = 14

>># Get f(x) for study time
>>prediction = f(study_time)

>># Grade can't be less than 0 or more than 100
>>expected_grade = max(0,min(100,prediction))

>>#Print the estimated grade
>>print ('Studying for {} hours per week may result in a grade of {:.0f}'.format(study_time, expected_grade))

>>>

Studying for 14 hours per week may result in a grade of 70
# Estudiar por 14 horas por semana obtiene un resultado de grado de 70 

Entonces, al aplicar estadísticas a los datos de muestra, ha determinado una relación entre el tiempo de estudio y el grado y encapsuló esa relación en una función general que puede usarse para predecir una calificación durante una cantidad determinada de tiempo de estudio.

Esta técnica es, de hecho, la premisa básica del aprendizaje automático. Puede tomar un conjunto de datos de muestra que incluya una o más funciones (en este caso, el número de horas estudiadas) y un de etiqueta (en este caso, el grado alcanzado) y usar los datos de muestra para derivar una función que calcula Valores de etiqueta previstos para cualquier conjunto de características.

Resumen

Aquí hemos mirado:

  1. Qué valor atípico y cómo eliminarlos
  2. Cómo los datos pueden ser sesgados
  3. Cómo mirar la propagación de datos
  4. Formas básicas de comparar variables, como calificaciones y tiempo de estudio

Otras lecturas

Para obtener más información sobre los paquetes de Python que exploró en este cuaderno, consulte la siguiente documentación:

 

 

No hay comentarios.:

Publicar un comentario

Entradas recientes

Thinkcspy 6.6. Las funciones pueden llamar a otras funciones

E s importante comprender que cada una de las funciones que escribimos se puede usar y llamado desde otras funciones que escribimos. Este es...

Entradas Populares