Public
Edited
Jul 25, 2023
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
marCasadoAir = FileAttachment("marCasadoAir@5.csv").csv({typed: true}) // Date issue
Insert cell
marCasadoSea = FileAttachment("marCasadoSea@4.csv").csv({typed: true}) // Date issue
Insert cell
Insert cell
// Write code to create a database called marCasadoDB, with tables 'air' and 'sea':
marCasadoDB = DuckDBClient.of({air: marCasadoAir, sea: marCasadoSea})
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
marCasadoDB
SELECT air.month, air.meanPressure, air.windSpeed, air.PAR, air.meanHumidity, air.windDirection, sea.maxTide, sea.minTide, sea.salinity, sea.seaSurfaceTemp as SST,
CASE WHEN date_part('month',air.month) IN (10,11,12,1,2,3) THEN 'hot moist' else 'cool dry'
END AS 'season',
FROM air
JOIN sea
ON air.month = sea.month

Insert cell
marCasado //verify that the SQL above has created a named object
Insert cell
Insert cell
Insert cell
Insert cell
// Write Plot code to create a heatmap of sea surface temperature (SST) by year and month, starting from the 'cell' snippet:

Insert cell
Plot.plot({
marks: [
Plot.cell(marCasado.slice(-365), {
x: d => d.month.getUTCMonth(),
y: d => d.month.getUTCFullYear(),
fill: "SST"
})
]
})
Insert cell
Insert cell
Plot.plot({
marks: [
Plot.cell(marCasado.slice(-365), {
x: d => d.month.getUTCMonth(),
y: d => d.month.getUTCFullYear(),
fill: "SST",
tip: true
})
],
y: {tickFormat: "Y", padding: 0},
x: { padding:0, tickFormat: Plot.formatMonth() }
})
Insert cell
screenShot20230725At105606Am = FileAttachment("Screen Shot 2023-07-25 at 10.56.06 AM.png").image()
Insert cell
Insert cell
Insert cell
import {PlotMatrix} with {marCasado as data} from "@observablehq/autoplot-matrix" // sets data variable to marCasado
Insert cell
// Use the PlotMatrix function (expecting marCasado) to create a pair plot:
PlotMatrix(marCasado)
Insert cell
Insert cell
principalComponentAnalysis = FileAttachment("principal-component-analysis.png").image()
Insert cell
Insert cell
plottingData = FileAttachment("plotting data.png").image()
Insert cell
pcasample = FileAttachment("PCAsample.png").image()
Insert cell
Insert cell
Insert cell
ML = require("https://www.lactame.com/lib/ml/6.0.0/ml.min.js")
Insert cell
Insert cell
import {scale, asMatrix} from "@chrispahm/hierarchical-clustering"
Insert cell
Insert cell
Insert cell
// Create a scaled version of the numeric variables
// so that value is not dependent on value it was measured in
marCasadoScaled = scale(marCasado.map(({season, month, ...rest}) => rest)) // excludes season and month
Insert cell
Insert cell
// Convert to an array of arrays, just containing the values (no keys):
// we have an array of objects initially
marCasadoArray = marCasadoScaled.map(Object.values)
Insert cell
Insert cell
// Perform principal component analysis:
marCasadoPCA = new ML.PCA(marCasadoArray)
// could also do marCasadoPCA = new ML.PCA(marCasadoArray, {scaled: true})
Insert cell
Insert cell
Insert cell
// Get variance explained by each PC:
marCasadoPCA.getExplainedVariance()
// says first value explains 31.2% of the data, and second is 18.4% so two-dimension explains 49% of data
Insert cell
Insert cell
// Get cumulative variance explained:
marCasadoPCA.getCumulativeVariance()
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
// Import viewof loadings from the notebook, with marCasadoScaled as food_scaled:
import {viewof loadings} with {marCasadoScaled as food_scaled} from "@chrispahm/principal-component-analysis"
Insert cell
// Look at viewof loadings:
viewof loadings
Insert cell
// import viewof scores from the notebook, with marCasadoScaled as food_scaled and marCasado as food:
import { viewof scores } with {
marCasadoScaled as food_scaled,
marCasado as food
} from "@chrispahm/principal-component-analysis"
Insert cell
// Look at viewof scores:
viewof scores // name is blankn because it would be our month
Insert cell
// Do some wrangling to get the month and season alongside scores:
scoresCombined = scores.map((d, i) => ({
...d,
Name: marCasado[i].month,
season: marCasado[i].season
}))
Insert cell
// Create a PCA biplot with the scores and loadings
Plot.plot({
// dot for marks
marks: [
Plot.dot(scoresCombined, { x: "PC1", y: "PC2", fill: "season", r: 4 })
]
})
Insert cell
// Create a PCA biplot with the scores and loadings
Plot.plot({
// dot for marks
marks: [
Plot.dot(scoresCombined, { x: "PC1", y: "PC2", fill: "season", r: 4 }),
Plot.arrow(loadings, {x1: 0, x2: d => d.PC1, y1: 0, y2: d => d.PC2})
],
color : {legend: true}
})
Insert cell
scalingFactor = 5 // arrows seems small, solve by scaling
Insert cell
// Create a PCA biplot with the scores and loadings
Plot.plot({
// dot for marks
marks: [
Plot.dot(scoresCombined, { x: "PC1", y: "PC2", fill: "season", r: 4, symbol: "season" }),
Plot.arrow(loadings, {x1: 0, x2: d => d.PC1 * scalingFactor, y1: 0, y2: d => d.PC2 * scalingFactor}) // arrows seems small, solve by scaling
],
color : {legend: true}
})
Insert cell
// Create a PCA biplot with the scores and loadings
Plot.plot({
// dot for marks
marks: [
Plot.dot(scoresCombined, { x: "PC1", y: "PC2", fill: "season", r: 4 }),
Plot.arrow(loadings, {
x1: 0,
x2: (d) => d.PC1 * scalingFactor,
y1: 0,
y2: (d) => d.PC2 * scalingFactor
}),
Plot.text(loadings, {
x: (d) => d.PC1 * scalingFactor,
y: (d) => d.PC2 * scalingFactor,
text: "Variable"
})
],
color: { legend: true }
})
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
// Alternatively (without an import):

// loadingsOption = marCasadoPCA
// .getEigenvectors()
// .data.map((d, i) => ({
// PC1: d[0],
// PC2: d[1],
// Variable: Object.keys(marCasadoScaled[0])[i]
// }))
Insert cell
// Alternatively to get score (projections into PC space):

// scoresOption = marCasadoPCA.predict(marCasadoArray).data.map((d,i) => ({month: marCasado[i].month,
// season: marCasado[i].season,
// PC1: d[0],
// PC2: d[1]}))
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more