<a href="https://colab.research.google.com/github/nvisagan/DS-Unit-1-Sprint-4-Linear-Algebra/blob/master/module2-intermediate-linear-algebra/Intermediate_Linear_Algebra_Assignment.ipynb" target="_parent"></a>

# Statistics

## 1.1 Sales for the past week was the following amounts: [3505, 2400, 3027, 2798, 3700, 3250, 2689]. Without using library functions, what is the mean, variance, and standard deviation of sales from last week? (for extra bonus points, write your own function that can calculate these three values for any sized list)


```
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
```


```
sales = [3505, 2400, 3027, 2798, 3700, 3250, 2689]

#Mean
def mean(data):
  return sum(data) / len(data)
print("Mean:", mean(sales))

#Variance
def variance(data):
  data = np.array(data) 
  return ((data - mean(data))**2).sum() / len(data)
print("Variance:",variance(sales))

#Standard Deviation
def std(data):
  return variance(data)**(0.5)
print("STD:", std(sales))
```

    Mean: 3052.714285714286
    Variance: 183761.06122448976
    STD: 428.67360686714756


## 1.2 Find the covariance between last week's sales numbers and the number of customers that entered the store last week: [127, 80, 105, 92, 120, 115, 93] (you may use library functions for calculating the covariance since we didn't specifically talk about its formula)


```
num_of_cust = [127, 80, 105, 92, 120, 115, 93]

covar = np.cov(sales, num_of_cust, )
print(covar)
```

    [[214387.9047619    7604.35714286]
     [  7604.35714286    290.95238095]]


## 1.3 Find the standard deviation of customers who entered the store last week. Then, use the standard deviations of both sales and customers to standardize the covariance to find the correlation coefficient that summarizes the relationship between sales and customers. (You may use library functions to check your work.)


```
devs = [[std(sales)*std(sales), std(sales)*std(num_of_cust)],
       [std(sales)*std(num_of_cust), std(num_of_cust)*std(num_of_cust)]]

print(devs)


print('Correlation:', np.divide(np.cov(sales, num_of_cust), devs))

print(np.corrcoef(sales, num_of_cust))
```

    [[183761.06122448976, 6769.620265121536], [6769.620265121536, 249.3877551020408]]
    Correlation:
    [[1.16666667 1.12330631]
     [1.12330631 1.16666667]]
    Numpy corr:
    [[1.         0.96283398]
     [0.96283398 1.        ]]


## 1.4 Use pandas to import a cleaned version of the titanic dataset from the following link: [Titanic Dataset](https://raw.githubusercontent.com/Geoyi/Cleaning-Titanic-Data/master/titanic_clean.csv)

## Calculate the variance-covariance matrix and correlation matrix for the titanic dataset's numeric columns. (you can encode some of the categorical variables and include them as a stretch goal if you finish early)


