Monthly premium and
claim amount
Data
motor_data <- data.frame(
premium = c(37, 70, 98, 84, 99, 91, 88, 135, 134, 41, 57, 100),
claim = c(2523, 6554, 7703, 5927, 2683, 2695,
6047, 13171, 10657, 2528, 2672, 5313)
)
knitr::kable(
motor_data,
format = "html",
col.names = c("Monthly premium (AUD)", "Claim amount (AUD)"),
caption = "Motor-insurance observations",
align = c("r", "r"),
table.attr = 'class="table table-striped table-hover" style="width:65%; margin-left:auto; margin-right:auto;"'
)
Motor-insurance observations
|
Monthly premium (AUD)
|
Claim amount (AUD)
|
|
37
|
2523
|
|
70
|
6554
|
|
98
|
7703
|
|
84
|
5927
|
|
99
|
2683
|
|
91
|
2695
|
|
88
|
6047
|
|
135
|
13171
|
|
134
|
10657
|
|
41
|
2528
|
|
57
|
2672
|
|
100
|
5313
|
There are 12 paired observations. Each row relates one monthly
premium to its corresponding claim amount.
Descriptive
statistics
motor_summary <- data.frame(
Variable = c("Monthly premium", "Claim amount"),
Mean = c(mean(motor_data$premium), mean(motor_data$claim)),
Median = c(median(motor_data$premium), median(motor_data$claim)),
`Standard deviation` = c(sd(motor_data$premium), sd(motor_data$claim)),
Minimum = c(min(motor_data$premium), min(motor_data$claim)),
Maximum = c(max(motor_data$premium), max(motor_data$claim)),
check.names = FALSE
)
knitr::kable(
motor_summary,
format = "html",
digits = 2,
caption = "Descriptive statistics for premiums and claims",
align = c("l", "r", "r", "r", "r", "r"),
table.attr = 'class="table table-striped table-hover" style="width:100%;"'
)
Descriptive statistics for premiums and claims
|
Variable
|
Mean
|
Median
|
Standard deviation
|
Minimum
|
Maximum
|
|
Monthly premium
|
86.17
|
89.5
|
31.29
|
37
|
135
|
|
Claim amount
|
5706.08
|
5620.0
|
3475.97
|
2523
|
13171
|
The average monthly premium is $86.17, while the average claim is
$5,706.08. Claim amounts are substantially more dispersed than premiums
in dollar terms. The largest claim, $13,171, should be noted when
interpreting the relationship.
Scatterplot and
fitted relationship
motor_model <- lm(claim ~ premium, data = motor_data)
plot(
claim ~ premium,
data = motor_data,
main = "Monthly Premium and Claim Amount",
xlab = "Monthly premium ($)",
ylab = "Claim amount ($)",
pch = 19,
col = "#2878B5"
)
text(
motor_data$premium,
motor_data$claim,
labels = seq_len(nrow(motor_data)),
pos = 3,
cex = 0.75,
col = "#444444"
)
abline(motor_model, col = "#D73027", lwd = 2)
The scatterplot displays a clear upward pattern. The Pearson
correlation is
\[
r=0.787,
\]
which indicates a strong positive linear association in this
sample.
motor_coef <- summary(motor_model)$coefficients
knitr::kable(
data.frame(
Term = c("Intercept", "Monthly premium"),
Estimate = motor_coef[, "Estimate"],
`Standard error` = motor_coef[, "Std. Error"],
`t statistic` = motor_coef[, "t value"],
`p-value` = motor_coef[, "Pr(>|t|)"],
check.names = FALSE
),
digits = 4,
caption = "Regression of claim amount on monthly premium"
)
Regression of claim amount on monthly premium
| (Intercept) |
Intercept |
-1824.1390 |
1978.4771 |
-0.9220 |
0.3782 |
| premium |
Monthly premium |
87.3914 |
21.6877 |
4.0295 |
0.0024 |
The fitted equation is
\[
\widehat{\text{Claim}}
=-1824.14
+87.39(\text{Premium}).
\]
The slope means that a $1 increase in monthly premium is associated
with an estimated average increase of $87.39 in claim amount.
Equivalently, a $10 increase in premium is associated with an estimated
$873.91 increase in claim amount.
The slope p-value is 0.0024, which is below 0.05. The data therefore
provide evidence of a positive linear association. The model has \(R^2=0.619\), so approximately 61.9% of the
observed variation in claim amounts is explained by monthly premium
through this fitted linear model.
This is an association rather than proof that higher premiums cause
larger claims. Insurers generally charge higher premiums to
policyholders assessed as being higher risk, so underlying risk could
influence both variables. The sample is also small, and observations 8
and 9 have high premiums and high claims, giving them substantial
influence on the fitted line.
Income and monthly
premium
Data
income_data <- data.frame(
income = c(51066, 34378, 43072, 25222, 36765, 23091,
48269, 32720, 20396, 21513, 72540),
premium = c(76, 142, 37, 70, 98, 84, 99, 91, 88, 135, 134)
)
knitr::kable(
income_data,
format = "html",
col.names = c("Income (AUD)", "Monthly premium (AUD)"),
caption = "Policyholder income and premium observations",
align = c("r", "r"),
table.attr = 'class="table table-striped table-hover" style="width:65%; margin-left:auto; margin-right:auto;"'
)
Policyholder income and premium observations
|
Income (AUD)
|
Monthly premium (AUD)
|
|
51066
|
76
|
|
34378
|
142
|
|
43072
|
37
|
|
25222
|
70
|
|
36765
|
98
|
|
23091
|
84
|
|
48269
|
99
|
|
32720
|
91
|
|
20396
|
88
|
|
21513
|
135
|
|
72540
|
134
|
Descriptive
statistics
income_summary <- data.frame(
Variable = c("Income", "Monthly premium"),
Mean = c(mean(income_data$income), mean(income_data$premium)),
Median = c(median(income_data$income), median(income_data$premium)),
`Standard deviation` = c(sd(income_data$income), sd(income_data$premium)),
Minimum = c(min(income_data$income), min(income_data$premium)),
Maximum = c(max(income_data$income), max(income_data$premium)),
check.names = FALSE
)
knitr::kable(
income_summary,
format = "html",
digits = 2,
caption = "Descriptive statistics for income and monthly premium",
align = c("l", "r", "r", "r", "r", "r"),
table.attr = 'class="table table-striped table-hover" style="width:100%;"'
)
Descriptive statistics for income and monthly premium
|
Variable
|
Mean
|
Median
|
Standard deviation
|
Minimum
|
Maximum
|
|
Income
|
37184.73
|
34378
|
15803.16
|
20396
|
72540
|
|
Monthly premium
|
95.82
|
91
|
31.44
|
37
|
142
|
The mean income is $37,185, and the mean premium is $95.82. The
maximum income of $72,540 is well above the third quartile and may
influence the analysis.
Scatterplot and
fitted relationship
income_model <- lm(premium ~ income, data = income_data)
plot(
premium ~ income,
data = income_data,
main = "Income and Monthly Premium",
xlab = "Income ($)",
ylab = "Monthly premium ($)",
pch = 19,
col = "#238B45"
)
abline(income_model, col = "#D73027", lwd = 2)
The points are widely scattered and the fitted line is almost flat.
The correlation is
\[
r=0.13,
\]
which indicates only a very weak positive linear association.
income_coef <- summary(income_model)$coefficients
knitr::kable(
data.frame(
Term = c("Intercept", "Income"),
Estimate = income_coef[, "Estimate"],
`Standard error` = income_coef[, "Std. Error"],
`t statistic` = income_coef[, "t value"],
`p-value` = income_coef[, "Pr(>|t|)"],
check.names = FALSE
),
digits = 5,
caption = "Regression of monthly premium on income"
)
Regression of monthly premium on income
| (Intercept) |
Intercept |
86.17847 |
26.37862 |
3.26698 |
0.00973 |
| income |
Income |
0.00026 |
0.00066 |
0.39430 |
0.70254 |
The fitted equation is
\[
\widehat{\text{Premium}}
=86.18
+0.0002592(\text{Income}).
\]
Because a one-dollar income increase is too small to interpret
conveniently, the slope can be scaled to $10,000. An additional $10,000
of income is associated with an estimated premium change of
\[
10{,}000 \times 0.0002592
=\$2.59.
\]
This estimated change is small. The slope p-value is 0.703, so the
sample does not provide evidence of a statistically significant linear
relationship. Furthermore, \(R^2=0.017\): income explains only about
1.7% of the observed variation in monthly premiums.
Sensitivity to the
highest-income observation
income_without_highest <- income_data[-which.max(income_data$income), ]
sensitivity <- data.frame(
Sample = c("All observations", "Highest income excluded"),
Correlation = c(
cor(income_data$income, income_data$premium),
cor(income_without_highest$income, income_without_highest$premium)
)
)
knitr::kable(
sensitivity,
digits = 3,
caption = "Sensitivity of the income–premium correlation"
)
Sensitivity of the income–premium correlation
| All observations |
0.130 |
| Highest income excluded |
-0.275 |
Removing the highest-income observation changes the correlation from
0.13 to -0.275. The sign reversal demonstrates that the estimated
relationship is sensitive to one observation and is not robust. Overall,
there is no convincing evidence in this small sample that income is an
important linear predictor of monthly premium. Premiums may instead be
driven by variables such as coverage, age, vehicle type, location and
claims history.
Co-movement of NAB and
ANZ monthly returns
Prices and return
calculation
share_data <- data.frame(
date = as.Date(
c(
"04/01/2022", "01/02/2022", "01/03/2022", "01/04/2022",
"02/05/2022", "01/06/2022", "01/07/2022", "01/08/2022",
"01/09/2022", "03/10/2022", "01/11/2022", "01/12/2022",
"03/01/2023", "01/02/2023", "01/03/2023", "03/04/2023",
"01/05/2023", "01/06/2023"
),
format = "%d/%m/%Y"
),
NAB = c(
27.16, 25.53, 27.13, 29.86, 29.86, 29.82, 26.01, 28.91, 28.65,
27.16, 30.92, 30.72, 28.53, 30.77, 28.49, 27.06, 28.30, 26.04
),
ANZ = c(
25.59, 24.24, 23.92, 24.84, 24.95, 23.76, 20.66, 21.35, 21.26,
21.38, 24.37, 24.13, 22.25, 24.44, 23.56, 22.45, 23.71, 22.73
)
)
share_data$NAB_return <- c(
NA,
diff(share_data$NAB) / head(share_data$NAB, -1) * 100
)
share_data$ANZ_return <- c(
NA,
diff(share_data$ANZ) / head(share_data$ANZ, -1) * 100
)
display_share_data <- transform(
share_data,
date = format(date, "%d %b %Y"),
NAB_return = round(NAB_return, 2),
ANZ_return = round(ANZ_return, 2)
)
knitr::kable(
display_share_data,
format = "html",
col.names = c(
"Date", "NAB price (AUD)", "ANZ price (AUD)",
"NAB return (%)", "ANZ return (%)"
),
caption = "Monthly share prices and calculated simple returns",
table.attr = 'class="table table-striped table-hover" style="width:100%;"'
)
Monthly share prices and calculated simple returns
|
Date
|
NAB price (AUD)
|
ANZ price (AUD)
|
NAB return (%)
|
ANZ return (%)
|
|
04 Jan 2022
|
27.16
|
25.59
|
NA
|
NA
|
|
01 Feb 2022
|
25.53
|
24.24
|
-6.00
|
-5.28
|
|
01 Mar 2022
|
27.13
|
23.92
|
6.27
|
-1.32
|
|
01 Apr 2022
|
29.86
|
24.84
|
10.06
|
3.85
|
|
02 May 2022
|
29.86
|
24.95
|
0.00
|
0.44
|
|
01 Jun 2022
|
29.82
|
23.76
|
-0.13
|
-4.77
|
|
01 Jul 2022
|
26.01
|
20.66
|
-12.78
|
-13.05
|
|
01 Aug 2022
|
28.91
|
21.35
|
11.15
|
3.34
|
|
01 Sep 2022
|
28.65
|
21.26
|
-0.90
|
-0.42
|
|
03 Oct 2022
|
27.16
|
21.38
|
-5.20
|
0.56
|
|
01 Nov 2022
|
30.92
|
24.37
|
13.84
|
13.99
|
|
01 Dec 2022
|
30.72
|
24.13
|
-0.65
|
-0.98
|
|
03 Jan 2023
|
28.53
|
22.25
|
-7.13
|
-7.79
|
|
01 Feb 2023
|
30.77
|
24.44
|
7.85
|
9.84
|
|
01 Mar 2023
|
28.49
|
23.56
|
-7.41
|
-3.60
|
|
03 Apr 2023
|
27.06
|
22.45
|
-5.02
|
-4.71
|
|
01 May 2023
|
28.30
|
23.71
|
4.58
|
5.61
|
|
01 Jun 2023
|
26.04
|
22.73
|
-7.99
|
-4.13
|
Prices are not compared directly because two trending price series
can appear related even when their month-to-month movements are not.
Instead, the simple percentage return for month \(t\) is calculated as
\[
R_t=\frac{P_t-P_{t-1}}{P_{t-1}}\times100,
\]
where \(P_t\) is the current price
and \(P_{t-1}\) is the preceding
month’s price. For example, NAB’s February 2022 return is
\[
\frac{25.53-27.16}{27.16}\times100
=-6\%.
\]
The first month has no return because no earlier price is supplied.
There are therefore 17 paired monthly returns.
Return
distributions
return_summary <- data.frame(
Bank = c("NAB", "ANZ"),
`Mean return (%)` = c(
mean(share_data$NAB_return, na.rm = TRUE),
mean(share_data$ANZ_return, na.rm = TRUE)
),
`Median return (%)` = c(
median(share_data$NAB_return, na.rm = TRUE),
median(share_data$ANZ_return, na.rm = TRUE)
),
`Standard deviation (%)` = c(
sd(share_data$NAB_return, na.rm = TRUE),
sd(share_data$ANZ_return, na.rm = TRUE)
),
`Minimum return (%)` = c(
min(share_data$NAB_return, na.rm = TRUE),
min(share_data$ANZ_return, na.rm = TRUE)
),
`Maximum return (%)` = c(
max(share_data$NAB_return, na.rm = TRUE),
max(share_data$ANZ_return, na.rm = TRUE)
),
check.names = FALSE
)
knitr::kable(
return_summary,
digits = 2,
caption = "Descriptive statistics for monthly returns"
)
Descriptive statistics for monthly returns
| NAB |
0.03 |
-0.65 |
7.75 |
-12.78 |
13.84 |
| ANZ |
-0.50 |
-0.98 |
6.53 |
-13.05 |
13.99 |
The sample mean monthly return is 0.03% for NAB and -0.5% for ANZ.
The sample standard deviations are 7.75% and 6.53%, respectively.
Standard deviation is used here as a measure of monthly volatility, so
NAB was somewhat more volatile over this short period.
Returns through
time
return_range <- range(
share_data$NAB_return,
share_data$ANZ_return,
na.rm = TRUE
)
plot(
share_data$date,
share_data$NAB_return,
type = "o",
ylim = return_range,
main = "Monthly Returns of NAB and ANZ",
xlab = "Date",
ylab = "Monthly return (%)",
col = "#2166AC",
pch = 19
)
lines(
share_data$date,
share_data$ANZ_return,
type = "o",
col = "#B2182B",
pch = 17
)
abline(h = 0, lty = 2, col = "grey50")
legend(
"topright",
legend = c("NAB", "ANZ"),
col = c("#2166AC", "#B2182B"),
pch = c(19, 17),
lty = 1,
bty = "n"
)
The two lines frequently rise and fall together. Both banks
experienced their lowest return in July 2022 and their highest return in
November 2022. This visual co-movement is consistent with the banks
being exposed to common market and economic conditions.
Correlation and
regression
return_model <- lm(ANZ_return ~ NAB_return, data = share_data)
plot(
share_data$NAB_return,
share_data$ANZ_return,
main = "NAB and ANZ Monthly Returns",
xlab = "NAB monthly return (%)",
ylab = "ANZ monthly return (%)",
pch = 19,
col = "#6A3D9A"
)
abline(return_model, col = "#D73027", lwd = 2)
abline(h = 0, v = 0, lty = 3, col = "grey65")
The return correlation is
\[
r=0.865,
\]
indicating a strong positive linear association.
return_coef <- summary(return_model)$coefficients
knitr::kable(
data.frame(
Term = c("Intercept", "NAB monthly return"),
Estimate = return_coef[, "Estimate"],
`Standard error` = return_coef[, "Std. Error"],
`t statistic` = return_coef[, "t value"],
`p-value` = return_coef[, "Pr(>|t|)"],
check.names = FALSE
),
digits = 4,
caption = "Regression of ANZ monthly returns on NAB monthly returns"
)
Regression of ANZ monthly returns on NAB monthly
returns
| (Intercept) |
Intercept |
-0.5191 |
0.8224 |
-0.6312 |
0.5374 |
| NAB_return |
NAB monthly return |
0.7286 |
0.1094 |
6.6627 |
0.0000 |
The fitted equation is
\[
\widehat{R}_{ANZ}
=-0.519
+0.729R_{NAB}.
\]
Thus, a one-percentage-point increase in NAB’s monthly return is
associated with an estimated 0.729-percentage-point increase in ANZ’s
monthly return on average. The slope p-value is 0.00000757, which
provides strong evidence of positive co-movement.
For a simple regression with one explanatory variable, \(R^2=r^2\). Here,
\[
R^2=(0.865)^2
\approx 0.747.
\]
Therefore, about 74.7% of the sample variation in ANZ monthly returns
is explained by its linear association with NAB monthly returns. The
remaining variation reflects company-specific information, measurement
noise and other factors not represented by this one-variable model.