Obiettivo: Creare un modello statistico in grado di prevedere con precisione il peso dei neonati alla nascita, basandosi su variabili cliniche raccolte da tre ospedali. Il progetto mira a migliorare la gestione delle gravidanze ad alto rischio, ottimizzare le risorse ospedaliere e garantire migliori risultati per la salute neonatale.
Il progetto si inserisce all’interno di un contesto di crescente attenzione verso la prevenzione delle complicazioni neonatali. La possibilità di prevedere il peso alla nascita dei neonati rappresenta un’opportunità fondamentale per migliorare la pianificazione clinica e ridurre i rischi associati a nascite problematiche, come parti prematuri o neonati con basso peso. Di seguito, i principali benefici che questo progetto porterà all’azienda e al settore sanitario:
Miglioramento delle previsioni cliniche:
Ottimizzazione delle risorse ospedaliere:
Prevenzione e identificazione dei fattori di rischio:
Valutazione delle pratiche ospedaliere:
Supporto alla pianificazione strategica:
Carico le librerie, le funzioni e il dataset
Installazione dei packages usati e verifica della versione
# library installatiion
library(ggplot2)
## Warning: il pacchetto 'ggplot2' è stato creato con R versione 4.4.1
# Packages verification installation
packageVersion("ggplot2")
## [1] '3.5.1'
########
# Load the moments package for skewness and kurtosis calculations
library(moments)
# Packages verification installation
packageVersion("moments")
## [1] '0.14.1'
########
# Load the moments package for skewness and kurtosis calculations
library(dplyr)
## Warning: il pacchetto 'dplyr' è stato creato con R versione 4.4.1
##
## Caricamento pacchetto: 'dplyr'
## I seguenti oggetti sono mascherati da 'package:stats':
##
## filter, lag
## I seguenti oggetti sono mascherati da 'package:base':
##
## intersect, setdiff, setequal, union
# Packages verification installation
packageVersion("dplyr")
## [1] '1.1.4'
########
# Load the moments package for skewness and kurtosis calculations
library(stringr)
## Warning: il pacchetto 'stringr' è stato creato con R versione 4.4.1
# Packages verification installation
packageVersion("stringr")
## [1] '1.5.1'
########
# Load the ineq package for Gini calculations
library(ineq)
# Packages verification installation
packageVersion("ineq")
## [1] '0.2.13'
########
# Load the tidyr package for line charts
library(tidyr)
## Warning: il pacchetto 'tidyr' è stato creato con R versione 4.4.2
# Packages verification installation
packageVersion("tidyr")
## [1] '1.3.1'
########
# Load the knitr package for line charts
library(knitr)
## Warning: il pacchetto 'knitr' è stato creato con R versione 4.4.1
# Packages verification installation
packageVersion("knitr")
## [1] '1.48'
# library installatiion
library(car)
## Warning: il pacchetto 'car' è stato creato con R versione 4.4.2
## Caricamento del pacchetto richiesto: carData
## Warning: il pacchetto 'carData' è stato creato con R versione 4.4.2
##
## Caricamento pacchetto: 'car'
## Il seguente oggetto è mascherato da 'package:dplyr':
##
## recode
# Packages verification installation
packageVersion("car")
## [1] '3.1.3'
########
# library installatiion
library(lmtest)
## Warning: il pacchetto 'lmtest' è stato creato con R versione 4.4.2
## Caricamento del pacchetto richiesto: zoo
## Warning: il pacchetto 'zoo' è stato creato con R versione 4.4.1
##
## Caricamento pacchetto: 'zoo'
## I seguenti oggetti sono mascherati da 'package:base':
##
## as.Date, as.Date.numeric
# Packages verification installation
packageVersion("lmtest")
## [1] '0.9.40'
########
############################################################################
# Function to calculate mean, median, min, max, first quantile and third quantile # for each numeric column in a dataframe
############################################################################
calculate_index_pos <- function(df) {
# Select only numeric columns
numeric_df <- df[sapply(df, is.numeric)]
# Calculate mean, median, min, and max for each column
stats <- data.frame(
Mean = sapply(numeric_df, mean, na.rm = TRUE),
Median = sapply(numeric_df, median, na.rm = TRUE),
Mode = sapply(numeric_df, getmode),
Min = sapply(numeric_df, min, na.rm = TRUE),
Max = sapply(numeric_df, max, na.rm = TRUE),
Qtl.25 = sapply(numeric_df, quantile, probs=0.25, na.rm = TRUE),
Qtl.75 = sapply(numeric_df, quantile, probs=0.75, na.rm = TRUE)
)
return(stats)
}
############################################################################
############################################################################
# Calculate variance index of dataframe
############################################################################
calculate_variance_index <- function(df) {
# Select only numeric columns
numeric_df <- df[sapply(df, is.numeric)]
# Calculate variance index
stats = data.frame(
Range =sapply(numeric_df, getrange),
IQR =sapply(numeric_df, IQR, na.rm = TRUE),
variance =sapply(numeric_df, var, na.rm = TRUE),
st.dev =sapply(numeric_df, sd, na.rm = TRUE),
CV =sapply(numeric_df, CV )
)
return(stats)
}
#
############################################################################
############################################################################
# Calculate the shape of a dataframe
############################################################################
calculate_shape = function(df) {
# Select only numeric columns
numeric_df = df[sapply(df, is.numeric)]
# Calculate variance index
stats = data.frame(
Asym_ind =sapply(numeric_df, skewness,na.rm = TRUE),
Kurtosis =sapply(numeric_df, kurtosis, na.rm = TRUE)
)
return(stats)
}
############################################################################
############################################################################
# Get mode of the vector
############################################################################
getmode <- function(v) {
uniqv <- unique(v)
uniqv[which.max(tabulate(match(v, uniqv)))]
}
#
############################################################################
############################################################################
# Get the range of a vector
############################################################################
getrange <- function(v) {
range = max(v)-min(v)
return(range)
}
############################################################################
############################################################################
# Function Variance %
############################################################################
CV = function(x){
return = ( sd(x)/mean(x)*100 )
}
############################################################################
############################################################################
# GINI index a
############################################################################
gini.index = function(x){
ni=table(x)
fi=ni/length(x)
fi2=fi^2
J = length (table(x))
gini = 1 - sum(fi2)
gini.normalizzato = gini/((J-1)/J)
return(gini.normalizzato)
}
#
############################################################################
############################################################################
# class and graph maker
############################################################################
freq_grap = function(x,
seq_start,
seq_end,
seq_steps,
title_desc,
x_desc,
y_desc,
y_start,
y_end,
y_steps) {
# Create the classes
x_cl = cut(x, seq(seq_start, seq_end, seq_steps))
x_n = length(x)
# Create the frequency distribution table
distr_freq = as.data.frame(
cbind(
ni = table(x_cl), # Absolute frequency
fi = table(x_cl) / x_n, # Relative frequency
Ni = cumsum(table(x_cl)), # Cumulative absolute frequency
Fi = cumsum(table(x_cl) / x_n) # Cumulative relative frequency
)
)
# Create the frequency distribution plot
plot = ggplot(data = as.data.frame(x_cl)) +
geom_bar(aes(x = x_cl),
position = "stack",
stat = "count",
col = "black",
fill = "lightblue") +
labs(title = title_desc,
x =x_desc,
y =y_desc) +
scale_y_continuous(breaks = seq(y_start, y_end, y_steps)) +
theme_classic() +
theme(legend.position = "bottom")
print(plot) # Force the plot to display
return(distr_freq)
}
#
############################################################################
############################################################################
# word counter
############################################################################
count_word = function(word, text_vector) {
# Convert to lowercase for case-insensitive search
word = tolower(word)
text_vector = tolower(text_vector)
# Count occurrences of the specific word in each element of the vector
count = sum(sapply(text_vector, function(text) {
str_count(text, paste0("\\b", word, "\\b"))
}))
return(count)
}
#
############################################################################
############################################################################
# words counter in columns -
############################################################################
count_words_in_columns = function(df, column_A, word_A, column_B, word_B) {
# Convert words to lowercase for case-insensitive search
word_A = tolower(word_A)
word_B = tolower(word_B)
# Initialize counter
count = 0
# Loop through each row of the dataframe
for (i in seq_len(nrow(df))) {
# Convert values in specified columns to lowercase for case-insensitive comparison
text_A = tolower(as.character(df[i, column_A]))
text_B = tolower(as.character(df[i, column_B]))
# Check if word_A is in column_A and word_B is in column_B for the same row
if (grepl(word_A, text_A) & grepl(word_B, text_B)) {
count = count + 1
}
}
return(count)
}
#
############################################################################
############################################################################
# class and graph maker with X labels 45 deg
############################################################################
freq_grap_45 = function(x,
seq_start,
seq_end,
seq_steps,
title_desc,
x_desc,
y_desc,
y_start,
y_end,
y_steps) {
# Create the classes
class_limits = pretty(seq_start:seq_end, n = seq_steps)
x_cl= cut(x,
breaks = class_limits,
include.lowest = TRUE,
right = TRUE, # Classe chiusa a sinistra, aperta a destra
labels=paste0("[", head(class_limits, -1), " - ", tail(class_limits, -1), ")")
)
x_n = length(x)
# Create the frequency distribution table
distr_freq = as.data.frame(
cbind(
ni = table(x_cl), # Absolute frequency
fi = table(x_cl) / x_n, # Relative frequency
Ni = cumsum(table(x_cl)), # Cumulative absolute frequency
Fi = cumsum(table(x_cl) / x_n) # Cumulative relative frequency
)
)
# Create the frequency distribution plot
plot = ggplot(data = as.data.frame(x_cl)) +
geom_bar(aes(x = x_cl),
position = "stack",
stat = "count",
col = "black",
fill = "lightblue") +
labs(title = title_desc,
x =x_desc,
y =y_desc) +
scale_y_continuous(breaks = seq(y_start, y_end, y_steps)) +
theme_classic() +
theme(legend.position = "bottom")+
# Rotate x-axis labels by 45 degrees for readability
theme(axis.text.x = element_text(angle = 45, hjust = 1))+
scale_x_discrete(labels = function(x) gsub("\\(|\\]|,", "", x))
print(plot) # Force the plot to display
return(distr_freq)
}
#
############################################################################
############################################################################
# Function Line Chart by group
############################################################################
line_chart_group = function(dataframe,
data_col,
df_filter_1,
df_filter_2,
x_start,
x_end,
x_steps,
title_desc,
Y_desc,
X_desc,
group_desc,
y_start,
y_end,
y_steps
) {
# Using the {{ }} operator to refer to column names
df_A = NULL
df_A <- dataframe %>%
group_by({{ df_filter_1 }},{{ df_filter_2 }}) %>%
summarise(tot_sum = sum({{data_col}}, na.rm = TRUE)) %>%
ungroup()
# Print the new dataframe created
print(df_A)
ggplot(data = df_A,
aes(x = {{ df_filter_1 }},
y = tot_sum,
color = {{ df_filter_2 }},
group = {{ df_filter_2 }}
))+
geom_line(size = 1)+
theme_minimal() +
# Definisce i nomi degli assi
labs (title = title_desc,
x = X_desc,
y = Y_desc,
fill = group_desc
)+
scale_y_continuous(breaks=seq(y_start,y_end,y_steps))+
if (x_start >0) {
scale_x_continuous(breaks = seq(x_start, x_end, x_steps))
}
}
############################################################################
############################################################################
# Function Line Chart by group + Colored
############################################################################
line_chart_group_col = function(dataframe,
data_col,
df_filter_1,
df_filter_2,
x_start,
x_end,
x_steps,
title_desc,
Y_desc,
X_desc,
group_desc,
y_start,
y_end,
y_steps
) {
# Using the {{ }} operator to refer to column names
df_A = NULL
df_A = dataframe %>%
group_by({{ df_filter_1 }}, {{ df_filter_2 }}) %>%
summarise(tot_sum = sum({{data_col}}, na.rm = TRUE), .groups = "drop") %>%
ungroup()
# Convert {{ df_filter_2 }} to a factor
df_A = df_A %>%
mutate({{ df_filter_2 }} := as.factor({{ df_filter_2 }}))
# Print the new dataframe created
print(df_A)
ggplot(data = df_A,
aes(x = {{ df_filter_1 }},
y = tot_sum,
color = {{ df_filter_2 }},
group = {{ df_filter_2 }}
))+
geom_line(size = 1)+
theme_minimal() +
# Definisce i nomi degli assi
labs (title = title_desc,
x = X_desc,
y = Y_desc,
color = group_desc
)+
scale_y_continuous(breaks = seq(y_start, y_end, y_steps)) +
scale_color_discrete() + # Use discrete color scale
if (x_start > 0) {
scale_x_continuous(breaks = seq(x_start, x_end, x_steps))
}
}
############################################################################
dati_neonati = read.csv("neonati.csv", header = TRUE, sep = ",", fileEncoding = "ISO-8859-1")
dati_neonati_fact = NULL
dati_neonati_fact = read.csv("neonati.csv",
stringsAsFactors = T,
sep="," ,
fileEncoding = "ISO-8859-1"
)
n <- dim(dati_neonati)[1] # Define dataset elements
head(dati_neonati) # Controllo che il dataframe sia stato caricato
## Anni.madre N.gravidanze Fumatrici Gestazione Peso Lunghezza Cranio Tipo.parto
## 1 26 0 0 42 3380 490 325 Nat
## 2 21 2 0 39 3150 490 345 Nat
## 3 34 3 0 38 3640 500 375 Nat
## 4 28 1 0 41 3690 515 365 Nat
## 5 20 0 0 38 3700 480 335 Nat
## 6 32 0 0 40 3200 495 340 Nat
## Ospedale Sesso
## 1 osp3 M
## 2 osp1 F
## 3 osp2 M
## 4 osp2 M
## 5 osp3 F
## 6 osp2 F
sum_no_data=sum(is.na(dati_neonati
))
cat("Numero totale di NA nel dataframe:",sum_no_data, "\n")
## Numero totale di NA nel dataframe: 0
Il dataframe contiene le seguenti variabili
Anni.madre: Età della madre. -> Variabile quantitativa discreta
N.gravidanze: Numero di gravidanze precedenti. -> Variabile quantitativa discreta
Fumatrici: Indica se la madre fuma (0 = no, 1 = sì). -> Variabile qualitativa nominale
Gestazione: Settimane di gestazione. -> Variabile quantitativa discreta
Peso: Peso del neonato in grammi. -> Variabile quantitativa continua
Lunghezza: Lunghezza del neonato in millimetri. -> Variabile quantitativa continua
Cranio: Circonferenza cranica in millimetri. -> Variabile quantitativa continua
Tipo.parto: Tipo di parto (es. naturale o cesareo). -> Variabile qualitativa nominale
Ospedale: Codice dell’ospedale. -> Variabile qualitativa nominale
Sesso: Sesso del neonato (M/F -> Variabile qualitativa nominale
Il dataset non contiene dati mancanti
====================================================================
Costruisco un dataframe che contiene variabili non qualitative
dati_neonati_no_qual = NULL
dati_neonati_no_qual = dati_neonati
dati_neonati_no_qual = dati_neonati_no_qual[, !colnames(dati_neonati_no_qual) %in% "Fumatrici"]
dati_neonati_no_qual = dati_neonati_no_qual[, !colnames(dati_neonati_no_qual) %in% "Tipo.parto"]
dati_neonati_no_qual = dati_neonati_no_qual[, !colnames(dati_neonati_no_qual) %in% "Ospedale"]
dati_neonati_no_qual = dati_neonati_no_qual[, !colnames(dati_neonati_no_qual) %in% "Sesso"]
kable(head(dati_neonati_no_qual),format = "simple", caption = "Dataframe contenente solo variabili quantitative")
| Anni.madre | N.gravidanze | Gestazione | Peso | Lunghezza | Cranio |
|---|---|---|---|---|---|
| 26 | 0 | 42 | 3380 | 490 | 325 |
| 21 | 2 | 39 | 3150 | 490 | 345 |
| 34 | 3 | 38 | 3640 | 500 | 375 |
| 28 | 1 | 41 | 3690 | 515 | 365 |
| 20 | 0 | 38 | 3700 | 480 | 335 |
| 32 | 0 | 40 | 3200 | 495 | 340 |
df_temp = NULL
df_temp = calculate_index_pos(dati_neonati_no_qual)
kable(df_temp,format = "simple", caption = "Dataframe contenente solo variabili quantitative")
| Mean | Median | Mode | Min | Max | Qtl.25 | Qtl.75 | |
|---|---|---|---|---|---|---|---|
| Anni.madre | 28.1640 | 28 | 30 | 0 | 46 | 25 | 32 |
| N.gravidanze | 0.9812 | 1 | 0 | 0 | 12 | 0 | 1 |
| Gestazione | 38.9804 | 39 | 40 | 25 | 43 | 38 | 40 |
| Peso | 3284.0808 | 3300 | 3300 | 830 | 4930 | 2990 | 3620 |
| Lunghezza | 494.6920 | 500 | 500 | 310 | 565 | 480 | 510 |
| Cranio | 340.0292 | 340 | 340 | 235 | 390 | 330 | 350 |
Calcoli di indici di posizione (media, mediana, moda) e dispersione (minimo, massimo, quartili). Analizziamo ogni variabile:
1. Anni.madre
Media (Mean): 28.16 anni. L’età media delle madri è circa 28 anni.
Mediana: 28 anni. L’età centrale è molto vicina alla media, indicando una distribuzione probabilmente simmetrica.
Moda: 30 anni. L’età più comune è 30 anni.
Minimo - Massimo: da 0 a 46 anni, suggerendo la presenza di valori non conformi come 0. Andrà controllato
Primo quartile (Q1): 25 anni.
Terzo quartile (Q3): 32 anni. La maggior parte delle madri ha un’età compresa tra 25 e 32 anni.
I dati indicano una distribuzione simmetrica
2. N.gravidanze
Media: 0.98. Il numero medio di gravidanze è appena sotto 1.
Mediana: 1. Il valore centrale corrisponde a una gravidanza.
Moda: 0 gravidanze, indica che la maggior parte delle donne non ha mai avuto gravidanze
Minimo - Massimo: da 0 a 12 gravidanze, con valori estremi (12 gravidanze), dato anche qui da controllare
Quartili: Il 25% delle donne ha avuto 0 gravidanze, e il 75% ha avuto massimo 1 gravidanza.
I dati indicano una distribuzione simmetrica
3. Gestazione (settimane)
Media: 38.98 settimane. Il valore medio è vicino alla durata standard di una gravidanza (circa 39 settimane).
Mediana: 39 settimane.
Moda: 40 settimane, il valore più comune per una gravidanza a termine.
Minimo - Massimo: da 25 a 43 settimane, con valori bassi (25 settimane) probabilmente associati a parti prematuri.
Quartili: La maggior parte delle gravidanze dura tra 38 e 40 settimane, in linea
4. Peso (grammi)
Media: 3284 grammi (circa 3.28 kg). Peso medio nella norma per un neonato.
Mediana: 3300 grammi.
Moda: 3300 grammi, il valore più frequente.
Minimo - Massimo: da 830 a 4930 grammi. Il minimo sembra indicare un peso estremamente basso (neonati prematuri), mentre il massimo suggerisce un neonato molto grande.
Quartili: Il peso è compreso tra 2990 e 3620 grammi per il 50% dei neonati.
5. Lunghezza (mm)
Media: 494.69 mm (circa 49.5 cm). Lunghezza media adeguata per un neonato.
Mediana: 500 mm (50 cm), un valore comune.
Minimo - Massimo: da 310 a 565 mm. I valori minimi potrebbero indicare anomalie o neonati prematuri.
Quartili: Il 50% dei neonati ha una lunghezza tra 480 e 510 mm.
6. Cranio (mm)
Media: 340 mm (34 cm). Circonferenza cranica media nella norma per un neonato.
Mediana: 340 mm.
Moda: 340 mm, valore centrale molto rappresentativo.
Minimo - Massimo: da 235 a 390 mm. Anche qui, i valori estremi possono indicare neonati prematuri o casi particolari.
Quartili: Il 50% dei neonati ha una circonferenza cranica tra 330 e 350 mm.
La maggior parte delle variabili presenta distribuzioni relativamente simmetriche, come indicato dalla vicinanza tra media e mediana.
Sono presenti valori estremi (outlier) in alcune variabili, come “Anni.madre” (0 anni), “N.gravidanze” (12 gravidanze), “Peso” (830 grammi).
I dati suggeriscono un’analisi ulteriore per verificare errori o valori anomali.
Potremmo usare un Box Plot per analizzare meglio le distribuzioni in oggetto, sopratutto per evidenziare gli outliners e poter considerare essi un dato errato all’origine
ggplot(data=dati_neonati_no_qual)+
geom_boxplot(aes(y=Anni.madre
),
fill="lightblue"
)+
labs(title =" Box plot dell'età della madre",
y = " Età della madre [Anni]")+
scale_y_continuous(breaks=seq(0,50,5))
Distribuzione principale:
La distribuzione sembra relativamente simmetrica per la maggior parte dei dati, con mediana e quartili abbastanza centrati.
Il 50% delle madri si trova in una fascia d’età compresa tra 25 e 32 anni.
Outlier:
I valori inferiori a 15 anni sono anomali e potrebbero rappresentare errori di input o dati eccezionali (madri molto giovani).
I valori superiori a 45 anni, anche se meno frequenti, possono rappresentare madri in età più avanzata o casi speciali.
Intervallo interquartile (IQR):
Si evidenziano numerosi outliners, ma possiamo ricostruire il database eliminando le righe che presentano quelli in basso 0 e 1 visto che sappiamo che sono valori troppo bassi. Li sostituiremo con la mediana.
dati_neonati_no_qual$Anni.madre[dati_neonati_no_qual$Anni.madre<=1] = 28
dati_neonati$Anni.madre[dati_neonati$Anni.madre<=1] = 28
dati_neonati_fact$Anni.madre[dati_neonati_fact$Anni.madre<=1] = 28
=================================================================
df_temp= NULL
df_temp=calculate_variance_index(dati_neonati_no_qual)
df_temp$variance = round(df_temp$variance,2)
kable(df_temp, format = "simple", caption = "Variabilità del dataset")
| Range | IQR | variance | st.dev | CV | |
|---|---|---|---|---|---|
| Anni.madre | 33 | 7 | 27.20 | 5.215121 | 18.502521 |
| N.gravidanze | 12 | 1 | 1.64 | 1.280587 | 130.512310 |
| Gestazione | 18 | 2 | 3.49 | 1.868639 | 4.793792 |
| Peso | 4100 | 630 | 275665.68 | 525.038744 | 15.987388 |
| Lunghezza | 255 | 30 | 692.67 | 26.318644 | 5.320208 |
| Cranio | 155 | 20 | 269.79 | 16.425330 | 4.830565 |
La tabella evidenzia le misure di variabilità: Range, Interquartile Range (IQR), Varianza, Deviazione standard (st.dev) e Coefficiente di variazione (CV). Ecco l’interpretazione dettagliata:
1. Anni.madre
Range: 33 anni (massimo - minimo).
IQR: 7 anni.
Varianza: 27.20.
Deviazione standard: 5.22.
CV (Coefficiente di variazione): 18.50%.
2. N.gravidanze
Range: 12.
IQR: 1.
Varianza: 1.64.
Deviazione standard: 1.28.
CV: 130.51%.
3. Gestazione (settimane)
Range: 18 settimane.
IQR: 2 settimane.
Varianza: 3.49.
Deviazione standard: 1.87.
CV: 4.79%.
4. Peso (grammi)
Range: 4100 grammi.
IQR: 630 grammi.
Varianza: 275665.68.
Deviazione standard: 525.04.
CV: 15.99%.
5. Lunghezza (mm)
Range: 255 mm.
IQR: 30 mm.
Varianza: 692.67.
Deviazione standard: 26.32 mm.
CV: 5.32%.
6. Cranio (mm)
Range: 155 mm.
IQR: 20 mm.
Varianza: 269.79.
Deviazione standard: 16.43 mm.
CV: 4.83%.
Bassa variabilità relativa (CV):
Elevata variabilità relativa:
Ampio range e IQR:
Le variabil peso e numero di gravidenze necessitano di un’analisi approfondita per capire se ci sono degli errori di rilevazione
ggplot(data=dati_neonati_no_qual)+
geom_boxplot(aes(y=Peso
),
fill="lightblue"
)+
labs(title =" Box plot della variabile peso",
y = " Peso del neonato [ Grammi ]")+
scale_y_continuous(breaks=seq(800,5000,250))
distr_freq = freq_grap_45(x = dati_neonati_no_qual$Peso,
seq_start = 500,
seq_end = 5000,
seq_steps = 18,
title_desc = "Distribuzione in classi della variabile peso",
y_desc ="Frequenza assoluta",
x_desc ="Classi di peso del neonato [grammi] ",
y_start = 0,
y_end = 1200,
y_steps = 50
)
print(distr_freq)
## ni fi Ni Fi
## [400 - 600) 0 0.0000 0 0.0000
## [600 - 800) 0 0.0000 0 0.0000
## [800 - 1000) 6 0.0024 6 0.0024
## [1000 - 1200) 5 0.0020 11 0.0044
## [1200 - 1400) 8 0.0032 19 0.0076
## [1400 - 1600) 9 0.0036 28 0.0112
## [1600 - 1800) 12 0.0048 40 0.0160
## [1800 - 2000) 13 0.0052 53 0.0212
## [2000 - 2200) 21 0.0084 74 0.0296
## [2200 - 2400) 38 0.0152 112 0.0448
## [2400 - 2600) 83 0.0332 195 0.0780
## [2600 - 2800) 157 0.0628 352 0.1408
## [2800 - 3000) 305 0.1220 657 0.2628
## [3000 - 3200) 400 0.1600 1057 0.4228
## [3200 - 3400) 444 0.1776 1501 0.6004
## [3400 - 3600) 361 0.1444 1862 0.7448
## [3600 - 3800) 278 0.1112 2140 0.8560
## [3800 - 4000) 195 0.0780 2335 0.9340
## [4000 - 4200) 92 0.0368 2427 0.9708
## [4200 - 4400) 46 0.0184 2473 0.9892
## [4400 - 4600) 16 0.0064 2489 0.9956
## [4600 - 4800) 8 0.0032 2497 0.9988
## [4800 - 5000) 3 0.0012 2500 1.0000
Questo grafico mostra distribuzione del peso dei neonati divisi in classi, con la frequenza assoluta sull’asse y.
1. Distribuzione del Peso
L’istogramma mostra come i pesi dei neonati siano distribuiti in vari intervalli (classi), ognuno dei quali copre un range di 200 grammi:
Gli intervalli variano da 800 g fino a 5000 g.
La classe con la frequenza più alta è 3200-3400 g, seguita da 3400-3600 g e 3000-3200 g, che indica che la maggior parte dei neonati rientra in questo range di peso.
2. Caratteristiche della Distribuzione
Distribuzione Simmetrica: La distribuzione sembra avere una forma che ricorda una curva normale, indicando una distribuzione simmetrica dei pesi dei neonati attorno alla media.
Moda: La classe con la frequenza più alta (ossia la moda) è quella tra 3200 g e 3400 g, con circa 450 neonati.
Code: Le code, ovvero le classi agli estremi (come 800-1000 g e 4800-5000 g), presentano una frequenza molto bassa, indicando che i pesi estremamente bassi o estremamente alti sono rari.
3. Tendenza Centrale e Variabilità
Media e Mediana: Considerando la forma della distribuzione, la media e la mediana sono vicine alla classe centrale (tra 3200 g e 3400 g). Questo è indicativo di un buon livello di salute per la maggior parte dei neonati.
Variabilità: C’è una buona quantità di variabilità, ma non sembra ci siano valori estremamente anomali. La variabilità dei pesi si concentra intorno ai valori medi, mentre i valori agli estremi (come 800-1200 g o 4800-5000 g) sono molto meno frequenti.
4. Intervalli di Peso Significativi
Classi Centrali: Le classi 3000-3800 g comprendono la maggior parte dei neonati, suggerendo che questi pesi siano i più comuni e che rappresentino una buona salute del neonato.
Classi Estreme: Le classi sotto 2000 g indicano neonati con peso basso, che potrebbero aver bisogno di maggiore attenzione medica.
5. Considerazioni Statistiche
Distribuzione Normale: La distribuzione del peso dei neonati sembra approssimare una distribuzione normale, suggerendo che la maggior parte dei neonati ha un peso simile, con alcune eccezioni alle estremità.
Valori Anomali: Le code della distribuzione potrebbero rappresentare neonati prematuri (a sinistra) o neonati con peso sopra la norma (a destra), comunque sono dati che non sembrano debbano essere eliminati. No vengono considerati errori di campionamento
Costruiamo questo boxplot
ggplot(data=dati_neonati_no_qual)+
geom_boxplot(aes(y=N.gravidanze
),
fill="lightblue"
)+
labs(title =" Box plot del numero di gravidanze",
y = " Numero di gravidanze")+
scale_y_continuous(breaks=seq(0,30,1))
Il grafico è un box plot del numero di gravidanze. Procederò con un’analisi dettagliata del box plot per descrivere la distribuzione di questa variabile.
Un box plot è uno strumento utile per comprendere la distribuzione di una variabile, individuare mediana, quartili e valori anomali.
Asse Y: Mostra il numero di gravidanze delle madri.
Box centrale (interquartile range, IQR): Rappresenta la porzione centrale del dataset (dal 1° quartile (Q1) al 3° quartile (Q3)). In questo caso, la maggior parte dei valori del numero di gravidanze è 1.
Linea nera all’interno del box: Questa linea rappresenta la mediana della distribuzione. Da quanto
“Baffi” : Si estendono dal box per mostrare l’estensione dei dati fino a 2 gravidanze.
Punti sopra il baffo superiore: Questi punti rappresentano i valori anomali o outliers, ovvero casi in cui il numero di gravidanze è significativamente più alto rispetto alla maggior parte dei dati. Nel grafico, si possono osservare valori anomali fino a 12 gravidanze.
2. Considerazioni sulla Distribuzione
Mediana e Quartili: La mediana è bassa, probabilmente attorno a 1. Questo suggerisce che la maggior parte delle madri nel dataset ha avuto 1 o meno gravidanze.
Concentrazione dei Valori: La maggior parte dei valori è concentrata tra 0 e 2 gravidanze. Questo indica che per la maggioranza delle madri il numero di gravidanze è limitato a poche (principalmente 0 o 1).
Valori Anomali: I valori anomali sono rappresentati da madri che hanno avuto un numero di gravidanze significativamente più alto, come 6, 8, 10 o addirittura 12. Questi casi rappresentano una minoranza nel dataset e potrebbero essere soggetti ad ulteriori analisi per capire eventuali correlazioni con altri fattori.
3. Distribuzione Asimmetrica
La presenza di molti valori anomali indica che la distribuzione è asimmetrica e presenta una coda lunga a destra, con un piccolo numero di madri che ha avuto un numero molto elevato di gravidanze.
La concentrazione di gravidanze pari a 0 o 1 mostra che nella maggior parte dei casi, le madri sono alla loro prima gravidanza o non hanno avuto precedenti gravidanze.
4. Considerazioni e Suggerimenti
distr_freq = freq_grap_45(x = dati_neonati_no_qual$N.gravidanze,
seq_start = 0,
seq_end = 12,
seq_steps = 13,
title_desc = "Distribuzione in classi della variabile numero di gravidanze",
y_desc ="Frequenza assoluta",
x_desc ="Classi del numero di gravidanze ",
y_start = 0,
y_end = 2200,
y_steps = 200
)
print(distr_freq)
## ni fi Ni Fi
## [0 - 1) 1914 0.7656 1914 0.7656
## [1 - 2) 340 0.1360 2254 0.9016
## [2 - 3) 150 0.0600 2404 0.9616
## [3 - 4) 48 0.0192 2452 0.9808
## [4 - 5) 21 0.0084 2473 0.9892
## [5 - 6) 11 0.0044 2484 0.9936
## [6 - 7) 1 0.0004 2485 0.9940
## [7 - 8) 8 0.0032 2493 0.9972
## [8 - 9) 2 0.0008 2495 0.9980
## [9 - 10) 3 0.0012 2498 0.9992
## [10 - 11) 1 0.0004 2499 0.9996
## [11 - 12) 1 0.0004 2500 1.0000
Questo grafico mostra distribuzione del numero di gravidanze divisi in classi, con la frequenza assoluta sull’asse y.
1. Distribuzione del numero di gravidanze
L’istogramma mostra come il numero di gravidanze sia distribuito in classi
Gli intervalli variano da 0 fino a 12 gravidanze.
La classe con la frequenza più alta è 0 gravidanze
2. Caratteristiche della Distribuzione
Distribuzione asimmetrica: La distribuzione è fortemente asimettrica negativa. La gran parte dei valori si concentra nelle gravidanze 0 o 1
Moda: La classe con la frequenza più alta (ossia la moda) è quella tra con 0 gravidanze
Code: Le code, ovvero le classi agli estremi come da 6 a 12 presentano una frequenza molto bassa, indicando che mamme con più di 6 gravidanze sono estrememamente rare
5. Considerazioni Statistiche
Valori Anomali: Le code della distribuzione potrebbero rappresentare casi estremi ma comunque non verranno eliminati
cov_eta_lunghezza = cor(dati_neonati_no_qual$Anni.madre,
dati_neonati_no_qual$Peso
)
# Scatterplot per l'età della madre e la lunghezza del neonato
ggplot(data = dati_neonati_no_qual,
aes(x = Anni.madre,
y = Peso
)) +
geom_point(color = "blue", alpha = 0.6) + # Scatterplot con punti blu
labs(
title = "Relazione tra età della madre e peso del neonato",
x = paste0("Età della Madre (anni) - Indice di Pearson: ", round(cov_eta_lunghezza,3) ),
y = "Peso del Neonato (grammi)"
) +
scale_y_continuous(breaks = seq(800, 5000, 200))+
scale_x_continuous(breaks = seq(13, 46, 2))+
geom_hline(yintercept = 3300, color = "red", linetype = "dashed", size = 1)+
geom_hline(yintercept = 2990, color = "orange", linetype = "solid", size = 1)+
geom_hline(yintercept = 3620, color = "orange", linetype = "solid", size = 1)
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
L’immagine che vediamo è uno scatterplot che mostra la relazione tra l’età della madre e il peso del neonato. Procederò con un’analisi dettagliata basata sul grafico.
Ho aggiunto tre line, una rossa che indica il valore mediano della lunghezza del neonato e le due linee arancioni per mostrare i due range interquartili
Distribuzione Generale
Asse X: Rappresenta l’età della madre in anni, variando da circa 13 anni a 45 anni.
Asse Y: Rappresenta il peso del neonato in grammi, variando da circa 800 a 4900 grammi
Tendenza Centrale
il peso del neonato sembra essere concentrata principalmente tra 2800 a 3700 grammi, indipendentemente dall’età della madre.
La maggiore concentrazione di punti si trova per le madri di età tra 21e 35 anni, che suggerisce che queste siano le età più comuni per la maternità nel dataset.
Relazione tra Età della Madre e peso del neonato
Non sembra esserci una chiara correlazione lineare tra l’età della madre e il peso del neonato.
Il peso dei neonati appaiono similmente distribuite per diverse età della madre, suggerendo che l’età materna potrebbe non essere un fattore determinante per il peso del neonato in questo dataset.
Alcuni valori si distaccano dalla zona di maggiore densità: ad esempio, ci sono alcuni neonati con un peso inferiore a 2200 grammi, prevalentemente associati a madri tra i 23e i 41 anni.
Possibili Valori Anomali
Età Materna Estrema
Per le madri più giovani (circa 13-20 anni), i dati sembrano essere meno numerosi, ci potrebbe essere una tendenza ad allontanarsi dal valore mediano, probabilmente dato dal numero inferiore di gravidanze in questa fascia di età
Per le madri più anziane (oltre i 40 anni), la varianza nella lunghezza del neonato sembra simile, ma i dati sono meno frequenti, probabilmente a causa del numero inferiore di gravidanze in questa fascia di età.
Considerazioni
Assenza di Correlazione Forte: Dall’osservazione di questo scatterplot, sembra che l’età della madre non abbia un effetto evidente e diretto sulla peso del neonato, almeno non in termini di una relazione lineare.
Dai 14 ai 20 anni c’è un aumento della distanza dei punti dalla mediana, come a formare un triangolo
La correlazione delle due variabili è di -0.024 che indica scarsa correlazione
cov_eta_lunghezza = cor(dati_neonati$Fumatrici,
dati_neonati$Peso
)
# Scatterplot per l'età della madre e la lunghezza del neonato
ggplot(data = dati_neonati,
aes(x = Fumatrici,
y = Peso
)) +
geom_point(color = "blue", alpha = 0.6) + # Scatterplot con punti blu
labs(
title = "Relazione tra madre fumatrice e peso del neonato",
x = paste0("Madre fumatrice [SI=1,NO=0]Indice di Pearson: ", round(cov_eta_lunghezza,3) ),
y = "Peso del Neonato (grammi)"
) +
scale_y_continuous(breaks = seq(800, 5000, 200))+
scale_x_continuous(breaks = seq(0, 1, 1))+
geom_hline(yintercept = 3300, color = "red", linetype = "dashed", size = 1)+
geom_hline(yintercept = 2990, color = "orange", linetype = "solid", size = 1)+
geom_hline(yintercept = 3620, color = "orange", linetype = "solid", size = 1)
cov_eta_lunghezza = cor(dati_neonati_no_qual$Anni.madre,
dati_neonati_no_qual$Lunghezza
)
Il grafico è uno scatterplot che mostra il peso del neonato in relazione alla variabile binaria “madre fumatrice”.
Asse X: Rappresenta lo stato della madre come fumatrice:
0: Madre non fumatrice.
1: Madre fumatrice.
Asse Y: Rappresenta il peso del neonato in grammi con valori che variano da 800 a 4900 grammi circa
Ci sono anche linee orizzontali aggiunte per evidenziare determinati livelli di lunghezza:
Una linea rossa tratteggiata, che rappresenta la mediana
Due linee arancione, che rappresentano i due range interquartili
Distribuzione dei Dati
I punti sul grafico rappresentano i neonati, raggruppati per la condizione di fumo della madre.
Le madri non fumatrici (0) costituiscono la maggior parte del campione, come evidenziato dal grande numero di punti sulla sinistra.
Le madri fumatrici (1) sono rappresentate sulla destra e mostrano una distribuzione simile a quella delle non fumatrici.
Valori Anomali
Indice di Pearson
È presente un indice di Pearson pari a -0,019, che indica la correlazione tra la variabile “madre fumatrice” e il peso del neonato.
Un valore di -0,019 suggerisce che non c’è una correlazione significativa tra il fumo della madre e il peso del neonato. La correlazione è molto debole e leggermente negativa, ma non abbastanza forte da suggerire una relazione chiara.
Confronto tra Fumatrici e Non Fumatrici
Visivamente, non sembrano esserci differenze significative tra il peso dei neonati delle madri fumatrici e non fumatrici. Entrambi i gruppi mostrano una concentrazione simile intorno ai 3300 grammi.
La varianza delle lunghezze è simile tra i due gruppi, suggerendo che il fumo potrebbe non avere un impatto significativo sul peso del neonato (almeno non in modo evidente in questo grafico).
cov_eta_lunghezza = cor(dati_neonati$N.gravidanze,
dati_neonati$Peso
)
# Scatterplot per l'età della madre e la lunghezza del neonato
ggplot(data = dati_neonati,
aes(x = N.gravidanze,
y = Peso
)) +
geom_point(color = "blue", alpha = 0.6) + # Scatterplot con punti blu
labs(
title = "Relazione tra numero di gravidanze e peso del neonato",
x = paste0("Numero di gravidanze | Indice di Pearson: ", round(cov_eta_lunghezza,3) ),
y = "Peso del neonato (grammi)"
) +
scale_y_continuous(breaks = seq(800, 5000, 200))+
scale_x_continuous(breaks = seq(0, 12, 1))+
geom_hline(yintercept = 3300, color = "red", linetype = "dashed", size = 0.8)+
geom_hline(yintercept = 2990, color = "orange", linetype = "solid", size = 1)+
geom_hline(yintercept = 3620, color = "orange", linetype = "solid", size = 1)
Asse X: Indica il numero di gravidanze della madre, che varia da 0 a 12.
0 indica una madre alla prima gravidanza.
Valori superiori indicano il numero di gravidanze precedenti.
Asse Y: Indica il peso del neonato in grammi, con valori che vanno da circa 800 g a 5000 g.
Il grafico presenta:
Punti blu: Ogni punto rappresenta un neonato, con la sua lunghezza e il numero di gravidanze della madre.
Linee orizzontali:
Linea arancione: Rappresenta il range interquartile .
Linea rossa tratteggiata: rappresenta la mediana del peso dei neonati.
Analisi del Grafico
Distribuzione del Peso dei Neonati in Relazione al Numero di Gravidanze
I punti sono distribuiti lungo i diversi numeri di gravidanze, da 0 a 12.
La maggior parte delle nascite si concentra nelle prime 4-5 gravidanze, con una densità decrescente per numeri di gravidanze più alti.
Il peso del neonato è principalmente concentrato tra 3000 e 3600 grammi, indipendentemente dal numero di gravidanze.
Relazione tra Numero di Gravidanze e Peso del Neonato
Dalla distribuzione dei punti, non sembra esserci una chiara correlazione tra il numero di gravidanze e il peso del neonato. La variabilità del peso è simile per i diversi valori di gravidanze, suggerendo che il numero di gravidanze non sia un fattore determinante nel peso del neonato.
Indice di Pearson: L’indice di correlazione riportato è 0,002, indicando una correlazione praticamente inesistente tra il numero di gravidanze e il peso del neonato. Questo conferma che non sembra esserci un legame diretto tra il numero di gravidanze precedenti e il peso alla nascita.
Valori Anomali
Si osservano valori anomali (outliers) nella parte superiore e inferiore del grafico. Questi includono neonati con pesi molto bassi (sotto 2000 grammi) e neonati con pesi molto elevati (oltre 4500 grammi).
Non c’è un pattern evidente che indichi che il numero di gravidanze aumenti o diminuisca la probabilità di un peso anomalo.
Considerazioni
Nessuna Correlazione Significativa: L’indice di Pearson vicino a 0 indica che il numero di gravidanze precedenti non sembra influenzare significativamente il peso del neonato. Questo significa che, nel dataset considerato, le madri alla loro prima gravidanza o con molte gravidanze hanno neonati con pesi simili.
Possibili Fattori Influenzanti: Il peso del neonato potrebbe essere più influenzato da altri fattori.
Suggerimenti per Ulteriori Analisi
attach(dati_neonati)
summary(dati_neonati)
## Anni.madre N.gravidanze Fumatrici Gestazione
## Min. :13.00 Min. : 0.0000 Min. :0.0000 Min. :25.00
## 1st Qu.:25.00 1st Qu.: 0.0000 1st Qu.:0.0000 1st Qu.:38.00
## Median :28.00 Median : 1.0000 Median :0.0000 Median :39.00
## Mean :28.19 Mean : 0.9812 Mean :0.0416 Mean :38.98
## 3rd Qu.:32.00 3rd Qu.: 1.0000 3rd Qu.:0.0000 3rd Qu.:40.00
## Max. :46.00 Max. :12.0000 Max. :1.0000 Max. :43.00
## Peso Lunghezza Cranio Tipo.parto
## Min. : 830 Min. :310.0 Min. :235 Length:2500
## 1st Qu.:2990 1st Qu.:480.0 1st Qu.:330 Class :character
## Median :3300 Median :500.0 Median :340 Mode :character
## Mean :3284 Mean :494.7 Mean :340
## 3rd Qu.:3620 3rd Qu.:510.0 3rd Qu.:350
## Max. :4930 Max. :565.0 Max. :390
## Ospedale Sesso
## Length:2500 Length:2500
## Class :character Class :character
## Mode :character Mode :character
##
##
##
n<-nrow(dati_neonati)
peso.skewness = moments::skewness(Peso)
peso.kurtosis = moments::kurtosis(Peso)-3
peso.shapiro = shapiro.test(Peso)
print(paste0("Il test di simmetria da risultato ", round(peso.skewness,2)))
## [1] "Il test di simmetria da risultato -0.65"
print(paste0("Il test di curtosi da risultato ", round(peso.kurtosis,2)))
## [1] "Il test di curtosi da risultato 2.03"
print(paste0("Il p-value del test di Shapiro-Wilk è: ", peso.shapiro$p.value))
## [1] "Il p-value del test di Shapiro-Wilk è: 3.2344586185273e-22"
print("Il p-value del test di Shapiro-Wilk indica che la distribuzione non è una distribuzione normale ")
## [1] "Il p-value del test di Shapiro-Wilk indica che la distribuzione non è una distribuzione normale "
##################################################################
####### Funzione Pairs
#################################################################
panel.cor <- function(x, y, digits = 2, prefix = "", cex.cor, ...)
{
usr <- par("usr"); on.exit(par(usr))
par(usr = c(0, 1, 0, 1))
r <- (cor(x, y))
txt <- format(c(r, 1), digits = digits)[1]
txt <- paste0(prefix, txt)
if(missing(cex.cor)) cex.cor <- 0.8/strwidth(txt)
text(0.5, 0.5, txt, cex = 1.5)
}
#################################################################
print( "Matrice di correlazione approsimata alla seconda cifra decimale")
## [1] "Matrice di correlazione approsimata alla seconda cifra decimale"
print ( round(cor(dati_neonati_no_qual),2))
## Anni.madre N.gravidanze Gestazione Peso Lunghezza Cranio
## Anni.madre 1.00 0.38 -0.13 -0.02 -0.06 0.02
## N.gravidanze 0.38 1.00 -0.10 0.00 -0.06 0.04
## Gestazione -0.13 -0.10 1.00 0.59 0.62 0.46
## Peso -0.02 0.00 0.59 1.00 0.80 0.70
## Lunghezza -0.06 -0.06 0.62 0.80 1.00 0.60
## Cranio 0.02 0.04 0.46 0.70 0.60 1.00
print( "Matrice di covarianza approsimata alla seconda cifra decimale")
## [1] "Matrice di covarianza approsimata alla seconda cifra decimale"
print ( round(cov(dati_neonati_no_qual),2))
## Anni.madre N.gravidanze Gestazione Peso Lunghezza Cranio
## Anni.madre 27.20 2.56 -1.31 -65.10 -8.92 1.39
## N.gravidanze 2.56 1.64 -0.24 1.62 -2.04 0.82
## Gestazione -1.31 -0.24 3.49 580.59 30.44 14.14
## Peso -65.10 1.62 580.59 275665.68 10999.88 6078.16
## Lunghezza -8.92 -2.04 30.44 10999.88 692.67 260.82
## Cranio 1.39 0.82 14.14 6078.16 260.82 269.79
# Trasposizione grafica della matrice di correlazione
pairs(dati_neonati_fact,lower.panel=panel.cor, upper.panel=panel.smooth)
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
## Warning in par(usr): l'argomento 1 non nomina un parametro grafico
attach(dati_neonati_fact)
## I seguenti oggetti sono mascherati da dati_neonati:
##
## Anni.madre, Cranio, Fumatrici, Gestazione, Lunghezza, N.gravidanze,
## Ospedale, Peso, Sesso, Tipo.parto
par(mfrow=c(1,2))
boxplot(Peso~Sesso)
peso.maschi.mean = mean(Peso[Sesso=="M"])
peso.femmine.mean = mean(Peso[Sesso=="F"])
t.test(Peso~Sesso)
##
## Welch Two Sample t-test
##
## data: Peso by Sesso
## t = -12.106, df = 2490.7, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group F and group M is not equal to 0
## 95 percent confidence interval:
## -287.1051 -207.0615
## sample estimates:
## mean in group F mean in group M
## 3161.132 3408.215
print(paste0("Il peso medio dei maschi è: ", round(peso.maschi.mean,2)))
## [1] "Il peso medio dei maschi è: 3408.22"
print(paste0("Il peso medio delle femmine è: ", round(peso.femmine.mean,2)))
## [1] "Il peso medio delle femmine è: 3161.13"
detach()
Statistiche del Test:
t = -12.106: Il valore del test t indica la differenza standardizzata tra le medie dei due gruppi. Un valore negativo significa che il peso medio del gruppo F è inferiore rispetto al gruppo M.
p-value < 2.2e-16: Il valore p è estremamente piccolo, il che indica una forte evidenza statistica contro l’ipotesi nulla.
Ipotesti del Test:
Intervallo di Confidenza (95%):
95 percent confidence interval: -287.1051, -207.0615: L’intervallo di confidenza per la differenza delle medie si estende tra -287,1 g e -207,1 g. Questo significa che siamo al 95% sicuri che la differenza media del peso tra le femmine e i maschi rientri in questo intervallo.
Dato che l’intervallo è tutto negativo, possiamo dire che, in media, i neonati maschi pesano tra 207 e 287 grammi in più rispetto alle neonate femmine.
Stima delle Medie dei Gruppi:
Mean in group F: 3161,132 g - Il peso medio dei neonati femmina.
Mean in group M: 3408,215 g - Il peso medio dei neonati maschio.
La differenza tra le medie dei due gruppi è di circa 247 g (i maschi pesano di più in media rispetto alle femmine).
Conclusioni
Differenza Statistica Significativa: Il p-value molto basso indica che la differenza tra i pesi medi dei neonati maschi e femmine è altamente significativa dal punto di vista statistico. Possiamo quindi rifiutare l’ipotesi nulla e concludere che c’è una differenza significativa tra il peso dei neonati maschi e delle neonate femmine.
Peso Maggiore nei Maschi: I risultati mostrano che, in media, i neonati maschi pesano più delle femmine. Questo risultato è supportato sia dalla stima delle medie sia dall’intervallo di confidenza, che è completamente negativo.
attach(dati_neonati_fact)
## I seguenti oggetti sono mascherati da dati_neonati:
##
## Anni.madre, Cranio, Fumatrici, Gestazione, Lunghezza, N.gravidanze,
## Ospedale, Peso, Sesso, Tipo.parto
par(mfrow=c(1,2))
boxplot(Peso~Fumatrici)
peso.fumo_no.mean = mean(Peso[Fumatrici==0])
peso.fumo_si.mean = mean(Peso[Fumatrici==1])
t.test(Peso~Fumatrici)
##
## Welch Two Sample t-test
##
## data: Peso by Fumatrici
## t = 1.034, df = 114.1, p-value = 0.3033
## alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
## 95 percent confidence interval:
## -45.61354 145.22674
## sample estimates:
## mean in group 0 mean in group 1
## 3286.153 3236.346
detach()
Statistiche del Test:
Ipotesti del Test:
L’ipotesi nulla (H₀) è che non c’è differenza significativa tra le medie del peso dei neonati delle madri fumatrici e non fumatrici.
L’ipotesi alternativa (H₁) è che ci sia una differenza nelle medie dei pesi tra i due gruppi.
Con un p-value di 0.3033, non abbiamo evidenza sufficiente per supportare l’ipotesi alternativa. In altre parole, non ci sono prove statisticamente significative per dire che il fumo delle madri abbia un impatto sul peso del neonato.
# Grafico a barre con valori assoluti
ggplot(data = dati_neonati_fact) +
# Selezione tipo grafico con geom_bar()
geom_bar(aes(x = Ospedale,
fill = Tipo.parto),
position = "dodge", # Barre sovrapposte
col = "black") +
# Aggiunta delle etichette e del titolo corretto
labs(x = "Ospedale",
y = "Numero di Neonati",
title = "Numero di neonati per ospedale e tipo di parto",
fill = "Tipo di Parto") +
# Configurazione del tema
theme_minimal()+
scale_y_continuous(breaks=seq(0,600,30))
Confronto Tra Ospedali:
osp1, osp2, osp3 mostrano una tendenza simile nella preferenza del tipo di parto: in tutti gli ospedali, i parti naturali (barra azzurra) sono significativamente più numerosi rispetto ai cesarei (barra rossa).
Il numero totale di parti (naturali e cesarei) è
simile in tutti e tre gli ospedali, con
osp2 leggermente superiore per entrambi i tipi di
parto.
Preferenza del Tipo di Parto:
In generale, il parto naturale è più comune rispetto al cesareo in tutti e tre gli ospedali.
Il numero di parti cesarei è relativamente basso rispetto a quello dei parti naturali in ciascun ospedale, il che potrebbe indicare che i cesarei vengono effettuati solo in casi specifici
mod1 = lm(Peso ~ . , data=dati_neonati_fact)
summary(mod1)
##
## Call:
## lm(formula = Peso ~ ., data = dati_neonati_fact)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1123.3 -181.2 -14.6 160.7 2612.6
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6735.1677 141.3977 -47.633 < 2e-16 ***
## Anni.madre 0.7983 1.1463 0.696 0.4862
## N.gravidanze 11.4118 4.6665 2.445 0.0145 *
## Fumatrici -30.1567 27.5396 -1.095 0.2736
## Gestazione 32.5265 3.8179 8.520 < 2e-16 ***
## Lunghezza 10.2951 0.3007 34.237 < 2e-16 ***
## Cranio 10.4725 0.4261 24.580 < 2e-16 ***
## Tipo.partoNat 29.5027 12.0848 2.441 0.0147 *
## Ospedaleosp2 -11.2216 13.4388 -0.835 0.4038
## Ospedaleosp3 28.0984 13.4972 2.082 0.0375 *
## SessoM 77.5473 11.1779 6.938 5.07e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 273.9 on 2489 degrees of freedom
## Multiple R-squared: 0.7289, Adjusted R-squared: 0.7278
## F-statistic: 669.1 on 10 and 2489 DF, p-value: < 2.2e-16
Coefficiente di Regressione
(Coefficients:):
Anni.madre (0.7983): Il
coefficiente non è significativo (p-value = 0.4862),
indicando che l’età della madre non ha un impatto
significativo sul peso del neonato, almeno in questo
modello.
N.gravidanze (11.4118): Questo
coefficiente è significativo (p-value = 0.0145). Indica
che, in media, ogni gravidanza aggiuntiva della madre è associata ad un
incremento di circa 11.4 grammi nel peso del neonato.
Tuttavia, l’effetto è relativamente piccolo.
Fumatrici (-30.1567): Il
coefficiente non è significativo (p-value = 0.2736),
indicando che il fatto che la madre sia fumatrice non ha un
impatto significativo sul peso del neonato in questo
modello.
Gestazione (32.5265): Il
coefficiente è altamente significativo (p-value <
2e-16). Questo indica che ogni settimana di gestazione in
più è associata a un incremento di circa 32.5 grammi
nel peso del neonato, suggerendo un impatto importante.
Lunghezza (10.2951): Il
coefficiente è altamente significativo (p-value <
2e-16). Questo significa che ogni millimetro in più nella
lunghezza del neonato è associato a un incremento di circa 10.3
grammi nel peso.
Cranio (10.4725): Anche questo
coefficiente è altamente significativo (p-value <
2e-16), indicando che ogni millimetro in più nella
circonferenza cranica è associato a un incremento di circa 10.5
grammi nel peso.
Tipo.partoNat (29.5027): Il
coefficiente è significativo (p-value = 0.0147). Questo
indica che i neonati nati con parto naturale pesano in media
29.5 grammi in più rispetto agli altri tipi di
parto.
Ospedaleosp2 (-11.2216): Questo
coefficiente non è significativo (p-value = 0.4038), quindi
non c’è evidenza che l’ospedale osp2 abbia un impatto sul
peso rispetto all’ospedale di riferimento.
Ospedaleosp3 (28.0984): Il
coefficiente è significativo (p-value = 0.0375), suggerendo
che i neonati nati nell’ospedale osp3 pesano in media
28.1 grammi in più rispetto all’ospedale di
riferimento.
SessoM (77.5473): Il coefficiente è
altamente significativo (p-value = 5.07e-12). Questo
significa che i neonati maschi pesano in media 77.5
grammi in più rispetto alle femmine.
Variabili Significative:
Le variabili più significative sono Gestazione, Lunghezza, Cranio, e Sesso. Queste variabili hanno il maggiore impatto sul peso del neonato.
N.gravidanze, Tipo.partoNat, e sono anche significativi, ma il loro effetto è relativamente minore.
Ospedale con un piccolo effetto ma anche ospedale 3 da qualche segnale. Bisognerà approfondire se per caso questa variabile è controllata da qualche altra variabile.
Variabili Non Significative:
Impatto del Fumo:
mod2 = update (mod1, ~.-Fumatrici)
summary(mod2)
##
## Call:
## lm(formula = Peso ~ Anni.madre + N.gravidanze + Gestazione +
## Lunghezza + Cranio + Tipo.parto + Ospedale + Sesso, data = dati_neonati_fact)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1122.69 -181.85 -15.23 161.38 2615.71
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6734.8325 141.4031 -47.629 < 2e-16 ***
## Anni.madre 0.8083 1.1463 0.705 0.4808
## N.gravidanze 11.1515 4.6606 2.393 0.0168 *
## Gestazione 32.2721 3.8109 8.468 < 2e-16 ***
## Lunghezza 10.3092 0.3004 34.314 < 2e-16 ***
## Cranio 10.4768 0.4261 24.591 < 2e-16 ***
## Tipo.partoNat 29.2488 12.0830 2.421 0.0156 *
## Ospedaleosp2 -11.1647 13.4392 -0.831 0.4062
## Ospedaleosp3 28.3685 13.4955 2.102 0.0356 *
## SessoM 77.3679 11.1772 6.922 5.65e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 273.9 on 2490 degrees of freedom
## Multiple R-squared: 0.7287, Adjusted R-squared: 0.7278
## F-statistic: 743.3 on 9 and 2490 DF, p-value: < 2.2e-16
print("ANOVA")
## [1] "ANOVA"
anova(mod2,mod1)
## Analysis of Variance Table
##
## Model 1: Peso ~ Anni.madre + N.gravidanze + Gestazione + Lunghezza + Cranio +
## Tipo.parto + Ospedale + Sesso
## Model 2: Peso ~ Anni.madre + N.gravidanze + Fumatrici + Gestazione + Lunghezza +
## Cranio + Tipo.parto + Ospedale + Sesso
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 2490 186862686
## 2 2489 186772707 1 89979 1.1991 0.2736
print("BIC")
## [1] "BIC"
BIC(mod2,mod1)
## df BIC
## mod2 11 35235.35
## mod1 12 35241.97
L’R quadro aggiustato non è variato resta 0.7278 , quindi abbiamo tolto una variabile che no ha impattato sul risultato. La variabile anni della madre invece direi di lasciarla anche se ha un p-value di 0.48, verrà usata come variabile controllo . Resta ancora da valutare la variabile ospedale che per qualche motivo ottiene un p value basso.
resta
Ho eseguito il test Anova per verificare che la rimozione della variabile fumo non abbia un impatto sul modello di regressione lineare. Il p-value presenta un valore di 0.2736 e quindi possiamo ritenere la variabile fumatrici non rilevante
Ho eseguito anche questo test per una doppia verifica, vediamo che il mod 2 presenta 11 Vs 12 gradi di libertà quindi si preferisce sempre il modello 2
mod3 = update (mod2, ~.-Ospedale)
summary(mod3)
##
## Call:
## lm(formula = Peso ~ Anni.madre + N.gravidanze + Gestazione +
## Lunghezza + Cranio + Tipo.parto + Sesso, data = dati_neonati_fact)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1139.63 -181.49 -15.06 160.22 2633.85
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6737.0948 141.4951 -47.614 < 2e-16 ***
## Anni.madre 0.8759 1.1475 0.763 0.4454
## N.gravidanze 11.4432 4.6655 2.453 0.0142 *
## Gestazione 32.5746 3.8152 8.538 < 2e-16 ***
## Lunghezza 10.2870 0.3007 34.206 < 2e-16 ***
## Cranio 10.4890 0.4266 24.586 < 2e-16 ***
## Tipo.partoNat 29.9956 12.0980 2.479 0.0132 *
## SessoM 77.8482 11.1920 6.956 4.47e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 274.3 on 2492 degrees of freedom
## Multiple R-squared: 0.7277, Adjusted R-squared: 0.727
## F-statistic: 951.6 on 7 and 2492 DF, p-value: < 2.2e-16
print("ANOVA")
## [1] "ANOVA"
anova(mod3,mod2)
## Analysis of Variance Table
##
## Model 1: Peso ~ Anni.madre + N.gravidanze + Gestazione + Lunghezza + Cranio +
## Tipo.parto + Sesso
## Model 2: Peso ~ Anni.madre + N.gravidanze + Gestazione + Lunghezza + Cranio +
## Tipo.parto + Ospedale + Sesso
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 2492 187557831
## 2 2490 186862686 2 695146 4.6315 0.009824 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
print("BIC")
## [1] "BIC"
BIC(mod3,mod2)
## df BIC
## mod3 9 35228.99
## mod2 11 35235.35
L’R quadro aggiustato è variato abbasandosi a 0.7270 , quindi abbiamo tolto una variabile che ha sensibilmente impattato sulle performance diminuendola.
Ho eseguito il test Anova per verificare che la rimozione della variabile ospedale non abbia un impatto sul modello di regressione lineare. Il p-value presenta un valore di 0.009824 e quindi possiamo ritenere che la variabile ospedale possa migliorare il modello
Mod3 non contiene la variabile ospedale: 35228 di BIC + 9 gradi di liberta
Mod2 contiene la variabile ospedale: 35235 di BIC + 11 gradi di libertà
Ho eseguito anche questo test per una doppia verifica, vediamo che il mod 2 che include la variabile ospedale presenta 11 Vs 9 gradi di libertà quindi ben 2 gradi di libertà.
Ricordando che il BIC è un criterio utilizzato per confrontare modelli di regressione al fine di scegliere quello che meglio si adatta ai dati, tenendo conto della complessità del modello., un valore di BIC più basso indica un modello migliore poiché rappresenta un compromesso tra una buona aderenza ai dati e un numero ridotto di parametri.
Conclusioni
Quindi tenuto conto che ,il teorema di Occam ci dice che a parita o minime prestazioni del modello bisogna prediligere quello con meno variabili e il test BIC che penalizza fortemente i modelli che includono variabili che non migliorano in modo significativo la capacità del modello di adattarsi ai dati, decidiamo di rimuovere la variabile ospedale
=================================================================
mod4 = lm(Peso ~ Anni.madre
+Fumatrici*Gestazione
+Lunghezza*Cranio
+Sesso
, data=dati_neonati_fact)
mod5 = lm(Peso ~ Anni.madre
+Gestazione*Lunghezza*Cranio
+Sesso
, data=dati_neonati_fact)
mod6 = lm(Peso ~ Anni.madre
+Fumatrici*Gestazione
+Fumatrici*Lunghezza
+Fumatrici*Cranio
+Gestazione*Lunghezza*Cranio
+Sesso
, data=dati_neonati_fact)
mod7 = lm(Peso ~ Anni.madre
+Fumatrici*Gestazione
+Fumatrici*Lunghezza
+Gestazione*Lunghezza*Cranio
+Sesso
, data=dati_neonati_fact)
summary(mod4)
##
## Call:
## lm(formula = Peso ~ Anni.madre + Fumatrici * Gestazione + Lunghezza *
## Cranio + Sesso, data = dati_neonati_fact)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1164.43 -182.47 -13.89 164.16 2842.29
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.860e+03 1.020e+03 -1.824 0.0683 .
## Anni.madre 1.937e+00 1.064e+00 1.820 0.0688 .
## Fumatrici 9.592e+02 7.559e+02 1.269 0.2046
## Gestazione 3.877e+01 4.027e+00 9.628 < 2e-16 ***
## Lunghezza -3.649e-01 2.208e+00 -0.165 0.8687
## Cranio -4.709e+00 3.198e+00 -1.473 0.1410
## SessoM 7.485e+01 1.121e+01 6.674 3.05e-11 ***
## Fumatrici:Gestazione -2.506e+01 1.924e+01 -1.302 0.1929
## Lunghezza:Cranio 3.160e-02 6.544e-03 4.829 1.45e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 273.7 on 2491 degrees of freedom
## Multiple R-squared: 0.7292, Adjusted R-squared: 0.7283
## F-statistic: 838.5 on 8 and 2491 DF, p-value: < 2.2e-16
summary(mod5)
##
## Call:
## lm(formula = Peso ~ Anni.madre + Gestazione * Lunghezza * Cranio +
## Sesso, data = dati_neonati_fact)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1170.24 -181.32 -13.56 160.56 2567.66
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.652e+04 8.311e+03 4.395 1.15e-05 ***
## Anni.madre 2.182e+00 1.059e+00 2.060 0.03947 *
## Gestazione -1.198e+03 2.358e+02 -5.081 4.04e-07 ***
## Lunghezza -7.338e+01 1.956e+01 -3.751 0.00018 ***
## Cranio -1.248e+02 2.739e+01 -4.556 5.46e-06 ***
## SessoM 7.338e+01 1.115e+01 6.580 5.71e-11 ***
## Gestazione:Lunghezza 2.378e+00 5.273e-01 4.509 6.81e-06 ***
## Gestazione:Cranio 3.817e+00 7.537e-01 5.064 4.41e-07 ***
## Lunghezza:Cranio 2.608e-01 6.195e-02 4.210 2.65e-05 ***
## Gestazione:Lunghezza:Cranio -7.353e-03 1.641e-03 -4.480 7.79e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 272.1 on 2490 degrees of freedom
## Multiple R-squared: 0.7324, Adjusted R-squared: 0.7314
## F-statistic: 757.2 on 9 and 2490 DF, p-value: < 2.2e-16
summary(mod6)
##
## Call:
## lm(formula = Peso ~ Anni.madre + Fumatrici * Gestazione + Fumatrici *
## Lunghezza + Fumatrici * Cranio + Gestazione * Lunghezza *
## Cranio + Sesso, data = dati_neonati_fact)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1165.43 -180.59 -14.56 163.79 2526.83
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.625e+04 8.297e+03 4.369 1.30e-05 ***
## Anni.madre 2.326e+00 1.058e+00 2.197 0.028087 *
## Fumatrici 5.419e+02 8.755e+02 0.619 0.536035
## Gestazione -1.192e+03 2.354e+02 -5.065 4.38e-07 ***
## Lunghezza -7.256e+01 1.953e+01 -3.714 0.000208 ***
## Cranio -1.239e+02 2.734e+01 -4.532 6.11e-06 ***
## SessoM 7.354e+01 1.115e+01 6.598 5.07e-11 ***
## Fumatrici:Gestazione -5.957e+01 2.203e+01 -2.704 0.006894 **
## Fumatrici:Lunghezza 5.226e+00 1.652e+00 3.164 0.001578 **
## Fumatrici:Cranio -2.357e+00 2.346e+00 -1.005 0.315099
## Gestazione:Lunghezza 2.358e+00 5.264e-01 4.480 7.80e-06 ***
## Gestazione:Cranio 3.806e+00 7.525e-01 5.058 4.54e-07 ***
## Lunghezza:Cranio 2.577e-01 6.185e-02 4.167 3.19e-05 ***
## Gestazione:Lunghezza:Cranio -7.295e-03 1.638e-03 -4.452 8.88e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 271.6 on 2486 degrees of freedom
## Multiple R-squared: 0.7338, Adjusted R-squared: 0.7324
## F-statistic: 527.2 on 13 and 2486 DF, p-value: < 2.2e-16
summary(mod7)
##
## Call:
## lm(formula = Peso ~ Anni.madre + Fumatrici * Gestazione + Fumatrici *
## Lunghezza + Gestazione * Lunghezza * Cranio + Sesso, data = dati_neonati_fact)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1165.31 -181.30 -14.68 163.79 2537.13
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.631e+04 8.297e+03 4.377 1.25e-05 ***
## Anni.madre 2.296e+00 1.058e+00 2.170 0.030073 *
## Fumatrici 1.983e+02 8.060e+02 0.246 0.805661
## Gestazione -1.191e+03 2.354e+02 -5.060 4.50e-07 ***
## Lunghezza -7.303e+01 1.953e+01 -3.739 0.000189 ***
## Cranio -1.241e+02 2.734e+01 -4.540 5.90e-06 ***
## SessoM 7.348e+01 1.115e+01 6.592 5.26e-11 ***
## Fumatrici:Gestazione -6.138e+01 2.195e+01 -2.796 0.005218 **
## Fumatrici:Lunghezza 4.443e+00 1.457e+00 3.050 0.002311 **
## Gestazione:Lunghezza 2.366e+00 5.264e-01 4.495 7.28e-06 ***
## Gestazione:Cranio 3.802e+00 7.524e-01 5.053 4.67e-07 ***
## Lunghezza:Cranio 2.591e-01 6.184e-02 4.191 2.88e-05 ***
## Gestazione:Lunghezza:Cranio -7.316e-03 1.638e-03 -4.465 8.35e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 271.6 on 2487 degrees of freedom
## Multiple R-squared: 0.7337, Adjusted R-squared: 0.7324
## F-statistic: 571.1 on 12 and 2487 DF, p-value: < 2.2e-16
#anova(mod4,mod5)
BIC(mod4,mod5,mod6,mod7)
## df BIC
## mod4 10 35223.35
## mod5 11 35201.41
## mod6 15 35219.33
## mod7 14 35212.52
Significatività delle Variabili:
Anni.madre: Diventa significativo a partire dal secondo modello, suggerendo un leggero effetto positivo dell’età materna sul peso del neonato. Anche se, nei vari test questa variabile non è significativa, la lasciamo in quanto variabile test sempre usata in medicina
Fumatrici: L’effetto principale non è significativo, ma le interazioni con Gestazione e Lunghezza sono significative nei modelli tre e quattro, indicando che il fumo influenza il peso ( anche se in modo molto marginale). Questa variabile, anche se sembra influire ben poco , viene lasciata in quanto potrebbe servire come variabile controllo
Gestazione, Lunghezza, Cranio: Le interazioni tra queste variabili sono cruciali per spiegare il peso del neonato.
Sesso: Costantemente significativo in tutti i modelli, con i maschi che pesano di più.
Parto naturale o cesareo, visto che il modello deve prevedere il peso questa variabile può essere tolta, essendo che il tipo di parto viene deciso al momento dal medico ( consideriamo valori di outliners le decisioni presi prima a causa di problema al feto )
Interazioni:
Le interazioni di ordine superiore tra Gestazione, Lunghezza e Cranio sono significative in tutti i modelli, suggerendo che l’effetto di una variabile dipende dai valori delle altre.
L’inclusione delle interazioni con Fumatrici migliora leggermente il modello, indicando che il fumo materno modera l’effetto di altre variabili sul peso ( sempre in maniera molto marginale )
Prestazioni dei Modelli:
Tutti i modelli hanno un R-quadrato e un R-quadrato aggiustato molto simili (~0.73), suggerendo che spiegano circa il 73% della variabilità del peso.
Il terzo e quarto modello offrono un leggero miglioramento rispetto ai primi due ( circa 1 punto percentuale ) ma includono la variabile fumo che come detto prima verrà lasciata.
Scelta del Modello Migliore:
Quarto Modello: Potrebbe essere preferibile poiché elimina un’interazione non significativa (Fumatrici:Cranio), rendendo il modello più parsimonioso senza perdere capacità esplicativa.
Anche l’indcie RSE di 271 resta costante sia per il modello 3 sia per il 4
car::vif(mod7, type=c("predictor"))
## GVIFs computed for predictors
## GVIF Df GVIF^(1/(2*Df)) Interacts With
## Anni.madre 1.031500e+00 1 1.015628 --
## Fumatrici 9.184401e+06 6 3.804120 Gestazione, Lunghezza
## Gestazione 1.085074e+00 10 1.004091 Fumatrici, Lunghezza, Cranio
## Lunghezza 1.085074e+00 10 1.004091 Fumatrici, Gestazione, Cranio
## Cranio 1.153709e+00 7 1.010265 Gestazione, Lunghezza
## Sesso 1.052678e+00 1 1.026001 --
## Other Predictors
## Anni.madre Fumatrici, Gestazione, Lunghezza, Cranio, Sesso
## Fumatrici Anni.madre, Cranio, Sesso
## Gestazione Anni.madre, Sesso
## Lunghezza Anni.madre, Sesso
## Cranio Anni.madre, Fumatrici, Sesso
## Sesso Anni.madre, Fumatrici, Gestazione, Lunghezza, Cranio
L’unica variabile che è un po alta è la variabile Fumatrice, in quanto il modello è stato forzato su questa variabile . I dati sono minori di 5 quindi il modello non rischia la multicollinearità
Molto bene invece le variabili gestazione, lunghezza e cranio che nonostante siano state interferenziate tra loro mantengono gradi di collinearità molto bassi
In base a tutte le valutazioni possiamo dire che:
fumo materno
Il fatto che la madre sia fumatrice non ha un impatto significativo sul peso del neonato in questo modello che potrebbe dipendere dal campione. Ho comunque deciso di mantenerlo , visto che ho trovato una corrinealità, seppure minima, con la variabile gestazione e lunghezza
Fumatrici:Gestazione -2.796 0.005218 ** P-value
Fumatrici:Lunghezza 3.050 0.002311 ** P-value
gravidanze multiple
Indica che, in media, ogni gravidanza aggiuntiva della madre è associata ad un incremento di circa 11.4 grammi nel peso del neonato. Tuttavia, l’effetto è relativamente piccolo.
gestazione
Ogni settimana di gestazione in più è associata a un incremento di circa 32.5 grammi nel peso del neonato, suggerendo un impatto importante.
Il modello ottimale è il 7. Modello di regressione
mod7 = lm(Peso ~ Anni.madre +FumatriciGestazione +FumatriciLunghezza +GestazioneLunghezzaCranio +Sesso , data=dati_neonati_fact)
Spiegazione delle variabili:
Anni.madre: Età della madre, considerata un predittore lineare. Inserita solamente per controllo visto che il peso è molto basso
Fumatrici * Gestazione: Interazione tra il fatto che la madre sia fumatrice e la durata della gestazione. Questa interazione permette di valutare se il fumo modifica l’effetto della durata della gestazione sul peso.
Fumatrici * Lunghezza: Interazione tra il fatto che la madre sia fumatrice e la lunghezza del neonato. Valuta se il fumo altera l’effetto della lunghezza sul peso.
Gestazione * Lunghezza * Cranio: Interazione tra gestazione, lunghezza e circonferenza cranica. Questo termine cattura gli effetti combinati di queste tre variabili sul peso, aumentando la precisione del modello.
Sesso: Variabile categorica che confronta i maschi con le femmine.
Analisi dei residui : shapiro test ,Breusch-Pagan test & Durbin-Watson
par(mfrow=c(2,2))
plot(mod7)
lmtest::bptest(mod7)
##
## studentized Breusch-Pagan test
##
## data: mod7
## BP = 228.95, df = 12, p-value < 2.2e-16
lmtest::dwtest(mod7)
##
## Durbin-Watson test
##
## data: mod7
## DW = 1.962, p-value = 0.1707
## alternative hypothesis: true autocorrelation is greater than 0
shapiro.test(mod7$residuals)
##
## Shapiro-Wilk normality test
##
## data: mod7$residuals
## W = 0.97542, p-value < 2.2e-16
plot(density(residuals(mod7)))
Residuals vs Fitted
Cosa mostra: La relazione tra i valori predetti (fitted) e i residui.
Obiettivo: I residui dovrebbero essere distribuiti casualmente intorno alla linea orizzontale (zero).
Osservazione:
I residui sembrano distribuiti intorno a zero, ma ci sono alcune osservazioni fuori scala (outliers).
In genereal non ci sono evidenti pattern non lineari, il che suggerisce che l’assunzione di linearità è soddisfatta, anche se abbiamo una nuvola di punti abbastanza concentrata da 3000 a 4000, che può essere dovuto ai numerosi outliners
Normal Q-Q
Cosa mostra: La distribuzione dei residui rispetto alla distribuzione normale teorica.
Obiettivo: I punti dovrebbero seguire la linea diagonale, indicando che i residui sono distribuiti normalmente.
Osservazione:
Questo potrebbe essere un problema, specialmente se il modello è sensibile agli outlier. Andrà eseguito un t-test per verifiare se la distribuzione può essere una normale
Spread-Location
Cosa mostra: La radice quadrata dei residui standardizzati rispetto ai valori predetti.
Obiettivo: I punti dovrebbero essere distribuiti in modo casuale con una banda orizzontale, indicando omoschedasticità (varianza costante dei residui).
Osservazione:
Residuals vs Leverage
Cosa mostra: La relazione tra i residui standardizzati e il leverage delle osservazioni.
Obiettivo: Identificare osservazioni influenti che possono avere un forte impatto sul modello.
Osservazione:
Le osservazioni vicine alla curva di Cook’s Distance meritano attenzione poiché potrebbero essere influenti. Faremo un grafico apposito per misurare questi dati
Residuals vs Leverage
Cosa mostra: La relazione tra i residui standardizzati e il leverage delle osservazioni.
Obiettivo: Identificare osservazioni influenti che possono avere un forte impatto sul modello.
Osservazione:
Ci sono alcune osservazioni con alto leverage (come 15510 e 310), che possono influenzare significativamente il modello.
Le osservazioni vicine alla curva di Cook’s Distance meritano attenzione poiché potrebbero essere influenti e quindi andranno analizzate in modo approfondito.
- Il test di Breusch-Pagan verifica l'omoschedasticità, ovvero se la varianza dei residui è costante.
- Un p-value molto piccolo (\<2.2e−16) indica che possiamo rifiutare l'ipotesi nulla di omoschedasticità.
**Conclusione**: I residui mostrano eteroschedasticità, il che significa che la varianza non è costante. Questo potrebbe indicare la necessità di trasformare i dati oppure usare altri modelli di regressione
Test di Durbin-Watson (Autocorrelation Test)
Interpretazione:
Il test di Durbin-Watson verifica la presenza di autocorrelazione tra i residui.
Il p-value di 0.1707 non è sufficientemente piccolo per rifiutare l’ipotesi nulla di assenza di autocorrelazione.
Conclusione: Non c’è evidenza di autocorrelazione nei residui del modello.
Test di Shapiro-Wilk (Normality Test)
Interpretazione:
Il test di Shapiro-Wilk verifica l’ipotesi nulla che i residui siano distribuiti secondo una normale.
Un p-value molto piccolo (<2.2e−16) indica che possiamo rifiutare l’ipotesi nulla di normalità.
Conclusione: I residui non seguono una distribuzione normale. Questo è coerente con l’osservazione fatta nel grafico Q-Q, dove le code mostrano deviazioni dalla normalità. Ciò può influire sull’interpretazione dei test di significatività. Potrebbe essere dovuto ai numerosi outliners
mod_cook = mod7
#leverage
lev = hatvalues(mod_cook)
p = sum(lev)
n = length(lev)
soglia=2*p/n
lev_df = data.frame(Indice = 1:n, Leverage = lev )
# Scatterplot dei leverage
ggplot(data = lev_df) +
aes(x= Indice,
y= lev
) +
geom_point(color = "blue", alpha = 0.4) + # Scatterplot con punti blu
labs(
title = "Valori leverage del modello 7 ",
x = "Indice ",
y = "Valore di Leverage"
) +
scale_y_continuous(breaks = seq(-2, 2, 0.025))+
scale_x_continuous(breaks = seq(0, 2000,250))+
geom_hline(yintercept = soglia, color = "red", linetype = "solid", size = 0.7)
Il grafico mostra i valori di leverage per il modello 7. Il leverage indica quanto un’osservazione è distante dal centro del gruppo di dati (cioè dalla media delle variabili indipendenti) ed è utile per identificare osservazioni potenzialmente influenti nel modello.
Distribuzione dei valori di leverage:
La maggior parte dei punti ha valori di leverage molto bassi, vicino a zero, il che è normale in modelli con molti dati.
Ci sono alcuni punti (outlier) con leverage alto, che si trovano lontani dagli altri.
Linea di soglia (rossa):
La linea rossa rappresenta la soglia per considerare un valore di leverage elevato.
Le osservazioni che superano questa soglia meritano attenzione.
Osservazioni con leverage alto:
Implicazioni dei leverage elevati
Raccomandazioni
Individuazione delle osservazioni influenti:
Analisi dei dati:
Verifica se queste osservazioni con alto leverage sono errori nei dati o rappresentano casi validi ma atipici.
Se sono errori, correggili o rimuovili. Se sono validi, considera se è necessario un modello più robusto.
Eventuali aggiustamenti al modello:
Se queste osservazioni influenzano eccessivamente il modello, puoi considerare:
Regressione robusta, che riduce l’impatto di outlier.
Trasformazioni delle variabili per ridurre la variabilità.
Conclusione
Il grafico mostra che la maggior parte delle osservazioni ha leverage basso, ma ci sono alcune osservazioni atipiche con leverage alto che meritano attenzione. Una diagnosi più approfondita con strumenti come la Distanza di Cook o l’analisi dei residui può aiutare a decidere se intervenire su queste osservazioni. Se hai bisogno di calcolare o analizzare i leverage o la Distanza di Cook in dettaglio, fammi sapere!
lev[lev>soglia]
## 15 36 96 99 101 105 106
## 0.02004838 0.01910289 0.01285844 0.02695093 0.02397822 0.02608684 0.03252573
## 120 128 131 140 151 155 182
## 0.01315962 0.05226135 0.02146321 0.04516750 0.05171120 0.01097146 0.03790159
## 190 194 205 206 220 234 242
## 0.01158166 0.01714599 0.01148638 0.01969138 0.01433723 0.01845571 0.01161183
## 249 251 279 295 296 306 310
## 0.01205049 0.04125469 0.01396506 0.01157307 0.01423989 0.02267706 0.29417069
## 312 315 321 335 378 391 413
## 0.04016166 0.01300181 0.02305498 0.02916239 0.05500984 0.03340116 0.02219025
## 424 442 445 473 486 492 538
## 0.02514088 0.03234274 0.01529656 0.02736432 0.01067484 0.02225192 0.02425947
## 557 567 572 587 592 593 600
## 0.02335184 0.01966949 0.02517481 0.02688488 0.01323057 0.01352732 0.01043399
## 615 616 638 658 668 684 699
## 0.01112483 0.01114216 0.01171744 0.04194158 0.04241261 0.01210056 0.01208898
## 701 703 748 750 758 765 805
## 0.01161858 0.02654578 0.02556839 0.02952549 0.05971229 0.01467640 0.03907443
## 928 932 947 956 984 991 1014
## 0.17735033 0.01144130 0.01853553 0.02745310 0.01269671 0.01811206 0.04536670
## 1017 1026 1037 1051 1067 1091 1110
## 0.01276808 0.03226497 0.01331851 0.01848308 0.01868833 0.02333319 0.01729713
## 1118 1130 1134 1170 1175 1181 1188
## 0.01493832 0.01617785 0.01111953 0.01927429 0.03101330 0.01432928 0.01325652
## 1227 1238 1248 1262 1271 1273 1275
## 0.01369921 0.01152178 0.03453118 0.03539416 0.01123147 0.02328613 0.01409358
## 1282 1283 1285 1326 1333 1356 1357
## 0.01289977 0.01270580 0.02181235 0.01452891 0.05573514 0.01061918 0.01754942
## 1368 1379 1385 1397 1398 1400 1410
## 0.01420677 0.04146882 0.03353058 0.02251121 0.03443652 0.01447149 0.03553860
## 1415 1420 1425 1426 1428 1429 1443
## 0.01778206 0.01451191 0.01401621 0.03660250 0.04038889 0.23688857 0.01494884
## 1449 1458 1473 1480 1512 1513 1525
## 0.04116497 0.01289114 0.02699474 0.02891188 0.01463377 0.01058527 0.01092587
## 1537 1551 1553 1556 1576 1583 1593
## 0.05605222 0.15119940 0.01863178 0.01222315 0.02308689 0.02001497 0.01156509
## 1610 1619 1626 1652 1660 1672 1686
## 0.03502621 0.05483988 0.02702452 0.01579628 0.04811025 0.01966370 0.01892923
## 1691 1692 1701 1712 1720 1743 1761
## 0.02714034 0.01459218 0.02733679 0.01075413 0.01348537 0.01058770 0.02235987
## 1763 1780 1789 1809 1827 1858 1893
## 0.02174324 0.23328721 0.03539880 0.02656517 0.01151605 0.01234250 0.01067130
## 1902 1906 1920 1929 1933 1971 2003
## 0.02410702 0.02581230 0.11152161 0.06639001 0.01170130 0.02218363 0.01403188
## 2016 2037 2040 2046 2049 2089 2101
## 0.06977382 0.01426274 0.01933362 0.04338503 0.02659157 0.26689273 0.01939788
## 2110 2114 2115 2120 2136 2140 2145
## 0.03116764 0.04280122 0.04490904 0.06455184 0.01047507 0.01341269 0.01434896
## 2149 2175 2180 2200 2202 2215 2216
## 0.02669483 0.14694323 0.01209322 0.02502980 0.01141701 0.01187597 0.01123127
## 2220 2224 2225 2237 2238 2245 2256
## 0.05401892 0.01258889 0.01622045 0.01385130 0.04087445 0.12006294 0.01459236
## 2257 2270 2282 2285 2307 2337 2353
## 0.01558792 0.01296254 0.03885095 0.02006700 0.02953124 0.04691559 0.06965820
## 2361 2391 2408 2412 2437 2442 2450
## 0.01094586 0.01597682 0.01936352 0.02207459 0.13986991 0.01067099 0.03410616
## 2452 2458 2459 2465
## 0.17387672 0.02016331 0.01432251 0.03507730
leverage_len = length(lev[lev>soglia] )
print(paste0(" I valori di leverage sono: ", leverage_len ))
## [1] " I valori di leverage sono: 200"
rstudent_df = NULL
rstudent_df = as.data.frame(rstudent(mod_cook))
rstudent_df = data.frame(Indice = 1:n, Leverage = rstudent_df$`rstudent(mod_cook)` )
# Scatterplot dei outliners
ggplot(data = rstudent_df) +
aes(x= Indice,
y= Leverage
) +
geom_point(color = "blue", alpha = 0.4) + # Scatterplot con punti blu
labs(
title = "Outliners dei leverage del modello 7 ",
x = "Indice ",
y = "Outliners"
) +
scale_y_continuous(breaks = seq(-5, 12, 1))+
scale_x_continuous(breaks = seq(0, 4000,250))+
geom_hline(yintercept = -2, color = "red", linetype = "solid", size = 0.7)+
geom_hline(yintercept = 2 , color = "red", linetype = "solid", size = 0.7)
car::outlierTest(mod_cook)
## rstudent unadjusted p-value Bonferroni p
## 1551 10.354256 1.2575e-24 3.1438e-21
## 155 5.300563 1.2560e-07 3.1401e-04
## 1306 4.787622 1.7867e-06 4.4668e-03
## 1694 4.339627 1.4843e-05 3.7107e-02
## 1399 -4.318140 1.6352e-05 4.0880e-02
Il grafico mostra gli outlier basati sui valori di leverage per il modello 7, insieme a due linee rosse orizzontali che rappresentano le soglie di riferimento (-2,+2). Vediamo un’analisi dettagliata:
Cosa mostra il grafico
Punti (Osservazioni):
Ogni punto rappresenta un’osservazione nel dataset.
L’asse y mostra la deviazione (outlier score) rispetto al comportamento atteso, basato sui valori di leverage e residui.
Le osservazioni fuori dalle linee rosse sono considerate potenziali outlier.
Linee di soglia (rossa):
Le linee rosse orizzontali rappresentano i limiti oltre i quali un’osservazione può essere considerata un outlier (-2,2 )
Questi limiti sono basati su una distribuzione standardizzata e indicano osservazioni con valori estremamente alti o bassi rispetto alla maggior parte dei dati.
Distribuzione delle osservazioni:
La maggior parte delle osservazioni si trova tra le due linee rosse, il che indica che non sono outlier significativi.
Alcuni punti (soprattutto in alto) si trovano fuori dai limiti, e questi devono essere analizzati più a fondo.
Osservazioni dal grafico
Outlier identificati:
Ci sono alcune osservazioni con valori molto alti (sopra la linea superiore, ad esempio vicino a 10.
Questi punti possono essere influenti e potrebbero distorcere i risultati del modello.
Distribuzione generale:
Conclusioni
La maggior parte dei dati è ben modellata, ma ci sono alcuni punti estremi che meritano attenzione.
Gli outlier identificati potrebbero rappresentare:
Errori nei dati (da verificare e correggere).
Osservazioni valide ma atipiche
Osservazione del numero di outliners
Abbiamo solamente 5 osservazione che superano i valori soglia, diciamo che l’osservazione 1151 potrebbe distorce il modello.
Gli outliners confermati potrebbero essere errori di raccolta , oppure dei valori atipici che possono distorcere il nostro modello
==========================================================================
#distanza di cook
cook =cooks.distance(mod_cook)
cook_dist_df = NULL
cook_dist_df = as.data.frame(cook)
cook_dist_df = data.frame(Indice = 1:n, Cook_Distance = cook_dist_df$cook )
osservazioni_influenti = which(cook > 1)
# Scatterplot della distanza di cook
ggplot(data = cook_dist_df) +
aes(x= Indice,
y= Cook_Distance
) +
geom_point(color = "blue", alpha = 0.4) + # Scatterplot con punti blu
labs(
title = "Distance di cook del modello 7 ",
x = "Indice ",
y = "Distanza di Cook"
) +
scale_y_continuous(breaks = seq(0, 2, 0.1))+
scale_x_continuous(breaks = seq(0, 4000,250))+
geom_hline(yintercept = 1.0, color = "red", linetype = "solid", size = 0.7)+
# Aggiunge le etichette per le osservazioni influenti
geom_text(
data = cook_dist_df[osservazioni_influenti, ],
aes(label = Indice),
color = "black",
vjust = 1.5,
size = 3
)
# Stampa gli indici delle osservazioni influenti
print(paste0("Osservazioni che andrebbero riviste: ", toString(osservazioni_influenti)))
## [1] "Osservazioni che andrebbero riviste: 1551"
Il grafico mostra i valori della Distanza di Cook per il modello 7. Questa metrica misura quanto ciascuna osservazione influisce sui coefficienti stimati del modello. È utile per identificare osservazioni influenti.
Cosa mostra il grafico
Asse X (Indice):
Asse Y (Distanza di Cook):
Indica il valore della Distanza di Cook per ciascuna osservazione.
Valori più elevati indicano che l’osservazione ha un’influenza maggiore sui coefficienti del modello.
Linea rossa orizzontale:
Distribuzione delle osservazioni:
La maggior parte dei punti ha valori di Distanza di Cook bassi, il che è atteso in un modello ben specificato.
L’osservazione 1551 si trova sopra la soglia critica di 1.
Osservazioni chiave
Presenza di osservazioni influenti:
L’osservazione 1551 con valore sopra 1 andrebbe rivista, perchè anche se un caso isolato potrebbe influire sulle prestazione del modello
Tuttavia, ci sono alcune osservazioni con Distanza di Cook elevata (vicino a 0.3–0.4), che potrebbero avere un impatto moderato sul modello e meritano ulteriori indagini.
Trattamento degli outlier:
Se le osservazioni risultano valide ma influenti, considera:
Conclusioni
Richiesta: stimare la previsione del peso del noeonato con i dati seguenti come input:
madre alla terza gravidanza,
non fumatrice,
che partorirà alla 39esima settimana
Visto che ci sono dei dati mancanti useremo le medie delle variabili del modello 7 che non ci sono state fornite
Anni della madre: 28
Lunghezza: 495 mm
Cranio 340 mm
Sesso: maschile
Anni.madre +FumatriciGestazione +FumatriciLunghezza +GestazioneLunghezzaCranio +Sesso
#summary(mod7)
Anni.madre.test = 28
Fumatrice.test = 0
Gestazione.test = 39
Lunghezza.test = 495
Cranio.test = 340
Sesso.test ="F"
predict_df = data.frame(Anni.madre=Anni.madre.test,
Fumatrici =Fumatrice.test,
Gestazione=Gestazione.test,
Lunghezza=Lunghezza.test,
Cranio=Cranio.test,
Sesso=Sesso.test
)
peso.pred.test = predict(mod7, newdata = predict_df)
test_predict = round(peso.pred.test,2)
print(test_predict)
## 1
## 3252.87
La previsione del peso del neonato con i seguenti dati di input :
Anni.madre.test = 28 ( ricavato come valore medio di tutte le osservazioni )
Fumatrice.test = 0 ( dato fornito )
Gestazione.test = 39 ( dato fornito )
Lunghezza.test = 495 ( ricavato come valore medio di tutte le osservazioni )
Cranio.test = 340 ( ricavato come valore medio di tutte le osservazioni )
Sesso.test =“F” ( ricavato come valore moda di tutte le osservazioni )
Il peso stimato del neonato con le caratteristiche riportate sarà di 3253 grammi
Bar graph per apprezzare la variabile peso sulla gestazione, tenendo conto della variabile fumo
ggplot(data = dati_neonati_fact,
aes(x = Gestazione,
y = Peso,
color = Sesso
)) +
geom_point( alpha = 0.7) + # Scatterplot con punti blu
labs(
title = "Relazione tra peso e gestazione della madre",
x = "Gestazione della madre [settimane] ",
y = "Peso del Neonato [grammi]"
) +
scale_y_continuous(breaks = seq(800, 5000, 300))+
scale_x_continuous(breaks = seq(13, 46, 2))+
geom_hline(yintercept = 3300, color = "red", linetype = "dashed", size = 0.7)+
geom_hline(yintercept = 2990, color = "orange", linetype = "solid", size = 0.7)+
geom_hline(yintercept = 3620, color = "orange", linetype = "solid", size = 0.7)+
scale_color_manual(values = c("M" = "blue", "F" = "green"))
Il grafico mostra la relazione tra il peso del neonato (in grammi) e la durata della gestazione della madre (in settimane), con i punti colorati per distinguere il sesso del neonato (verde per femmine, blu per maschi). Sono presenti anche delle linee orizzontali di riferimento (rosse e arancioni) che indicano mediane e range interquartili .
Relazione tra peso e gestazione:
Il peso del neonato tende a crescere con l’aumento della durata della gestazione.
Neonati nati prematuramente (prima delle 37 settimane) hanno generalmente un peso inferiore rispetto a quelli nati a termine (37-42 settimane).
Oltre le 42 settimane, il peso sembra più variabile, con alcuni neonati con peso superiore alla media.
Differenze di peso tra maschi e femmine:
I neonati maschi (punti blu) tendono a pesare di più rispetto alle femmine (punti verdi), confermando una tendenza biologica nota.
Questa differenza è visibile in quasi tutte le durate di gestazione.
Distribuzione del peso:
Nelle settimane centrali (37-41 settimane), il peso dei neonati è più concentrato intorno a valori mediani ( rappresentati dalla linea tratteggiata rossa).
Vi sono alcuni outlier:
Neonati molto piccoli, anche con una gestazione avanzata.
Neonati con peso molto elevato rispetto alla media (sopra i 4500 grammi).
Linee di riferimento:
Linea rossa tratteggiata: rappresenta il peso mediano dei neonati.
Linee arancioni: Rappresentano i due range interquartili 25 e 75 percento
Interpretazione clinica e biologica
Neonati prematuri (< 37 settimane):
Neonati post-termine (> 42 settimane):
Differenza tra sessi:
Osservazioni atipiche (outlier):
Raccomandazioni
Analisi statistica:
Calcola la differenza media di peso tra maschi e femmine per confermare la significatività della differenza osservata.
Usa modelli per analizzare se altre variabili (ad esempio, età materna o stato di salute) influenzano il peso del neonato.
Monitoraggio clinico:
Valutazione delle linee guida:
Conclusione
Il grafico conferma una correlazione positiva tra peso e durata della gestazione e mostra differenze evidenti tra maschi e femmine. Tuttavia, gli outlier meritano attenzione, e sarebbe utile approfondire l’impatto di altre variabili sul peso del neonato.
=================================================================
ggplot(data = dati_neonati_fact,
aes(x = Lunghezza,
y = Peso,
color = Sesso
)) +
geom_point( alpha = 0.7) + # Scatterplot con punti blu
labs(
title = "Relazione tra lunghezza misurata tramite ecografia e peso",
x = "Lunghezza del neonato [mm] ",
y = "Peso del Neonato [grammi]"
) +
scale_y_continuous(breaks = seq(800, 5000, 300))+
scale_x_continuous(breaks = seq(300, 600, 20))+
geom_hline(yintercept = 3300, color = "red", linetype = "dashed", size = 0.7)+
geom_hline(yintercept = 2990, color = "orange", linetype = "solid", size = 0.7)+
geom_hline(yintercept = 3620, color = "orange", linetype = "solid", size = 0.7)+
scale_color_manual(values = c("M" = "blue", "F" = "green"))
Il grafico mostra la relazione tra la lunghezza del neonato (in millimetri) e il peso del neonato (in grammi), con i punti distinti per sesso (verde per femmine, blu per maschi). Sono presenti anche linee orizzontali che indicano mediane e range interquartili .
Relazione tra lunghezza e peso:
Esiste una chiara relazione positiva tra la lunghezza e il peso del neonato: all’aumentare della lunghezza, aumenta il peso.
La relazione sembra essere abbastanza lineare, con una maggiore densità di dati tra 450 e 540 mm di lunghezza e 2800-3800 grammi di peso.
Differenze tra maschi e femmine:
I maschi (punti blu) tendono a pesare di più rispetto alle femmine (punti verdi) a parità di lunghezza.
Questa differenza si osserva lungo quasi tutto il range di lunghezza, confermando una tendenza biologica nota.
Distribuzione dei dati:
La maggior parte dei neonati si trova in un intervallo di lunghezza tra 450 e 550 mm, con un peso compreso tra 2800 e 3800 grammi.
Ci sono alcuni outlier:
Neonati con peso molto basso rispetto alla lunghezza
Neonati con peso molto alto rispetto alla lunghezza
Linee di riferimento:
Linea rossa tratteggiata: Rrappresenta il peso mediano dei neonati.
Linee arancioni: Rappresentano i due range interquartili
Interpretazione varie
Neonati normali:
Differenze sessuali:
Identificazione degli outlier:
Analizza gli outlier (peso molto basso o molto alto rispetto alla lunghezza) per verificare se rappresentano errori nei dati o condizioni cliniche particolari.
ci potrebbe essere un dato anomalo nella parte sinistra del grafico rappresentato da una osservazione sesso femmina, maggiore di 4300 grammi di peso ma con una lunghezza di circa 300 mm.
Conclusione
Il grafico evidenzia una relazione chiara tra lunghezza e peso del neonato, con differenze significative tra maschi e femmine. Tuttavia, gli outlier meritano attenzione, poiché possono rappresentare errori nei dati.
ggplot(data = dati_neonati_fact,
aes(x = Cranio,
y = Peso,
color = Sesso
)) +
geom_point( alpha = 0.7) + # Scatterplot con punti blu
labs(
title = "Relazione tra misura del cranio misurata tramite ecografia e peso",
x = "Misura del cranio [mm] ",
y = "Peso del Neonato [grammi]"
) +
scale_y_continuous(breaks = seq(800, 5000, 300))+
scale_x_continuous(breaks = seq(50, 600, 10))+
geom_hline(yintercept = 3300, color = "red", linetype = "dashed", size = 0.7)+
geom_hline(yintercept = 2990, color = "orange", linetype = "solid", size = 0.7)+
geom_hline(yintercept = 3620, color = "orange", linetype = "solid", size = 0.7)+
scale_color_manual(values = c("M" = "blue", "F" = "green"))
Il grafico mostra la relazione tra la misura del cranio (in millimetri) e il peso del neonato (in grammi), distinguendo il sesso del neonato (verde per femmine, blu per maschi). Le linee orizzontali indicano valori di riferimento ( mediana e range interquartili 25%-75% del peso ).
Relazione tra misura del cranio e peso:
Esiste una relazione positiva tra la misura del cranio e il peso: un cranio più grande è associato a un peso maggiore.
La relazione non è perfettamente lineare, ma la tendenza è chiara.
Differenze tra maschi e femmine:
I neonati maschi (punti blu) tendono ad avere una misura del cranio maggiore e un peso superiore rispetto alle femmine (punti verdi) a parità di misura del cranio.
Questa differenza è evidente in quasi tutto l’intervallo di misure.
Distribuzione dei dati:
La maggior parte dei neonati ha una misura del cranio compresa tra 310 e 370 mm e un peso tra 2800 e 4000 grammi.
Ci sono alcuni outlier:
Neonati con una misura del cranio molto piccola e peso basso
Neonati con cranio grande e peso fuori scala
Linee di riferimento:
Linea rossa tratteggiata: Rappresenta il peso mediano dei neonati.
Linee arancioni: Rappresenta il range interquartile del peso del neonato
Interpretazione clinica e biologica
Neonati normali:
Differenze sessuali:
Conclusione
Il grafico evidenzia una relazione chiara e prevedibile tra la misura del cranio e il peso del neonato, con differenze significative tra maschi e femmine. Tuttavia, alcuni outlier meritano attenzione per garantire che non ci siano errori nei dati.
=================================================================
ggplot(data = dati_neonati_fact,
aes(x = Gestazione,
y = Peso,
color = as.factor(Fumatrici)
)) +
geom_point( alpha = 0.9) + # Scatterplot con punti blu
labs(
title = "Relazione tra settimane di gestazione , peso e madre fumatrice ",
x = " Gestazione [settimane] ",
y = "Peso del Neonato [grammi]",
color = " Fumatrici "
) +
scale_y_continuous(breaks = seq(800, 5000, 300))+
scale_x_continuous(breaks = seq(5, 45, 1))+
geom_hline(yintercept = 3300, color = "red", linetype = "dashed", size = 0.7)+
geom_hline(yintercept = 2990, color = "orange", linetype = "solid", size = 0.7)+
geom_hline(yintercept = 3620, color = "orange", linetype = "solid", size = 0.7)+
scale_color_manual(values = c("0" = "blue", "1" = "green"),
labels = c("0" = "Non-fumatrice", "1" = "Fumatrice")
)
Il grafico mostra la relazione tra il numero di settimane di gestazione, il peso del neonato (in grammi) e se la madre è fumatrice (punti verdi) o non fumatrice (punti blu). Sono presenti linee orizzontali che indicano: rossa la mediana del peso mentre quelle arancion i due range interquartili
Impatto del fumo sulla relazione peso-gestazione:
Linee di riferimento:
Linea rossa tratteggiata: Rappresenta il peso mediano dei neonati.
Linee arancioni: Rappresentare il range interquartile
Outlier clinici:
Il grafico mostra il fumo materno sul peso dei neonati, probabilmente a causa del campione, non si riesce a distinguere una differenza chiara tra madri fumatrici e non fumatrici.