```
titanic = pd.read_csv("https://raw.githubusercontent.com/Geoyi/Cleaning-Titanic-Data/master/titanic_clean.csv")

numerics = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']

numtitanic = titanic.select_dtypes(include=numerics).drop(columns="Unnamed: 0")

numtitanic.cov()
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>pclass</th>
      <th>survived</th>
      <th>age</th>
      <th>sibsp</th>
      <th>parch</th>
      <th>fare</th>
      <th>body</th>
      <th>has_cabin_number</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>pclass</th>
      <td>0.701969</td>
      <td>-0.127248</td>
      <td>-3.954605</td>
      <td>0.053090</td>
      <td>0.013287</td>
      <td>-24.227788</td>
      <td>-2.876653</td>
      <td>-0.249992</td>
    </tr>
    <tr>
      <th>survived</th>
      <td>-0.127248</td>
      <td>0.236250</td>
      <td>-0.314343</td>
      <td>-0.014088</td>
      <td>0.034776</td>
      <td>6.146023</td>
      <td>0.000000</td>
      <td>0.061406</td>
    </tr>
    <tr>
      <th>age</th>
      <td>-3.954605</td>
      <td>-0.314343</td>
      <td>165.850021</td>
      <td>-2.559806</td>
      <td>-1.459378</td>
      <td>114.416613</td>
      <td>81.622922</td>
      <td>1.463138</td>
    </tr>
    <tr>
      <th>sibsp</th>
      <td>0.053090</td>
      <td>-0.014088</td>
      <td>-2.559806</td>
      <td>1.085052</td>
      <td>0.336833</td>
      <td>8.641768</td>
      <td>-8.708471</td>
      <td>-0.003946</td>
    </tr>
    <tr>
      <th>parch</th>
      <td>0.013287</td>
      <td>0.034776</td>
      <td>-1.459378</td>
      <td>0.336833</td>
      <td>0.749195</td>
      <td>9.928031</td>
      <td>4.237190</td>
      <td>0.013316</td>
    </tr>
    <tr>
      <th>fare</th>
      <td>-24.227788</td>
      <td>6.146023</td>
      <td>114.416613</td>
      <td>8.641768</td>
      <td>9.928031</td>
      <td>2678.959738</td>
      <td>-179.164684</td>
      <td>10.976961</td>
    </tr>
    <tr>
      <th>body</th>
      <td>-2.876653</td>
      <td>0.000000</td>
      <td>81.622922</td>
      <td>-8.708471</td>
      <td>4.237190</td>
      <td>-179.164684</td>
      <td>9544.688567</td>
      <td>3.625689</td>
    </tr>
    <tr>
      <th>has_cabin_number</th>
      <td>-0.249992</td>
      <td>0.061406</td>
      <td>1.463138</td>
      <td>-0.003946</td>
      <td>0.013316</td>
      <td>10.976961</td>
      <td>3.625689</td>
      <td>0.174613</td>
    </tr>
  </tbody>
</table>
</div>




```
numtitanic.corr()
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>pclass</th>
      <th>survived</th>
      <th>age</th>
      <th>sibsp</th>
      <th>parch</th>
      <th>fare</th>
      <th>body</th>
      <th>has_cabin_number</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>pclass</th>
      <td>1.000000</td>
      <td>-0.312469</td>
      <td>-0.366370</td>
      <td>0.060832</td>
      <td>0.018322</td>
      <td>-0.558629</td>
      <td>-0.034642</td>
      <td>-0.713857</td>
    </tr>
    <tr>
      <th>survived</th>
      <td>-0.312469</td>
      <td>1.000000</td>
      <td>-0.050199</td>
      <td>-0.027825</td>
      <td>0.082660</td>
      <td>0.244265</td>
      <td>NaN</td>
      <td>0.302250</td>
    </tr>
    <tr>
      <th>age</th>
      <td>-0.366370</td>
      <td>-0.050199</td>
      <td>1.000000</td>
      <td>-0.190747</td>
      <td>-0.130872</td>
      <td>0.171892</td>
      <td>0.059059</td>
      <td>0.271887</td>
    </tr>
    <tr>
      <th>sibsp</th>
      <td>0.060832</td>
      <td>-0.027825</td>
      <td>-0.190747</td>
      <td>1.000000</td>
      <td>0.373587</td>
      <td>0.160238</td>
      <td>-0.099961</td>
      <td>-0.009064</td>
    </tr>
    <tr>
      <th>parch</th>
      <td>0.018322</td>
      <td>0.082660</td>
      <td>-0.130872</td>
      <td>0.373587</td>
      <td>1.000000</td>
      <td>0.221539</td>
      <td>0.051099</td>
      <td>0.036806</td>
    </tr>
    <tr>
      <th>fare</th>
      <td>-0.558629</td>
      <td>0.244265</td>
      <td>0.171892</td>
      <td>0.160238</td>
      <td>0.221539</td>
      <td>1.000000</td>
      <td>-0.043110</td>
      <td>0.507253</td>
    </tr>
    <tr>
      <th>body</th>
      <td>-0.034642</td>
      <td>NaN</td>
      <td>0.059059</td>
      <td>-0.099961</td>
      <td>0.051099</td>
      <td>-0.043110</td>
      <td>1.000000</td>
      <td>0.083796</td>
    </tr>
    <tr>
      <th>has_cabin_number</th>
      <td>-0.713857</td>
      <td>0.302250</td>
      <td>0.271887</td>
      <td>-0.009064</td>
      <td>0.036806</td>
      <td>0.507253</td>
      <td>0.083796</td>
      <td>1.000000</td>
    </tr>
  </tbody>
</table>
</div>



# Orthogonality

## 2.1 Plot two vectors that are orthogonal to each other. What is a synonym for orthogonal?


```
vector_1 = [-3,3]
vector_2 = [3,3]

plt.arrow(0,0, vector_1[0], vector_1[1],head_width=.05, head_length=0.05, color ='red')
plt.arrow(0,0, vector_2[0], vector_2[1],head_width=.05, head_length=0.05, color ='green')
plt.xlim(-3,3)          
plt.ylim(-3,3)
plt.title("Orthogonal Vectors")
plt.show()


```

### A synonym for orthogonal is perpendicualr 

## 2.2 Are the following vectors orthogonal? Why or why not?

\begin{align}
a = \begin{bmatrix} -5 \\ 3 \\ 7 \end{bmatrix}
\qquad
b = \begin{bmatrix} 6 \\ -8 \\ 2 \end{bmatrix}
\end{align}


```
a = np.array([-5, 3, 7])
b = np.array([6, -8, 2])

dot = np.dot(a,b)
print(dot, "Not Orthogonal")
```

    -40 Not Orthogonal


## 2.3 Compute the following values: What do these quantities have in common?

## What is $||c||^2$? 

## What is $c \cdot c$? 

## What is $c^{T}c$?

\begin{align}
c = \begin{bmatrix} 2 & -15 & 6 & 20 \end{bmatrix}
\end{align}


```
from numpy import linalg as LA

c = np.array([2, -15, 6, 20])
# C norm squared
normC = LA.norm(c)**2
print(normC)

#C C
cdot = np.dot(c,c)
print(cdot)

#CT C
ctransposec = np.transpose(c)*c
print(ctransposec)\

# The quatites for the norm and the dot prodcut are the same 
```

    665.0
    665
    [  4 225  36 400]


# Unit Vectors

## 3.1 Using Latex, write the following vectors as a linear combination of scalars and unit vectors:

\begin{align}
d = \begin{bmatrix} 7 \\ 12 \end{bmatrix}
\qquad
e = \begin{bmatrix} 2 \\ 11 \\ -8  \end{bmatrix}
\end{align}

\begin{align}
d = \begin{bmatrix} 7 \\ 12 \end{bmatrix} = 7\begin{bmatrix} 1 \\ 0 \end{bmatrix} + 12\begin{bmatrix} 0 \\ 1 \end{bmatrix} \end{align}

\begin{align}
e = \begin{bmatrix} 2 \\ 11 \\ -8 \end{bmatrix} = 2\begin{bmatrix} 1 \\ 0 \\ 0 \end{bmatrix} + 11\begin{bmatrix} 0 \\ 1 \\ 0 \end{bmatrix}  + -8\begin{bmatrix} 0 \\ 0 \\ 1 \end{bmatrix} \end{align}

## 3.2 Turn vector $f$ into a unit vector:

\begin{align}
f = \begin{bmatrix} 4 & 12 & 11 & 9 & 2 \end{bmatrix}
\end{align}


```
f = np.array([4, 12, 11,9, 2])

f_hat = f/LA.norm(f)
print(f_hat)
```

    [0.20908335 0.62725005 0.57497921 0.47043754 0.10454167]


# Linear Independence / Dependence 

## 4.1 Plot two vectors that are linearly dependent and two vectors that are linearly independent (bonus points if done in $\mathbb{R}^3$).

# Span

## 5.1 What is the span of the following vectors?

\begin{align}
g = \begin{bmatrix} 1 & 2 \end{bmatrix}
\qquad
h = \begin{bmatrix} 4 & 8 \end{bmatrix}
\end{align}


```
g = np.array([1,2])
h = np.array([4,8])

# STILL NOT SURE


```

## 5.2 What is the span of $\{l, m, n\}$?

\begin{align}
l = \begin{bmatrix} 1 & 2 & 3 \end{bmatrix}
\qquad
m = \begin{bmatrix} -1 & 0 & 7 \end{bmatrix}
\qquad
n = \begin{bmatrix} 4 & 8  & 2\end{bmatrix}
\end{align}


```
#STILL NOT SURE 
```

# Basis

## 6.1 Graph two vectors that form a basis for $\mathbb{R}^2$




```
a = np.array([0,2])
b = np.array([1,0])

vectors = [a,b]

fig = plt.figure()
for vec in vectors:
    plt.arrow(0,0,vec[0],vec[1], head_width=0.2, 
              head_length=0.3, length_includes_head = True)

plt.xlim(-1,3)          
plt.ylim(-1,3)

plt.show()
```

## 6.2 What does it mean to form a basis?

A set of vectors forms the basis of a vector space if they are linearly independent and their linear combinations fill that space.

# Rank

## 7.1 What is the Rank of P?

\begin{align}
P = \begin{bmatrix} 
1 & 2 & 3 \\
 -1 & 0 & 7 \\
4 & 8  & 2
\end{bmatrix}
\end{align}


```
P = np.array([[1,2,3],[-1,0,7],[4,8,2]])
print('Rank: ' + str(np.linalg.matrix_rank(P)))
```

    Rank: 3


## 7.2 What does the rank of a matrix tell us?

The rank of a matrix is the dimension of the vector space that its columns span. In this case, it tells us that the columns of this matrix span all of 3D space, $\mathbb{R}^3$.

# Linear Projections

## 8.1 Line $L$ is formed by all of the vectors that can be created by scaling vector $v$ 
\begin{align}
v = \begin{bmatrix} 1 & 3 \end{bmatrix}
\end{align}

\begin{align}
w = \begin{bmatrix} -1 & 2 \end{bmatrix}
\end{align}

## find $proj_{L}(w)$

## graph your projected vector to check your work (make sure your axis are square/even)


```

```

# Stretch Goal

## For vectors that begin at the origin, the coordinates of where the vector ends can be interpreted as regular data points. (See 3Blue1Brown videos about Spans, Basis, etc.)

## Write a function that can calculate the linear projection of each point (x,y) (vector) onto the line y=x. run the function and plot the original points in blue and the new projected points on the line y=x in red. 

## For extra points plot the orthogonal vectors as a dashed line from the original blue points to the projected red points.


```
import pandas as pd
import matplotlib.pyplot as plt

# Creating a dataframe for you to work with -Feel free to not use the dataframe if you don't want to.
x_values = [1, 4, 7, 3, 9, 4, 5 ]
y_values = [4, 2, 5, 0, 8, 2, 8]

data = {"x": x_values, "y": y_values}

df = pd.DataFrame(data)

df.head()

plt.scatter(df.x, df.y)
plt.show()
```


```

```

3c034fc0f79ba1906e5ce8b57fa8312de4c1e1f0
ipynb
Jupyter Notebook
DS-Unit-1-Sprint-4-Linear-Algebra-master/module2-intermediate-linear-algebra/Intermediate_Linear_Algebra_Assignment.ipynb
nvisagan/DS_LDS1
f576a91ff080ec5c2ad115e3230cf04dc362001a
MIT
DS-Unit-1-Sprint-4-Linear-Algebra-master/module2-intermediate-linear-algebra/Intermediate_Linear_Algebra_Assignment.ipynb
nvisagan/DS_LDS1
f576a91ff080ec5c2ad115e3230cf04dc362001a
MIT
DS-Unit-1-Sprint-4-Linear-Algebra-master/module2-intermediate-linear-algebra/Intermediate_Linear_Algebra_Assignment.ipynb
nvisagan/DS_LDS1
f576a91ff080ec5c2ad115e3230cf04dc362001a
MIT
Qwen/Qwen-72B
1. YES
2. YES