Wikibooks
itwikibooks
https://it.wikibooks.org/wiki/Pagina_principale
MediaWiki 1.47.0-wmf.22
first-letter
Media
Speciale
Discussione
Utente
Discussioni utente
Wikibooks
Discussioni Wikibooks
File
Discussioni file
MediaWiki
Discussioni MediaWiki
Template
Discussioni template
Aiuto
Discussioni aiuto
Categoria
Discussioni categoria
Progetto
Discussioni progetto
Ripiano
Discussioni ripiano
TimedText
TimedText talk
Modulo
Discussioni modulo
Evento
Discussioni evento
Elettronica fisica/Semiconduttori
0
5122
502000
455016
2026-10-01T15:58:04Z
Д.Ильин
32713
502000
wikitext
text/x-wiki
{{elettronica fisica}}
{{da wikificare| }}
== Semiconduttori ==
Con il termine semiconduttori si indicano alcuni elementi delle colonne III,
IV e V della tavola periodica, caratterizzati da una resistività elettrica
intermedia tra quella molto bassa dei conduttori e quella estremamente elevata degli isolanti (fig. 1.1). I semiconduttori possono essere composti da
una singola specie atomica della quarta colonna (semiconduttori elementali:
Si, Ge) oppure possono essere combinazioni degli elementi delle colonne III
e V oppure II e VI (semiconduttori composti).
[[Immagine:Semiconductors.png|thumb|center|500px|Figura 1.1: Semiconduttori]]
== Resistività ==
La grandissima differenza di resistività che si osserva tra conduttori, semiconduttori e isolanti è dovuta principalmente alla differente concentrazione
in volume dei portatori di carica. Infatti la densità di corrente di conduzione
J, dovuta al moto di deriva dei portatori in presenza di un campo elettrico
E, per i conduttori ohmici, è:
{| width="100%"
|
{{Equazione|eq=<math>J = n q \mu E</math>|id=1.1}}
{{Equazione|eq=<math>n q \mu = \sigma = \rho^{-1}</math>|id=1.2}}
|
*J = densità di corrente (<math>A m^{-2}</math>)
*n = Concentrazione dei portatori (<math>m^{-3}</math>)
*q = Carica dei portatori (<math>C</math>)
*μ = Mobilità dei portatori (<math>m^2 V^{-1} s^{-1}</math>)
*σ = Conducibilità del materiale (<math>\Omega^{-1} m^{-1}</math>)
*ρ = Resistività del materiale (<math>\Omega m</math>)
|}
La mobilità μ differisce relativamente poco tra materiali diversi, mentre
la concentrazione dei portatori di carica tra isolanti e conduttori spazia
su oltre 20 ordini di grandezza (10^1 ... 10^22 cm<sup>−3</sup>). Nei semiconduttori si
colloca, su scala logaritmica, a metà di questo intervallo (fig. 1.2).
[[Immagine:charge carriers concentration.png|thumb|center|1000px|Figura 1.2: Concentrazione dei portatori di carica per alcuni materiali (cm<sup>3</sup>)]]
== Germanio e Silicio ==
Il Germanio è stato utilizzato per la produzione di dispositivi elettronici
(diodi e transistor) soprattutto negli anni ’50 e ’60; successivamente è stato
sostituito dal Silicio. Attualmente con il Silicio è realizzata la grandissima
maggioranza dei dispositivi a semiconduttore (fig. 1.3).
Germanio e Silicio appartengono alla IV colonna della tavola periodica,
sono tetravalenti e formano cristalli con reticolo tetraedrico. In figura 1.4
è riportata una proiezione in piano del reticolo cristallino tridimensionale,
in cui ogni atomo forma quattro legami covalenti con i quattro atomi primi
vicini.
[[Immagine:Semiconductors dspositives.png|thumb|center|500px|Figura 1.3: Dispositivi a semiconduttore al germanio ed al silicio. Da sinistra:
tre transistor al germanio; un diodo al silicio per piccoli segnali, uno di media
potenza ed uno di potenza; due transistor al silicio per piccoli segnali ed uno
di potenza; un circuito integrato digitale ed un microprocessore.]]
[[Immagine:Semiconduttore intrinseco.png|thumb|center|500px|Figura 1.4: Semiconduttore intrinseco. <br />
a) Allo zero assoluto non ci sono nel
reticolo portatori di carica disponibili; <br />
b) a temperature maggiori dello zero
assoluto alcuni elettroni si rendono disponibili come elettroni di conduzione]]
== Elettroni e Lacune ==
Nella figura 1.4a è schematizzata la situazione del reticolo cristallino alla temperatura dello zero assoluto: tutti gli elettroni di valenza risultano
stabilmente impegnati nei rispettivi legami; non esistono elettroni liberi all’interno del reticolo e quindi il cristallo è un isolante perfetto. La situazione
cambia per temperature diverse dallo zero assoluto: ogni elettrone ha una
probabilità piccola ma finita di uscire dalla buca di potenziale corrispondente al legame covalente e trovarsi nel reticolo, disponibile come elettrone di
conduzione (figura 1.4b).
[[Immagine:lacuna movement.png|thumb|center|500px|Figura 1.5: Movimento delle lacune: una lacuna si trova in A; un elettrone di
valenza salta da B in A; la lacuna in A scompare e riappare in B]]
Per ogni elettrone che abbandona il proprio legame covalente si formano due cariche libere: una carica negativa (l’elettrone) ed una positiva (la
lacuna, cioè la carica positiva rimasta scoperta nel reticolo a seguito dell’allontanamento dell’elettrone). Le lacune sono portatori di carica a tutti gli effetti e danno un contributo al trasporto di carica indipendente da quello
degli elettroni di conduzione. In fig. 1.5 una lacuna si trova in A; un elettrone di valenza salta da B in A; la lacuna in A scompare e riappare in B:
apparentemente la lacuna si è spostata da A a B. In realtà sono sempre gli
elettroni che si muovono, ma poich´e si tratta di elettroni di valenza questo
meccanismo fornisce un movimento di carica indipendente da quello degli
elettroni di conduzione.
Lacune ed elettroni si generano continuamente a coppie in seguito alla
rottura di legami covalenti per effetto della agitazione termica e scompaiono a coppie, quando una lacuna ed un elettrone si ricombinano a riformare un legame covalente. Di conseguenza nel semiconduttore intrinseco
(cioè non drogato, come si vedrà più avanti) la concentrazione delle lacune
(p) sarà sempre eguale a quella degli elettroni (n). Il valore ni di p ed n,
detto concentrazione intrinseca, è determinato dall’equilibrio dinamico tra
generazione e ricombinazione e dipende dalle caratteristiche del materiale
semiconduttore e dalla temperatura T:
{{Equazione|eq=<math>n_i^2 = n^2 = p^2 = B T^3 e^{-e_G/kT}</math>|id=1.3}}
dove EG è l’energia di rottura di un legame covalente, k la costante di
Boltzmann e B una costante caratteristica del materiale. La concentrazione
intrinseca ni aumenta rapidamente con la temperatura e questo aumento
è la causa della forte diminuzione della resistività dei semiconduttori con il riscaldamento (a differenza dei metalli, la cui resistività cresce con la
temperatura).
== Modello a bande di energia ==
Una descrizione accurata dei meccanismi di trasporto nei semiconduttori si
può avere solo facendo uso della meccanica quantistica, tramite la teoria delle
bande (banda di conduzione e di valenza) ed esula dallo scopo di queste note.
Qui è sufficiente utilizzare i risultati che descrivono fenomenologicamente tali
meccanismi. Il risultato più importante è costituito proprio dal fatto che in
un semiconduttore si ha un doppio meccanismo di conduzione, legato alla
presenza di portatori di carica negativi (gli elettroni di conduzione) e positivi
(le lacune), che portano ciascuno una unità di carica elettrica q di segno
opposto. In un metallo invece gli unici portatori di carica sono gli elettroni.
In presenza di un campo elettrico si stabilisce quindi una corrente di deriva
con densità J:
{| width="100%"
!Metalli
!Semiconduttori
!
|-
| align="center" |<math>J = q n \mu_n E</math>
| align="center" |<math>J = q (n \mu_n + p \mu_p ) E</math>
| align="right" |''(1.4)''
|-
| align="center" |<math>\sigma = q n \mu_n</math>
| align="center" |<math>\sigma = q (n \mu_n + p \mu_p)</math>
| align="right" |''(1.5)''
|}
Le caratteristiche chimico-fisiche principali alla base delle proprietà di
conduzione di Silicio e Germanio sono riportate in tabella 1.1.
== Semiconduttore estrinseco ==
Si ha un semiconduttore estrinseco o drogato quando piccole quantità di atomi di elementi trivalenti (es.: boro, gallio, indio) o pentavalenti (es.: antimonio, fosforo, arsenico) vengono sostituite nel reticolo cristallino agli atomi
originali del semiconduttore, Germanio o Silicio (fig.1.6). La frazione di atomi sostituiti tipicamente è compresa nell’intervallo 10−3 . . . 10−9, per cui le
proprietà chimico-fisiche del reticolo cristallino rimangono sostanzialmente
inalterate. Gli atomi estranei si sostituiscono a quelli del semiconduttore
originale e portano nel reticolo un eccesso di un elettrone, nel caso degli elementi pentavalenti (atomi donatori, drogaggio di tipo N), o un difetto di un
elettrone, cioè una lacuna nel caso degli elementi trivalenti (atomi accettori,
drogaggio di tipo P).
In entrambi i casi ci troviamo ad avere inserito portatori di carica liberi
nel cristallo: gli elettroni in eccesso portati dal drogaggio N hanno una
energia di legame con il proprio atomo sufficientemente bassa da trovarsi
già a temperatura ambiente tutti disponibili come elettroni di conduzione,
{| class="wikitable"
|+ '''''Tabella 1.1: Principali caratteristiche chimico-fisiche di Germanio e Silicio a temperatura ambiente (300 K).'''''
!
!
!Ge
!Si
!
|-
|numero atomico
|
|32
|14
|uma (g/mole)
|-
|peso atomico
|
|72.6
|28.1
|
|-
|densità
|
|5.32
|2.33
|g/cm<sup>3</sup>
|-
|densità atomica
|
|4.4 · 10<sup>22</sup>
|5 · 10<sup>22</sup>
|atomi/cm<sup>3</sup>
|-
|costante dielettrica relativa
|
|16
|12
|-
|Energia di legame (bandgap)
|E<sub>G</sub>
|0.72
|1.1
|eV
|-
|concentrazione intrinseca
|n<sub>i</sub>
|2.5 · 10<sup>13</sup>
|1.5 · 10<sup>10</sup>
|cm<sup>-3</sup>
|-
|1/n<sub>i</sub> · dn<sub>i</sub>/dT
|
|16
|10
|%/°K
|-
|dρ /dT
|
|
|
|
|-
|frazione portatori/legami
|
|0.14 · 10<sup>-9</sup>
|0.75 · 10<sup>-13</sup>
|
|-
|resistività
|
|0.45
|2300
|Ω·m
|-
|mobilità degli elettroni
|μ<sub>n</sub>
|0.38
|0.14
|m<sup>2</sup>/(V · s)
|-
|mobilità delle lacune
|μp
|0.18
|0.05
|m<sup>2</sup>/(V · s)
|-
|coeff. di diffusione degli elettroni
|D<sub>n</sub>
|9.9 · 10<sup>−3</sup>
|3.4 · 10<sup>-3</sup>
|m<sup>2</sup>/s
|-
|coeff. di diffusione delle lacune
|D<sub>p</sub>
|4.7 · 10<sup>−3</sup>
|1.3 · 10<sup>−3</sup>
|m<sup>2</sup>/s
|}
[[Immagine:n type semiconductor.svg]]
[[Immagine:p type semiconductor.png]]
[[Immagine:semiconductor legend.png]]
<p align=center>Figura 1.6: Modello di semiconduttore estrinseco
e quindi come portatori di carica negativa; analogamente le lacune portate
dal drogaggio di tipo P costituiscono altrettanti portatori di carica positivi.</p>
== Legge di Azione di Massa ==
L’aumento della concentrazione di uno dei due tipi di portatori n o p nel reticolo in seguito al drogaggio porta conseguentemente una diminuzione della
concentrazione dell’altro portatore. Infatti la probabilità di ricombinazione
delle coppie lacuna-elettrone è legata al prodotto n·p delle due concentrazioni, mentre la probabilità di generazione di nuove coppie per effetto
della agitazione termica è legata alla concentrazione di legami non ionizzati e quindi rimane sostanzialmente costante anche in seguito al drogaggio.
Questo equilibrio è riassunto nella legge di azione di massa:
{{equazione|eq=n·p = n<sub>i</sub><sup>2</sup>(T)|id=1.6}}
Nell’intervallo di drogaggi usati abitualmente si ha, indicando con N<sub>A</sub> ed N<sub>D</sub> rispettivamente la concentrazione di atomi accettori e donatori:
{| width =100%
| semiconduttore P: || N<sub>A</sub> ≫ n<sub>i</sub> || p<sub>p</sub> ≈ N<sub>A</sub> ||
n<sub>p</sub> = n<sub>i</sub><sup>2</sup>/N<sub>A</sub>
|}
{| width =100%
| semiconduttore N: || N<sub>D</sub> ≫ n<sub>i</sub> || n<sub>n</sub> ≈ N<sub>D</sub> ||
p<sub>n</sub> = n<sub>i</sub><sup>2</sup>/N<sub>D</sub>
|}
Con p<sub>p</sub> e n<sub>n</sub> sono state indicate le concentrazioni di lacune ed elettroni nelle regioni rispettivamente di tipo P ed N; questi sono i portatori maggioritari, in quanto presenti nella regione in quantità preponderante. I simboli n<sub>p</sub> e p<sub>n</sub> indicano invece le concentrazioni dei portatori minoritari: l’altra specie di portatori, la cui concentrazione risulta fortemente depressa a causa della abbondante presenza dei maggioritari (fig. 1.7).
[[Immagine:semicond relation mu.png|Figura 1.7: Livelli di drogaggio nei semiconduttori al silicio e concentrazioni
dei portatori a temperatura ambiente]]
== Corrente di diffusione ==
Nei semiconduttori il trasporto di carica avviene come moto di deriva dei
portatori per effetto del campo elettrico (corrente di conduzione), analogamente a quanto avviene nei metalli. Oltre a questo meccanismo ve ne è un
secondo, legato alla diffusione, che invece è irrilevante nel caso dei metalli:
un gradiente di concentrazione dei portatori di carica dà origine ad un moto
di diffusione e quindi ad una densità di corrente elettrica di lacune (J<sub>p</sub>) e di elettroni (J<sub>n</sub>) anche in assenza di un campo elettrico:
{{equazione|eq=J<sub>p</sub> = −q''D''<sub>p</sub>∇rp|id=1.7a}}
{{Equazione|eq=J<sub>n</sub> = q''D''<sub>n</sub>∇n|id=1.7b}}
La densità di corrente totale J è data dalla somma dei contributi di
conduzione e diffusione per entrambi i tipi di portatori:
J
p = q μp p E − q Dp rp J
n = q μn n E + q Dn rn (1.8)
J = J<sub>p</sub>+ J<sub>n</sub> (1.9)
I coefficienti di diffusione D<sub>p</sub>, D<sub>n</sub> e le mobilità μ<sub>p</sub>, μ<sub>n</sub> sono legati dalla
relazione di Einstein:
D<sub>p</sub>/μ<sub>p</sub>
=
D<sub>n</sub>/μ<sub>n</sub>
= V<sub>T</sub> = kT/q
(1.10).
A temperatura ambiente VT è 26 mV .
[[Categoria:Elettronica fisica|Semiconduttori]]
r58tlgu8hm6ekzexcboit0aor2xl1bx
502001
502000
2026-10-01T16:54:12Z
Д.Ильин
32713
502001
wikitext
text/x-wiki
{{elettronica fisica}}
{{da wikificare| }}
== Semiconduttori ==
Con il termine semiconduttori si indicano alcuni elementi delle colonne III,
IV e V della tavola periodica, caratterizzati da una resistività elettrica
intermedia tra quella molto bassa dei conduttori e quella estremamente elevata degli isolanti (fig. 1.1). I semiconduttori possono essere composti da
una singola specie atomica della quarta colonna (semiconduttori elementali:
Si, Ge) oppure possono essere combinazioni degli elementi delle colonne III
e V oppure II e VI (semiconduttori composti).
[[Immagine:Semiconductors.png|thumb|center|500px|Figura 1.1: Semiconduttori]]
== Resistività ==
La grandissima differenza di resistività che si osserva tra conduttori, semiconduttori e isolanti è dovuta principalmente alla differente concentrazione
in volume dei portatori di carica. Infatti la densità di corrente di conduzione
J, dovuta al moto di deriva dei portatori in presenza di un campo elettrico
E, per i conduttori ohmici, è:
{| width="100%"
|
{{Equazione|eq=<math>J = n q \mu E</math>|id=1.1}}
{{Equazione|eq=<math>n q \mu = \sigma = \rho^{-1}</math>|id=1.2}}
|
*J = densità di corrente (<math>A m^{-2}</math>)
*n = Concentrazione dei portatori (<math>m^{-3}</math>)
*q = Carica dei portatori (<math>C</math>)
*μ = Mobilità dei portatori (<math>m^2 V^{-1} s^{-1}</math>)
*σ = Conducibilità del materiale (<math>\Omega^{-1} m^{-1}</math>)
*ρ = Resistività del materiale (<math>\Omega m</math>)
|}
La mobilità μ differisce relativamente poco tra materiali diversi, mentre
la concentrazione dei portatori di carica tra isolanti e conduttori spazia
su oltre 20 ordini di grandezza (10^1 ... 10^22 cm<sup>−3</sup>). Nei semiconduttori si
colloca, su scala logaritmica, a metà di questo intervallo (fig. 1.2).
[[Immagine:charge carriers concentration.png|thumb|center|1000px|Figura 1.2: Concentrazione dei portatori di carica per alcuni materiali (cm<sup>3</sup>)]]
== Germanio e Silicio ==
Il Germanio è stato utilizzato per la produzione di dispositivi elettronici
(diodi e transistor) soprattutto negli anni ’50 e ’60; successivamente è stato
sostituito dal Silicio. Attualmente con il Silicio è realizzata la grandissima
maggioranza dei dispositivi a semiconduttore (fig. 1.3).
Germanio e Silicio appartengono alla IV colonna della tavola periodica,
sono tetravalenti e formano cristalli con reticolo tetraedrico. In figura 1.4
è riportata una proiezione in piano del reticolo cristallino tridimensionale,
in cui ogni atomo forma quattro legami covalenti con i quattro atomi primi
vicini.
[[Immagine:Semiconductors dspositives.png|thumb|center|500px|Figura 1.3: Dispositivi a semiconduttore al germanio ed al silicio. Da sinistra:
tre transistor al germanio; un diodo al silicio per piccoli segnali, uno di media
potenza ed uno di potenza; due transistor al silicio per piccoli segnali ed uno
di potenza; un circuito integrato digitale ed un microprocessore.]]
[[Immagine:Semiconduttore intrinseco.png|thumb|center|500px|Figura 1.4: Semiconduttore intrinseco. <br />
a) Allo zero assoluto non ci sono nel
reticolo portatori di carica disponibili; <br />
b) a temperature maggiori dello zero
assoluto alcuni elettroni si rendono disponibili come elettroni di conduzione]]
== Elettroni e Lacune ==
Nella figura 1.4a è schematizzata la situazione del reticolo cristallino alla temperatura dello zero assoluto: tutti gli elettroni di valenza risultano
stabilmente impegnati nei rispettivi legami; non esistono elettroni liberi all’interno del reticolo e quindi il cristallo è un isolante perfetto. La situazione
cambia per temperature diverse dallo zero assoluto: ogni elettrone ha una
probabilità piccola ma finita di uscire dalla buca di potenziale corrispondente al legame covalente e trovarsi nel reticolo, disponibile come elettrone di
conduzione (figura 1.4b).
[[Immagine:lacuna movement.png|thumb|center|500px|Figura 1.5: Movimento delle lacune: una lacuna si trova in A; un elettrone di
valenza salta da B in A; la lacuna in A scompare e riappare in B]]
Per ogni elettrone che abbandona il proprio legame covalente si formano due cariche libere: una carica negativa (l’elettrone) ed una positiva (la
lacuna, cioè la carica positiva rimasta scoperta nel reticolo a seguito dell’allontanamento dell’elettrone). Le lacune sono portatori di carica a tutti gli effetti e danno un contributo al trasporto di carica indipendente da quello
degli elettroni di conduzione. In fig. 1.5 una lacuna si trova in A; un elettrone di valenza salta da B in A; la lacuna in A scompare e riappare in B:
apparentemente la lacuna si è spostata da A a B. In realtà sono sempre gli
elettroni che si muovono, ma poich´e si tratta di elettroni di valenza questo
meccanismo fornisce un movimento di carica indipendente da quello degli
elettroni di conduzione.
Lacune ed elettroni si generano continuamente a coppie in seguito alla
rottura di legami covalenti per effetto della agitazione termica e scompaiono a coppie, quando una lacuna ed un elettrone si ricombinano a riformare un legame covalente. Di conseguenza nel semiconduttore intrinseco
(cioè non drogato, come si vedrà più avanti) la concentrazione delle lacune
(p) sarà sempre eguale a quella degli elettroni (n). Il valore ni di p ed n,
detto concentrazione intrinseca, è determinato dall’equilibrio dinamico tra
generazione e ricombinazione e dipende dalle caratteristiche del materiale
semiconduttore e dalla temperatura T:
{{Equazione|eq=<math>n_i^2 = n^2 = p^2 = B T^3 e^{-e_G/kT}</math>|id=1.3}}
dove EG è l’energia di rottura di un legame covalente, k la costante di
Boltzmann e B una costante caratteristica del materiale. La concentrazione
intrinseca ni aumenta rapidamente con la temperatura e questo aumento
è la causa della forte diminuzione della resistività dei semiconduttori con il riscaldamento (a differenza dei metalli, la cui resistività cresce con la
temperatura).
== Modello a bande di energia ==
Una descrizione accurata dei meccanismi di trasporto nei semiconduttori si
può avere solo facendo uso della meccanica quantistica, tramite la teoria delle
bande (banda di conduzione e di valenza) ed esula dallo scopo di queste note.
Qui è sufficiente utilizzare i risultati che descrivono fenomenologicamente tali
meccanismi. Il risultato più importante è costituito proprio dal fatto che in
un semiconduttore si ha un doppio meccanismo di conduzione, legato alla
presenza di portatori di carica negativi (gli elettroni di conduzione) e positivi
(le lacune), che portano ciascuno una unità di carica elettrica q di segno
opposto. In un metallo invece gli unici portatori di carica sono gli elettroni.
In presenza di un campo elettrico si stabilisce quindi una corrente di deriva
con densità J:
{| width="100%"
!Metalli
!Semiconduttori
!
|-
| align="center" |<math>J = q n \mu_n E</math>
| align="center" |<math>J = q (n \mu_n + p \mu_p ) E</math>
| align="right" |''(1.4)''
|-
| align="center" |<math>\sigma = q n \mu_n</math>
| align="center" |<math>\sigma = q (n \mu_n + p \mu_p)</math>
| align="right" |''(1.5)''
|}
Le caratteristiche chimico-fisiche principali alla base delle proprietà di
conduzione di Silicio e Germanio sono riportate in tabella 1.1.
== Semiconduttore estrinseco ==
Si ha un semiconduttore estrinseco o drogato quando piccole quantità di atomi di elementi trivalenti (es.: boro, gallio, indio) o pentavalenti (es.: antimonio, fosforo, arsenico) vengono sostituite nel reticolo cristallino agli atomi
originali del semiconduttore, Germanio o Silicio (fig.1.6). La frazione di atomi sostituiti tipicamente è compresa nell’intervallo 10−3 . . . 10−9, per cui le
proprietà chimico-fisiche del reticolo cristallino rimangono sostanzialmente
inalterate. Gli atomi estranei si sostituiscono a quelli del semiconduttore
originale e portano nel reticolo un eccesso di un elettrone, nel caso degli elementi pentavalenti (atomi donatori, drogaggio di tipo N), o un difetto di un
elettrone, cioè una lacuna nel caso degli elementi trivalenti (atomi accettori,
drogaggio di tipo P).
In entrambi i casi ci troviamo ad avere inserito portatori di carica liberi
nel cristallo: gli elettroni in eccesso portati dal drogaggio N hanno una
energia di legame con il proprio atomo sufficientemente bassa da trovarsi
già a temperatura ambiente tutti disponibili come elettroni di conduzione,
{| class="wikitable"
|+ '''''Tabella 1.1: Principali caratteristiche chimico-fisiche di Germanio e Silicio a temperatura ambiente (300 K).'''''
!
!
!Ge
!Si
!
|-
|numero atomico
|
|32
|14
|uma (g/mole)
|-
|peso atomico
|
|72.6
|28.1
|
|-
|densità
|
|5.32
|2.33
|g/cm<sup>3</sup>
|-
|densità atomica
|
|4.4 · 10<sup>22</sup>
|5 · 10<sup>22</sup>
|atomi/cm<sup>3</sup>
|-
|costante dielettrica relativa
|
|16
|12
|-
|Energia di legame (bandgap)
|E<sub>G</sub>
|0.72
|1.1
|eV
|-
|concentrazione intrinseca
|n<sub>i</sub>
|2.5 · 10<sup>13</sup>
|1.5 · 10<sup>10</sup>
|cm<sup>-3</sup>
|-
|1/n<sub>i</sub> · dn<sub>i</sub>/dT
|
|16
|10
|%/°K
|-
|dρ /dT
|
|
|
|
|-
|frazione portatori/legami
|
|0.14 · 10<sup>-9</sup>
|0.75 · 10<sup>-13</sup>
|
|-
|resistività
|
|0.45
|2300
|Ω·m
|-
|mobilità degli elettroni
|μ<sub>n</sub>
|0.38
|0.14
|m<sup>2</sup>/(V · s)
|-
|mobilità delle lacune
|μp
|0.18
|0.05
|m<sup>2</sup>/(V · s)
|-
|coeff. di diffusione degli elettroni
|D<sub>n</sub>
|9.9 · 10<sup>−3</sup>
|3.4 · 10<sup>-3</sup>
|m<sup>2</sup>/s
|-
|coeff. di diffusione delle lacune
|D<sub>p</sub>
|4.7 · 10<sup>−3</sup>
|1.3 · 10<sup>−3</sup>
|m<sup>2</sup>/s
|}
[[Immagine:n type semiconductor.svg]]
[[Immagine:p type semiconductor.svg]]
[[Immagine:semiconductor legend.png]]
<p align=center>Figura 1.6: Modello di semiconduttore estrinseco
e quindi come portatori di carica negativa; analogamente le lacune portate
dal drogaggio di tipo P costituiscono altrettanti portatori di carica positivi.</p>
== Legge di Azione di Massa ==
L’aumento della concentrazione di uno dei due tipi di portatori n o p nel reticolo in seguito al drogaggio porta conseguentemente una diminuzione della
concentrazione dell’altro portatore. Infatti la probabilità di ricombinazione
delle coppie lacuna-elettrone è legata al prodotto n·p delle due concentrazioni, mentre la probabilità di generazione di nuove coppie per effetto
della agitazione termica è legata alla concentrazione di legami non ionizzati e quindi rimane sostanzialmente costante anche in seguito al drogaggio.
Questo equilibrio è riassunto nella legge di azione di massa:
{{equazione|eq=n·p = n<sub>i</sub><sup>2</sup>(T)|id=1.6}}
Nell’intervallo di drogaggi usati abitualmente si ha, indicando con N<sub>A</sub> ed N<sub>D</sub> rispettivamente la concentrazione di atomi accettori e donatori:
{| width =100%
| semiconduttore P: || N<sub>A</sub> ≫ n<sub>i</sub> || p<sub>p</sub> ≈ N<sub>A</sub> ||
n<sub>p</sub> = n<sub>i</sub><sup>2</sup>/N<sub>A</sub>
|}
{| width =100%
| semiconduttore N: || N<sub>D</sub> ≫ n<sub>i</sub> || n<sub>n</sub> ≈ N<sub>D</sub> ||
p<sub>n</sub> = n<sub>i</sub><sup>2</sup>/N<sub>D</sub>
|}
Con p<sub>p</sub> e n<sub>n</sub> sono state indicate le concentrazioni di lacune ed elettroni nelle regioni rispettivamente di tipo P ed N; questi sono i portatori maggioritari, in quanto presenti nella regione in quantità preponderante. I simboli n<sub>p</sub> e p<sub>n</sub> indicano invece le concentrazioni dei portatori minoritari: l’altra specie di portatori, la cui concentrazione risulta fortemente depressa a causa della abbondante presenza dei maggioritari (fig. 1.7).
[[Immagine:semicond relation mu.png|Figura 1.7: Livelli di drogaggio nei semiconduttori al silicio e concentrazioni
dei portatori a temperatura ambiente]]
== Corrente di diffusione ==
Nei semiconduttori il trasporto di carica avviene come moto di deriva dei
portatori per effetto del campo elettrico (corrente di conduzione), analogamente a quanto avviene nei metalli. Oltre a questo meccanismo ve ne è un
secondo, legato alla diffusione, che invece è irrilevante nel caso dei metalli:
un gradiente di concentrazione dei portatori di carica dà origine ad un moto
di diffusione e quindi ad una densità di corrente elettrica di lacune (J<sub>p</sub>) e di elettroni (J<sub>n</sub>) anche in assenza di un campo elettrico:
{{equazione|eq=J<sub>p</sub> = −q''D''<sub>p</sub>∇rp|id=1.7a}}
{{Equazione|eq=J<sub>n</sub> = q''D''<sub>n</sub>∇n|id=1.7b}}
La densità di corrente totale J è data dalla somma dei contributi di
conduzione e diffusione per entrambi i tipi di portatori:
J
p = q μp p E − q Dp rp J
n = q μn n E + q Dn rn (1.8)
J = J<sub>p</sub>+ J<sub>n</sub> (1.9)
I coefficienti di diffusione D<sub>p</sub>, D<sub>n</sub> e le mobilità μ<sub>p</sub>, μ<sub>n</sub> sono legati dalla
relazione di Einstein:
D<sub>p</sub>/μ<sub>p</sub>
=
D<sub>n</sub>/μ<sub>n</sub>
= V<sub>T</sub> = kT/q
(1.10).
A temperatura ambiente VT è 26 mV .
[[Categoria:Elettronica fisica|Semiconduttori]]
ofg0qau4h7beg2iajjh71klxkwrfvqk
Wikibooks:Bar
4
19157
501998
501834
2026-10-01T12:42:40Z
MediaWiki message delivery
19950
/* Wikidata Sitelink changes in Recent Changes and Watchlist */ nuova sezione
501998
wikitext
text/x-wiki
{{Bar|discussioni_in_evidenza=}}{{Nascondi titolo}}
<!--'''Ultima modifica''': {{#time:j F Y, H:i|{{REVISIONTIMESTAMP}} }} '''Utente''': {{REVISIONUSER}} -->
== Teorema dei rapporti geometrici ==
Vorrei creare un libro su un teorema:
R= proprietà interna i fratto dimensione esterna p.
Per saperne di più scrivetemi [[Utente:Diego esposito67|Diego esposito67]] ([[Discussioni utente:Diego esposito67|disc.]]) 21:10, 11 gen 2026 (CET)
:@[[Utente:Diego esposito67|Diego esposito67]] Ti ho risposto nella [[Discussioni utente:Diego esposito67|tua talk]]. [[Utente:Hippias|<span style="font-family:Georgia, serif">Hippias</span>]] <sup>([[Discussioni utente:Hippias|msg]])</sup> 16:26, 12 gen 2026 (CET)
== Thank You for Last Year – Join Wiki Loves Ramadan 2026 ==
Dear Wikimedia communities,
We hope you are doing well, and we wish you a happy New Year.
''Last year, we captured light. This year, we’ll capture legacy.''
In 2025, communities around the world shared the glow of Ramadan nights and the warmth of collective iftars. In 2026, ''Wiki Loves Ramadan'' is expanding, bringing more stories, more cultures, and deeper global connections across Wikimedia projects.
We invite you to explore the ''Wiki Loves Ramadan 2026'' [[m:Special:MyLanguage/Wiki Loves Ramadan 2026|Meta page]] to learn how you can participate and [[m:Special:MyLanguage/Wiki Loves Ramadan 2026/Participating communities|sign up]] your community.
📷 ''Photo campaign on '' [[c:Special:MyLanguage/Commons:Wiki Loves Ramadan 2026|Wikimedia Commons]]
If you have questions about the project, please refer to the FAQs:
* [[m:Special:MyLanguage/Wiki Loves Ramadan/FAQ/|Meta-Wiki]]
* [[c:Special:MyLanguage/Commons:Wiki Loves Ramadan/FAQ|Wikimedia Commons]]
''Early registration for updates is now open via the '''[[m:Special:RegisterForEvent/2710|Event page]]'''''
''Stay connected and receive updates:''
* [https://t.me/WikiLovesRamadan Telegram channel]
* [https://lists.wikimedia.org/postorius/lists/wikilovesramadan.lists.wikimedia.org/ Mailing list]
We look forward to collaborating with you and your community.
'''The Wiki Loves Ramadan 2026 Organizing Team''' 20:44, 16 gen 2026 (CET)
<!-- Messaggio inviato da User:ZI Jony@metawiki usando l'elenco su https://meta.wikimedia.org/w/index.php?title=Distribution_list/Non-Technical_Village_Pumps_distribution_list&oldid=29879549 -->
== <span lang="en" dir="ltr">Annual review of the Universal Code of Conduct and Enforcement Guidelines</span> ==
<div lang="en" dir="ltr">
<section begin="announcement-content" />
I am writing to you to let you know the annual review period for the Universal Code of Conduct and Enforcement Guidelines is open now. You can make suggestions for changes through 9 February 2026. This is the first step of several to be taken for the annual review. [[m:Special:MyLanguage/Universal Code of Conduct/Annual review/2026|Read more information and find a conversation to join on the UCoC page on Meta]].
The [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee|Universal Code of Conduct Coordinating Committee]] (U4C) is a global group dedicated to providing an equitable and consistent implementation of the UCoC. This annual review was planned and implemented by the U4C. For more information and the responsibilities of the U4C, [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Charter|you may review the U4C Charter]].
Please share this information with other members in your community wherever else might be appropriate.
-- In cooperation with the U4C, [[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User talk:Keegan (WMF)|talk]])<section end="announcement-content" />
</div>
22:01, 19 gen 2026 (CET)
<!-- Messaggio inviato da User:Keegan (WMF)@metawiki usando l'elenco su https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=29905753 -->
== Wikimedia Hackathon e Wikimania 2026: apertura borse di partecipazione di Wikimedia Italia ==
Siamo molto lieti di comunicarvi che Wikimedia Italia ha aperto le '''borse per sostenere i costi di partecipazione a [[:mw:Wikimedia Hackathon 2026|Wikimedia Hackathon 2026]] e [[:wmania:2026:Wikimania|Wikimania 2026]]'''.
* Per Wikimedia Hackathon, che si terrà a Milano dal 1º al 3 maggio, vengono messe a disposizione 6 borse da 350 € ciascuna e la richiesta può essere inviata '''entro venerdì 6 febbraio 2026'''.
* Per Wikimania, che si terrà a Parigi dal 21 al 25 luglio, vengono messe a disposizione 13 borse da 800 € ciascuna e la richiesta può essere inviata '''entro domenica 1º marzo 2026'''.
Tutte le richieste pervenute saranno poi valutate da due commissioni appositamente costituite e gli esiti verranno comunicati entro l'11 febbraio per il Wikimedia Hackathon ed entro il 25 marzo per Wikimania.
I bandi completi si trovano sul wiki di Wikimedia Italia:
* Wikimedia Hackathon: [[:wmit:Programma borse di partecipazione per il Wikimedia Hackathon 2026|Programma borse di partecipazione per il Wikimedia Hackathon 2026]]
* Wikimania: [[:wmit:Programma borse di partecipazione "Alessio Guidetti" per Wikimania 2026|Programma borse di partecipazione "Alessio Guidetti" per Wikimania 2026]]
All'interno dei bandi si trovano i link ai form da compilare per la richiesta. Siete tutti invitati a partecipare!
Per qualsiasi dubbio, non esitate a [https://it.wikipedia.org/wiki/Speciale:InviaEmail?wpTarget=Dario_Crespi_(WMIT) scrivermi]. Buona giornata, --[[Utente:Dario Crespi (WMIT)|Dario Crespi (WMIT)]] ([[Discussioni utente:Dario Crespi (WMIT)|disc.]]) 09:55, 28 gen 2026 (CET)
== Sondaggio su microgrant e sportello volontari di Wikimedia Italia ==
Ciao. Nel corso degli ultimi anni [[:it:w:Wikipedia:Wikimedia Italia|Wikimedia Italia]] ha introdotto alcuni strumenti a sostegno delle attività promosse dai volontari dei progetti Wikimedia e OpenStreetMap. In particolare, dal 2017 con il programma '''microgrant''' finanzia progetti fino a 1000 euro, mentre dal 2021 è attivo lo '''sportello volontari''', che finanzia progetti per importi superiori.
Vorremmo capire meglio quanto questi strumenti siano conosciuti e come siano percepiti, oltre a individuare possibili miglioramenti per rispondere sempre di più alle esigenze della comunità. Per questo ti chiediamo di dedicarci qualche minuto compilando un breve sondaggio: il tuo punto di vista per noi è davvero prezioso.
Le risposte ci aiuteranno a individuare cosa funziona, cosa può essere migliorato e in che modo Wikimedia Italia può offrire un supporto più efficace.
Il sondaggio è disponibile a questo link: https://survey.wikimedia.it/index.php/754139
Ti chiediamo per favore di rispondere entro le ore 23.59 di domenica 15 febbraio.
Ti ringrazio e rimango a tua disposizione per qualsiasi informazione, [[Utente:Dario Crespi (WMIT)|Dario Crespi (WMIT)]] ([[Discussioni utente:Dario Crespi (WMIT)|disc.]]) 16:42, 9 feb 2026 (CET)
== Attivazione sportello di supporto legale di Wikimedia Italia ==
Ciao. Sono felice di comunicarvi che da oggi è attivo un nuovo servizio che Wikimedia Italia, richiesto dagli utenti in diverse occasioni, anche nella fase di consultazione per la stesura della [[:meta:Wikimedia Italia/Strategia 2026-2030|strategia 2026-2030 di Wikimedia Italia]].
Si tratta di uno '''sportello di supporto legale gratuito''', che consente ai volontari di potersi rivolgere a un avvocato in merito a questioni che riguardano la loro attività su Wikipedia e gli altri progetti Wikimedia.<br/>
Questo sportello si articola in due parti:
* un documento con "risposte a domande frequenti" che affronta alcune casistiche di carattere generale più ricorrenti (e che potrà essere aggiornata e ampliata in futuro);
* la possibilità di richiedere una consulenza legale con un avvocato per chiarimenti sui contenuti del documento o per questioni non trattate nelle FAQ.
Trovate tutte le informazioni relative allo sportello di supporto legale in questa pagina su Wikipedia in italiano: '''[[w:it:Wikipedia:Wikimedia Italia/Supporto legale|Wikipedia:Wikimedia Italia/Supporto legale]]'''.
Per qualsiasi domanda o osservazione, non esitate a contattarmi rispondendo a questo messaggio (vi chiedo di pingarmi) o tramite [[Special:EmailUser/Dario_Crespi_(WMIT)|email]]. --[[Utente:Dario Crespi (WMIT)|Dario Crespi (WMIT)]] ([[Discussioni utente:Dario Crespi (WMIT)|disc.]]) 17:17, 11 mar 2026 (CET)
== <span lang="en" dir="ltr">Upcoming deployment of CampaignEvents extension to Wikibooks</span> ==
<div lang="en" dir="ltr">
<section begin="message"/>
Hello everyone,
We are writing to inform you that the [[mw:Help:Extension:CampaignEvents|CampaignEvents extension]] will be deployed to all Wikibooks projects during the week of '''23 March 2026'''.
This follows last year’s broader rollout across Wikimedia projects. We realized that Wikibooks was not included at the time, and we’re now addressing that to ensure consistency across all communities.
The CampaignEvents extension provides tools to support event and campaign organization on-wiki, including features like on-wiki event registration and collaboration lists(global event list).
We welcome any questions, feedback, or concerns you may have. We are also happy to support anyone interested in trying out the tools.
''Apologies if this message is not in your preferred language. If you’re able to help translate it for your community, please feel free to do so.''
<section end="message"/>
</div>
<bdi lang="en" dir="ltr">[[User:Udehb-WMF|Udehb-WMF]] ([[User talk:Udehb-WMF|discussione]]) 19:22, 19 mar 2026 (CET)</bdi>
<!-- Messaggio inviato da User:Udehb-WMF@metawiki usando l'elenco su https://meta.wikimedia.org/w/index.php?title=User:Udehb-WMF/sandbox/MM_target&oldid=30284073 -->
== Richiesta inserimento template "Simple Page Navigation" ==
Salve,
vorrei sapere se si può inserire nella Wikibooks italiana il template "Simple Page Navigation" che potete visualizzare qui :
https://en.wikibooks.org/wiki/Scientific_Calculations_with_Julia
e che serve a navigare tra i moduli di un Wikibook .
Grazie [[Utente:Lovepeacejoy404|Lovepeacejoy404]] ([[Discussioni utente:Lovepeacejoy404|disc.]]) 15:59, 27 mar 2026 (CET)
:@[[Utente:Lovepeacejoy404|Lovepeacejoy404]] Ciao, su Wikibooks in italiano abbiamo {{tl|Capitolo}}, che è l'equivalente al template che citi. [[Utente:Hippias|<span style="font-family:Georgia, serif">Hippias</span>]] <sup>([[Discussioni utente:Hippias|msg]])</sup> 16:06, 27 mar 2026 (CET)
::Ok, grazie dell'informazione. Saluti [[Utente:Lovepeacejoy404|Lovepeacejoy404]] ([[Discussioni utente:Lovepeacejoy404|disc.]]) 16:20, 27 mar 2026 (CET)
== Action Required: Update templates/modules for electoral maps (Migrating from P1846 to P14226) ==
Hello everyone,
This is a notice regarding an ongoing data migration on Wikidata that may affect your election-related templates and Lua modules (such as <code>Module:Itemgroup/list</code>).
'''The Change:'''<br />
Currently, many templates pull electoral maps from Wikidata using the property [[:d:Property:P1846|P1846]], combined with the qualifier [[:d:Property:P180|P180]]: [[:d:Q19571328|Q19571328]].
We are migrating this data (across roughly 4,000 items) to a newly created, dedicated property: '''[[:d:Property:P14226|P14226]]'''.
'''What You Need To Do:'''<br />
To ensure your templates and infoboxes do not break or lose their maps, please update your local code to fetch data from [[:d:Property:P14226|P14226]] instead of the old [[:d:Property:P1846|P1846]] + [[:d:Property:P180|P180]] structure. A [[m:Wikidata/Property Migration: P1846 to P14226/List|list of pages]] was generated using Wikimedia Global Search.
'''Deadline:'''<br />
We are temporarily retaining the old data on [[:d:Property:P1846|P1846]] to allow for a smooth transition. However, to complete the data cleanup on Wikidata, the old [[:d:Property:P1846|P1846]] statements will be removed after '''May 1, 2026'''. Please update your modules and templates before this date to prevent any disruption to your wiki's election articles.
Let us know if you have any questions or need assistance with the query logic. Thank you for your help! [[User:ZI Jony|ZI Jony]] using [[Utente:MediaWiki message delivery|MediaWiki message delivery]] ([[Discussioni utente:MediaWiki message delivery|disc.]]) 19:11, 3 apr 2026 (CEST)
<!-- Messaggio inviato da User:ZI Jony@metawiki usando l'elenco su https://meta.wikimedia.org/w/index.php?title=Distribution_list/Non-Technical_Village_Pumps_distribution_list&oldid=29941252 -->
== Save the Date: itWikiCon 2026 a Vezia (Lugano) – Vi aspettiamo! ==
Gli organizzatori sono entusiasti di invitarvi '''all’itWikiCon 2026 che si terrà a [[:w:it:Vezia|Vezia]] ([[:w:it:Lugano|Lugano]])'''! È la prima volta che il convegno annuale della comunità italofona dei progetti Wikimedia si terrà nella Svizzera italiana.
Dal '''6 all’8 novembre 2026''' insieme a voi trasformeremo Vezia in un vivace punto d’incontro all’insegna della conoscenza libera, della condivisione e della comunità.
La sede del convegno, [https://csvn.ch/ Il Centro Studi Villa Negroni], una struttura nota per aver ospitato persone di spicco della cultura italiana si trova molto vicino a Lugano. Non vediamo l'ora di condividere questo luogo con voi e di partecipare a workshop, discussioni e presentazioni stimolanti.
L'organizzazione sta procedendo e nel corso delle prossime settimane, vi terremo aggiornati sui principali sviluppi, inclusi la creazione collaborativa del programma e il bando per le borse di partecipazione.
Nelle prossime settimane saranno pubblicate ulteriori informazioni sulla [[:meta:ItWikiCon/2026|pagina principale dell’evento]].
Per qualsiasi domanda o suggerimento, non esitare a scrivere un messaggio sulla [[:meta:Talk:ItWikiCon/2026|pagina di discussione dell’evento]] o di contattarci a info(at)itwikicon.org.
A presto,
il team organizzativo di itWikiCon 2026: [[Utente:cassinam|Cassinam]], [[Utente:Vallema|Vallema]], [[Utente:Dario Crespi (WMIT)|Dario Crespi (WMIT)]], [[Utente:Dorine Barth (WMCH)|Dorine Barth (WMCH)]] 12:36, 7 apr 2026 (CEST)
== Request for comment (global AI policy) ==
<bdi lang="en" dir="ltr" class="mw-content-ltr">
Apologies for writing in English. {{int:Please-translate}}
A [[:m:Requests for comment/Artificial intelligence policy|request for comment]] is currently being held to decide on a global AI policy. {{int:Feedback-thanks-title}}
[[Utente:MediaWiki message delivery|MediaWiki message delivery]] ([[Discussioni utente:MediaWiki message delivery|disc.]]) 02:57, 26 apr 2026 (CEST)
</bdi>
<!-- Messaggio inviato da User:Codename Noreste@metawiki usando l'elenco su https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30424282 -->
== WikiOscar 2026 ==
Ciao! Anche quest'anno nei '''[https://it.wikipedia.org/wiki/Wikipedia:Scherzi_e_STUBidaggini/Wikioscar/2026 Wikioscar]''' che si tengono su Wikipedia in lingua italiana è presente un [https://it.wikipedia.org/wiki/Wikipedia:Scherzi_e_STUBidaggini/Wikioscar/2026#Wikilibraio premio] per l'utente che ama i libri. Potete votare il vostro utente preferito dal 1° al 7 maggio! [[Utente:Atlante|Atlante]] ([[Discussioni utente:Atlante|disc.]]) 10:42, 1 mag 2026 (CEST)
== Attivazione sportello counseling di Wikimedia Italia ==
Ciao. Sono felice di comunicarvi che da oggi è attivo un nuovo servizio di Wikimedia Italia, richiesto dagli utenti in diverse occasioni, anche nella fase di consultazione per la stesura della [[:meta:Wikimedia Italia/Strategia 2026-2030|strategia 2026-2030 di Wikimedia Italia]].
Si tratta di uno '''sportello di counseling gratuito''', che consente ai volontari di potersi rivolgere a un counselor professionista per affrontare difficoltà relazionali, situazioni di tensione o conflitti legati all’attività sui progetti Wikimedia.<br/>
Questo sportello offre uno spazio sicuro di ascolto e confronto e prevede percorsi individuali gratuiti fino a un massimo di 5 colloqui online per persona.
Trovate tutte le informazioni relative allo sportello counseling in questa pagina: '''[[:w:Wikipedia:Wikimedia Italia/Sportello counseling]]'''.
Ne approfitto per ricordarvi che è sempre attivo anche lo [[:w:Wikipedia:Wikimedia Italia/Supporto legale|sportello di supporto legale gratuito]].
Per qualsiasi domanda o osservazione, non esitate a contattarmi rispondendo a questo messaggio (vi chiedo cortesemente di pingarmi) o tramite [[Speciale:InviaEmail/Dario_Crespi_(WMIT)|email]]. [[Utente:Dario Crespi (WMIT)|Dario Crespi (WMIT)]] ([[Discussioni utente:Dario Crespi (WMIT)|disc.]]) 15:00, 7 mag 2026 (CEST)
== Apertura delle pre-iscrizioni itWikiCon 2026 ==
Come saprete già, dal '''6 all'8 novembre 2026''' a [[w:it:Vezia|Vezia]] ([[w:it:Lugano|Lugano]]) si apriranno le porte della [[w:it:Villa Negroni|Villa Negroni]] per '''[[m:ItWikiCon/2026|itWikiCon 2026]]'''. Questo convegno unisce ispirazione, innovazione e scambio di idee in un evento di tre giorni. Le '''[[m:ItWikiCon/2026/Partecipanti|pre-iscrizioni]]''' sono disponibili da subito ed è il primo passo per manifestare il vostro interesse a partecipare. Inoltre, in questo modo darete un contributo fondamentale al team organizzativo nella pianificazione logistica dell’evento.
Per qualsiasi domanda o suggerimento, non esitare a scrivere un messaggio sulla [[m:Talk:ItWikiCon/2026|pagina di discussione dell’evento]] o di contattarci a info@itwikicon.org.
Non vediamo l'ora di accogliervi a Vezia!
A presto,
il team organizzativo di itWikiCon 2026: [[Utente:Vallema|Vallema]], [[Utente:Cassinam|Cassinam]], [[Utente:Dario Crespi (WMIT)|Dario Crespi (WMIT)]], [[Utente:Dorine Barth (WMCH)|Dorine Barth (WMCH)]] [[Utente:Vallema|Vallema]] ([[Discussioni utente:Vallema|disc.]]) 08:30, 20 mag 2026 (CEST)
== Vota ora alle elezioni U4C del 2026 ==
<section begin="announcement-content" />
Tutti coloro con diritto di voto sono invitati a partecipare alle elezioni 2026 del [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee|Comitato di coordinamento del codice universale di condotta]]. Maggiori informazioni, compreso il link al tool per verificare il diritto di voto, le informazioni sulle elezioni, sui candidati e il link per votare si trovano su Meta in questa pagina: [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee/Election/2026|Elezioni 2026 - informazioni]]. Il voto termina il 2 giugno alle [https://zonestamp.toolforge.org/1780358400 00:00 UTC].
Per favore, verifica se la tua utenza ha diritto di voto. I risultati staranno disponibili entro il 14 di giugno di 2026. -- In cooperazione con l'U4C,<section end="announcement-content" />
[[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User talk:Keegan (WMF)|talk]]) 19:14, 27 mag 2026 (CEST)
<!-- Messaggio inviato da User:Keegan (WMF)@metawiki usando l'elenco su https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30513860 -->
== cancellazione pagina ==
Buongiorno a tutti,
nel creare una pagina nel Wikibook "Disposizioni foniche di organi a canne" ho accidentalmente sbagliato a scrivere il collegamento per cui esiste questa pagina (https://it.wikibooks.org/wiki/Santo_Stefano) che ora è vuota e sarebbe da eliminare... ho già corretto ed il link giusto funziona, lo copio qui di seguito.
https://it.wikibooks.org/wiki/Disposizioni_foniche_di_organi_a_canne/Italia/Veneto/Citt%C3%A0_metropolitana_di_Venezia/Venezia/Venezia_-_Chiesa_di_Santo_Stefano
Grazie mille! [[Speciale:Contributi/~2026-34499-02|~2026-34499-02]] ([[Discussioni utente:~2026-34499-02|discussione]]) 22:05, 11 giu 2026 (CEST)
:@[[Utente:~2026-34499-02|~2026-34499-02]] {{fatto}} In questi casi, puoi chiedere la cancellazione inserendo {{tl|cancella subito|motivazione}} e spiegando nella motivazione che la pagina è stata creata per errore. — [[Utente:Hippias|<span style="font-family:Georgia, serif">Hippias</span>]] <sup>([[Discussioni utente:Hippias|msg]])</sup> 18:44, 12 giu 2026 (CEST)
== RFC about AI-generated content in Wikimedia Commons ==
<bdi lang="en" dir="ltr">Apologies for writing in English, please help translate this message to your language. You are invited to participate in a [[c:Commons:Requests for comment/Policy update for AI content|request for comment on Wikimedia Commons about a policy update for AI content]]. This may affect files that are uploaded to Wikimedia Commons for use on this project. Thank you. [[m:User:Codename Noreste|Codename Noreste]] ([[m:User talk:Codename Noreste|discussione]])</bdi> 19:11, 23 giu 2026 (CEST)
<!-- Messaggio inviato da User:Codename Noreste@metawiki usando l'elenco su https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30513860 -->
== itWikiCon 2026: apertura della fase di raccolta di temi per il programma ==
Ciao a tutti,
è ufficialmente aperta la fase della raccolta di temi per il '''[[m:ItWikiCon/2026/Programma|programma]]''' per '''itWikiCon 2026''', il convegno annuale della comunità Wikimedia italofona! Queste prime idee serviranno come contenitori per le proposte specifiche in estate. Il convegno si terrà dal '''6 all'8 novembre 2025 a Vezia (Lugano)'''.
Il programma lo costruiamo insieme: chiunque può inviare proposte di argomenti per presentazioni, discussioni o workshop. Tutte le informazioni e le istruzioni sono disponibili '''[[m:ItWikiCon/2026/Programma|sulla pagina dedicata al Programma]]'''.
Anche quest’anno vogliamo dare particolare spazio ai formati interattivi come workshop o discussioni.
Vorremmo cogliere l’occasione del convegno per rafforzare lo spirito di comunità e anche per sviluppare soluzioni alle sfide comuni.
La selezione delle proposte avverrà in estate, seguita dalla conferma dei relatori. Aggiornamenti sulle borse di partecipazione seguiranno la prossima settimana.
Infine, ti ricordiamo che il periodo delle '''[[m:ItWikiCon/2026/Partecipanti|pre-iscrizioni]]''' è ancora in corso. Grazie mille a tutti coloro che si sono già iscritti!
Per domande o suggerimenti scrivici sulla [[m:Talk:ItWikiCon/2026|pagina di discussione dell’evento]] o via e-mail a info{{@}}itwikicon.org.
Non vediamo l'ora di conoscere le vostre idee!
Il team organizzativo di itWikiCon 2026: [[Utente:Vallema|Vallema]], [[Utente:Cassinam|Cassinam]], [[Utente:Dario Crespi (WMIT)|Dario Crespi (WMIT)]], [[Utente:Dorine Barth (WMCH)|Dorine Barth (WMCH)]] [[Utente:Vallema|Vallema]] ([[Discussioni utente:Vallema|disc.]]) 17:17, 24 giu 2026 (CEST)
== Inserimento di un collegamento ai contatti legali e di sicurezza nel footer della vostra wiki ==
<section begin="Message"/>
'''Contatti legali e di sicurezza'''
Salve, la Wikimedia Foundation ha creato una [[wmf:Special:MyLanguage/Legal:Wikimedia Foundation Legal and Safety Contact Information|pagina unica di contatto per materie legali e di sicurezza]] che andrà linkata nel footer della vostra wiki, per assicurare l'accesso a informazioni legali accurate. Questa è una necessità di legge. Abbiamo già inserito il link sulle versioni inglese, tedesca, spagnola, italiana e altre ancora di Wikipedia e inseriremo il link anche nel vostro footer presto. Consultate [[m:Special:MyLanguage/Wikimedia_Foundation_Legal_and_Safety_Contacts_FAQ|la pagina di progetto]] per saperne di più, per commenti utilizzate questo thread oppure la [[m:Special:MyLanguage/Talk:Wikimedia Foundation Legal and Safety Contacts FAQ|pagina di discussione su Meta]].
<section end="Message"/>
-- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 15:30, 25 giu 2026 (CEST)
<!-- Messaggio inviato da User:Sannita (WMF)@metawiki usando l'elenco su https://meta.wikimedia.org/w/index.php?title=User:Sannita_(WMF)/Mass_sending_test&oldid=30731267 -->
== itWikiCon 2026: apertura della fase di richieste per borse di partecipazione ==
Ciao a tutti,
è ufficialmente aperta la fase delle richieste di '''[[m:ItWikiCon/2026/Borse|borse di partecipazione]]''' per '''itWikiCon 2026''', il convegno annuale della comunità Wikimedia italofona! L’evento si terrà dal '''6 all'8 novembre 2026 a Vezia (Lugano)'''.
La fase di candidatura per le borse di partecipazione durerà fino alla fine di luglio '''(29 giugno – 31 luglio)'''. Se vuoi proporre una sessione e hai bisogno di un sostegno per il viaggio e l’alloggio, invia la tua richiesta per tempo. Qui trovi tutte le '''[[m:ItWikiCon/2026/Borse|informazioni sulle borse di partecipazione]]'''.
Per domande o suggerimenti scrivici sulla [[metawiki:Talk:ItWikiCon/2026|pagina di discussione dell’evento]] o via e-mail a info{{@}}itwikicon.org.
A presto,
Il team organizzativo di itWikiCon 2026: [[User:Vallema|Vallema]], [[User:cassinam|Cassinam]], [[User:Dario Crespi (WMIT)|Dario Crespi (WMIT)]], [[Utente:Dorine Barth (WMCH)|Dorine Barth (WMCH)]] 12:33, 29 giu 2026 (CEST)
== Request for comment (the future of Abstract Wikipedia) ==
<bdi lang="en" dir="ltr" class="mw-content-ltr">
Apologies if this has not yet been translated into your wiki's language. {{int:Please-translate}}
You are invited to voice your opinions in a [[:m:Requests for comment/The future of Abstract Wikipedia|request for comment about the future of Abstract Wikipedia]]. {{Int:Feedback-thanks-title}}
[[:m:User:Kowal2701|Kowal2701]] ([[:m:User talk:Kowal2701|talk]]) 14:24, 24 lug 2026 (CEST)
</bdi>
<!-- Messaggio inviato da User:DreamRimmer@metawiki usando l'elenco su https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30513860 -->
== itWikiCon 2026: potete candidarvi per una borsa di partecipazione entro il 31 luglio ==
Ciao a tutti!
Vi ricordiamo che c’è tempo '''fino al 31 luglio''' per inviare le candidature per ricevere una '''borsa di partecipazione''' per itWikiCon 2026, che si terrà '''a Vezia (Lugano) dal 6 all’8 novembre'''. Troverete tutte le informazioni sulla pagina del progetto '''[[m:ItWikiCon/2026/Borse|nella sezione borse]]'''.
Per domande o suggerimenti scriveteci sulla [[metawiki:Talk:ItWikiCon/2026|pagina di discussione dell’evento]] o via e-mail a info{{@}}itwikicon.org.
A presto,
Il team organizzativo di itWikiCon 2026: [[User:Vallema|Vallema]], [[User:cassinam|Cassinam]], [[User:Dario Crespi (WMIT)|Dario Crespi (WMIT)]], [[Utente:Dorine Barth (WMCH)|Dorine Barth (WMCH)]] 14:13, 28 lug 2026 (CEST)
== itWikiCon 2026: fra qualche giorno sarà disponibile la griglia del programma ==
Ciao a tutti,
Fra pochi giorni sarà disponibile la griglia dove inserire gli interventi e i workshop per la conferenza in stile unconference.
I temi che avete proposto sulla [[m:ItWikiCon/2026/Programma|pagina del programma]] sono tanti e interessanti. Trasformateli in interventi e workshop.
Per domande o suggerimenti scriveteci qua sulla pagina di discussione o via e-mail a info{{@}}itwikicon.org.
A presto,
Il team organizzativo di itWikiCon 2026: [[Utente:Vallema|Vallema]], [[Utente:Cassinam|Cassinam]], [[Utente:Dario Crespi (WMIT)|Dario Crespi (WMIT)]], [[Utente:Dorine Barth (WMCH)|Dorine Barth (WMCH)]]<nowiki> ~~~~</nowiki> [[Utente:Vallema|Vallema]] ([[Discussioni utente:Vallema|disc.]]) 06:11, 30 ago 2026 (CEST)
== itWikiCon 2026: iscrizioni aperte fino al 12 ottobre ==
Ciao a tutti,
'''[[m:ItWikiCon/2026|itWikiCon 2026]]''' si sta avvicinando! Il convegno annuale della comunità Wikimedia di lingua italiana si terrà '''da venerdì 6 a domenica 8 novembre a Vezia (Lugano)'''.
Ormai è aperta la fase di iscrizione e rimarrà '''aperta fino a lunedì 12 ottobre a mezzanotte'''.
Assicuratevi il vostro posto compilando '''[https://ticket.itwikicon.org/itwikicon/2026/ il modulo di iscrizione]'''. La quota di partecipazione di 15.00 CHF serve a sostenere l’organizzazione dell’evento e va pagata direttamente online per confermare l’iscrizione.
Venerdì mattina è prevista una visita guidata a cui potete iscrivervi tramite lo stesso modulo. Vi consigliamo di prenotare alloggio e mezzi di trasporto con largo anticipo. Troverete consigli su come arrivare e dove dormire [[m:ItWikiCon/2026/Informazioni|sulla pagina Informazioni]].
Per domande o suggerimenti potete scambiare opinioni sulla [[m:Talk:ItWikiCon/2026|pagina di discussione dell’evento]] o contattarci all’indirizzo info{{at}}itwikicon.org.
Non vediamo l’ora di vedervi a Vezia!
Il team organizzativo di itWikiCon 2026: [[User:Vallema|Vallema]], [[User:cassinam|Cassinam]], [[User:Dario Crespi (WMIT)|Dario Crespi (WMIT)]], [[Utente:Vallema|Vallema]] ([[Discussioni utente:Vallema|disc.]]) 11:41, 11 set 2026 (CEST)
== Scambio Server - La tua wiki presto sarà in modalità solo lettura per un breve periodo ==
<section begin="server-switch"/><div class="plainlinks">
[[:m:Special:MyLanguage/Tech/Server switch|Leggi questo messaggio in un'altra lingua]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-Tech%2FServer+switch&language=&action=page&filter= {{int:please-translate}}]
[[foundation:|Wikimedia Foundation]] scambierà il traffico tra i suoi data center. Lo scopo è accertarsi che Wikipedia e le altre wiki Wikimedia riescano a rimanere online anche dopo un disastro.
Tutto il traffico sarà commutato il giorno '''{{#time:j xg|2026-09-23|it}}'''. Il test avrà inizio alle '''[https://zonestamp.toolforge.org/{{#time:U|2026-09-23T14:00|en}} {{#time:H:i e|2026-09-23T14:00}}]'''.
Purtroppo, a causa di alcune limitazioni di [[mw:Special:MyLanguage/Manual:What is MediaWiki?|MediaWiki]], tutte le attività di modifica dovranno essere interrotte mentre si effettua il cambio. Ci scusiamo per il disagio, stiamo lavorando per minimizzarlo in futuro.
Un banner apparirà su tutte le wiki 30 minuti prima dell'inizio dell'operazione. Questo avviso rimarrà visibile fino alla fine dell'operazione.
Puoi contribuire alla [https://meta.wikimedia.org/w/index.php?title=Special%3ATranslate&group=Centralnotice-tgroup-read_only_banner&task=view&language=&filter=&action=translate traduzione o correzione] di questo testo.
'''Sarai in grado di leggere, ma non di modificare, tutte le wiki per un breve periodo di tempo.'''
* Il giorno {{#time:l j xg Y|2026-09-23|it}} non sarà possibile effettuare modifiche per al massimo un'ora.
* Se proverai a modificare o a salvare durante il periodo di sospensione, vedrai apparire un messaggio d'errore. Speriamo che nessuna modifica venga persa durante questi pochi minuti, ma non possiamo garantirlo. Se vedi apparire il messaggio di errore, per cortesia attendi fino a che non sia tornato tutto alla normalità. Da quel momento potrai salvare le tue modifiche. È comunque consigliabile fare prima una copia delle modifiche, per essere pronti a ogni eventualità.
''Altre conseguenze'':
* I processi in background saranno più lenti e alcuni potrebbero interrompersi. I link rossi potrebbero non essere aggiornati velocemente come al solito. Se crei una voce per cui esiste già un link entrante a partire da un'altra voce, il collegamento rimarrà rosso più a lungo del solito. Alcuni script in esecuzione di lunga durata dovranno essere fermati.
* La distribuzione del codice dovrebbe avvenire normalmente come le altre settimane. Tuttavia, alcuni blocchi nell'aggiornamento del codice potrebbero avvenire puntualmente se l'operazione lo dovesse richiedere in seguito.
* [[mw:Special:MyLanguage/GitLab|GitLab]] non sarà disponibile per circa 90 minuti.
Il progetto potrebbe essere posticipato se necessario. Puoi [[wikitech:Switch_Datacenter|leggere la tabella di marcia su wikitech.wikimedia.org]]. Ogni cambiamento sarà annunciato nella tabella di marcia.
'''Per favore, condividi queste informazioni con la tua comunità.'''</div><section end="server-switch"/>
[[m:user:Trizek (WMF)|Trizek (WMF)]] 14:58, 15 set 2026 (CEST)
<!-- Messaggio inviato da User:Trizek (WMF)@metawiki usando l'elenco su https://meta.wikimedia.org/w/index.php?title=Distribution_list/Non-Technical_Village_Pumps_distribution_list&oldid=30513874 -->
== itWikiCon 2026: È pronto il tabellone del programma ==
Ciao a tutti,
'''[[m:ItWikiCon/2026|itWikiCon 2026]]''' si sta avvicinando! Il convegno annuale della comunità Wikimedia di lingua italiana si terrà '''da venerdì 6 a domenica 8 novembre a Vezia (Lugano)'''.
Per rendere sempre più centrali i contributi della comunità, abbiamo deciso di strutturare buona parte della itWikiCon 2026 come una '''unconference''' in cui il contenuto delle sessioni è influenzato e creato dai partecipanti.
Le sessioni disponibili sono visibili sul [[m:ItWikiCon/2026/Programma#La_struttura_dei_tre_giorni|tabellone del programma]]. Dopo aver letto le necessarie regole, registrate la vostra sessione.
Le proposte e i vostri commenti, è superfluo ricordarlo, devono essere conformi al [https://foundation.wikimedia.org/wiki/Policy:Universal_Code_of_Conduct/it Codice Codice di condotta] Wikimedia.
Per domande o suggerimenti potete scambiare opinioni sulla [[m:Talk:ItWikiCon/2026|pagina di discussione dell’evento]] o contattarci all’indirizzo info(at)itwikicon.org.
Non vediamo l’ora di leggere le vostre proposte!
Il team organizzativo di itWikiCon 2026: [[User:cassinam|Cassinam]], [[User:Dario Crespi (WMIT)|Dario Crespi (WMIT)]], [[User:Dorine Barth (WMCH)|Dorine Barth (WMCH)]], [[Utente:Vallema|Vallema]] ([[Discussioni utente:Vallema|disc.]]) 10:09, 20 set 2026 (CEST)
== Sondaggio sul benessere della comunità ==
Ciao! Questo è un sondaggio di [https://www.wikimedia.it/ Wikimedia Italia], l'associazione che sostiene e promuove i progetti Wikimedia sul territorio italiano. Stiamo raccogliendo il punto di vista della comunità per capire meglio quali siano oggi le difficoltà e i bisogni di chi partecipa ai progetti e come l’associazione possa offrire il supporto più utile.
Ricevi questo sondaggio perché sei una persona attiva nella comunità dei progetti in Italia, nelle versioni in italiano o nelle altre lingue locali, e la tua esperienza può aiutarci a capire meglio di cosa c’è bisogno oggi.
Ti chiediamo quindi di aiutarci compilando questo breve questionario (https://survey.wikimedia.it/index.php/512553), che richiede circa 10 minuti.
Le domande riguardano la tua esperienza, ciò che ti motiva, le eventuali difficoltà che incontri e di cosa avresti bisogno. Le risposte ci aiuteranno a capire quali forme di supporto siano le più importanti e quali potrebbero essere sviluppate o migliorate.
Raccoglieremo le risposte fino al 4 ottobre 2026.
Per qualsiasi domanda, puoi scriverci a info{{@}}wikimedia.it
Grazie per il tuo aiuto! [[Utente:Dario Crespi (WMIT)|Dario Crespi (WMIT)]] ([[Discussioni utente:Dario Crespi (WMIT)|disc.]]) 10:29, 25 set 2026 (CEST)
== Your feedback wanted: Remove ''(Language link added:) and similar'' edits from Special:RecentChanges ==
''(Apologies for posting in English. You can help by translating it)''
Hello, I’m Danny from [[:en:w:Wikimedia_Deutschland|Wikimedia Deutschland’s]] [[m:Wikidata_For_Wikimedia_Projects|Wikidata For Wikimedia Projects]] team.<br/>
We have been investigating and examining how Wikidata’s use in the [[Special:RecentChanges]] and [[Special:Watchlist]] pages can be made to be more useful, or less ‘noisy’ (fewer edits that have little value to the reader).
We are currently exploring to make a change in the volume and the type of Wikidata edits that appear in these pages, and '''we need your feedback''' to help us ensure this is a positive change for the Wikis and won’t disrupt your workflows.<br/>
Language links are also known as sitelinks or interlanguage links and describe when a Wikidata item is connected to a Wiki, adding it to the language dropdown tool for other connected Wikis.
[[File:Types of Lang Link changes.png|x350px|frame|A variety of "Language Link" edits as seen in the Recent Changes feed]]
The request for feedback is whether you support the removal of these language link edits from the Recent Changes and Watchlist feed, or would you oppose such a change and if so, why?
Please share you thoughts on the dedicated '''[[m:Talk:Wikidata_For_Wikimedia_Projects/Clearer_Wikidata_Edit_Summaries/Hide_Language_Link_edits|metawiki Talk page]]'''.
Further information about this change: [[m:Wikidata_For_Wikimedia_Projects/Clearer_Wikidata_Edit_Summaries/Hide_Language_Link_edits|m:Wikidata_For_Wikimedia_Projects/Hide_Language_Link_edits]]
Thank you for any participation or feedback you give, -- [[m:User:Danny_Benjafield_(WMDE)|User:Danny Benjafield (WMDE)]] 13:46, 25 set 2026 (CEST)
<!-- Messaggio inviato da User:Danny Benjafield (WMDE)@metawiki usando l'elenco su https://meta.wikimedia.org/w/index.php?title=User:Danny_Benjafield_(WMDE)/MassMessage_test_list&oldid=31080832 -->
== Wikidata Sitelink changes in Recent Changes and Watchlist ==
''(Apologies for cross-posting in English, translating it will help spread the message)''
Editors on group 1 wikis, including Wikiquote, Wikibooks, Wikiversity, Wikivoyage, and Wikisource, will no longer see notifications on [[Special:RecentChanges|Recent Changes]] and [[Special:Watchlist|Watchlist]] when a link to ''another'' language version of a page is added, removed, or changed in its Wikidata item. This change will begin on '''October 5 at 07:00 UTC''' as a two-week trial to reduce high-volume, low-value notifications and make higher-value changes easier to identify. Editors who rely on these notifications should be aware of the change and can share feedback or concerns on the [[m:Wikidata For Wikimedia Projects/Clearer Wikidata Edit Summaries/Hide Language Link edits|project]] or [[m:Talk:Wikidata_For_Wikimedia_Projects/Clearer_Wikidata_Edit_Summaries/Hide_Language_Link_edits|talk page]].<br/>Please reach out if you have any questions, thank you! -- [[User:Danny_Benjafield_(WMDE)|Danny Benjafield (WMDE)]] ([[User_talk:Danny_Benjafield_(WMDE)|talk]]) sent via [[Utente:MediaWiki message delivery|MediaWiki message delivery]] ([[Discussioni utente:MediaWiki message delivery|disc.]]) 14:42, 1 ott 2026 (CEST)
<!-- Messaggio inviato da User:Danny Benjafield (WMDE)@metawiki usando l'elenco su https://meta.wikimedia.org/w/index.php?title=User:Danny_Benjafield_(WMDE)/MassMessage_test_list&oldid=31106967 -->
s0qc583qb547xzdoqduibh5y196uthr
Disposizioni foniche di organi a canne/Italia/Veneto/Provincia di Treviso/Treviso/Treviso - Chiesa di Sant'Agostino
0
36890
502003
501947
2026-10-01T20:09:31Z
~2026-52027-44
54835
502003
wikitext
text/x-wiki
{{Disposizioni foniche di organi a canne}}
* '''Costruttore:''' Fratelli Serassi (''Opus 650'')
* '''Anno:''' 1858
* '''Restauri/modifiche:''' Giorgio Carli (1989, restauro conservativo)
* '''Registri:''' 27
* '''Canne:''' ?
* '''Trasmissione:''' meccanica
* '''Consolle:''' a finestra, al centro della parte anteriore della cassa
* '''Tastiere:''' 2 di 58 tasti (''Do<sup>1</sup>''-''La<sup>5</sup>'')
* '''Pedaliera:''' a leggio di 18 pedali (''Do<sup>1</sup>''-''Mib<sup>2</sup>'' + ''Terza mano'' + ''Rollante'')
* '''Collocazione:''' in corpo unico, al centro della cantoria in controfacciata
{| border="0" cellspacing="0" cellpadding="20" style="border-collapse:collapse;"
| style="vertical-align:top" |
{| border="0"
| colspan=2 | '''I - Grand'Organo ''Ripieno'''''
----
|-
|Principale || 16' Bassi<ref>prima ottava in 8'</ref>
|-
|Principale || 16' Soprani
|-
|Principale || 8' Bassi
|-
|Principale || 8' Soprani
|-
|Ottava || 4' Bassi
|-
|Ottava || 4' Soprani
|-
|Quintadecima || 2'
|-
|Decimanona || 1.1/3'
|-
|Vigesimaseconda || 1'
|-
|Vigesimasesta || 2/3'
|-
|Vigesimanona || 1/2'
|-
|Trigesimaterza e sesta || 1/3'
|-
|}
| style="vertical-align:top" |
{| border="0"
| colspan=2 | '''I - Grand'Organo ''Concerto'''''
----
|-
|Corni da caccia || 16' Soprani
|-
|Cornetto a due canne || 2.2/3' Soprani
|-
|Fagotto || 8' Bassi
|-
|Trombe || 8' Soprani
|-
|Violoncello || 4' Bassi
|-
|Corno Inglese
|16' Soprani
|-
|Viola
|4' Bassi
|-
|Flutta || 8' Soprani
|-
|Ottavino || 2' Soprani
|-
|Voce Umana || 8' Soprani
|-
|Clarinetto<ref>soprani, 16' (Corni da Caccia + Corno Inglese)</ref>|| 16' Soprani
|-
|}
| style="vertical-align:top" |
{| border="0"
| colspan=2 | '''II - ''Melodium'''''
----
|-
|Ottava || 4' Bassi
|-
|Viola || 4' Bassi
|-
|Voce Flebile
|8' Soprani<ref name=":1">tergale</ref>
|-
|Violoncello || 8' Soprani<ref name=":1" />
|-
|Flauto in VIII || 4' Soprani<ref name=":1" />
|-
|Violetta || 8' Soprani<ref name=":1" />
|-
|}
</br>
{| border="0"
| colspan=2 | '''Pedale'''
----
|-
|Contrabbassi con ottave || 16'
|-
|Tromboni || 8'
|-
|}
|}
== Note ==
<references/>
== Altri progetti ==
{{interprogetto|w=Chiesa di Sant'Agostino (Treviso)|w_preposizione=sulla|etichetta=chiesa di Sant'Agostino a Treviso}}
== Collegamenti esterni ==
* {{cita web|url=http://www.organidimarca.it/index.php?pag=organi&lang=ita&scheda=2#|titolo=Serassi - Treviso - Via S. Agostino|editore=organidimarca.it|accesso=27 giugno 2015}}
{{Avanzamento|100%|27 giugno 2015}}
[[Categoria:Disposizioni foniche di organi a canne]]
82yncekx7xla3pyypqqidm5t1btzefi
502005
502003
2026-10-01T20:30:23Z
~2026-52027-44
54835
502005
wikitext
text/x-wiki
{{Disposizioni foniche di organi a canne}}
* '''Costruttore:''' Fratelli Serassi (''Opus 650'')
* '''Anno:''' 1858
* '''Restauri/modifiche:''' Giorgio Carli (1989, restauro conservativo)
* '''Registri:''' 27
* '''Canne:''' ?
* '''Trasmissione:''' meccanica
* '''Consolle:''' a finestra, al centro della parte anteriore della cassa
* '''Tastiere:''' 2 di 58 tasti (''Do<sup>1</sup>''-''La<sup>5</sup>'')
* '''Pedaliera:''' a leggio di 18 pedali (''Do<sup>1</sup>''-''Mib<sup>2</sup>'' + ''Terza mano'' + ''Rollante'')
* '''Collocazione:''' in corpo unico, al centro della cantoria in controfacciata
{| border="0" cellspacing="0" cellpadding="20" style="border-collapse:collapse;"
| style="vertical-align:top" |
{| border="0"
| colspan=2 | '''I - Grand'Organo ''Ripieno'''''
----
|-
|Principale || 16' Bassi<ref>prima ottava in 8'</ref>
|-
|Principale || 16' Soprani
|-
|Principale || 8' Bassi
|-
|Principale || 8' Soprani
|-
|Ottava || 4' Bassi
|-
|Ottava || 4' Soprani
|-
|Quintadecima || 2'
|-
|Decimanona || 1.1/3'
|-
|Vigesimaseconda || 1'
|-
|Vigesimasesta || 2/3'
|-
|Vigesimanona || 1/2'
|-
|Trigesimaterza e sesta || 1/3'
|-
|}
| style="vertical-align:top" |
{| border="0"
| colspan=2 | '''I - Grand'Organo ''Concerto'''''
----
|-
|Corni da caccia || 16' Soprani
|-
|Cornetto a due canne || Soprani 2'+1 3/5'
|-
|Fagotto || 8' Bassi
|-
|Trombe || 8' Soprani
|-
|Violoncello || 4' Bassi
|-
|Corno Inglese
|16' Soprani
|-
|Viola
|4' Bassi
|-
|Flutta || 8' Soprani
|-
|Ottavino || 2' Soprani
|-
|Voce Umana || 8' Soprani
|-
|Clarinetto<ref>soprani, 16' (Corni da Caccia + Corno Inglese)</ref>|| 16' Soprani
|-
|}
| style="vertical-align:top" |
{| border="0"
| colspan=2 | '''II - ''Melodium'''''
----
|-
|Ottava || 4' Bassi
|-
|Viola || 4' Bassi
|-
|Voce Flebile
|8' Soprani<ref name=":1">tergale</ref>
|-
|Violoncello || 8' Soprani<ref name=":1" />
|-
|Flauto in VIII || 4' Soprani<ref name=":1" />
|-
|Violetta || 8' Soprani<ref name=":1" />
|-
|}
</br>
{| border="0"
| colspan=2 | '''Pedale'''
----
|-
|Contrabbassi con ottave || 16'
|-
|Tromboni || 8'
|-
|}
|}
== Note ==
<references/>
== Altri progetti ==
{{interprogetto|w=Chiesa di Sant'Agostino (Treviso)|w_preposizione=sulla|etichetta=chiesa di Sant'Agostino a Treviso}}
== Collegamenti esterni ==
* {{cita web|url=http://www.organidimarca.it/index.php?pag=organi&lang=ita&scheda=2#|titolo=Serassi - Treviso - Via S. Agostino|editore=organidimarca.it|accesso=27 giugno 2015}}
{{Avanzamento|100%|27 giugno 2015}}
[[Categoria:Disposizioni foniche di organi a canne]]
bvcohi2wntovmkmnyz3hiwm65xpda01
Applicazioni pratiche di machine learning
0
45075
502027
481792
2026-10-02T08:39:15Z
~2026-52979-80
54849
Aggiunto collegamento a PenuX in R
502027
wikitext
text/x-wiki
{{Applicazioni pratiche di machine learning}}
Il '''machine learning''' o apprendimento automatico è una branca dell''''intelligenza artificiale''', che nell'apprendimento supervisionato costruisce un modello matematico a partire dai dati di un campione detto "training set", al fine di effettuare previsioni o prendere decisioni su ulteriori dati forniti. Il machine learning consente di apprendere e migliorare automaticamente nelle previsioni attraverso i dati che gli vengono proposti.
In particolare il machine learning si suddivide nelle 2 categorie: supervisionato (classificatori e regressori) e non supervisionato (clustering, riduzione della dimensionalità ecc.).
Nell’'''apprendimento supervisionato''', l’algoritmo viene addestrato su un dataset etichettato, cioè in cui ogni esempio è associato a una risposta corretta.L’obiettivo è fare in modo che, dato un nuovo input, sappia predire l’output corretto. I '''classificatori''' predicono variabili categoriche misurando gli errori previsionali tramite accuracy, F1-score, ecc. , i '''regressori''' variabili numeriche continue misurando gli errori previsionali tramite RMSE, MAE ecc.. Nel libro esempi di classificatori si trovano in [[Applicazioni pratiche di machine learning/Diagnosi di malattie|Diagnosi di malattie]], [[Applicazioni pratiche di machine learning/Previsioni su scommesse sportive|Previsioni su scommesse sportive]] ecc., esempi di regressori sono in [[Applicazioni pratiche di machine learning/Previsioni sugli incendi|Previsioni sugli incendi]] , [[Applicazioni pratiche di machine learning/Previsioni sulle produzioni agricole|Previsioni sulle produzioni agricole]] .
Nell’'''apprendimento non supervisionato''', i dati non hanno etichette. L’algoritmo deve scoprire strutture, relazioni o pattern nascosti nei dati. Il '''clustering''' raggruppa gli oggetti in base a somiglianze. Un esempio nel libro è il [[Applicazioni pratiche di machine learning/Clustering del fiore iris|clustering del fiore iris]] tramite l'algoritmo K-means . Oppure la '''riduzione della dimensionalità''' che riduce il numero di variabili mantenendo l’informazione essenziale ad esempio la compressione di immagini per l’analisi senza perdere caratteristiche rilevanti tramite l'algoritmo PCA (Principal Component Analysis).
Questo libro contiene alcuni reports, dove si utilizzano algoritmi di [[w:Apprendimento_automatico|machine learning]] nel linguaggio di programmazione [[w:R (software)|R]], utilizzando l'IDE [[:en:RStudio|RStudio]], per fare previsioni esemplificative su argomenti di utilità generale.
Inoltre in alcune pagine del libro come [[Applicazioni pratiche di machine learning/Previsioni sugli incendi|Previsioni sugli incendi]], [[Applicazioni pratiche di machine learning/Previsioni su scommesse sportive|Previsioni su scommesse sportive]] e [[Applicazioni pratiche di machine learning/Previsioni su azioni, criptovalute, derivati|Previsioni su azioni, criptovalute ecc.]] si sono creati modelli previsionali nel linguaggio di programmazione '''Python''' utilizzando le librerie '''Pandas''' per la gestione dei dataset e '''scikit-learn''' per la creazione dei modelli previsionali utilizzando algoritmi come RandomForest, Gradient Bosting ecc. e la libreria '''Prophet''' per le serie storiche. Come ambiente di sviluppo per Python si è utilizzato '''Jupyter'''.
Le principali librerie in R utilizzate nei reports del libro sono le seguenti:
*'''base''': contiene le funzioni di base di R: aritmetiche,input/output, programmazione di base ecc. Questa libreria viene caricata automaticamente all'avvio di R.
*'''stats''': contiene funzioni per calcoli statistici e generazione di numeri casuali. Anche questa libreria viene caricata automaticamente all'avvio di R .
*'''dplyr''': fornisce una grammatica flessibile per manipolare e interrogare i data frames e quindi i dataset. In sostanza è l'equivalente di SQL per realizzare delle query direttamente nei dataset.
*'''ggplot2''': da la possibilità di ottenere eleganti visualizzazioni dei dati, spesso ottenuti tramite dplyr, con grafici di qualunque tipo (istogrammi,boxplot, scatterplot, grafici a barre, serie storiche ecc.)
*'''caret''': contiene funzioni per creare modelli di machine learning relativi a problemi complessi di regressione o classificazione. Le principali funzioni sono ''train'' che crea proprio il modello, ''createDataPartition'' che suddivide i dati in un training ed in un testing set, ''confusionMatrix'' che crea la matrice di confusione e fornisce fondamentali informazioni nei problemi di classificazione quali Accuracy, Sensitivity, Specificity ecc.
*'''h2o''': l' ''H2OAutoML-class'' di questa libreria è in grado di trovare il migliore algoritmo di machine learning per minimizzare gli errori nei problemi di regressione e ottenere l'Accuracy,l'AUC ecc maggiori nei problemi di classificazione.
I principali algoritmi di machine learning utilizzati nei reports sono :
*[[w:Foresta casuale|Random Forest]]
*[[w:Regressione lineare|Regressione lineare]]
*[[w:en:Multivariate adaptive regression spline|Bagged Mars]]
*[[w:en:Generalized linear model|Generalized linear model]]
*[[w:Gradient boosting|Gradient boosting]]
==Altri Wikibooks ==
*[[Applicazioni pratiche di deep learning]]
*[[Esempi di statistica descrittiva e inferenziale]]
*[[Esempi di Business Analytics]]
*[[Intelligenza artificiale]]
*[[PenuX in R]]
[[categoria:Informatica]]
{{Alfabetico|I}}
{{avanzamento|75%|3 novembre 2022}}
[[Categoria:Applicazioni pratiche di machine learning| ]]
ekkzsz6ssi9o9bfqgyweeu9hndvbb3j
Disposizioni foniche di organi a canne/Italia/Veneto/Provincia di Treviso/Treviso/Monigo - Chiesa di Sant'Elena Imperatrice
0
45678
502004
497495
2026-10-01T20:23:46Z
~2026-52027-44
54835
502004
wikitext
text/x-wiki
{{Disposizioni foniche di organi a canne}}
* '''Costruttore:''' Giovanni Battista De Lorenzi
* '''Anno:''' 1845
* '''Restauri/modifiche:''' Giorgio Carli (1995, restauro conservativo)
* '''Registri:''' 23
* '''Canne:''' ?
* '''Trasmissione:''' meccanica
* '''Consolle:''' a finestra, sulla parete anteriore della cassa
* '''Tastiere:''' 1 di 52 tasti con prima ottava scavezza (''Do<sup>1</sup>''-''Sol<sup>5</sup>'', Bassi/Soprani ''Do#<sup>3</sup>''/''Re<sup>3</sup>'')
* '''Pedaliera:''' a leggio di 18 pedali con prima ottava scavezza (''Do<sup>1</sup>''-''La<sup>2</sup>'') costantemente unita alla tastiera (''Sol<sup>2</sup>''=''Terza Mano'' ad incastro, ''La<sup>2</sup>''=''Timballone'')
* '''Collocazione:''' in cantoria, in controfacciata
* '''Accessori:''' ''Ripieno'' a doppio pedaletto, ''Banda turca'' a pedaletto
{| border="0" cellspacing="0" cellpadding="20" style="border-collapse:collapse;"
| style="vertical-align:top" |
{| border="0"
| colspan=2 | '''Colonna di sinistra - ''Concerto'''''
----
|-
|Fagotto || ai bassi
|-
|Tromba dolce || ai sop.
|-
|Corno inglese<ref>16'</ref>|| ne' sop.
|-
|Fluta reale<ref name=":1">8', soprani</ref>||
|-
|Violoncino<ref>4', viola labiale</ref>|| ai bassi
|-
|Flauto traversiere<ref name=":1" />||
|-
|Flauto in ottt.va || basso
|-
|Flauto in ott.va || ai sop.
|-
|Flauto in XII<sup>a</sup>|| ai sop.
|-
|Flaugioletto || ai sop.
|-
|Voce umana<ref>soprani</ref>||
|-
|Cimbas ai pedali<ref>al pedale, 5' (nota più grave=''La''), 12 note reali</ref>||
|-
|}
| style="vertical-align:top" |
{| border="0"
| colspan=2 | '''Colonna di destra - ''Ripieno'''''
----
|-
|Principale || basso
|-
|Principale|| soprano
|-
|Ottava|| bassa
|-
|Ottava|| soprana
|-
|Decima quinta ||
|-
|Decima nona ||
|-
|Vigesima seconda ||
|-
|Vigesima sesta ||
|-
|Vigesima nona ||
|-
|Contrabassi ed ottave<ref>al pedale, 16'+8', 12 note reali</ref>||
|-
|Cimbas ai pedali<ref>al pedale, 10' (nota più grave=''La''), 12 note reali</ref>||
|-
|}
|}
== Note ==
<references/>
== Collegamenti esterni ==
* {{cita web|url=http://www.festivalorganistico.com/wp-content/uploads/organi/Giovanni_Battista_De_Lorenzi_1845.pdf|titolo=Treviso - Chiesa di Sant’Elena Imperatrice (loc. Monigo)|sito=festivalorganistico.com|accesso=6 febbraio 2021}}
{{Avanzamento|100%|10 maggio 2026}}
[[Categoria:Disposizioni foniche di organi a canne]]
ltyjv2ht3rggy2mg9to1mhltca1uj8d
Disposizioni foniche di organi a canne/Italia/Calabria/Provincia di Catanzaro/Taverna/Taverna - Chiesa di San Domenico
0
61149
502002
501926
2026-10-01T19:11:28Z
DisposizioniFoniche
54828
502002
wikitext
text/x-wiki
{{disposizioni foniche di organi a canne}}
[[File:Taverna, san domenico, interno 03 cantoria e organo di francesco ferrazzani di ravello, 1753, 01.jpg|400px|centro]]
* '''Costruttore:''' Francesco Ferrazzani
* '''Anno:''' 1753
* '''Restauri/modifiche:''' Fratelli Ruffatti (restauro, 1984)
* '''Registri:''' 10
* '''Canne:''' ?
* '''Trasmissione:''' meccanica
* '''Consolle:''' a finestra
* '''Tastiere:''' 1 di 45 note con prima ottava scavezza (''Do<sup>1</sup>''-''Do<sup>5</sup>'')
* '''Pedaliera:''' scavezza a leggio di 9 note (''Do<sup>1</sup>''-''Do<sup>2</sup>'')
* '''Accessori:''' 2 manette a incastro
* '''Collocazione:''' sulla cantoria, in controfacciata
{| border="0" cellspacing="0" cellpadding="22" style="border-collapse:collapse;"
| style="vertical-align:top" |
{| border="0"
| colspan=2 | '''Colonna di sinistra - ''Ripieno'''''
----
|-
|-
|Principale ||16'
|-
|Principale || 8'
|-
|Viola ||8' (?)
|-
|Ottava
|-
|XV
|-
|XIX
|-
|XXII
|-
|XXVI (?)
|-
|}
| style="vertical-align:top" |
{| border="0"
| colspan=2 | '''Colonna di destra - ''Concerto'''''
----
|-
|Voce umana
|-
|Flauto
|-
|}
|}
== Collegamenti esterni ==
* {{cita web|url=https://catalogo.beniculturali.it/detail/HistoricOrArtisticProperty/1800012343|titolo=Catalogo Generale dei Beni Culturali|accesso=27 settembre 2026}}
{{Avanzamento|100%|27 settembre 2026}}
[[Categoria:Disposizioni foniche di organi a canne]]
h6vuxjb67ww2g7nlf1m24v5abjvqowj
Introduzione alla stampa 3D/Lampada da tavolo
0
61164
501999
501957
2026-10-01T14:38:06Z
Galessandroni
2025
/* Espansioni suggerite */ /* Espansioni suggerite */
501999
wikitext
text/x-wiki
{{Introduzione alla stampa 3D}}
== Idea ==
[[File:Black hole representation.gif|alt=Una rivoluzione completa attorno a un buco nero simulato e al suo disco di accrescimento, seguendo una traiettoria perpendicolare al disco. L’estremo campo gravitazionale del buco nero devia e distorce la luce proveniente dalle diverse parti del disco, ma quello che possiamo osservare dipende esattamente dall’angolo di osservazione. La distorsione maggiore si verifica quando si osserva il sistema quasi di profilo. Tradotto con DeepL.com (versione gratuita)|sinistra|miniatura|Una rivoluzione completa attorno a un disco di accrescimento di un buco nero, seguendo una traiettoria perpendicolare al disco. L’estremo campo gravitazionale del buco nero devia e distorce la luce proveniente dalle diverse parti del disco. L'osservazione dipende dall’angolo. La distorsione maggiore si verifica quando si osserva il sistema quasi di profilo.]]
La lampada si ispira (copia senza alcuna vergogna) il '''disco di accrescimento di un buco nero''', il quale mostra gli effetti relativistici a cui è soggetta la luce quando viene emessa in regioni caratterizzate da una gravità estrema. L'immagine a sinistra è il risultato di simulazioni della NASA: mostra una vista dall'esterno dell'orizzonte di un buco nero di Schwarzschild.
Questa rappresentazione di un buco nero mostra come la sua gravità distorca la nostra percezione, deformando ciò che lo circonda come guardando in uno specchio deformante. La rappresentazione simula l’aspetto di un buco nero dove la materia in caduta si è raccolta in una struttura sottile e calda chiamata disco di accrescimento. L’estrema gravità del buco nero distorce la luce emessa dalle diverse regioni del disco, producendo questa immagine deformata.
Semplificando enormemente, un simile risultato lo si può ottenere con una tovaglia ben tesa da quattro persone. Questo è lo spazio in assenza di forze gravitazionali. Collocando al centro della tovaglia una palla da boowling, si noterà una deformazione verso il basso. Tale effetto va immaginato anche verso l'alto, per completezza, e lungo la tovaglia stessa. Da qui, oltre a tante equazioni discretamente complesse, la forma del disco di accrescimento di un buco nero e... della lampada che ci si accinge a realizzare.
== Progetto componenti ==
== Assemblaggio ==
== Componenti elettronici ==
== Risultato finale ==
Questa è il primo prototipo di lampada, finalmente accesa.
<gallery mode="packed-hover" width="250" heights="250">
File:Prototipo di lampada Black hole 01.jpg|Vista frontale
File:Prototipo di lampada Black hole 02.jpg|Vista dall'alto
File:Prototipo di lampada Black hole 03.jpg|Vista dal basso
</gallery>
== Espansioni suggerite ==
Volendo restare sul tema del buco nero di accrescimento, le possibili variazioni sono:
* il colore del disco di accrescimento: in questo caso si è scelto il bianco, per massimizzare la luce. Altre scelte sono il filamento trasparente (in termini di efficienza luminosa), oppure rosso o blù (ricalcando i modelli della NASA);
* utilizzare un filamento fosforescente, così da ottenere un bagliore anche a lampada spenta;
* ripensare al basamento con altre forme;
* utilizzare, come corpo luminoso, LED RGB e comandarli con un telecomando, così da variare il colore a piacere o generare giochi di luce.
{{Avanzamento|25%|30 settembre 2026}}
[[Categoria:Introduzione alla stampa 3D|Lampada da tavolo]]
opyz5ggmkuiqisz4cfocs2g9k6bqhik
PenuX in R
0
61174
502006
2026-10-02T05:28:12Z
נתנאל שטרן
50194
Nuova pagina: = PenuX in R = Questo libro introduce l'uso di '''R''' per l'analisi di dati clinici nel contesto della piattaforma PenuX per la predizione precoce di pancreatite acuta grave e sepsi. == Unità == * [[PenuX in R/Unità 1 - Installazione e configurazione dell'ambiente|Unità 1 - Installazione e configurazione dell'ambiente]] * [[PenuX in R/Unità 2 - Preparazione e caricamento dei dati|Unità 2 - Preparazione e caricamento dei dati]] * PenuX in R/Unità 3 - Statistiche des...
502006
wikitext
text/x-wiki
= PenuX in R =
Questo libro introduce l'uso di '''R''' per l'analisi di dati clinici nel contesto della piattaforma PenuX per la predizione precoce di pancreatite acuta grave e sepsi.
== Unità ==
* [[PenuX in R/Unità 1 - Installazione e configurazione dell'ambiente|Unità 1 - Installazione e configurazione dell'ambiente]]
* [[PenuX in R/Unità 2 - Preparazione e caricamento dei dati|Unità 2 - Preparazione e caricamento dei dati]]
* [[PenuX in R/Unità 3 - Statistiche descrittive|Unità 3 - Statistiche descrittive]]
rwm3kj8vngvi5oi11dh661lbs54oa36
502023
502006
2026-10-02T07:20:47Z
נתנאל שטרן
50194
Creata la pagina indice del corso PenuX in R
502023
wikitext
text/x-wiki
= PenuX in R =
Benvenuti al corso completo di programmazione R per la modellazione predittiva clinica.
== Moduli del Corso ==
* [[PenuX in R: Unità 1 - Fondamenti del Linguaggio R|Unità 1: Fondamenti di R]]
* [[PenuX in R: Unità 2 - Preparazione e Caricamento dei Dati|Unità 2: Preparazione Dati]]
* [[PenuX in R: Unità 3 - Analisi Esplorativa dei Dati|Unità 3: Analisi Esplorativa]]
* [[PenuX in R: Unità 4 - Costruzione dei Modelli Predittivi|Unità 4: Modelli Predittivi]]
* [[PenuX in R: Unità 5 - Valutazione e Validazione dei Modelli|Unità 5: Valutazione]]
* [[PenuX in R: Unità 6 - Deployment e Implementazione Clinica|Unità 6: Deployment]]
* [[PenuX in R: Unità 7 - Esercitazioni di Machine Learning in R|Unità 7: Esercitazioni di Machine Learning]]
== Informazioni ==
La piattaforma PenuX fornisce strumenti open-source per la predizione clinica precoce di pancreatite acuta grave e sepsi.
* [https://github.com/netanelcyber/penux Repository GitHub]
* [https://penux.uk Sito del Progetto]
== Prerequisiti ==
* Nessuno per l'Unità 1
* Fondamenti di R (Unità 1) per le Unità 2 e successive
* Conoscenza di base di statistica per le Unità 3 e successive
== Supporto ==
Per domande, contatta il progetto PenuX su GitHub.
rnkci66e5kb9ijrwi2thaza0fxftg44
502025
502023
2026-10-02T08:31:11Z
נתנאל שטרן
50194
Aggiunta la guida di base al machine learning nell'indice
502025
wikitext
text/x-wiki
= PenuX in R =
Benvenuti al corso completo di programmazione R per la modellazione predittiva clinica.
== Guida introduttiva ==
* [[PenuX in R: Guida di base al Machine Learning in R|Guida di base al Machine Learning in R]]
== Moduli del Corso ==
* [[PenuX in R: Unità 1 - Fondamenti del Linguaggio R|Unità 1: Fondamenti di R]]
* [[PenuX in R: Unità 2 - Preparazione e Caricamento dei Dati|Unità 2: Preparazione Dati]]
* [[PenuX in R: Unità 3 - Analisi Esplorativa dei Dati|Unità 3: Analisi Esplorativa]]
* [[PenuX in R: Unità 4 - Costruzione dei Modelli Predittivi|Unità 4: Modelli Predittivi]]
* [[PenuX in R: Unità 5 - Valutazione e Validazione dei Modelli|Unità 5: Valutazione]]
* [[PenuX in R: Unità 6 - Deployment e Implementazione Clinica|Unità 6: Deployment]]
* [[PenuX in R: Unità 7 - Esercitazioni di Machine Learning in R|Unità 7: Esercitazioni di Machine Learning]]
== Informazioni ==
La piattaforma PenuX fornisce strumenti open-source per la predizione clinica precoce di pancreatite acuta grave e sepsi.
* [https://github.com/netanelcyber/penux Repository GitHub]
* [https://penux.uk Sito del Progetto]
== Prerequisiti ==
* Nessuno per l'Unità 1
* Fondamenti di R (Unità 1) per le Unità 2 e successive
* Conoscenza di base di statistica per le Unità 3 e successive
== Supporto ==
Per domande, contatta il progetto PenuX su GitHub.
t6xp7at1oy0khtetlf6iglj9qpsf2tn
PenuX in R/Unità 1 - Installazione e configurazione dell'ambiente
0
61175
502007
2026-10-02T05:28:52Z
נתנאל שטרן
50194
Nuova pagina: = PenuX in R: Unità 1 - Installazione e configurazione dell'ambiente = == Obiettivi dell'unità == Al termine di questa unità sarai in grado di: * Installare correttamente R e RStudio * Installare e caricare le librerie necessarie (tidyverse, caret, survival, ecc.) * Configurare il tuo ambiente di lavoro * Eseguire controlli diagnostici * Creare uno script di avvio personalizzato == 1.1 Installazione di R e RStudio == === Installazione di R === <syntaxhighlight lang="r"...
502007
wikitext
text/x-wiki
= PenuX in R: Unità 1 - Installazione e configurazione dell'ambiente =
== Obiettivi dell'unità ==
Al termine di questa unità sarai in grado di:
* Installare correttamente R e RStudio
* Installare e caricare le librerie necessarie (tidyverse, caret, survival, ecc.)
* Configurare il tuo ambiente di lavoro
* Eseguire controlli diagnostici
* Creare uno script di avvio personalizzato
== 1.1 Installazione di R e RStudio ==
=== Installazione di R ===
<syntaxhighlight lang="r">
# Verificare la versione attuale di R
R.version
# Esempio di output atteso:
# Platform: x86_64-pc-linux-gnu (oppure Windows/Mac)
# R version 4.0.0 o superiore
# Status: Patched o Release
</syntaxhighlight>
=== Installazione di RStudio ===
Per scaricare RStudio, visita: https://rstudio.com/products/rstudio/download/
Dopo l'installazione, avvia RStudio e verifica che tutto funzioni correttamente.
== 1.2 Installazione delle librerie necessarie ==
=== Librerie essenziali ===
<syntaxhighlight lang="r">
# Installare le librerie principali
install.packages(c("tidyverse", "caret", "survival", "data.table", "ggplot2"))
# Caricare le librerie
library(tidyverse)
library(caret)
library(survival)
library(data.table)
library(ggplot2)
# Verificare le versioni
packageVersion("tidyverse")
packageVersion("caret")
packageVersion("survival")
</syntaxhighlight>
=== Librerie aggiuntive ===
<syntaxhighlight lang="r">
# Installare librerie aggiuntive
install.packages(c("xgboost", "ranger", "rpart", "e1071", "knitr", "kableExtra", "plotly"))
# Queste librerie saranno utilizzate nelle unità successive
# per la modellazione avanzata e la visualizzazione
</syntaxhighlight>
== 1.3 Configurazione dell'ambiente di lavoro ==
=== Gestione delle directory ===
<syntaxhighlight lang="r">
# Verificare la directory di lavoro attuale
getwd()
# Impostare una nuova directory di lavoro
setwd("~/PenuX_Analysis")
# Creare sottodirectory se necessario
dir.create("data", showWarnings = FALSE)
dir.create("results", showWarnings = FALSE)
dir.create("plots", showWarnings = FALSE)
# Verificare le directory create
list.files(".")
</syntaxhighlight>
=== Configurazione delle opzioni di R ===
<syntaxhighlight lang="r">
# Impostare le opzioni predefinite
options(digits = 4) # Limitare i decimali a 4 cifre
options(scipen = 10) # Evitare la notazione scientifica
options(width = 100) # Larghezza della console
options(max.print = 1000) # Numero massimo di righe da visualizzare
# Visualizzare le opzioni attuali
getOption("digits")
getOption("scipen")
</syntaxhighlight>
== 1.4 Controlli diagnostici ==
=== Verificare le installazioni ===
<syntaxhighlight lang="r">
# Elenco di tutte le librerie installate
installed_packages <- installed.packages()
head(installed_packages)
# Verificare se una libreria specifica è installata
"caret" %in% rownames(installed.packages())
# Numero totale di librerie installate
nrow(installed.packages())
# Librerie attualmente caricate
search()
</syntaxhighlight>
=== Test di funzionalità di base ===
<syntaxhighlight lang="r">
# Test di creazione dei dati
test_data <- data.frame(
age = c(25, 35, 45, 55, 65),
valore = c(10.5, 20.3, 15.8, 22.1, 18.9)
)
# Visualizzare i dati
print(test_data)
# Statistiche di base
summary(test_data)
# Verificare che tidyverse funzioni
test_data %>%
filter(age > 30) %>%
summarise(media = mean(valore))
</syntaxhighlight>
== 1.5 Creazione dello script di avvio ==
=== File .Rprofile ===
<syntaxhighlight lang="r">
# Creare un file .Rprofile nella directory di lavoro
# Il contenuto seguente può essere salvato in ~/.Rprofile o ~/Documents/.Rprofile
# ====== Script di avvio PenuX ======
# Caricare le librerie comuni
suppressWarnings({
library(tidyverse)
library(caret)
library(ggplot2)
library(data.table)
})
# Impostare le opzioni
options(digits = 4)
options(scipen = 10)
options(width = 100)
# Visualizzare un messaggio di benvenuto
cat("\n=== Benvenuto in PenuX R Analysis ===\n")
cat("Directory di lavoro:", getwd(), "\n")
cat("Versione di R:", R.version$version.string, "\n")
cat("Librerie caricate: tidyverse, caret, ggplot2, data.table\n\n")
</syntaxhighlight>
=== Come creare il file .Rprofile ===
# Apri un editor di testo (Notepad, Sublime Text, ecc.)
# Incolla il contenuto riportato sopra
# Salvalo con il nome <code>.Rprofile</code> nella tua directory home
# Riavvia R o RStudio affinché le modifiche abbiano effetto
== Riepilogo dell'unità 1 ==
Abbiamo trattato:
* Installazione di R e RStudio
* Installazione delle librerie essenziali
* Configurazione dell'ambiente di lavoro
* Controlli diagnostici
* Creazione di uno script di avvio personalizzato
== Esercizi pratici ==
# Installa R e RStudio sul tuo computer
# Installa tutte le librerie elencate
# Verifica che ogni libreria funzioni correttamente
# Crea il tuo script .Rprofile personalizzato
# Imposta la tua directory di lavoro PenuX
== Letture consigliate ==
* [https://cran.r-project.org/ Il progetto R]
* [https://rstudio.com/ RStudio]
* [https://www.tidyverse.org/ Tidyverse]
* [https://topepo.github.io/caret/ Pacchetto Caret]
== Il progetto PenuX ==
Il codice sorgente, i modelli e la documentazione della piattaforma PenuX sono disponibili pubblicamente con licenza libera:
* [[github:netanelcyber/penux|Repository PenuX su GitHub]]
* [https://penux.uk Sito del progetto PenuX]
852eq2t1u39l9v4usjtpehoogsvfs2w
PenuX in R/Unità 2 - Preparazione e caricamento dei dati
0
61176
502008
2026-10-02T05:30:01Z
נתנאל שטרן
50194
Nuova pagina: = PenuX in R: Unità 2 - Preparazione e caricamento dei dati = == Obiettivi dell'unità == Al termine di questa unità sarai in grado di: * Caricare dati clinici da file CSV * Pulire e pre-elaborare i dati * Gestire valori mancanti e valori anomali * Eseguire l'ingegneria delle caratteristiche * Codificare le variabili categoriche * Normalizzare e standardizzare i dati * Salvare i dati elaborati == 2.1 Caricamento dei dati == === Caricamento di base === <syntaxhighlight l...
502008
wikitext
text/x-wiki
= PenuX in R: Unità 2 - Preparazione e caricamento dei dati =
== Obiettivi dell'unità ==
Al termine di questa unità sarai in grado di:
* Caricare dati clinici da file CSV
* Pulire e pre-elaborare i dati
* Gestire valori mancanti e valori anomali
* Eseguire l'ingegneria delle caratteristiche
* Codificare le variabili categoriche
* Normalizzare e standardizzare i dati
* Salvare i dati elaborati
== 2.1 Caricamento dei dati ==
=== Caricamento di base ===
<syntaxhighlight lang="r">
# Caricare un file CSV
clinical_data <- read.csv("data/patients.csv")
# Visualizzare le prime righe
head(clinical_data)
# Visualizzare la struttura dei dati
str(clinical_data)
# Riepilogo statistico
summary(clinical_data)
# Dimensioni del dataset
dim(clinical_data)
</syntaxhighlight>
=== Opzioni avanzate di caricamento ===
<syntaxhighlight lang="r">
# Caricare con gestione dei valori mancanti
clinical_data <- read.csv(
"data/patients.csv",
na.strings = c("NA", "N/A", "missing", ""),
stringsAsFactors = FALSE
)
# Usare data.table per file di grandi dimensioni
library(data.table)
clinical_data <- fread("data/patients.csv")
# Verificare i valori mancanti
colSums(is.na(clinical_data))
</syntaxhighlight>
== 2.2 Pulizia dei dati ==
=== Rilevamento dei valori mancanti ===
<syntaxhighlight lang="r">
# Contare i valori mancanti per colonna
missing_counts <- colSums(is.na(clinical_data))
print(missing_counts)
# Percentuale di valori mancanti
missing_pct <- colSums(is.na(clinical_data)) / nrow(clinical_data) * 100
print(missing_pct)
# Righe con almeno un valore mancante
rows_with_missing <- sum(rowSums(is.na(clinical_data)) > 0)
print(paste("Numero di righe con valori mancanti:", rows_with_missing))
</syntaxhighlight>
=== Gestione dei valori mancanti ===
<syntaxhighlight lang="r">
# Rimuovere le righe con valori mancanti
clean_data <- na.omit(clinical_data)
# Rimuovere le colonne con troppi valori mancanti
clean_data <- clinical_data[, colSums(is.na(clinical_data)) < nrow(clinical_data)*0.5]
# Usare tidyverse per rimuovere valori mancanti selettivi
library(tidyverse)
clean_data <- clinical_data %>%
drop_na(age, diagnosis) %>%
filter(!is.na(systolic_bp))
</syntaxhighlight>
=== Gestione dei valori anomali ===
<syntaxhighlight lang="r">
# Metodo IQR per rilevare i valori anomali
detect_outliers <- function(x) {
Q1 <- quantile(x, 0.25, na.rm = TRUE)
Q3 <- quantile(x, 0.75, na.rm = TRUE)
IQR <- Q3 - Q1
lower_bound <- Q1 - 1.5 * IQR
upper_bound <- Q3 + 1.5 * IQR
return(x < lower_bound | x > upper_bound)
}
# Applicare il rilevamento
outliers <- apply(clinical_data[, sapply(clinical_data, is.numeric)], 2, detect_outliers)
# Rimuovere le righe con valori anomali
clean_data <- clinical_data[!rowSums(outliers, na.rm = TRUE) > 0, ]
</syntaxhighlight>
== 2.3 Ingegneria delle caratteristiche ==
=== Creazione di nuove variabili ===
<syntaxhighlight lang="r">
# Creare gruppi di età
clinical_data <- clinical_data %>%
mutate(
age_group = case_when(
age < 40 ~ "Giovane",
age >= 40 & age < 65 ~ "Medio",
age >= 65 ~ "Anziano"
)
)
# Creare variabili binarie
clinical_data <- clinical_data %>%
mutate(
has_pancreatitis = diagnosis == "Pancreatitis",
has_sepsis = diagnosis == "Sepsis",
is_sick = diagnosis != "Healthy"
)
# Creare punteggi compositi
clinical_data <- clinical_data %>%
mutate(
MAP = (systolic_bp + 2 * diastolic_bp) / 3,
pulse_pressure = systolic_bp - diastolic_bp
)
</syntaxhighlight>
== 2.4 Codifica delle variabili categoriche ==
=== Conversione in fattori ===
<syntaxhighlight lang="r">
# Convertire in fattori
clinical_data <- clinical_data %>%
mutate(
gender = factor(gender, levels = c("M", "F")),
diagnosis = factor(diagnosis),
age_group = factor(age_group)
)
# Visualizzare i livelli
levels(clinical_data$gender)
levels(clinical_data$diagnosis)
</syntaxhighlight>
=== Codifica binaria ===
<syntaxhighlight lang="r">
# Creare variabili binarie manualmente
clinical_data <- clinical_data %>%
mutate(
gender_F = ifelse(gender == "F", 1, 0),
diagnosis_Pancreatitis = ifelse(diagnosis == "Pancreatitis", 1, 0),
diagnosis_Sepsis = ifelse(diagnosis == "Sepsis", 1, 0),
diagnosis_Healthy = ifelse(diagnosis == "Healthy", 1, 0)
)
# Usare caret per la codifica binaria
library(caret)
dummies <- dummyVars(~ diagnosis + gender, data = clinical_data)
encoded_data <- predict(dummies, newdata = clinical_data)
</syntaxhighlight>
== 2.5 Normalizzazione e standardizzazione ==
=== Normalizzazione (Min-Max) ===
<syntaxhighlight lang="r">
# Funzione di normalizzazione
normalize <- function(x) {
return((x - min(x, na.rm = TRUE)) / (max(x, na.rm = TRUE) - min(x, na.rm = TRUE)))
}
# Applicare la normalizzazione
clinical_data <- clinical_data %>%
mutate(across(
c(age, systolic_bp, diastolic_bp, white_blood_cells, creatinine),
normalize
))
# Verificare gli intervalli (devono essere tra 0 e 1)
summary(clinical_data$age)
</syntaxhighlight>
=== Standardizzazione (Z-score) ===
<syntaxhighlight lang="r">
# Standardizzazione con scale()
clinical_data <- clinical_data %>%
mutate(across(
c(age, systolic_bp, diastolic_bp, white_blood_cells, creatinine),
scale
))
# Verificare la media (≈0) e la deviazione standard (≈1)
mean(clinical_data$age, na.rm = TRUE)
sd(clinical_data$age, na.rm = TRUE)
</syntaxhighlight>
== 2.6 Verifica della qualità dei dati ==
=== Rapporto sulla qualità ===
<syntaxhighlight lang="r">
# Creare un rapporto di qualità
cat("=== Rapporto sulla qualità dei dati ===\n")
cat("Data:", as.character(Sys.Date()), "\n\n")
cat("--- Dimensioni ---\n")
cat("Numero di righe:", nrow(clinical_data), "\n")
cat("Numero di colonne:", ncol(clinical_data), "\n\n")
cat("--- Tipi di variabili ---\n")
cat("Numeriche:", sum(sapply(clinical_data, is.numeric)), "\n")
cat("Categoriche:", sum(sapply(clinical_data, is.character)), "\n\n")
cat("--- Valori mancanti ---\n")
print(colSums(is.na(clinical_data)))
</syntaxhighlight>
== 2.7 Salvataggio dei dati ==
=== Salvataggio in formati diversi ===
<syntaxhighlight lang="r">
# Salvare in CSV
write.csv(clinical_data, "results/clinical_data_cleaned.csv", row.names = FALSE)
# Salvare in formato RDS (più efficiente)
saveRDS(clinical_data, "results/clinical_data_cleaned.rds")
# Salvare in formato Excel (se writexl è installato)
# install.packages("writexl")
# library(writexl)
# write_xlsx(clinical_data, "results/clinical_data_cleaned.xlsx")
# Caricare i dati salvati
loaded_data <- read.csv("results/clinical_data_cleaned.csv")
loaded_rds <- readRDS("results/clinical_data_cleaned.rds")
</syntaxhighlight>
== Riepilogo dell'unità 2 ==
Abbiamo trattato:
* Caricamento dei dati clinici
* Pulizia e pre-elaborazione
* Gestione dei valori mancanti
* Rilevamento dei valori anomali
* Ingegneria delle caratteristiche
* Codifica delle variabili categoriche
* Normalizzazione e standardizzazione
* Verifica della qualità
* Salvataggio dei dati
== Esercizi pratici ==
# Carica il tuo dataset clinico
# Esegui una pulizia completa
# Crea almeno 5 nuove variabili
# Codifica tutte le variabili categoriche
# Normalizza e standardizza le variabili numeriche
# Genera un rapporto di qualità
# Salva i dati elaborati
== Letture consigliate ==
* [https://www.tidyverse.org/ Tidyverse]
* [https://topepo.github.io/caret/ Pacchetto Caret]
* [https://r4ds.had.co.nz/ R for Data Science]
== Il progetto PenuX ==
Il codice sorgente, i modelli e la documentazione della piattaforma PenuX sono disponibili pubblicamente con licenza libera:
* [[github:netanelcyber/penux|Repository PenuX su GitHub]]
* [https://penux.uk Sito del progetto PenuX]
htagk86jji8h9v8q7nuabidyn9x2z5a
PenuX in R: Quiz Unità 1
0
61177
502009
2026-10-02T07:14:53Z
נתנאל שטרן
50194
Aggiunto quiz dell'unità 1
502009
wikitext
text/x-wiki
= PenuX in R: Quiz Unità 1 =
Rispondi alle domande, poi clicca su "Mostra risposta" per controllare.
== Domanda 1 ==
Quale funzione crea un vettore in R?
* A) vector.new()
* B) list.add()
* C) c()
* D) make()
<div class="mw-collapsible mw-collapsed" data-expandtext="Mostra risposta" data-collapsetext="Nascondi risposta">
'''Risposta: C'''. <code>c()</code> combina valori in un vettore.
</div>
== Domanda 2 ==
Che cosa restituisce <code>10 %% 3</code>?
* A) 3.33
* B) 0
* C) 3
* D) 1 (il resto della divisione)
<div class="mw-collapsible mw-collapsed" data-expandtext="Mostra risposta" data-collapsetext="Nascondi risposta">
'''Risposta: D'''. L'operatore <code>%%</code> restituisce il resto: 10 = 3 × 3 + 1.
</div>
== Domanda 3 ==
Qual è la differenza principale tra matrice e data frame?
* A) La matrice contiene un solo tipo di dato; il data frame può avere colonne di tipi diversi
* B) Il data frame contiene solo numeri
* C) La matrice può avere solo una riga
* D) Non ci sono differenze
<div class="mw-collapsible mw-collapsed" data-expandtext="Mostra risposta" data-collapsetext="Nascondi risposta">
'''Risposta: A'''. Una matrice è omogenea; un data frame è una tabella con colonne di tipo diverso (numeri, testo, fattori).
</div>
== Domanda 4 ==
Quale ciclo conviene usare quando non si conosce in anticipo il numero di iterazioni?
* A) for su un vettore di lunghezza fissa
* B) while
* C) if
* D) function
<div class="mw-collapsible mw-collapsed" data-expandtext="Mostra risposta" data-collapsetext="Nascondi risposta">
'''Risposta: B'''. Il ciclo <code>while</code> continua finché la condizione è vera.
</div>
== Torna all'unità ==
[[PenuX in R: Unità 1 - Fondamenti del Linguaggio R|Torna all'Unità 1]]
lq7mx5j70usuqnkytx29hxpp3xtv8pm
PenuX in R: Unità 1 - Fondamenti del Linguaggio R
0
61178
502010
2026-10-02T07:15:39Z
נתנאל שטרן
50194
Aggiunta unità del corso PenuX in R (1/7)
502010
wikitext
text/x-wiki
= PenuX in R: Unità 1 - Fondamenti del Linguaggio R =
== Obiettivi dell'unità ==
Al termine di questa unità sarai in grado di:
* Comprendere i tipi di dati di base in R
* Lavorare con variabili e funzioni
* Utilizzare vettori, matrici e data frame
* Scrivere cicli e condizionali
* Creare le tue funzioni
* Leggere e scrivere file
== 1.1 Installazione e Configurazione ==
=== Installare R ===
<syntaxhighlight lang="bash">
# Ubuntu/Debian
sudo apt-get install r-base
# macOS
brew install r
# Windows
# Scarica da: https://cran.r-project.org/bin/windows/base/
</syntaxhighlight>
=== RStudio (IDE Consigliata) ===
<syntaxhighlight lang="bash">
# Scarica da: https://rstudio.com/products/rstudio/download/
</syntaxhighlight>
== 1.2 Tipi di Dati di Base ==
=== Vettori ===
<syntaxhighlight lang="r">
# Vettore numerico
age <- c(25, 30, 35, 40, 45)
print(age)
# Vettore di testo
names <- c("Alice", "Bob", "Carlo", "Diana", "Enrico")
print(names)
# Vettore logico
is_sick <- c(TRUE, FALSE, TRUE, FALSE, TRUE)
print(is_sick)
# Verificare il tipo
class(age)
class(names)
class(is_sick)
# Lunghezza del vettore
length(age)
# Accesso agli elementi
age[1] # Primo elemento
age[c(1, 3)] # Elementi 1 e 3
age[age > 30] # Tutti gli elementi > 30
</syntaxhighlight>
=== Matrici ===
<syntaxhighlight lang="r">
# Creare una matrice
matrix_data <- matrix(1:12, nrow = 3, ncol = 4)
print(matrix_data)
# Matrice con nomi di righe e colonne
data <- matrix(
c(65, 72, 58, 81, 92, 76),
nrow = 3,
ncol = 2,
dimnames = list(
c("Paziente_1", "Paziente_2", "Paziente_3"),
c("Pressione_Sistolica", "Temperatura")
)
)
print(data)
# Accesso agli elementi
data[1, 1] # Riga 1, Colonna 1
data[1, ] # Intera riga 1
data[, 1] # Intera colonna 1
</syntaxhighlight>
=== Data Frames ===
<syntaxhighlight lang="r">
# Creare un data frame
patients <- data.frame(
patient_id = 1:5,
name = c("Alice", "Bob", "Carlo", "Diana", "Enrico"),
age = c(25, 30, 35, 40, 45),
systolic_bp = c(120, 130, 140, 125, 135)
)
print(patients)
# Accesso alle colonne
patients$age
patients[["name"]]
patients[, "age"]
# Accesso alle righe
patients[1, ] # Prima riga
patients[1:3, ] # Righe 1-3
# Informazioni sul data frame
nrow(patients) # Numero di righe
ncol(patients) # Numero di colonne
head(patients) # Primo 6 righe
str(patients) # Struttura
summary(patients) # Statistiche
</syntaxhighlight>
== 1.3 Operazioni di Base ==
=== Operazioni Aritmetiche ===
<syntaxhighlight lang="r">
# Operazioni aritmetiche
5 + 3 # Addizione
10 - 2 # Sottrazione
4 * 5 # Moltiplicazione
20 / 4 # Divisione
2 ^ 3 # Potenza
10 %% 3 # Resto
# Operazioni su vettori
vec1 <- c(1, 2, 3, 4, 5)
vec2 <- c(2, 2, 2, 2, 2)
vec1 + vec2
vec1 * vec2
sqrt(vec1) # Radice quadrata
log(vec1) # Logaritmo naturale
exp(vec1) # e elevato a potenza
</syntaxhighlight>
=== Operazioni Logiche ===
<syntaxhighlight lang="r">
# Confronti
5 > 3 # Maggiore di
10 <= 10 # Minore o uguale
8 == 8 # Uguale
5 != 3 # Non uguale
# Logica booleana
TRUE & FALSE # AND
TRUE | FALSE # OR
!TRUE # NOT
# Su vettori
age <- c(25, 30, 35, 40, 45)
age > 30
age >= 35 & age < 45
!(age == 30)
</syntaxhighlight>
== 1.4 Funzioni ==
=== Funzioni Integrate ===
<syntaxhighlight lang="r">
# Statistiche di base
numbers <- c(1, 2, 3, 4, 5)
mean(numbers) # Media
median(numbers) # Mediana
sd(numbers) # Deviazione standard
var(numbers) # Varianza
min(numbers) # Minimo
max(numbers) # Massimo
sum(numbers) # Somma
prod(numbers) # Prodotto
length(numbers) # Lunghezza
# Funzioni su testo
text <- "Hello World"
nchar(text) # Numero di caratteri
toupper(text) # Maiuscole
tolower(text) # Minuscole
substr(text, 1, 5) # Sottostringa
paste("Hello", "World") # Concatenazione
</syntaxhighlight>
=== Creare Funzioni Personalizzate ===
<syntaxhighlight lang="r">
# Funzione semplice
greet <- function(name) {
message <- paste("Ciao", name)
return(message)
}
greet("Natanele")
# Funzione con parametri di default
calculate_bmi <- function(weight, height = 1.70) {
bmi <- weight / (height ^ 2)
return(bmi)
}
calculate_bmi(70) # height = 1.70 (default)
calculate_bmi(70, 1.80)
# Funzione che ritorna multipli valori
get_statistics <- function(data) {
mean_val <- mean(data)
sd_val <- sd(data)
return(list(mean = mean_val, sd = sd_val))
}
stats <- get_statistics(c(1, 2, 3, 4, 5))
stats$mean
stats$sd
</syntaxhighlight>
== 1.5 Cicli e Condizionali ==
=== if-else ===
<syntaxhighlight lang="r">
# if semplice
age <- 25
if (age >= 18) {
print("Maggiorenne")
} else {
print("Minorenne")
}
# if-else if-else
diagnosis <- "Healthy"
if (diagnosis == "Healthy") {
print("Sei sano")
} else if (diagnosis == "Pancreatitis") {
print("Pancreatite acuta")
} else if (diagnosis == "Sepsis") {
print("Sepsi")
} else {
print("Diagnosi sconosciuta")
}
# ifelse vettoriale
age <- c(20, 30, 40, 50, 60)
category <- ifelse(age > 40, "Anziano", "Giovane")
print(category)
</syntaxhighlight>
=== Cicli for ===
<syntaxhighlight lang="r">
# Ciclo for di base
for (i in 1:5) {
print(paste("Iterazione", i))
}
# Ciclo su un vettore
names <- c("Alice", "Bob", "Carlo")
for (name in names) {
print(paste("Ciao", name))
}
# Ciclo con break e next
for (i in 1:10) {
if (i == 3) {
next # Salta questa iterazione
}
if (i == 7) {
break # Esci dal ciclo
}
print(i)
}
</syntaxhighlight>
=== Cicli while ===
<syntaxhighlight lang="r">
# Ciclo while
count <- 0
while (count < 5) {
print(paste("Count:", count))
count <- count + 1
}
# Ciclo con condizione complessa
x <- 10
while (x > 0 & x < 20) {
print(x)
x <- x - 2
}
</syntaxhighlight>
== 1.6 Lavorare con i Pacchetti ==
=== Installazione e Caricamento ===
<syntaxhighlight lang="r">
# Installare un pacchetto
install.packages("tidyverse")
install.packages("ggplot2")
# Caricare un pacchetto
library(tidyverse)
library(ggplot2)
# Controllare i pacchetti installati
installed.packages()
# Rimuovere un pacchetto
remove.packages("tidyverse")
</syntaxhighlight>
=== Pacchetti Utili ===
<syntaxhighlight lang="r">
# tidyverse - Manipolazione dati conveniente
library(tidyverse)
# ggplot2 - Visualizzazione
library(ggplot2)
# caret - Machine learning
library(caret)
# dplyr - Manipolazione dati
library(dplyr)
# data.table - Tabelle dati veloci
library(data.table)
</syntaxhighlight>
== 1.7 Leggere e Scrivere File ==
=== File CSV ===
<syntaxhighlight lang="r">
# Leggere un file CSV
data <- read.csv("data.csv")
# Scrivere un file CSV
write.csv(data, "output.csv", row.names = FALSE)
# Con opzioni
data <- read.csv("data.csv",
sep = ",",
header = TRUE,
encoding = "UTF-8")
</syntaxhighlight>
=== Formato RDS ===
<syntaxhighlight lang="r">
# Salvare un oggetto R
patients <- data.frame(name = c("Alice", "Bob"), age = c(30, 40))
saveRDS(patients, "patients.rds")
# Caricare un oggetto R
loaded_data <- readRDS("patients.rds")
</syntaxhighlight>
== 1.8 Esercizi Pratici ==
=== Esercizio 1: Lavorare con i Vettori ===
<syntaxhighlight lang="r">
# Crea un vettore di 10 età di pazienti
ages <- c(45, 52, 38, 61, 55, 48, 72, 41, 58, 50)
# Calcola la media
mean(ages)
# Quanti pazienti hanno più di 50 anni?
sum(ages > 50)
# Quali sono le età dei pazienti con più di 50 anni?
ages[ages > 50]
</syntaxhighlight>
=== Esercizio 2: Creare un Data Frame ===
<syntaxhighlight lang="r">
# Crea un data frame di pazienti
patients <- data.frame(
id = 1:5,
name = c("Alice", "Bob", "Carlo", "Diana", "Enrico"),
age = c(45, 52, 38, 61, 55),
systolic_bp = c(140, 150, 120, 155, 145),
diagnosis = c("Healthy", "Hypertension", "Healthy", "Pancreatitis", "Sepsis")
)
# Stampa i dati
print(patients)
# Accedi alla colonna age
patients$age
# Filtra pazienti con diagnosi "Healthy"
healthy_patients <- patients[patients$diagnosis == "Healthy", ]
print(healthy_patients)
</syntaxhighlight>
=== Esercizio 3: Creare una Funzione ===
<syntaxhighlight lang="r">
# Scrivi una funzione che calcola la MAP
calculate_map <- function(systolic, diastolic) {
map <- (systolic + 2 * diastolic) / 3
return(round(map, 2))
}
# Testa la funzione
calculate_map(140, 90)
calculate_map(120, 80)
# Usala su un data frame
patients$MAP <- mapply(calculate_map,
patients$systolic_bp,
patients$diastolic_bp)
print(patients)
</syntaxhighlight>
=== Esercizio 4: Cicli e Funzioni ===
<syntaxhighlight lang="r">
# Scrivi un ciclo che stampa statistiche per ogni paziente
for (i in 1:nrow(patients)) {
cat("Paziente:", patients$name[i],
"| Età:", patients$age[i],
"| MAP:", patients$MAP[i], "\n")
}
# Scrivi una funzione che categorizza per età
categorize_age <- function(age) {
if (age < 40) {
return("Giovane")
} else if (age < 65) {
return("Medio")
} else {
return("Anziano")
}
}
# Applica a tutti i pazienti
patients$age_category <- sapply(patients$age, categorize_age)
print(patients)
</syntaxhighlight>
== 1.9 Verifica della Comprensione ==
* Qual è la differenza tra un vettore, una matrice e un data frame?
* Come si crea una funzione in R?
* Quale è la differenza tra un ciclo for e un ciclo while?
* Come si legge un file CSV in R?
* Come si usa il condizionale if-else?
== 1.10 Soluzioni degli Esercizi ==
=== Soluzione Esercizio 1 ===
<syntaxhighlight lang="r">
ages <- c(45, 52, 38, 61, 55, 48, 72, 41, 58, 50)
mean_age <- mean(ages) # 52
count_over_50 <- sum(ages > 50) # 6
ages_over_50 <- ages[ages > 50] # 52, 61, 55, 72, 58, 50
</syntaxhighlight>
=== Soluzione Esercizio 2 ===
<syntaxhighlight lang="r">
# Vedi nell'esercizio stesso
</syntaxhighlight>
== Riepilogo dell'Unità 1 ==
Abbiamo trattato:
* Tipi di dati: vettori, matrici, data frame
* Operazioni di base e funzioni
* Condizionali e cicli
* Creazione di funzioni personalizzate
* Utilizzo dei pacchetti
* Lettura e scrittura di file
* Esercizi pratici
== Letture Consigliate ==
* [https://www.r-project.org/ R Project]
* [https://rstudio.com/ RStudio]
* [https://r4ds.had.co.nz/ R for Data Science]
== Prosegui da Qui ==
Bene! Ora sei pronto per passare all'Unità 2: Preparazione dei Dati.
== Il progetto PenuX ==
Repository PenuX: https://github.com/netanelcyber/penux
Sito PenuX: https://penux.uk
== Quiz ==
[[PenuX in R: Quiz Unità 1|Fai il quiz dell'Unità 1]]
luk22act9f4e33fxkhd3nd2jgw8fsbq
PenuX in R: Unità 2 - Preparazione e Caricamento dei Dati
0
61179
502011
2026-10-02T07:16:28Z
נתנאל שטרן
50194
Aggiunta unità del corso PenuX in R (2/7)
502011
wikitext
text/x-wiki
= PenuX in R: Unità 2 - Preparazione e Caricamento dei Dati =
== Obiettivi dell'unità ==
Al termine di questa unità sarai in grado di:
* Caricare dati clinici da file CSV, Excel e RDS
* Ispezionare la struttura e la qualità di un dataset
* Individuare e gestire i valori mancanti
* Individuare e trattare i valori anomali (outlier)
* Creare nuove variabili (feature engineering)
* Codificare le variabili categoriche
* Normalizzare e standardizzare le variabili numeriche
* Produrre un breve rapporto sulla qualità dei dati
'''Prerequisiti''': Unità 1 (Fondamenti del Linguaggio R).
== 2.0 Preparazione ==
<syntaxhighlight lang="r">
install.packages(c("tidyverse", "readxl", "naniar", "caret"))
library(tidyverse)
library(readxl)
library(naniar)
library(caret)
set.seed(42)
</syntaxhighlight>
=== Dataset di esempio (sintetico) ===
Per gli esercizi creiamo un dataset clinico sintetico con difetti realistici: valori mancanti, outlier e categorie scritte in modi diversi. Non contiene dati di pazienti reali.
<syntaxhighlight lang="r">
n <- 300
raw <- data.frame(
patient_id = 1:n,
age = round(rnorm(n, 58, 16)),
sex = sample(c("M", "F", "m", "f", "Male", "Female"), n, replace = TRUE),
weight_kg = round(rnorm(n, 75, 14), 1),
height_cm = round(rnorm(n, 170, 10)),
systolic_bp = round(rnorm(n, 128, 18)),
heart_rate = round(rnorm(n, 84, 14)),
creatinine = round(rlnorm(n, log(1.0), 0.35), 2),
wbc = round(rnorm(n, 9, 3), 1),
diagnosis = sample(c("Healthy", "Pancreatitis", "Sepsis"), n,
replace = TRUE, prob = c(0.6, 0.25, 0.15))
)
# Introdurre difetti
raw$creatinine[sample(n, 25)] <- NA
raw$wbc[sample(n, 15)] <- NA
raw$systolic_bp[sample(n, 10)] <- NA
raw$heart_rate[c(5, 77)] <- c(900, -20) # errori di inserimento
raw$weight_kg[12] <- 750 # virgola decimale mancante
write.csv(raw, "pazienti_grezzi.csv", row.names = FALSE)
</syntaxhighlight>
== 2.1 Caricamento dei dati ==
=== CSV ===
<syntaxhighlight lang="r">
dati <- read.csv("pazienti_grezzi.csv", stringsAsFactors = FALSE)
# Alternativa tidyverse (più veloce, tipi più prevedibili)
dati <- read_csv("pazienti_grezzi.csv")
# CSV europeo: separatore ";" e virgola decimale
# dati <- read.csv2("file_europeo.csv")
# dati <- read_csv2("file_europeo.csv")
</syntaxhighlight>
=== Excel ===
<syntaxhighlight lang="r">
# Elencare i fogli e leggerne uno
excel_sheets("pazienti.xlsx")
dati <- read_excel("pazienti.xlsx", sheet = 1)
# Saltare righe di intestazione e specificare i valori mancanti
dati <- read_excel("pazienti.xlsx", skip = 2, na = c("", "NA", "N/D", "-"))
</syntaxhighlight>
=== RDS ===
<syntaxhighlight lang="r">
saveRDS(dati, "pazienti.rds")
dati <- readRDS("pazienti.rds")
</syntaxhighlight>
'''Buona pratica''': non modificare mai il file originale. Conserva i dati grezzi in una cartella separata e salva i dati puliti in un nuovo file.
== 2.2 Ispezione iniziale ==
<syntaxhighlight lang="r">
dim(dati) # righe e colonne
str(dati) # tipi di variabili
head(dati)
summary(dati) # statistiche e conteggio NA
# Valori mancanti per colonna
colSums(is.na(dati))
# Percentuale di mancanti
round(colMeans(is.na(dati)) * 100, 1)
# Righe duplicate
sum(duplicated(dati))
sum(duplicated(dati$patient_id))
# Valori distinti delle variabili categoriche
table(dati$sex, useNA = "ifany")
table(dati$diagnosis, useNA = "ifany")
</syntaxhighlight>
'''Domande''':
* Quali colonne hanno valori mancanti e in che percentuale?
* La variabile <code>sex</code> è coerente?
== 2.3 Pulizia delle variabili categoriche ==
<syntaxhighlight lang="r">
dati <- dati %>%
mutate(
sex = case_when(
sex %in% c("M", "m", "Male") ~ "M",
sex %in% c("F", "f", "Female") ~ "F",
TRUE ~ NA_character_
),
sex = factor(sex, levels = c("F", "M")),
diagnosis = factor(diagnosis, levels = c("Healthy", "Pancreatitis", "Sepsis"))
)
table(dati$sex)
levels(dati$diagnosis)
</syntaxhighlight>
== 2.4 Valori anomali (outlier) ==
=== Valori fisiologicamente impossibili ===
Prima di usare metodi statistici, applica i limiti clinici: un battito di 900 al minuto è un errore, non un outlier da "tenere".
<syntaxhighlight lang="r">
limiti <- list(
age = c(0, 110),
weight_kg = c(20, 250),
height_cm = c(100, 220),
systolic_bp = c(50, 260),
heart_rate = c(20, 220),
creatinine = c(0.1, 15),
wbc = c(0.5, 100)
)
for (v in names(limiti)) {
fuori <- which(dati[[v]] < limiti[[v]][1] | dati[[v]] > limiti[[v]][2])
if (length(fuori) > 0) {
cat(v, ": ", length(fuori), " valori fuori intervallo (righe ",
paste(fuori, collapse = ", "), ")\n", sep = "")
dati[[v]][fuori] <- NA # trasformare in mancanti
}
}
</syntaxhighlight>
=== Metodo dell'IQR ===
<syntaxhighlight lang="r">
rileva_outlier_iqr <- function(x, k = 1.5) {
q <- quantile(x, c(0.25, 0.75), na.rm = TRUE)
iqr <- q[2] - q[1]
x < (q[1] - k * iqr) | x > (q[2] + k * iqr)
}
out_creat <- rileva_outlier_iqr(dati$creatinine)
sum(out_creat, na.rm = TRUE)
boxplot(dati$creatinine, main = "Creatinina", horizontal = TRUE)
</syntaxhighlight>
'''Attenzione''': in medicina un valore estremo può essere clinicamente reale (per esempio creatinina molto alta in insufficienza renale). Non eliminare automaticamente gli outlier statistici: verifica sempre se sono errori o casi veri.
== 2.5 Valori mancanti ==
=== Esplorare lo schema dei mancanti ===
<syntaxhighlight lang="r">
vis_miss(dati) # mappa dei mancanti
gg_miss_var(dati) # mancanti per variabile
miss_var_summary(dati)
</syntaxhighlight>
Tipi di dati mancanti:
* '''MCAR''': mancano in modo completamente casuale
* '''MAR''': la mancanza dipende da altre variabili osservate
* '''MNAR''': la mancanza dipende dal valore stesso (per esempio un esame non richiesto perché il paziente sembrava sano)
=== Strategie ===
<syntaxhighlight lang="r">
# 1) Eliminare le righe con mancanti (solo se poche)
dati_completi <- na.omit(dati)
nrow(dati) - nrow(dati_completi)
# 2) Imputazione con la mediana (robusta agli outlier)
imputa_mediana <- function(x) {
x[is.na(x)] <- median(x, na.rm = TRUE)
x
}
dati_imp <- dati %>%
mutate(across(where(is.numeric), imputa_mediana))
# 3) Aggiungere un indicatore di "mancante" prima di imputare
dati_ind <- dati %>%
mutate(creatinine_mancante = as.integer(is.na(creatinine)))
# 4) Imputazione k-nearest neighbors con caret
pre <- preProcess(dati %>% select(where(is.numeric), -patient_id),
method = "knnImpute")
dati_knn <- predict(pre, dati %>% select(where(is.numeric), -patient_id))
</syntaxhighlight>
'''Nota importante''': <code>knnImpute</code> centra e scala le variabili. Inoltre, ogni parametro di imputazione (mediane, medie) va calcolato '''solo sul training set''' e poi applicato al test set, per evitare la fuga di informazioni (data leakage).
== 2.6 Feature engineering ==
<syntaxhighlight lang="r">
dati_imp <- dati_imp %>%
mutate(
# Indice di massa corporea
bmi = weight_kg / (height_cm / 100)^2,
# Categoria BMI
bmi_cat = cut(bmi,
breaks = c(0, 18.5, 25, 30, Inf),
labels = c("Sottopeso", "Normale", "Sovrappeso", "Obeso"),
right = FALSE),
# Fasce d'età
age_group = cut(age,
breaks = c(0, 40, 65, Inf),
labels = c("<40", "40-64", "65+"),
right = FALSE),
# Creatinina elevata
high_creatinine = creatinine > 1.3,
# Rapporto utile in clinica: shock index = FC / PAS
shock_index = heart_rate / systolic_bp
)
summary(dati_imp %>% select(bmi, shock_index))
table(dati_imp$bmi_cat)
</syntaxhighlight>
== 2.7 Codifica delle variabili categoriche ==
<syntaxhighlight lang="r">
# One-hot encoding con caret
dummy <- dummyVars(~ sex + age_group, data = dati_imp)
codificate <- predict(dummy, newdata = dati_imp)
head(codificate)
# Combinare con le variabili numeriche
dati_modello <- cbind(
dati_imp %>% select(where(is.numeric)),
as.data.frame(codificate),
diagnosis = dati_imp$diagnosis
)
# Per un esito binario (sepsi sì/no)
dati_modello$sepsis <- factor(ifelse(dati_modello$diagnosis == "Sepsis", "Si", "No"),
levels = c("No", "Si"))
</syntaxhighlight>
'''Suggerimento''': molte funzioni di R (<code>glm</code>, <code>randomForest</code>, <code>train</code>) accettano direttamente i fattori e creano da sole le variabili dummy.
== 2.8 Normalizzazione e standardizzazione ==
<syntaxhighlight lang="r">
numeriche <- c("age", "weight_kg", "systolic_bp", "heart_rate",
"creatinine", "wbc", "bmi")
# Standardizzazione (z-score): media 0, deviazione standard 1
z <- scale(dati_imp[, numeriche])
# Normalizzazione min-max: valori in [0, 1]
min_max <- function(x) (x - min(x)) / (max(x) - min(x))
mm <- as.data.frame(lapply(dati_imp[, numeriche], min_max))
# Con caret (apprende i parametri dal training e li riapplica al test)
idx <- createDataPartition(dati_imp$diagnosis, p = 0.7, list = FALSE)
train <- dati_imp[idx, ]
test <- dati_imp[-idx, ]
pp <- preProcess(train[, numeriche], method = c("center", "scale"))
train_scalato <- predict(pp, train[, numeriche])
test_scalato <- predict(pp, test[, numeriche]) # usa media e sd del training
</syntaxhighlight>
'''Quando serve''': kNN, SVM, k-means, regressione penalizzata e reti neurali sono sensibili alla scala. Alberi e Random Forest no.
== 2.9 Rapporto sulla qualità dei dati ==
<syntaxhighlight lang="r">
rapporto_qualita <- function(df) {
data.frame(
variabile = names(df),
tipo = sapply(df, function(x) class(x)[1]),
mancanti = sapply(df, function(x) sum(is.na(x))),
pct_manc = round(sapply(df, function(x) mean(is.na(x))) * 100, 1),
distinti = sapply(df, function(x) length(unique(x))),
row.names = NULL
)
}
rapporto_qualita(dati)
rapporto_qualita(dati_imp)
</syntaxhighlight>
== 2.10 Esercizi pratici ==
=== Esercizio 1: Ispezione ===
Carica <code>pazienti_grezzi.csv</code> e rispondi:
* Quante righe e colonne ha?
* Quale colonna ha più valori mancanti?
* Quali valori distinti contiene <code>sex</code>?
<syntaxhighlight lang="r">
dati <- read.csv("pazienti_grezzi.csv", stringsAsFactors = FALSE)
dim(dati)
colSums(is.na(dati))
table(dati$sex)
</syntaxhighlight>
=== Esercizio 2: Pulizia ===
Uniforma <code>sex</code> in "F"/"M" e trasforma in <code>NA</code> la frequenza cardiaca fuori dall'intervallo 20-220.
=== Esercizio 3: Imputazione ===
Imputa la creatinina con la mediana '''per diagnosi''' (non con la mediana globale) e confronta il risultato con l'imputazione globale.
<syntaxhighlight lang="r">
dati <- dati %>%
group_by(diagnosis) %>%
mutate(creatinine = ifelse(is.na(creatinine),
median(creatinine, na.rm = TRUE),
creatinine)) %>%
ungroup()
</syntaxhighlight>
=== Esercizio 4: Nuove variabili ===
Crea BMI, shock index e una variabile binaria <code>tachicardia</code> (frequenza cardiaca > 100).
=== Esercizio 5: Divisione senza fuga di informazioni ===
Dividi i dati in training (70%) e test (30%). Calcola media e deviazione standard '''solo sul training''', standardizza entrambi i set e verifica che la media del test '''non''' sia esattamente 0.
== 2.11 Soluzioni ==
=== Esercizio 1 ===
Il dataset ha 300 righe e 10 colonne. La creatinina ha 25 valori mancanti (la più alta), seguita da <code>wbc</code> (15) e <code>systolic_bp</code> (10). La colonna <code>sex</code> contiene sei varianti: M, F, m, f, Male, Female.
=== Esercizio 2 ===
<syntaxhighlight lang="r">
dati$sex <- ifelse(toupper(substr(dati$sex, 1, 1)) == "M", "M", "F")
dati$heart_rate[dati$heart_rate < 20 | dati$heart_rate > 220] <- NA
sum(is.na(dati$heart_rate)) # 2 (i valori 900 e -20)
</syntaxhighlight>
=== Esercizio 3 ===
L'imputazione per gruppo conserva meglio le differenze tra diagnosi. Con dati reali la creatinina è tipicamente più alta nei pazienti con sepsi, quindi la mediana globale la sottostimerebbe in quel gruppo. Attenzione: l'esito (diagnosi) non deve essere usato per imputare quando il modello dovrà predirlo su nuovi pazienti, perché in produzione la diagnosi non è nota. Questo esercizio serve solo a mostrare l'effetto; nel flusso predittivo si imputa con variabili disponibili al momento della predizione.
=== Esercizio 4 ===
<syntaxhighlight lang="r">
dati <- dati %>%
mutate(bmi = weight_kg / (height_cm / 100)^2,
shock_index = heart_rate / systolic_bp,
tachicardia = heart_rate > 100)
</syntaxhighlight>
=== Esercizio 5 ===
<syntaxhighlight lang="r">
idx <- createDataPartition(dati$diagnosis, p = 0.7, list = FALSE)
train <- dati[idx, ]
test <- dati[-idx, ]
mu <- mean(train$wbc, na.rm = TRUE)
s <- sd(train$wbc, na.rm = TRUE)
train$wbc_z <- (train$wbc - mu) / s
test$wbc_z <- (test$wbc - mu) / s
mean(train$wbc_z, na.rm = TRUE) # 0
mean(test$wbc_z, na.rm = TRUE) # vicino a 0, ma non esattamente 0
</syntaxhighlight>
La media del test non è 0 perché usa i parametri del training: è il comportamento corretto, perché in produzione i nuovi pazienti verranno standardizzati con i parametri appresi in fase di addestramento.
== 2.12 Verifica della comprensione ==
* Perché non si deve modificare il file dei dati grezzi?
* Qual è la differenza tra un valore impossibile e un outlier statistico?
* Quando l'eliminazione delle righe con valori mancanti è rischiosa?
* Che cos'è la fuga di informazioni (data leakage) e come si evita nella preparazione dei dati?
* Perché Random Forest non richiede la standardizzazione, mentre kNN sì?
* Che differenza c'è tra MCAR, MAR e MNAR?
== Avvertenza ==
I dati di questa unità sono sintetici e a scopo didattico. Con dati clinici reali rispetta sempre le norme sulla privacy (anonimizzazione e GDPR) e consulta un esperto clinico per decidere come trattare valori anomali e mancanti.
== Riepilogo dell'Unità 2 ==
Abbiamo trattato:
* Caricamento da CSV, Excel e RDS
* Ispezione di struttura e qualità
* Pulizia delle variabili categoriche
* Valori impossibili e outlier
* Strategie per i valori mancanti
* Feature engineering clinico (BMI, shock index)
* Codifica, normalizzazione e standardizzazione
* Prevenzione della fuga di informazioni
* Rapporto sulla qualità dei dati
== Letture Consigliate ==
* [https://r4ds.hadley.nz/ R for Data Science]
* [https://topepo.github.io/caret/pre-processing.html Pre-processing con caret]
* [https://naniar.njtierney.com/ Pacchetto naniar per i valori mancanti]
== Prosegui da Qui ==
Ora i dati sono puliti: passa all'Unità 3, Analisi Esplorativa dei Dati.
== Il progetto PenuX ==
Repository PenuX: https://github.com/netanelcyber/penux
Sito PenuX: https://penux.uk
== Quiz ==
[[PenuX in R: Quiz Unità 2|Fai il quiz dell'Unità 2]]
fgcmhioztxv8jxvwna6higs4tlg17nz
PenuX in R: Quiz Unità 2
0
61180
502012
2026-10-02T07:16:34Z
נתנאל שטרן
50194
Aggiunto quiz dell'unità 2
502012
wikitext
text/x-wiki
= PenuX in R: Quiz Unità 2 =
Rispondi alle domande, poi clicca su "Mostra risposta" per controllare.
== Domanda 1 ==
Una frequenza cardiaca di 900 bpm in un dataset è:
* A) Un outlier da conservare sempre
* B) Un valore normale nella sepsi
* C) Un valore da standardizzare
* D) Un valore impossibile da trattare come errore (mancante)
<div class="mw-collapsible mw-collapsed" data-expandtext="Mostra risposta" data-collapsetext="Nascondi risposta">
'''Risposta: D'''. Valori fisiologicamente impossibili sono errori di inserimento e vanno trattati come mancanti.
</div>
== Domanda 2 ==
Perché spesso si imputa con la mediana anziché con la media?
* A) La mediana è robusta agli outlier
* B) La mediana è sempre più grande
* C) La media non si può calcolare in R
* D) La mediana crea nuove variabili
<div class="mw-collapsible mw-collapsed" data-expandtext="Mostra risposta" data-collapsetext="Nascondi risposta">
'''Risposta: A'''. La mediana non è influenzata dai valori estremi.
</div>
== Domanda 3 ==
Che cos'è la fuga di informazioni (data leakage)?
* A) Perdere righe del dataset
* B) Usare informazioni del test set durante la preparazione o l'addestramento
* C) Salvare i dati in un file RDS
* D) Rimuovere le colonne duplicate
<div class="mw-collapsible mw-collapsed" data-expandtext="Mostra risposta" data-collapsetext="Nascondi risposta">
'''Risposta: B'''. Per esempio, calcolare media e sd su tutto il dataset prima della divisione rende la valutazione ottimistica.
</div>
== Domanda 4 ==
Quale algoritmo richiede in genere la standardizzazione delle variabili?
* A) Random Forest
* B) Albero decisionale
* C) kNN
* D) Nessuno
<div class="mw-collapsible mw-collapsed" data-expandtext="Mostra risposta" data-collapsetext="Nascondi risposta">
'''Risposta: C'''. kNN usa le distanze, quindi le variabili con scala maggiore dominerebbero.
</div>
== Torna all'unità ==
[[PenuX in R: Unità 2 - Preparazione e Caricamento dei Dati|Torna all'Unità 2]]
etcmuvl7u4t1e0cz3s6r8w91n1vcfx7
PenuX in R: Unità 3 - Analisi Esplorativa dei Dati
0
61181
502013
2026-10-02T07:17:23Z
נתנאל שטרן
50194
Aggiunta unità del corso PenuX in R (3/7)
502013
wikitext
text/x-wiki
= PenuX in R: Unità 3 - Analisi Esplorativa dei Dati (EDA) =
== Obiettivi dell'unità ==
Al termine di questa unità sarai in grado di:
* Eseguire analisi statistiche descrittive
* Creare visualizzazioni di dati univariate e bivariate
* Identificare relazioni e dipendenze tra variabili
* Rilevare anomalie e pattern nei dati
* Generare ipotesi basate sull'esplorazione
* Documentare e comunicare i risultati
== 3.1 Analisi Statistica Descrittiva ==
=== Statistiche di base ===
<syntaxhighlight lang="r">
# Statistiche descrittive complessive
summary(clinical_data)
# Statistiche per singola variabile
mean(clinical_data$age, na.rm = TRUE)
median(clinical_data$age, na.rm = TRUE)
sd(clinical_data$age, na.rm = TRUE)
var(clinical_data$age, na.rm = TRUE)
min(clinical_data$age, na.rm = TRUE)
max(clinical_data$age, na.rm = TRUE)
range(clinical_data$age, na.rm = TRUE)
# Percentili
quantile(clinical_data$age, probs = c(0.25, 0.5, 0.75, 0.95), na.rm = TRUE)
</syntaxhighlight>
=== Statistiche per gruppo ===
<syntaxhighlight lang="r">
# Usare dplyr per statistiche raggruppate
library(dplyr)
clinical_data %>%
group_by(diagnosis) %>%
summarise(
n = n(),
mean_age = mean(age, na.rm = TRUE),
sd_age = sd(age, na.rm = TRUE),
mean_systolic = mean(systolic_bp, na.rm = TRUE),
mean_diastolic = mean(diastolic_bp, na.rm = TRUE),
.groups = 'drop'
)
# Statistiche più dettagliate
clinical_data %>%
group_by(diagnosis, gender) %>%
summarise(
count = n(),
age_mean = mean(age, na.rm = TRUE),
age_sd = sd(age, na.rm = TRUE),
wbc_mean = mean(white_blood_cells, na.rm = TRUE),
creatinine_mean = mean(creatinine, na.rm = TRUE),
.groups = 'drop'
)
</syntaxhighlight>
== 3.2 Visualizzazioni Univariate ==
=== Istogrammi ===
<syntaxhighlight lang="r">
library(ggplot2)
# Istogramma semplice
ggplot(clinical_data, aes(x = age)) +
geom_histogram(binwidth = 5, fill = "steelblue", color = "black", alpha = 0.7) +
labs(title = "Distribuzione dell'età",
x = "Età (anni)",
y = "Frequenza") +
theme_minimal()
# Istogrammi per gruppo
ggplot(clinical_data, aes(x = age, fill = diagnosis)) +
geom_histogram(binwidth = 5, alpha = 0.6, position = "dodge") +
labs(title = "Distribuzione dell'età per diagnosi",
x = "Età (anni)",
y = "Frequenza") +
theme_minimal() +
theme(legend.position = "bottom")
# Densità overlay
ggplot(clinical_data, aes(x = systolic_bp)) +
geom_histogram(aes(y = after_stat(density)), binwidth = 10,
fill = "steelblue", alpha = 0.5) +
geom_density(color = "red", linewidth = 1) +
labs(title = "Distribuzione della pressione sistolica",
x = "Pressione Sistolica (mmHg)",
y = "Densità") +
theme_minimal()
</syntaxhighlight>
=== Box Plot e Violin Plot ===
<syntaxhighlight lang="r">
# Box plot semplice
ggplot(clinical_data, aes(x = diagnosis, y = age)) +
geom_boxplot(fill = "lightblue", color = "darkblue") +
geom_jitter(width = 0.2, alpha = 0.3) +
labs(title = "Distribuzione dell'età per diagnosi",
x = "Diagnosi",
y = "Età (anni)") +
theme_minimal()
# Violin plot
ggplot(clinical_data, aes(x = diagnosis, y = white_blood_cells, fill = diagnosis)) +
geom_violin(alpha = 0.6) +
geom_boxplot(width = 0.2, alpha = 0.8) +
labs(title = "Distribuzione dei leucociti per diagnosi",
x = "Diagnosi",
y = "Leucociti (WBC)") +
theme_minimal() +
theme(legend.position = "none")
# Facet plot
ggplot(clinical_data, aes(x = age)) +
geom_histogram(binwidth = 5, fill = "steelblue", alpha = 0.7) +
facet_wrap(~ diagnosis) +
labs(title = "Distribuzione dell'età per diagnosi",
x = "Età (anni)",
y = "Frequenza") +
theme_minimal()
</syntaxhighlight>
== 3.3 Visualizzazioni Bivariate ==
=== Scatter Plot ===
<syntaxhighlight lang="r">
# Scatter plot semplice
ggplot(clinical_data, aes(x = age, y = systolic_bp)) +
geom_point(alpha = 0.6, size = 2) +
geom_smooth(method = "lm", se = TRUE, color = "red") +
labs(title = "Relazione tra età e pressione sistolica",
x = "Età (anni)",
y = "Pressione Sistolica (mmHg)") +
theme_minimal()
# Scatter plot per gruppo
ggplot(clinical_data, aes(x = age, y = white_blood_cells, color = diagnosis)) +
geom_point(alpha = 0.6, size = 2) +
geom_smooth(method = "lm", se = FALSE, linewidth = 1) +
labs(title = "Relazione tra età e leucociti per diagnosi",
x = "Età (anni)",
y = "Leucociti (WBC)") +
theme_minimal() +
theme(legend.position = "bottom")
</syntaxhighlight>
=== Matrice di Correlazione ===
<syntaxhighlight lang="r">
# Calcolare la matrice di correlazione
numeric_data <- clinical_data %>%
select_if(is.numeric)
correlation_matrix <- cor(numeric_data, use = "complete.obs")
print(correlation_matrix)
# Visualizzare con ggplot
library(reshape2)
melted_corr <- melt(correlation_matrix)
ggplot(melted_corr, aes(x = Var1, y = Var2, fill = value)) +
geom_tile(color = "white") +
geom_text(aes(label = round(value, 2)), size = 3) +
scale_fill_gradient2(low = "blue", mid = "white", high = "red",
limits = c(-1, 1)) +
labs(title = "Matrice di Correlazione",
x = "",
y = "",
fill = "Correlazione") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
# Usare corrplot
library(corrplot)
corrplot(correlation_matrix, method = "circle", type = "upper",
addCoef.col = "black", diag = FALSE,
title = "Matrice di Correlazione - PenuX")
</syntaxhighlight>
== 3.4 Analisi Multivariata ==
=== Analisi delle Componenti Principali (PCA) ===
<syntaxhighlight lang="r">
# Preparare i dati per PCA
pca_data <- clinical_data %>%
select_if(is.numeric) %>%
scale() # Standardizzare
# Eseguire PCA
pca_result <- prcomp(pca_data, center = FALSE)
# Riepilogo
summary(pca_result)
# Visualizzare la varianza spiegata
scree_plot <- tibble(
PC = 1:length(pca_result$sdev),
Variance = (pca_result$sdev^2 / sum(pca_result$sdev^2)) * 100
)
ggplot(scree_plot, aes(x = PC, y = Variance)) +
geom_col(fill = "steelblue", alpha = 0.7) +
geom_line(color = "red", linewidth = 1) +
labs(title = "Varianza Spiegata per Componente Principale",
x = "Componente Principale",
y = "Varianza Spiegata (%)") +
theme_minimal()
# Biplot
biplot(pca_result, main = "PCA Biplot")
</syntaxhighlight>
=== Clustering Analisi ===
<syntaxhighlight lang="r">
# K-means clustering
kmeans_result <- kmeans(pca_data, centers = 3, nstart = 25)
# Aggiungere i cluster ai dati
clinical_data_clustered <- clinical_data %>%
mutate(cluster = as.factor(kmeans_result$cluster))
# Visualizzare i cluster
ggplot(clinical_data_clustered, aes(x = age, y = white_blood_cells, color = cluster)) +
geom_point(size = 3, alpha = 0.6) +
labs(title = "K-means Clustering (k=3)",
x = "Età (anni)",
y = "Leucociti (WBC)",
color = "Cluster") +
theme_minimal()
# Hierarchical clustering
library(dendextend)
hc_result <- hclust(dist(pca_data), method = "ward.D2")
# Dendrogram
plot(hc_result, main = "Dendrogramma - Clustering Gerarchico",
xlab = "Osservazioni", ylab = "Distanza")
</syntaxhighlight>
== 3.5 Analisi Diagnostica ==
=== Test di Normalità ===
<syntaxhighlight lang="r">
# Test di Shapiro-Wilk
shapiro_test <- shapiro.test(clinical_data$age)
print(shapiro_test)
# Test di Kolmogorov-Smirnov
ks_test <- ks.test(clinical_data$age, "pnorm",
mean = mean(clinical_data$age, na.rm = TRUE),
sd = sd(clinical_data$age, na.rm = TRUE))
print(ks_test)
# Q-Q plot
ggplot(clinical_data, aes(sample = age)) +
geom_qq() +
geom_qq_line(color = "red") +
labs(title = "Q-Q Plot - Età",
x = "Quantili teorici",
y = "Quantili osservati") +
theme_minimal()
</syntaxhighlight>
=== Test di Omoschedasticità ===
<syntaxhighlight lang="r">
# Test di Levene
library(car)
levene_test <- leveneTest(age ~ diagnosis, data = clinical_data)
print(levene_test)
# Test di Bartlett
bartlett_test <- bartlett.test(age ~ diagnosis, data = clinical_data)
print(bartlett_test)
</syntaxhighlight>
== 3.6 Generazione di Rapporti ==
=== Rapporto EDA Automatico ===
<syntaxhighlight lang="r">
# Usare DataExplorer
library(DataExplorer)
# Creare un rapporto HTML automatico
create_report(clinical_data,
output_file = "eda_report.html",
output_dir = "results/",
y = "diagnosis")
# Analisi di singole variabili
plot_str(clinical_data)
plot_missing(clinical_data)
plot_histogram(clinical_data)
plot_density(clinical_data)
plot_boxplot(clinical_data, by = "diagnosis")
plot_correlation(clinical_data, type = "continuous")
</syntaxhighlight>
=== Rapporto Personalizzato ===
<syntaxhighlight lang="r">
# Creare un rapporto con R Markdown
rmd_content <- "
---
title: 'Analisi Esplorativa - PenuX'
date: '`r Sys.Date()`'
output: html_document
---
## Sommario dei Dati
```{r}
summary(clinical_data)
```
## Distribuzioni Univariate
```{r fig.width=12}
# Istogrammi per tutte le variabili numeriche
clinical_data %>%
select_if(is.numeric) %>%
pivot_longer(everything(), names_to = 'Variable', values_to = 'Value') %>%
ggplot(aes(x = Value)) +
geom_histogram(bins = 30, fill = 'steelblue') +
facet_wrap(~Variable, scales = 'free') +
theme_minimal()
```
## Correlazioni
```{r}
correlation_matrix <- cor(clinical_data %>% select_if(is.numeric),
use = 'complete.obs')
corrplot(correlation_matrix, method = 'circle', type = 'upper')
```
"
# Scrivere il file R Markdown
writeLines(rmd_content, "eda_report.Rmd")
# Renderizzare il report
library(rmarkdown)
render("eda_report.Rmd", output_format = "html_document")
</syntaxhighlight>
== 3.7 Esercizi Pratici ==
# Caricare il dataset pulito da Unit 2
# Eseguire analisi statistiche descrittive
# Creare almeno 10 visualizzazioni diverse
# Identificare le principali relazioni tra variabili
# Eseguire PCA e interpretare i risultati
# Applicare clustering e valutarne la qualità
# Generare un rapporto EDA completo
# Documentare le ipotesi generate dall'esplorazione
== 3.8 Verifica della Comprensione ==
* Quali test statistici usi per verificare la normalità dei dati?
* Come interpreti una matrice di correlazione?
* Quando e perché usi PCA?
* Quali sono le differenze tra clustering k-means e gerarchico?
* Come comunichi i risultati dell'EDA agli stakeholder clinici?
== Riepilogo dell'unità 3 ==
Abbiamo trattato:
* Analisi statistica descrittiva e raggruppata
* Visualizzazioni univariate (istogrammi, box plot, violin plot)
* Visualizzazioni bivariate e matrici di correlazione
* Analisi multivariata (PCA, clustering)
* Test diagnostici di normalità e omoschedasticità
* Generazione automatica di rapporti EDA
* Comunicazione efficace dei risultati
== Letture Consigliate ==
* [https://ggplot2.tidyverse.org/ ggplot2 Documentation]
* [https://cran.r-project.org/web/packages/DataExplorer/index.html DataExplorer Package]
== Il progetto PenuX ==
Il codice sorgente, i modelli e la documentazione della piattaforma PenuX sono
disponibili pubblicamente con licenza libera:
* [https://github.com/netanelcyber/penux Repository PenuX su GitHub]
* [https://penux.uk Sito del progetto PenuX]
== Quiz ==
[[PenuX in R: Quiz Unità 3|Fai il quiz dell'Unità 3]]
ptjqjeeakdp1wdlgj10pzyc5gbelqkx
PenuX in R: Quiz Unità 3
0
61182
502014
2026-10-02T07:17:28Z
נתנאל שטרן
50194
Aggiunto quiz dell'unità 3
502014
wikitext
text/x-wiki
= PenuX in R: Quiz Unità 3 =
Rispondi alle domande, poi clicca su "Mostra risposta" per controllare.
== Domanda 1 ==
Quale grafico mostra mediana e quartili?
* A) Boxplot
* B) Grafico a torta
* C) Grafico a dispersione
* D) Mappa di calore
<div class="mw-collapsible mw-collapsed" data-expandtext="Mostra risposta" data-collapsetext="Nascondi risposta">
'''Risposta: A'''. Il boxplot riassume mediana, quartili e valori estremi.
</div>
== Domanda 2 ==
Un coefficiente di correlazione r = -0,8 indica:
* A) Nessuna correlazione
* B) Una forte correlazione negativa
* C) Una debole correlazione positiva
* D) Un errore di calcolo
<div class="mw-collapsible mw-collapsed" data-expandtext="Mostra risposta" data-collapsetext="Nascondi risposta">
'''Risposta: B'''. Quando una variabile aumenta, l'altra tende a diminuire in modo marcato.
</div>
== Domanda 3 ==
A cosa serve l'analisi delle componenti principali (PCA)?
* A) A imputare i valori mancanti
* B) A dividere i dati in training e test
* C) A ridurre la dimensionalità conservando la maggior parte della varianza
* D) A calcolare l'AUC
<div class="mw-collapsible mw-collapsed" data-expandtext="Mostra risposta" data-collapsetext="Nascondi risposta">
'''Risposta: C'''. La PCA riassume molte variabili correlate in poche componenti.
</div>
== Domanda 4 ==
Una correlazione elevata tra due variabili dimostra un nesso causale?
* A) Sì, sempre
* B) Sì, se r > 0,5
* C) Solo nei dati clinici
* D) No, la correlazione da sola non prova la causalità
<div class="mw-collapsible mw-collapsed" data-expandtext="Mostra risposta" data-collapsetext="Nascondi risposta">
'''Risposta: D'''. Possono esserci variabili confondenti o coincidenze.
</div>
== Torna all'unità ==
[[PenuX in R: Unità 3 - Analisi Esplorativa dei Dati|Torna all'Unità 3]]
4i2as7plt0ctger8jkhg1fdd1eyau0n
PenuX in R: Unità 4 - Costruzione dei Modelli Predittivi
0
61183
502015
2026-10-02T07:18:02Z
נתנאל שטרן
50194
Aggiunta unità del corso PenuX in R (4/7)
502015
wikitext
text/x-wiki
= PenuX in R: Unità 4 - Costruzione dei Modelli Predittivi =
== Obiettivi dell'unità ==
Al termine di questa unità sarai in grado di:
* Suddividere i dati in training e test
* Costruire modelli di regressione logistica
* Implementare algoritmi di machine learning (Random Forest, SVM, XGBoost)
* Ottimizzare gli iperparametri
* Confrontare le prestazioni di diversi modelli
* Gestire il class imbalance
== 4.1 Preparazione dei Dati ==
=== Train-Test Split ===
<syntaxhighlight lang="r">
library(caret)
library(tidyverse)
# Impostare il seed per riproducibilità
set.seed(42)
# Creare indici di training (80%) e test (20%)
train_index <- createDataPartition(clinical_data$diagnosis,
p = 0.8,
list = FALSE)
train_data <- clinical_data[train_index, ]
test_data <- clinical_data[-train_index, ]
cat("Training set:", nrow(train_data), "righe\n")
cat("Test set:", nrow(test_data), "righe\n")
cat("Proporzione diagnosi nel training:\n")
print(table(train_data$diagnosis) / nrow(train_data))
</syntaxhighlight>
=== Cross-Validation ===
<syntaxhighlight lang="r">
# Configurare k-fold cross-validation
train_control <- trainControl(
method = "cv",
number = 5,
classProbs = TRUE,
summaryFunction = twoClassSummary
)
# Alternativa: Stratified k-fold per dataset sbilanciai
train_control_stratified <- trainControl(
method = "cv",
number = 5,
classProbs = TRUE,
summaryFunction = twoClassSummary,
sampling = "smote" # SMOTE per gestire imbalance
)
</syntaxhighlight>
== 4.2 Regressione Logistica ==
=== Modello Base ===
<syntaxhighlight lang="r">
# Modello di regressione logistica
logistic_model <- glm(diagnosis ~ age + systolic_bp + diastolic_bp +
white_blood_cells + creatinine,
family = binomial(link = "logit"),
data = train_data)
# Riepilogo del modello
summary(logistic_model)
# Coefficienti e odds ratio
coefficients(logistic_model)
exp(coefficients(logistic_model))
</syntaxhighlight>
=== Previsioni e Valutazione ===
<syntaxhighlight lang="r">
# Previsioni sul test set
predictions <- predict(logistic_model, newdata = test_data, type = "response")
# Convertire in classi (soglia = 0.5)
predicted_class <- ifelse(predictions > 0.5, "Disease", "Healthy")
# Matrice di confusione
conf_matrix <- confusionMatrix(
factor(predicted_class),
factor(test_data$diagnosis)
)
print(conf_matrix)
</syntaxhighlight>
== 4.3 Random Forest ==
=== Addestramento ===
<syntaxhighlight lang="r">
library(randomForest)
# Random Forest basic
rf_model <- randomForest(
diagnosis ~ age + systolic_bp + diastolic_bp +
white_blood_cells + creatinine,
data = train_data,
ntree = 500,
mtry = sqrt(ncol(train_data) - 1),
importance = TRUE
)
print(rf_model)
# Importanza delle variabili
importance(rf_model)
varImpPlot(rf_model, main = "Variable Importance - Random Forest")
</syntaxhighlight>
=== Ottimizzazione Iperparametri ===
<syntaxhighlight lang="r">
# Tuning con caret
rf_grid <- expand.grid(
mtry = c(2, 3, 4, 5)
)
rf_tuned <- train(
diagnosis ~ age + systolic_bp + diastolic_bp +
white_blood_cells + creatinine,
data = train_data,
method = "rf",
trControl = train_control,
tuneGrid = rf_grid,
ntree = 500,
metric = "ROC"
)
plot(rf_tuned)
print(rf_tuned$bestTune)
</syntaxhighlight>
== 4.4 Support Vector Machines (SVM) ==
<syntaxhighlight lang="r">
library(kernlab)
# SVM con kernel radiale
svm_model <- ksvm(
diagnosis ~ age + systolic_bp + diastolic_bp +
white_blood_cells + creatinine,
data = train_data,
kernel = "rbfdot",
C = 1,
prob.model = TRUE
)
# Previsioni
svm_pred <- predict(svm_model, newdata = test_data)
confusionMatrix(svm_pred, test_data$diagnosis)
</syntaxhighlight>
== 4.5 XGBoost ==
=== Addestramento ===
<syntaxhighlight lang="r">
library(xgboost)
# Preparare i dati per XGBoost
train_matrix <- xgb.DMatrix(
data = as.matrix(train_data %>%
select(age, systolic_bp, diastolic_bp, white_blood_cells, creatinine)),
label = as.numeric(train_data$diagnosis) - 1
)
test_matrix <- xgb.DMatrix(
data = as.matrix(test_data %>%
select(age, systolic_bp, diastolic_bp, white_blood_cells, creatinine)),
label = as.numeric(test_data$diagnosis) - 1
)
# Parametri
params <- list(
objective = "binary:logistic",
max_depth = 6,
eta = 0.1,
gamma = 1,
subsample = 0.8,
colsample_bytree = 0.8
)
# Addestramento
xgb_model <- xgb.train(
params = params,
data = train_matrix,
nrounds = 100,
watchlist = list(train = train_matrix, test = test_matrix),
print_every_n = 10,
early_stopping_rounds = 10
)
</syntaxhighlight>
=== Feature Importance ===
<syntaxhighlight lang="r">
# Feature importance
importance_matrix <- xgb.importance(
feature_names = c("age", "systolic_bp", "diastolic_bp",
"white_blood_cells", "creatinine"),
model = xgb_model
)
xgb.plot.importance(importance_matrix)
print(importance_matrix)
</syntaxhighlight>
== 4.6 Gestione del Class Imbalance ==
=== SMOTE (Synthetic Minority Over-sampling) ===
<syntaxhighlight lang="r">
library(DMwR)
# Applicare SMOTE
balanced_data <- SMOTE(diagnosis ~ ., data = train_data, perc.over = 200, perc.under = 150)
# Controllare il bilanciamento
cat("Before SMOTE:\n")
print(table(train_data$diagnosis))
cat("After SMOTE:\n")
print(table(balanced_data$diagnosis))
# Addestrare il modello su dati bilanciati
rf_balanced <- randomForest(
diagnosis ~ age + systolic_bp + diastolic_bp +
white_blood_cells + creatinine,
data = balanced_data,
ntree = 500
)
</syntaxhighlight>
=== Class Weights ===
<syntaxhighlight lang="r">
# Calcolare i pesi delle classi
class_weights <- table(train_data$diagnosis) / nrow(train_data)
scale_pos_weight <- class_weights["Healthy"] / class_weights["Disease"]
# XGBoost con class weights
xgb_weighted <- xgb.train(
params = list(
objective = "binary:logistic",
max_depth = 6,
eta = 0.1,
scale_pos_weight = scale_pos_weight
),
data = train_matrix,
nrounds = 100
)
</syntaxhighlight>
== 4.7 Salvataggio dei Modelli ==
=== Serializzazione ===
<syntaxhighlight lang="r">
# Salvare il modello Random Forest
saveRDS(rf_model, "models/rf_model.rds")
# Salvare il modello XGBoost
xgb.save(xgb_model, "models/xgb_model.model")
# Caricare i modelli
rf_loaded <- readRDS("models/rf_model.rds")
xgb_loaded <- xgb.load("models/xgb_model.model")
# Previsioni con modello caricato
pred_loaded <- predict(rf_loaded, newdata = test_data)
</syntaxhighlight>
== 4.8 Esercizi Pratici ==
# Dividere i dati in training (80%) e test (20%)
# Addestrare una regressione logistica
# Addestrare un Random Forest con tuning
# Addestrare un modello SVM
# Addestrare un modello XGBoost
# Confrontare le prestazioni dei tre modelli
# Gestire il class imbalance con SMOTE
# Salvare i modelli migliori
== Riepilogo dell'unità 4 ==
Abbiamo trattato:
* Preparazione e suddivisione dei dati
* Regressione logistica
* Random Forest con ottimizzazione iperparametri
* Support Vector Machines
* XGBoost
* Gestione del class imbalance
* Salvataggio e caricamento dei modelli
== Il progetto PenuX ==
Il codice sorgente è disponibile su GitHub: https://github.com/netanelcyber/penux
== Quiz ==
[[PenuX in R: Quiz Unità 4|Fai il quiz dell'Unità 4]]
kw6chom36v2itv936n6yehazoq34jiz
PenuX in R: Quiz Unità 4
0
61184
502016
2026-10-02T07:18:07Z
נתנאל שטרן
50194
Aggiunto quiz dell'unità 4
502016
wikitext
text/x-wiki
= PenuX in R: Quiz Unità 4 =
Rispondi alle domande, poi clicca su "Mostra risposta" per controllare.
== Domanda 1 ==
Perché si divide il dataset in training e test set?
* A) Per ridurre il numero di variabili
* B) Per valutare il modello su dati che non ha mai visto
* C) Per eliminare i valori mancanti
* D) Per velocizzare la lettura del file
<div class="mw-collapsible mw-collapsed" data-expandtext="Mostra risposta" data-collapsetext="Nascondi risposta">
'''Risposta: B'''. La valutazione sui dati di addestramento è troppo ottimistica.
</div>
== Domanda 2 ==
Come funziona una Random Forest?
* A) Usa un solo albero molto profondo
* B) Calcola la media di tutte le variabili
* C) Combina molti alberi addestrati su campioni bootstrap e variabili casuali
* D) Applica una regressione lineare
<div class="mw-collapsible mw-collapsed" data-expandtext="Mostra risposta" data-collapsetext="Nascondi risposta">
'''Risposta: C'''. L'aggregazione di molti alberi riduce la varianza.
</div>
== Domanda 3 ==
Che cos'è l'overfitting?
* A) Prestazioni scarse ovunque
* B) Un errore di sintassi in R
* C) Un metodo di imputazione
* D) Ottime prestazioni sul training ma scarse su dati nuovi
<div class="mw-collapsible mw-collapsed" data-expandtext="Mostra risposta" data-collapsetext="Nascondi risposta">
'''Risposta: D'''. Il modello memorizza il rumore invece di apprendere il segnale.
</div>
== Domanda 4 ==
Quale tecnica aiuta con classi molto sbilanciate?
* A) Pesi di classe o SMOTE
* B) Eliminare la classe minoritaria
* C) Usare solo l'accuratezza
* D) Standardizzare l'esito
<div class="mw-collapsible mw-collapsed" data-expandtext="Mostra risposta" data-collapsetext="Nascondi risposta">
'''Risposta: A'''. Con classi sbilanciate l'accuratezza da sola può ingannare.
</div>
== Torna all'unità ==
[[PenuX in R: Unità 4 - Costruzione dei Modelli Predittivi|Torna all'Unità 4]]
ljigbwebu1jktjjarmw4v38sjhios84
PenuX in R: Unità 5 - Valutazione e Validazione dei Modelli
0
61185
502017
2026-10-02T07:18:42Z
נתנאל שטרן
50194
Aggiunta unità del corso PenuX in R (5/7)
502017
wikitext
text/x-wiki
= PenuX in R: Unità 5 - Valutazione e Validazione dei Modelli =
== Obiettivi dell'unità ==
Al termine di questa unità sarai in grado di:
* Calcolare metriche di valutazione (accuracy, sensitivity, specificity)
* Costruire curve ROC e calcolare AUC
* Valutare le prestazioni su dati clinici
* Eseguire validazione esterna
* Confrontare modelli statisticamente
* Documentare le prestazioni
== 5.1 Metriche di Valutazione ==
=== Matrice di Confusione e Metriche Derivate ===
<syntaxhighlight lang="r">
library(caret)
library(ggplot2)
# Previsioni
predictions <- predict(rf_model, newdata = test_data, type = "class")
# Matrice di confusione
conf_matrix <- confusionMatrix(predictions, test_data$diagnosis)
print(conf_matrix)
# Estrarre metriche
accuracy <- conf_matrix$overall['Accuracy']
sensitivity <- conf_matrix$byClass['Sensitivity']
specificity <- conf_matrix$byClass['Specificity']
ppv <- conf_matrix$byClass['Pos Pred Value']
npv <- conf_matrix$byClass['Neg Pred Value']
metrics_df <- data.frame(
Metric = c("Accuracy", "Sensitivity (TPR)", "Specificity (TNR)",
"PPV", "NPV"),
Value = c(accuracy, sensitivity, specificity, ppv, npv)
)
print(metrics_df)
</syntaxhighlight>
=== Visualizzare la Matrice di Confusione ===
<syntaxhighlight lang="r">
# Creare una visualizzazione della matrice di confusione
cm_table <- as.data.frame(table(
Predicted = predictions,
Actual = test_data$diagnosis
))
ggplot(cm_table, aes(x = Predicted, y = Actual, fill = Freq)) +
geom_tile() +
geom_text(aes(label = Freq), color = "white", size = 8) +
scale_fill_gradient(low = "lightblue", high = "darkblue") +
labs(title = "Matrice di Confusione",
x = "Predetto", y = "Reale", fill = "Frequenza") +
theme_minimal()
</syntaxhighlight>
== 5.2 Curve ROC e AUC ==
=== Calcolo di ROC e AUC ===
<syntaxhighlight lang="r">
library(pROC)
# Previsioni probabilistiche
prob_predictions <- predict(rf_model, newdata = test_data, type = "prob")
# Calcolare ROC
roc_curve <- roc(response = test_data$diagnosis,
predictor = prob_predictions[, "Disease"])
# AUC
auc_value <- auc(roc_curve)
print(paste("AUC:", round(auc_value, 3)))
# Plottare la curva ROC
plot(roc_curve, main = "Curva ROC - Random Forest",
xlab = "1 - Specificity", ylab = "Sensitivity")
text(0.5, 0.2, paste("AUC =", round(auc_value, 3)), cex = 2)
</syntaxhighlight>
=== Confronto di Modelli con ROC ===
<syntaxhighlight lang="r">
# ROC per più modelli
roc_rf <- roc(test_data$diagnosis,
predict(rf_model, test_data, type = "prob")[, "Disease"])
roc_xgb <- roc(test_data$diagnosis,
predict(xgb_model, test_matrix, type = "prob"))
roc_svm <- roc(test_data$diagnosis,
predict(svm_model, test_data, type = "prob")[, "Disease"])
# Plot comparativo
ggroc(list(RandomForest = roc_rf,
XGBoost = roc_xgb,
SVM = roc_svm)) +
ggtitle("Confronto delle curve ROC") +
theme_minimal()
# AUC per ogni modello
data.frame(
Model = c("Random Forest", "XGBoost", "SVM"),
AUC = c(auc(roc_rf), auc(roc_xgb), auc(roc_svm))
)
</syntaxhighlight>
== 5.3 Validazione Esterna ==
=== Cross-Validation ===
<syntaxhighlight lang="r">
# K-fold cross-validation
train_control <- trainControl(
method = "cv",
number = 5,
classProbs = TRUE,
summaryFunction = twoClassSummary
)
# Addestrare con CV
cv_model <- train(
diagnosis ~ age + systolic_bp + diastolic_bp +
white_blood_cells + creatinine,
data = clinical_data,
method = "rf",
trControl = train_control,
metric = "ROC"
)
# Risultati cross-validation
print(cv_model$results)
print(cv_model$resample)
</syntaxhighlight>
=== Validazione su Dataset Esterno ===
<syntaxhighlight lang="r">
# Simulare un dataset esterno
external_data <- clinical_data %>%
sample_frac(0.2)
# Previsioni
external_predictions <- predict(rf_model, newdata = external_data)
# Valutazione
external_cm <- confusionMatrix(external_predictions, external_data$diagnosis)
print(external_cm)
# Confrontare con test set
cat("Accuracy - Test Set:", accuracy, "\n")
cat("Accuracy - External Set:",
external_cm$overall['Accuracy'], "\n")
</syntaxhighlight>
== 5.4 Calibrazione del Modello ==
=== Verifica della Calibrazione ===
<syntaxhighlight lang="r">
library(MASS)
# Previsioni probabilistiche
prob_preds <- predict(rf_model, newdata = test_data, type = "prob")[, "Disease"]
# Creare gruppi di decile
deciles <- cut(prob_preds, breaks = quantile(prob_preds,
probs = seq(0, 1, 0.1)), include.lowest = TRUE)
# Calcolare expected vs observed
calibration_data <- data.frame(
decile = deciles,
predicted_prob = prob_preds,
actual = as.numeric(test_data$diagnosis) - 1
)
calibration_summary <- calibration_data %>%
group_by(decile) %>%
summarise(
mean_predicted = mean(predicted_prob),
mean_observed = mean(actual),
n = n(),
.groups = 'drop'
)
# Plottare la calibrazione
ggplot(calibration_summary, aes(x = mean_predicted, y = mean_observed)) +
geom_point(aes(size = n)) +
geom_smooth(method = "loess", se = FALSE) +
geom_abline(intercept = 0, slope = 1, linetype = "dashed", color = "red") +
labs(title = "Diagramma di Calibrazione",
x = "Probabilità Predetta",
y = "Probabilità Osservata") +
theme_minimal()
</syntaxhighlight>
== 5.5 Analisi di Sensibilità ==
=== Threshold Optimization ===
<syntaxhighlight lang="r">
# Analizzare performance a diversi soglie
thresholds <- seq(0.3, 0.7, by = 0.05)
threshold_performance <- lapply(thresholds, function(t) {
pred_class <- ifelse(prob_preds > t, "Disease", "Healthy")
cm <- confusionMatrix(factor(pred_class), test_data$diagnosis)
data.frame(
Threshold = t,
Accuracy = cm$overall['Accuracy'],
Sensitivity = cm$byClass['Sensitivity'],
Specificity = cm$byClass['Specificity']
)
}) %>%
bind_rows()
# Visualizzare
threshold_performance %>%
pivot_longer(-Threshold) %>%
ggplot(aes(x = Threshold, y = value, color = name)) +
geom_line(linewidth = 1) +
labs(title = "Performance vs Threshold",
x = "Soglia di Classificazione",
y = "Valore Metrica") +
theme_minimal() +
theme(legend.position = "bottom")
</syntaxhighlight>
== 5.6 Rapporto di Valutazione ==
=== Generare Rapporto Automatico ===
<syntaxhighlight lang="r">
# Creare un rapporto completo
report_content <- paste("
# Rapporto di Valutazione del Modello PenuX
## Dataset
- Training set: ", nrow(train_data), " pazienti
- Test set: ", nrow(test_data), " pazienti
- Variabili predittive: age, systolic_bp, diastolic_bp, white_blood_cells, creatinine
## Performance Complessiva
- Accuracy: ", round(accuracy, 3), "
- Sensitivity: ", round(sensitivity, 3), "
- Specificity: ", round(specificity, 3), "
- AUC: ", round(auc_value, 3), "
## Conclusioni
Il modello mostra buone performance predittive per la diagnosi
di pancreatite acuta grave e sepsi nel contesto PenuX.
")
writeLines(report_content, "results/model_evaluation_report.txt")
</syntaxhighlight>
== 5.7 Esercizi Pratici ==
# Calcolare tutte le metriche di valutazione
# Costruire e interpretare la curva ROC
# Eseguire validazione incrociata
# Testare su un dataset esterno simulato
# Verificare la calibrazione del modello
# Ottimizzare la soglia di classificazione
# Generare un rapporto completo
== Riepilogo dell'unità 5 ==
Abbiamo trattato:
* Metriche di valutazione (accuracy, sensitivity, specificity)
* Curve ROC e AUC
* Validazione incrociata ed esterna
* Calibrazione dei modelli
* Ottimizzazione della soglia
* Documentazione delle prestazioni
== Il progetto PenuX ==
Repository: https://github.com/netanelcyber/penux
Sito: https://penux.uk
== Quiz ==
[[PenuX in R: Quiz Unità 5|Fai il quiz dell'Unità 5]]
se8mxolivc99y559pc26ir7sk0grcoy
PenuX in R: Quiz Unità 5
0
61186
502018
2026-10-02T07:18:47Z
נתנאל שטרן
50194
Aggiunto quiz dell'unità 5
502018
wikitext
text/x-wiki
= PenuX in R: Quiz Unità 5 =
Rispondi alle domande, poi clicca su "Mostra risposta" per controllare.
== Domanda 1 ==
Come si calcola la sensibilità?
* A) VN / (VN + FP)
* B) VP / (VP + FP)
* C) VP / (VP + FN)
* D) (VP + VN) / totale
<div class="mw-collapsible mw-collapsed" data-expandtext="Mostra risposta" data-collapsetext="Nascondi risposta">
'''Risposta: C'''. La sensibilità è la quota di malati correttamente riconosciuti.
</div>
== Domanda 2 ==
Un'AUC pari a 0,5 significa:
* A) Un modello perfetto
* B) Un modello molto accurato
* C) Un errore di calibrazione
* D) Nessuna capacità discriminante (come il caso)
<div class="mw-collapsible mw-collapsed" data-expandtext="Mostra risposta" data-collapsetext="Nascondi risposta">
'''Risposta: D'''. Il modello non distingue meglio di un lancio di moneta.
</div>
== Domanda 3 ==
Che cos'è la validazione esterna?
* A) Valutare il modello su dati di un altro centro o periodo
* B) Ripetere la divisione train/test
* C) Aumentare il numero di alberi
* D) Standardizzare i dati
<div class="mw-collapsible mw-collapsed" data-expandtext="Mostra risposta" data-collapsetext="Nascondi risposta">
'''Risposta: A'''. Verifica la generalizzabilità oltre il dataset di sviluppo.
</div>
== Domanda 4 ==
Che cosa misura la calibrazione di un modello?
* A) La velocità di calcolo
* B) La concordanza tra probabilità previste e frequenze osservate
* C) Il numero di variabili
* D) La percentuale di valori mancanti
<div class="mw-collapsible mw-collapsed" data-expandtext="Mostra risposta" data-collapsetext="Nascondi risposta">
'''Risposta: B'''. Se il modello dice 20%, circa 20 pazienti su 100 dovrebbero avere l'evento.
</div>
== Torna all'unità ==
[[PenuX in R: Unità 5 - Valutazione e Validazione dei Modelli|Torna all'Unità 5]]
atgnqlampuyuw20mnemyg6u91uuu3z3
PenuX in R: Unità 6 - Deployment e Implementazione Clinica
0
61187
502019
2026-10-02T07:19:35Z
נתנאל שטרן
50194
Aggiunta unità del corso PenuX in R (6/7)
502019
wikitext
text/x-wiki
= PenuX in R: Unità 6 - Deployment e Implementazione Clinica =
== Obiettivi dell'unità ==
Al termine di questa unità sarai in grado di:
* Containerizzare il modello con Docker
* Creare API REST per le previsioni
* Integrare il modello con sistemi clinici
* Gestire il monitoraggio del modello
* Implementare controlli di qualità
* Documentare la soluzione
== 6.1 Creazione di una Funzione di Previsione ==
=== Funzione Wrapper ===
<syntaxhighlight lang="r">
# Creare una funzione per fare previsioni standardizzate
predict_penux <- function(model, new_patient_data, threshold = 0.5) {
# Validare l'input
required_cols <- c("age", "systolic_bp", "diastolic_bp",
"white_blood_cells", "creatinine")
if (!all(required_cols %in% colnames(new_patient_data))) {
stop("Colonne mancanti:",
paste(setdiff(required_cols, colnames(new_patient_data)), collapse = ", "))
}
# Fare previsioni probabilistiche
prob_predictions <- predict(model, newdata = new_patient_data,
type = "prob")
# Convertire in classi
predicted_class <- ifelse(prob_predictions[, "Disease"] > threshold,
"Disease", "Healthy")
# Ritornare risultati strutturati
results <- data.frame(
patient_id = 1:nrow(new_patient_data),
predicted_probability = prob_predictions[, "Disease"],
predicted_class = predicted_class,
confidence = pmax(prob_predictions[, "Disease"],
prob_predictions[, "Healthy"]),
risk_level = ifelse(prob_predictions[, "Disease"] > 0.7, "High",
ifelse(prob_predictions[, "Disease"] > 0.4, "Medium",
"Low"))
)
return(results)
}
# Testare la funzione
test_prediction <- predict_penux(rf_model, test_data[1:5, ])
print(test_prediction)
</syntaxhighlight>
== 6.2 API REST con Plumber ==
=== Creare un'API ===
<syntaxhighlight lang="r">
# Installare plumber
# install.packages("plumber")
library(plumber)
# Creare il file API (plumber.R)
api_code <- "
#' PenuX Model Prediction API
#' @post /predict
#' @param age:int Età del paziente
#' @param systolic_bp:numeric Pressione sistolica
#' @param diastolic_bp:numeric Pressione diastolica
#' @param white_blood_cells:numeric Conta leucocitaria
#' @param creatinine:numeric Livello di creatinina
predict_disease <- function(age, systolic_bp, diastolic_bp,
white_blood_cells, creatinine) {
patient_data <- data.frame(
age = age,
systolic_bp = systolic_bp,
diastolic_bp = diastolic_bp,
white_blood_cells = white_blood_cells,
creatinine = creatinine
)
prediction <- predict_penux(rf_model, patient_data)
return(prediction)
}
#' Health Check
#' @get /health
health_check <- function() {
return(list(status = 'OK', model = 'PenuX v1.0'))
}
"
writeLines(api_code, "api/plumber.R")
# Lanciare l'API
# pr <- plumb("api/plumber.R")
# pr$run(host = "0.0.0.0", port = 8000)
</syntaxhighlight>
== 6.3 Containerizzazione con Docker ==
=== Dockerfile ===
<syntaxhighlight lang="dockerfile">
FROM rocker/tidyverse:latest
# Installare dipendenze
RUN install2.r \
randomForest \
xgboost \
caret \
pROC \
plumber
# Copiare il modello e l'API
COPY models/rf_model.rds /app/models/
COPY api/plumber.R /app/api/
WORKDIR /app
# Esporre la porta
EXPOSE 8000
# Comando di avvio
CMD ["R", "-e", "library(plumber); pr <- plumb('api/plumber.R'); pr$run(host = '0.0.0.0', port = 8000)"]
</syntaxhighlight>
=== Docker Compose ===
<syntaxhighlight lang="yaml">
version: '3'
services:
penux-model:
build: .
ports:
- "8000:8000"
environment:
- MODEL_PATH=/app/models/rf_model.rds
volumes:
- ./logs:/app/logs
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
timeout: 10s
retries: 3
</syntaxhighlight>
== 6.4 Monitoraggio del Modello ==
=== Performance Tracking ===
<syntaxhighlight lang="r">
# Creare un sistema di tracking delle performance
create_model_monitor <- function(model_id, model_version) {
list(
model_id = model_id,
model_version = model_version,
deployment_date = Sys.Date(),
metrics = list(),
predictions_log = NULL
)
}
# Registrare una previsione
log_prediction <- function(monitor, prediction_result, actual_outcome = NA) {
log_entry <- data.frame(
timestamp = Sys.time(),
prediction_probability = prediction_result$predicted_probability,
prediction_class = prediction_result$predicted_class,
actual_outcome = actual_outcome
)
monitor$predictions_log <- rbind(monitor$predictions_log, log_entry)
return(monitor)
}
# Calcolare data drift
calculate_data_drift <- function(training_stats, new_data) {
drift_metrics <- list()
for (col in names(training_stats)) {
new_mean <- mean(new_data[[col]], na.rm = TRUE)
new_sd <- sd(new_data[[col]], na.rm = TRUE)
drift_metrics[[col]] <- list(
training_mean = training_stats[[col]]$mean,
new_mean = new_mean,
mean_shift = abs(new_mean - training_stats[[col]]$mean) /
training_stats[[col]]$sd,
training_sd = training_stats[[col]]$sd,
new_sd = new_sd
)
}
return(drift_metrics)
}
</syntaxhighlight>
== 6.5 Integrazione Clinica ==
=== Validazione Clinica ===
<syntaxhighlight lang="r">
# Workflow di validazione clinica
clinical_validation <- function(model, clinical_test_data,
acceptance_criteria) {
# Generare previsioni
predictions <- predict_penux(model, clinical_test_data)
# Valutare rispetto ai criteri di accettazione
results <- list(
total_samples = nrow(clinical_test_data),
min_auc = acceptance_criteria$min_auc,
min_sensitivity = acceptance_criteria$min_sensitivity,
min_specificity = acceptance_criteria$min_specificity,
passed = FALSE
)
# Implementare ulteriori controlli
if (all(unlist(results) >= unlist(acceptance_criteria))) {
results$passed <- TRUE
}
return(results)
}
# Criteri di accettazione PenuX
penux_criteria <- list(
min_auc = 0.85,
min_sensitivity = 0.85,
min_specificity = 0.80,
max_false_positive_rate = 0.10
)
# Eseguire validazione
validation_result <- clinical_validation(rf_model, test_data, penux_criteria)
print(validation_result)
</syntaxhighlight>
== 6.6 Documentazione e Compliance ==
=== Regulatory Documentation ===
<syntaxhighlight lang="r">
# Generare rapporto di conformità
generate_regulatory_report <- function(model, validation_results,
training_data, deployment_date) {
report <- list(
model_information = list(
name = "PenuX Prediction Model",
version = "1.0.0",
deployment_date = deployment_date,
intended_use = "Early prediction of severe acute pancreatitis and sepsis"
),
training_data = list(
sample_size = nrow(training_data),
variables = names(training_data),
date_range = paste(min(training_data$date), "to", max(training_data$date))
),
performance_metrics = validation_results,
limitations = list(
"Model trained on specific patient population",
"Regular revalidation recommended",
"Clinician judgment should not be replaced"
),
maintenance_plan = list(
monitoring_frequency = "Monthly",
retraining_frequency = "Quarterly",
data_drift_threshold = 0.2
)
)
return(report)
}
</syntaxhighlight>
== 6.7 Ciclo di Vita Continuo ==
=== Retraining Pipeline ===
<syntaxhighlight lang="r">
# Creare una pipeline di retraining automatico
create_retraining_pipeline <- function(data,
model_path,
performance_threshold = 0.80) {
# 1. Verificare la performance
current_model <- readRDS(model_path)
current_performance <- evaluate_model(current_model)
# 2. Se la performance degrada, ritirare
if (current_performance$auc < performance_threshold) {
# 2a. Ritirare il modello su dati aggiornati
new_model <- train_model(data)
# 2b. Confrontare le performance
new_performance <- evaluate_model(new_model)
# 2c. Se il nuovo è migliore, salvare
if (new_performance$auc > current_performance$auc) {
saveRDS(new_model, paste0(model_path, ".backup"))
saveRDS(new_model, model_path)
return(list(status = "Retrained", new_auc = new_performance$auc))
}
}
return(list(status = "No Retrain Needed"))
}
</syntaxhighlight>
== 6.8 Esercizi Pratici ==
# Creare una funzione di previsione robusta
# Costruire un'API REST con plumber
# Creare un Dockerfile funzionante
# Implementare un sistema di monitoraggio
# Generare un rapporto di conformità normativa
# Testare il deployment in ambiente locale
# Documentare il ciclo di vita del modello
== Riepilogo dell'unità 6 ==
Abbiamo trattato:
* Creazione di funzioni di previsione robust
* API REST con plumber
* Containerizzazione con Docker
* Monitoraggio continuo del modello
* Validazione clinica e compliance
* Documentazione normativa
* Ciclo di vita continuo e retraining
== Prossimi Passi ==
* Distribuire su cloud (AWS, Google Cloud, Azure)
* Integrare con sistemi EHR
* Implementare feedback loops clinici
* Stabilire partnership cliniche per validazione
* Preparare per regulatory approval
== Il progetto PenuX ==
Repository: https://github.com/netanelcyber/penux
Sito: https://penux.uk
== Quiz ==
[[PenuX in R: Quiz Unità 6|Fai il quiz dell'Unità 6]]
qi4qv6kasqvf5282tlsseoya24nyupc
PenuX in R: Quiz Unità 6
0
61188
502020
2026-10-02T07:19:40Z
נתנאל שטרן
50194
Aggiunto quiz dell'unità 6
502020
wikitext
text/x-wiki
= PenuX in R: Quiz Unità 6 =
Rispondi alle domande, poi clicca su "Mostra risposta" per controllare.
== Domanda 1 ==
A cosa serve il pacchetto Plumber?
* A) A creare grafici
* B) A pulire i dati
* C) A calcolare l'AUC
* D) A esporre funzioni R come API REST
<div class="mw-collapsible mw-collapsed" data-expandtext="Mostra risposta" data-collapsetext="Nascondi risposta">
'''Risposta: D'''. Permette di servire un modello tramite richieste HTTP.
</div>
== Domanda 2 ==
Qual è il vantaggio principale di Docker?
* A) Impacchetta applicazione e dipendenze in un ambiente riproducibile
* B) Rende il modello più accurato
* C) Sostituisce R
* D) Elimina la necessità di test
<div class="mw-collapsible mw-collapsed" data-expandtext="Mostra risposta" data-collapsetext="Nascondi risposta">
'''Risposta: A'''. Lo stesso container funziona allo stesso modo su macchine diverse.
</div>
== Domanda 3 ==
Che cos'è il data drift?
* A) Un errore di sintassi
* B) Un cambiamento nella distribuzione dei dati in produzione rispetto al training
* C) La perdita di connessione all'API
* D) Un metodo di imputazione
<div class="mw-collapsible mw-collapsed" data-expandtext="Mostra risposta" data-collapsetext="Nascondi risposta">
'''Risposta: B'''. Può degradare le prestazioni nel tempo e richiede monitoraggio.
</div>
== Domanda 4 ==
Che cosa serve prima di un uso clinico di un modello predittivo?
* A) Solo un'AUC alta sul training
* B) Solo una buona documentazione del codice
* C) Validazione clinica e conformità normativa
* D) Nulla, se il modello è accurato
<div class="mw-collapsible mw-collapsed" data-expandtext="Mostra risposta" data-collapsetext="Nascondi risposta">
'''Risposta: C'''. Un'accuratezza elevata non basta: servono validazione prospettica, sicurezza e norme applicabili.
</div>
== Torna all'unità ==
[[PenuX in R: Unità 6 - Deployment e Implementazione Clinica|Torna all'Unità 6]]
8hab7zlildwax2xuib6jslm7mkd67h0
PenuX in R: Unità 7 - Esercitazioni di Machine Learning in R
0
61189
502021
2026-10-02T07:20:26Z
נתנאל שטרן
50194
Aggiunta unità del corso PenuX in R (7/7)
502021
wikitext
text/x-wiki
= PenuX in R: Unità 7 - Esercitazioni di Machine Learning in R =
== Obiettivi dell'unità ==
Al termine di questa unità sarai in grado di:
* Preparare i dati e dividerli in training e test set
* Addestrare modelli di classificazione (regressione logistica, albero decisionale, Random Forest, kNN)
* Valutare i modelli con matrice di confusione, ROC e AUC
* Confrontare più modelli con la validazione incrociata
* Costruire un modello di regressione e interpretarne l'errore (RMSE)
* Applicare un metodo non supervisionato (k-means)
* Completare un mini-progetto clinico di predizione della sepsi
'''Prerequisiti''': Unità 1 (Fondamenti di R) e conoscenza di base delle Unità 2-5.
== 7.0 Preparazione ==
<syntaxhighlight lang="r">
# Installare i pacchetti (una sola volta)
install.packages(c("caret", "randomForest", "rpart", "pROC", "e1071"))
# Caricare i pacchetti
library(caret)
library(randomForest)
library(rpart)
library(pROC)
set.seed(42) # Riproducibilità
</syntaxhighlight>
=== Dati clinici sintetici ===
In tutti gli esercizi useremo un dataset sintetico (non contiene dati di pazienti reali) per la predizione della sepsi.
<syntaxhighlight lang="r">
n <- 500
clinical <- data.frame(
age = round(rnorm(n, 55, 15)),
heart_rate = round(rnorm(n, 85, 15)),
temperature = round(rnorm(n, 37.2, 0.8), 1),
wbc = round(rnorm(n, 9, 3), 1),
lactate = round(rlnorm(n, log(1.5), 0.4), 2)
)
# Rischio reale (logit) usato per generare l'esito
risk <- -7.5 + 0.02 * clinical$age + 0.03 * clinical$heart_rate +
0.5 * (clinical$temperature - 37) + 0.1 * clinical$wbc +
0.9 * clinical$lactate
clinical$sepsis <- factor(
rbinom(n, 1, plogis(risk)),
levels = c(0, 1),
labels = c("No", "Si")
)
table(clinical$sepsis)
prop.table(table(clinical$sepsis))
str(clinical)
</syntaxhighlight>
== 7.1 Esercizio 1: Divisione dei dati ==
'''Obiettivo''': dividere il dataset in 70% training e 30% test mantenendo la proporzione delle classi.
<syntaxhighlight lang="r">
# Completa il codice:
train_idx <- createDataPartition(clinical$sepsis, p = 0.70, list = FALSE)
train_data <- clinical[train_idx, ]
test_data <- clinical[-train_idx, ]
# Verifica:
nrow(train_data)
nrow(test_data)
prop.table(table(train_data$sepsis))
prop.table(table(test_data$sepsis))
</syntaxhighlight>
'''Domande''':
* Perché è importante stratificare la divisione per la variabile esito?
* Cosa succede se valutiamo il modello sugli stessi dati usati per l'addestramento?
== 7.2 Esercizio 2: Regressione logistica ==
<syntaxhighlight lang="r">
# Addestrare il modello
logit_model <- glm(sepsis ~ ., data = train_data, family = binomial)
summary(logit_model)
# Odds ratio con intervalli di confidenza
exp(cbind(OR = coef(logit_model), confint.default(logit_model)))
# Predizioni sul test set
prob_logit <- predict(logit_model, newdata = test_data, type = "response")
pred_logit <- factor(ifelse(prob_logit > 0.5, "Si", "No"),
levels = c("No", "Si"))
# Matrice di confusione
confusionMatrix(pred_logit, test_data$sepsis, positive = "Si")
</syntaxhighlight>
'''Compito''': quale variabile ha l'odds ratio più alto? Come interpreti il valore per il lattato?
== 7.3 Esercizio 3: Curva ROC e AUC ==
<syntaxhighlight lang="r">
roc_logit <- roc(response = test_data$sepsis,
predictor = prob_logit,
levels = c("No", "Si"))
auc(roc_logit)
plot(roc_logit,
main = "Curva ROC - Regressione logistica",
col = "steelblue", lwd = 2)
# Soglia ottimale (indice di Youden)
coords(roc_logit, "best", ret = c("threshold", "sensitivity", "specificity"))
</syntaxhighlight>
'''Compito''': ripeti la matrice di confusione usando la soglia ottimale al posto di 0.5. Come cambiano sensibilità e specificità?
== 7.4 Esercizio 4: Albero decisionale ==
<syntaxhighlight lang="r">
tree_model <- rpart(sepsis ~ ., data = train_data, method = "class",
control = rpart.control(cp = 0.01))
# Visualizzare l'albero
plot(tree_model, margin = 0.1)
text(tree_model, use.n = TRUE, cex = 0.8)
# Predizioni
pred_tree <- predict(tree_model, newdata = test_data, type = "class")
confusionMatrix(pred_tree, test_data$sepsis, positive = "Si")
</syntaxhighlight>
'''Compito''': modifica il parametro <code>cp</code> (0.001, 0.05) e osserva come cambia la complessità dell'albero (overfitting vs underfitting).
== 7.5 Esercizio 5: Random Forest ==
<syntaxhighlight lang="r">
rf_model <- randomForest(sepsis ~ ., data = train_data,
ntree = 500, importance = TRUE)
print(rf_model)
# Importanza delle variabili
importance(rf_model)
varImpPlot(rf_model, main = "Importanza delle variabili")
# Valutazione sul test set
pred_rf <- predict(rf_model, newdata = test_data)
prob_rf <- predict(rf_model, newdata = test_data, type = "prob")[, "Si"]
confusionMatrix(pred_rf, test_data$sepsis, positive = "Si")
auc(roc(test_data$sepsis, prob_rf, levels = c("No", "Si")))
</syntaxhighlight>
'''Domande''':
* Quali sono le tre variabili più importanti?
* Corrispondono ai coefficienti più alti della regressione logistica?
== 7.6 Esercizio 6: Validazione incrociata e confronto modelli ==
<syntaxhighlight lang="r">
ctrl <- trainControl(
method = "cv",
number = 5,
classProbs = TRUE,
summaryFunction = twoClassSummary,
savePredictions = "final"
)
set.seed(42)
cv_logit <- train(sepsis ~ ., data = train_data, method = "glm",
family = "binomial", metric = "ROC", trControl = ctrl)
set.seed(42)
cv_rf <- train(sepsis ~ ., data = train_data, method = "rf",
metric = "ROC", trControl = ctrl, tuneLength = 3)
set.seed(42)
cv_knn <- train(sepsis ~ ., data = train_data, method = "knn",
metric = "ROC", trControl = ctrl,
preProcess = c("center", "scale"), tuneLength = 5)
# Confronto
risultati <- resamples(list(Logistica = cv_logit,
RandomForest = cv_rf,
kNN = cv_knn))
summary(risultati)
bwplot(risultati, metric = "ROC")
</syntaxhighlight>
'''Compito''': quale modello ha l'AUC media più alta? La differenza è rilevante rispetto alla variabilità tra i fold?
'''Nota''': per il kNN la standardizzazione (<code>center</code>, <code>scale</code>) è fondamentale perché l'algoritmo usa le distanze.
== 7.7 Esercizio 7: Dati sbilanciati ==
<syntaxhighlight lang="r">
# Pesi per le classi
pesi <- ifelse(train_data$sepsis == "Si",
sum(train_data$sepsis == "No") / sum(train_data$sepsis == "Si"),
1)
logit_pesata <- glm(sepsis ~ ., data = train_data,
family = binomial, weights = pesi)
prob_pesata <- predict(logit_pesata, newdata = test_data, type = "response")
pred_pesata <- factor(ifelse(prob_pesata > 0.5, "Si", "No"),
levels = c("No", "Si"))
confusionMatrix(pred_pesata, test_data$sepsis, positive = "Si")
</syntaxhighlight>
'''Compito''': confronta la sensibilità con il modello non pesato dell'Esercizio 2. In un contesto clinico (sepsi), è peggio un falso negativo o un falso positivo?
== 7.8 Esercizio 8: Regressione (variabile continua) ==
Predire il consumo di carburante (<code>mpg</code>) dal dataset integrato <code>mtcars</code>.
<syntaxhighlight lang="r">
data(mtcars)
set.seed(42)
idx <- createDataPartition(mtcars$mpg, p = 0.75, list = FALSE)
train <- mtcars[idx, ]
test <- mtcars[-idx, ]
lm_model <- lm(mpg ~ wt + hp + cyl, data = train)
summary(lm_model)
pred <- predict(lm_model, newdata = test)
# Metriche di regressione
rmse <- sqrt(mean((test$mpg - pred)^2))
mae <- mean(abs(test$mpg - pred))
r2 <- cor(test$mpg, pred)^2
cat("RMSE:", round(rmse, 2), "| MAE:", round(mae, 2), "| R2:", round(r2, 2), "\n")
# Valori osservati vs predetti
plot(test$mpg, pred, xlab = "Osservato", ylab = "Predetto",
main = "Osservato vs Predetto", pch = 19)
abline(0, 1, col = "red", lty = 2)
</syntaxhighlight>
'''Compito''': aggiungi altre variabili al modello (per esempio <code>disp</code>, <code>qsec</code>) e verifica se l'RMSE sul test set migliora.
== 7.9 Esercizio 9: Apprendimento non supervisionato (k-means) ==
<syntaxhighlight lang="r">
# Usare solo le variabili cliniche (senza l'esito)
X <- scale(clinical[, c("age", "heart_rate", "temperature", "wbc", "lactate")])
# Metodo del gomito
wss <- sapply(1:8, function(k) kmeans(X, centers = k, nstart = 20)$tot.withinss)
plot(1:8, wss, type = "b", xlab = "Numero di cluster",
ylab = "Somma dei quadrati intra-cluster", main = "Metodo del gomito")
# Clustering con k = 3
set.seed(42)
km <- kmeans(X, centers = 3, nstart = 25)
table(Cluster = km$cluster, Sepsi = clinical$sepsis)
# Visualizzazione con PCA
pca <- prcomp(X)
plot(pca$x[, 1:2], col = km$cluster, pch = 19,
main = "Cluster nello spazio delle prime due componenti principali")
</syntaxhighlight>
'''Domande''':
* I cluster trovati corrispondono alla presenza di sepsi?
* Perché è necessario standardizzare le variabili prima di k-means?
== 7.10 Mini-progetto finale ==
Completa il flusso di lavoro, dall'inizio alla fine:
# Genera un nuovo dataset con <code>set.seed(2026)</code> e <code>n = 800</code>
# Dividi i dati in training (70%) e test (30%)
# Addestra almeno tre modelli (per esempio logistica, Random Forest, SVM)
# Confrontali con 5-fold CV usando l'AUC
# Scegli il modello migliore e valutalo sul test set (matrice di confusione, ROC, soglia ottimale)
# Salva il modello con <code>saveRDS()</code> e ricaricalo per fare una predizione su un nuovo paziente
# Scrivi un breve paragrafo (5 righe) che spiega i limiti del modello
<syntaxhighlight lang="r">
# Suggerimento per il punto 6:
saveRDS(rf_model, "modello_sepsi.rds")
modello <- readRDS("modello_sepsi.rds")
nuovo_paziente <- data.frame(age = 72, heart_rate = 112,
temperature = 38.6, wbc = 15.2, lactate = 3.4)
predict(modello, nuovo_paziente, type = "prob")
</syntaxhighlight>
== 7.11 Soluzioni e Risposte ==
=== Esercizio 1 ===
La stratificazione mantiene la stessa proporzione di casi positivi in training e test; senza di essa, con classi sbilanciate, il test set potrebbe contenere pochissimi casi positivi. Valutare sui dati di addestramento sovrastima le prestazioni (overfitting): il modello ha già "visto" quelle risposte.
=== Esercizio 2 ===
Il lattato ha di solito l'odds ratio più alto perché nel processo generatore ha il coefficiente maggiore (0.9, cioè OR ≈ 2.5 per ogni unità di aumento, a parità delle altre variabili). Con dati simulati i valori stimati varieranno leggermente.
=== Esercizio 3 ===
Abbassare la soglia sotto 0.5 aumenta di solito la sensibilità a scapito della specificità. In ambito clinico, per una condizione grave come la sepsi si preferisce spesso una sensibilità maggiore.
=== Esercizio 4 ===
Un <code>cp</code> basso produce un albero profondo (rischio di overfitting); un <code>cp</code> alto produce un albero troppo semplice (underfitting).
=== Esercizio 5 ===
Le variabili più importanti sono tipicamente lattato, frequenza cardiaca ed età. L'importanza nella Random Forest e i coefficienti della regressione logistica tendono a concordare, ma non sono la stessa misura (non lineare vs lineare).
=== Esercizio 6 ===
Poiché i dati sono generati da un modello logistico, la regressione logistica è spesso competitiva o migliore della Random Forest. Se le differenze di AUC sono minori della deviazione standard tra i fold, i modelli sono statisticamente indistinguibili.
=== Esercizio 7 ===
I pesi aumentano la sensibilità e riducono la specificità. Nella sepsi un falso negativo (paziente malato non riconosciuto) è generalmente più grave di un falso positivo.
=== Esercizio 8 ===
Aggiungere variabili può ridurre l'RMSE sul training, ma con pochi dati (<code>mtcars</code> ha 32 righe) il test set è molto piccolo e il risultato è instabile: valutare con validazione incrociata.
=== Esercizio 9 ===
K-means non usa l'esito, quindi i cluster non coincidono necessariamente con la sepsi. La standardizzazione evita che variabili con scala maggiore (es. frequenza cardiaca) dominino la distanza.
== Verifica della comprensione ==
* Qual è la differenza tra apprendimento supervisionato e non supervisionato?
* Perché si usa un test set separato?
* Cosa misura l'AUC? Quando può essere fuorviante?
* Qual è la differenza tra sensibilità e valore predittivo positivo?
* Perché il kNN richiede la standardizzazione?
* Cos'è l'overfitting e come lo si individua?
== Avvertenza ==
I dati di questa unità sono sintetici e a scopo didattico. I modelli non sono validati clinicamente e non devono essere usati per decisioni su pazienti reali.
== Riepilogo dell'Unità 7 ==
Abbiamo praticato:
* Divisione stratificata dei dati
* Regressione logistica, albero decisionale, Random Forest, kNN
* Matrice di confusione, ROC, AUC e scelta della soglia
* Validazione incrociata e confronto tra modelli
* Gestione dello sbilanciamento delle classi
* Regressione con RMSE, MAE e R²
* Clustering con k-means
* Un mini-progetto completo
== Letture Consigliate ==
* [https://topepo.github.io/caret/ Manuale del pacchetto caret]
* [https://www.statlearning.com/ An Introduction to Statistical Learning (con applicazioni in R)]
* [https://r4ds.hadley.nz/ R for Data Science]
== Il progetto PenuX ==
Repository PenuX: https://github.com/netanelcyber/penux
Sito PenuX: https://penux.uk
== Quiz ==
[[PenuX in R: Quiz Unità 7|Fai il quiz dell'Unità 7]]
9b34a4dfkkeerwajghw02x68gddwpqh
PenuX in R: Quiz Unità 7
0
61190
502022
2026-10-02T07:20:32Z
נתנאל שטרן
50194
Aggiunto quiz dell'unità 7
502022
wikitext
text/x-wiki
= PenuX in R: Quiz Unità 7 =
Rispondi alle domande, poi clicca su "Mostra risposta" per controllare.
== Domanda 1 ==
Quale funzione di caret esegue una divisione stratificata?
* A) createDataPartition()
* B) dummyVars()
* C) varImp()
* D) scale()
<div class="mw-collapsible mw-collapsed" data-expandtext="Mostra risposta" data-collapsetext="Nascondi risposta">
'''Risposta: A'''. Mantiene la stessa proporzione di classi in training e test.
</div>
== Domanda 2 ==
Perché nel kNN si usa <code>preProcess = c("center", "scale")</code>?
* A) Per velocizzare il training
* B) Perché l'algoritmo si basa sulle distanze
* C) Per creare variabili dummy
* D) Per imputare i mancanti
<div class="mw-collapsible mw-collapsed" data-expandtext="Mostra risposta" data-collapsetext="Nascondi risposta">
'''Risposta: B'''. Senza standardizzazione le variabili con scala maggiore dominano.
</div>
== Domanda 3 ==
Nella predizione della sepsi, quale errore è di solito più grave?
* A) Il falso positivo
* B) Sono sempre equivalenti
* C) Il falso negativo (paziente malato non riconosciuto)
* D) Nessuno dei due
<div class="mw-collapsible mw-collapsed" data-expandtext="Mostra risposta" data-collapsetext="Nascondi risposta">
'''Risposta: C'''. Per questo spesso si privilegia una sensibilità alta.
</div>
== Domanda 4 ==
K-means è un esempio di:
* A) Apprendimento supervisionato
* B) Regressione logistica
* C) Validazione esterna
* D) Apprendimento non supervisionato
<div class="mw-collapsible mw-collapsed" data-expandtext="Mostra risposta" data-collapsetext="Nascondi risposta">
'''Risposta: D'''. Non usa la variabile esito per formare i cluster.
</div>
== Torna all'unità ==
[[PenuX in R: Unità 7 - Esercitazioni di Machine Learning in R|Torna all'Unità 7]]
k7wa5yhjfumf61jf51gt46cfydqtyra
PenuX in R: Guida di base al Machine Learning in R
0
61191
502024
2026-10-02T08:31:06Z
נתנאל שטרן
50194
Aggiunta guida di base al machine learning in R
502024
wikitext
text/x-wiki
= PenuX in R: Guida di base al Machine Learning in R =
Questa guida introduce i concetti essenziali del machine learning (apprendimento automatico) e mostra, passo dopo passo, come applicarli in R con piccoli esempi che usano dataset già inclusi in R (<code>iris</code> e <code>mtcars</code>). Non servono dati clinici né conoscenze avanzate: è sufficiente aver letto l'[[PenuX in R: Unità 1 - Fondamenti del Linguaggio R|Unità 1]].
== Che cos'è il machine learning ==
Il machine learning è l'insieme dei metodi con cui un programma impara dai dati a fare previsioni o a trovare strutture, senza che le regole vengano scritte a mano.
=== Due famiglie principali ===
* '''Apprendimento supervisionato''': i dati contengono la risposta corretta (l'etichetta, o variabile target) e il modello impara a prevederla.
** ''Classificazione'': la risposta è una categoria (per esempio malato / sano, oppure la specie di un fiore).
** ''Regressione'': la risposta è un numero (per esempio il consumo di carburante).
* '''Apprendimento non supervisionato''': non c'è una risposta nota; il modello cerca gruppi o pattern (per esempio il ''clustering'' con k-means).
=== Vocabolario di base ===
* '''Feature (variabile predittiva)''': una colonna usata per fare la previsione (età, pressione, lunghezza del petalo).
* '''Target (esito)''': la colonna che vogliamo prevedere.
* '''Training set''': i dati su cui il modello impara.
* '''Test set''': dati tenuti da parte, mai visti dal modello, usati per valutarlo.
* '''Overfitting''': il modello memorizza il rumore del training set e funziona male su dati nuovi.
== Il flusso di lavoro in sei passi ==
# Definire il problema e la variabile target
# Preparare e controllare i dati (valori mancanti, tipi, outlier)
# Dividere i dati in training e test
# Addestrare uno o più modelli
# Valutare i modelli sul test set
# Interpretare, confrontare e (se serve) migliorare
== Preparazione ==
<syntaxhighlight lang="r">
install.packages(c("caret", "randomForest", "rpart", "e1071"))
library(caret)
set.seed(42) # rende i risultati riproducibili
data(iris)
str(iris)
summary(iris)
table(iris$Species)
</syntaxhighlight>
Il dataset <code>iris</code> contiene 150 fiori di tre specie, descritti da quattro misure (lunghezza e larghezza di sepalo e petalo). La variabile target è <code>Species</code>.
== Passo 1: dividere i dati ==
<syntaxhighlight lang="r">
idx <- createDataPartition(iris$Species, p = 0.70, list = FALSE)
train <- iris[idx, ]
test <- iris[-idx, ]
nrow(train) # circa 105
nrow(test) # circa 45
table(train$Species)
</syntaxhighlight>
<code>createDataPartition()</code> mantiene la stessa proporzione di classi nei due insiemi (divisione ''stratificata'').
== Passo 2: addestrare un primo modello ==
<syntaxhighlight lang="r">
ctrl <- trainControl(method = "cv", number = 5) # validazione incrociata a 5 fold
modello_albero <- train(Species ~ ., data = train,
method = "rpart",
trControl = ctrl)
modello_albero
</syntaxhighlight>
La funzione <code>train()</code> di caret offre la stessa interfaccia per centinaia di algoritmi: basta cambiare l'argomento <code>method</code>.
== Passo 3: valutare sul test set ==
<syntaxhighlight lang="r">
previsioni <- predict(modello_albero, newdata = test)
confusionMatrix(previsioni, test$Species)
</syntaxhighlight>
La ''matrice di confusione'' confronta classi previste e classi reali. Da essa si ricavano:
* '''Accuratezza''': quota di previsioni corrette
* '''Sensibilità''': tra i casi positivi, quanti vengono riconosciuti
* '''Specificità''': tra i casi negativi, quanti vengono riconosciuti
Con classi molto sbilanciate (per esempio una malattia rara) l'accuratezza da sola può ingannare: valuta sempre anche sensibilità e specificità.
== Passo 4: provare altri modelli e confrontarli ==
<syntaxhighlight lang="r">
set.seed(42)
modello_rf <- train(Species ~ ., data = train, method = "rf",
trControl = ctrl)
set.seed(42)
modello_knn <- train(Species ~ ., data = train, method = "knn",
trControl = ctrl,
preProcess = c("center", "scale"))
confronto <- resamples(list(Albero = modello_albero,
RandomForest = modello_rf,
kNN = modello_knn))
summary(confronto)
bwplot(confronto)
</syntaxhighlight>
Note utili:
* Il '''kNN''' usa le distanze, quindi richiede la standardizzazione (<code>center</code> e <code>scale</code>).
* Gli '''alberi''' e la '''Random Forest''' non richiedono standardizzazione.
* Scegli il modello con le prestazioni migliori in validazione incrociata, poi verificalo '''una sola volta''' sul test set.
== Passo 5: quali variabili contano? ==
<syntaxhighlight lang="r">
varImp(modello_rf)
plot(varImp(modello_rf))
</syntaxhighlight>
== Un esempio di regressione ==
Prevediamo il consumo (<code>mpg</code>) delle auto del dataset <code>mtcars</code>.
<syntaxhighlight lang="r">
data(mtcars)
set.seed(42)
idx <- createDataPartition(mtcars$mpg, p = 0.75, list = FALSE)
train <- mtcars[idx, ]
test <- mtcars[-idx, ]
modello_lm <- lm(mpg ~ wt + hp, data = train)
summary(modello_lm)
pred <- predict(modello_lm, newdata = test)
# Errore medio di previsione
rmse <- sqrt(mean((test$mpg - pred)^2))
mae <- mean(abs(test$mpg - pred))
c(RMSE = rmse, MAE = mae)
</syntaxhighlight>
In regressione si usano metriche di errore: '''RMSE''' (radice dell'errore quadratico medio, penalizza gli errori grandi) e '''MAE''' (errore assoluto medio).
== Un esempio non supervisionato: k-means ==
<syntaxhighlight lang="r">
X <- scale(iris[, 1:4]) # usiamo solo le misure, senza la specie
set.seed(42)
km <- kmeans(X, centers = 3, nstart = 25)
table(Cluster = km$cluster, Specie = iris$Species)
</syntaxhighlight>
Il modello non ha visto le specie, ma i cluster ne ricalcano in gran parte la divisione. Questo non succede sempre: i cluster non coincidono necessariamente con categorie reali.
== Errori comuni da evitare ==
* '''Valutare sui dati di addestramento''': porta a sovrastimare le prestazioni.
* '''Fuga di informazioni (data leakage)''': calcolare medie, scalature o imputazioni sull'intero dataset prima della divisione. Calcolale solo sul training e applicale al test.
* '''Dimenticare il seme''' (<code>set.seed()</code>): senza, i risultati cambiano a ogni esecuzione.
* '''Usare solo l'accuratezza''' con classi sbilanciate.
* '''Confondere correlazione e causalità''': un buon modello predittivo non spiega il perché.
* '''Usare il test set più volte''' per scegliere il modello: diventa di fatto un secondo training set.
== Mini-quiz di autovalutazione ==
* Qual è la differenza tra classificazione e regressione?
* Perché si tiene da parte un test set?
* Che cosa indica una grande differenza tra accuratezza sul training e sul test?
* Perché il kNN richiede la standardizzazione e la Random Forest no?
* Perché k-means è un metodo non supervisionato?
<div class="mw-collapsible mw-collapsed" data-expandtext="Mostra risposte" data-collapsetext="Nascondi risposte">
# La classificazione prevede una categoria, la regressione un numero.
# Per stimare le prestazioni su dati mai visti dal modello.
# Overfitting: il modello ha memorizzato il training set.
# Il kNN si basa sulle distanze, che dipendono dalla scala delle variabili; gli alberi dividono per soglie e non risentono della scala.
# Perché non usa la variabile target per formare i gruppi.
</div>
== Esercizi ==
# Ripeti il flusso con il dataset <code>iris</code> usando <code>p = 0.8</code>. Cambiano i risultati?
# Aggiungi un modello SVM (<code>method = "svmRadial"</code>) al confronto.
# Sul dataset <code>mtcars</code> aggiungi la variabile <code>cyl</code> al modello lineare e confronta l'RMSE.
# Prova k-means con <code>centers = 2</code> e <code>centers = 4</code>: come cambia la tabella rispetto alle specie?
# Ripeti l'Esercizio 1 con <code>set.seed(1)</code> e <code>set.seed(2)</code> e confronta la variabilità delle prestazioni.
== Avvertenza ==
I dataset usati qui sono didattici. Un modello predittivo in ambito sanitario richiede validazione clinica, controllo della qualità dei dati e conformità normativa prima di qualunque uso reale: vedi le Unità 5 e 6.
== Prosegui da qui ==
* [[PenuX in R: Unità 2 - Preparazione e Caricamento dei Dati|Unità 2: preparazione dei dati]]
* [[PenuX in R: Unità 7 - Esercitazioni di Machine Learning in R|Unità 7: esercitazioni di machine learning]]
* [[PenuX in R]]
== Il progetto PenuX ==
Repository PenuX: https://github.com/netanelcyber/penux
Sito PenuX: https://penux.uk
ee5o2s22qjltvqo188vstfycsaffpx1
502026
502024
2026-10-02T08:37:28Z
נתנאל שטרן
50194
Interwiki link to Ukrainian version
502026
wikitext
text/x-wiki
= PenuX in R: Guida di base al Machine Learning in R =
Questa guida introduce i concetti essenziali del machine learning (apprendimento automatico) e mostra, passo dopo passo, come applicarli in R con piccoli esempi che usano dataset già inclusi in R (<code>iris</code> e <code>mtcars</code>). Non servono dati clinici né conoscenze avanzate: è sufficiente aver letto l'[[PenuX in R: Unità 1 - Fondamenti del Linguaggio R|Unità 1]].
== Che cos'è il machine learning ==
Il machine learning è l'insieme dei metodi con cui un programma impara dai dati a fare previsioni o a trovare strutture, senza che le regole vengano scritte a mano.
=== Due famiglie principali ===
* '''Apprendimento supervisionato''': i dati contengono la risposta corretta (l'etichetta, o variabile target) e il modello impara a prevederla.
** ''Classificazione'': la risposta è una categoria (per esempio malato / sano, oppure la specie di un fiore).
** ''Regressione'': la risposta è un numero (per esempio il consumo di carburante).
* '''Apprendimento non supervisionato''': non c'è una risposta nota; il modello cerca gruppi o pattern (per esempio il ''clustering'' con k-means).
=== Vocabolario di base ===
* '''Feature (variabile predittiva)''': una colonna usata per fare la previsione (età, pressione, lunghezza del petalo).
* '''Target (esito)''': la colonna che vogliamo prevedere.
* '''Training set''': i dati su cui il modello impara.
* '''Test set''': dati tenuti da parte, mai visti dal modello, usati per valutarlo.
* '''Overfitting''': il modello memorizza il rumore del training set e funziona male su dati nuovi.
== Il flusso di lavoro in sei passi ==
# Definire il problema e la variabile target
# Preparare e controllare i dati (valori mancanti, tipi, outlier)
# Dividere i dati in training e test
# Addestrare uno o più modelli
# Valutare i modelli sul test set
# Interpretare, confrontare e (se serve) migliorare
== Preparazione ==
<syntaxhighlight lang="r">
install.packages(c("caret", "randomForest", "rpart", "e1071"))
library(caret)
set.seed(42) # rende i risultati riproducibili
data(iris)
str(iris)
summary(iris)
table(iris$Species)
</syntaxhighlight>
Il dataset <code>iris</code> contiene 150 fiori di tre specie, descritti da quattro misure (lunghezza e larghezza di sepalo e petalo). La variabile target è <code>Species</code>.
== Passo 1: dividere i dati ==
<syntaxhighlight lang="r">
idx <- createDataPartition(iris$Species, p = 0.70, list = FALSE)
train <- iris[idx, ]
test <- iris[-idx, ]
nrow(train) # circa 105
nrow(test) # circa 45
table(train$Species)
</syntaxhighlight>
<code>createDataPartition()</code> mantiene la stessa proporzione di classi nei due insiemi (divisione ''stratificata'').
== Passo 2: addestrare un primo modello ==
<syntaxhighlight lang="r">
ctrl <- trainControl(method = "cv", number = 5) # validazione incrociata a 5 fold
modello_albero <- train(Species ~ ., data = train,
method = "rpart",
trControl = ctrl)
modello_albero
</syntaxhighlight>
La funzione <code>train()</code> di caret offre la stessa interfaccia per centinaia di algoritmi: basta cambiare l'argomento <code>method</code>.
== Passo 3: valutare sul test set ==
<syntaxhighlight lang="r">
previsioni <- predict(modello_albero, newdata = test)
confusionMatrix(previsioni, test$Species)
</syntaxhighlight>
La ''matrice di confusione'' confronta classi previste e classi reali. Da essa si ricavano:
* '''Accuratezza''': quota di previsioni corrette
* '''Sensibilità''': tra i casi positivi, quanti vengono riconosciuti
* '''Specificità''': tra i casi negativi, quanti vengono riconosciuti
Con classi molto sbilanciate (per esempio una malattia rara) l'accuratezza da sola può ingannare: valuta sempre anche sensibilità e specificità.
== Passo 4: provare altri modelli e confrontarli ==
<syntaxhighlight lang="r">
set.seed(42)
modello_rf <- train(Species ~ ., data = train, method = "rf",
trControl = ctrl)
set.seed(42)
modello_knn <- train(Species ~ ., data = train, method = "knn",
trControl = ctrl,
preProcess = c("center", "scale"))
confronto <- resamples(list(Albero = modello_albero,
RandomForest = modello_rf,
kNN = modello_knn))
summary(confronto)
bwplot(confronto)
</syntaxhighlight>
Note utili:
* Il '''kNN''' usa le distanze, quindi richiede la standardizzazione (<code>center</code> e <code>scale</code>).
* Gli '''alberi''' e la '''Random Forest''' non richiedono standardizzazione.
* Scegli il modello con le prestazioni migliori in validazione incrociata, poi verificalo '''una sola volta''' sul test set.
== Passo 5: quali variabili contano? ==
<syntaxhighlight lang="r">
varImp(modello_rf)
plot(varImp(modello_rf))
</syntaxhighlight>
== Un esempio di regressione ==
Prevediamo il consumo (<code>mpg</code>) delle auto del dataset <code>mtcars</code>.
<syntaxhighlight lang="r">
data(mtcars)
set.seed(42)
idx <- createDataPartition(mtcars$mpg, p = 0.75, list = FALSE)
train <- mtcars[idx, ]
test <- mtcars[-idx, ]
modello_lm <- lm(mpg ~ wt + hp, data = train)
summary(modello_lm)
pred <- predict(modello_lm, newdata = test)
# Errore medio di previsione
rmse <- sqrt(mean((test$mpg - pred)^2))
mae <- mean(abs(test$mpg - pred))
c(RMSE = rmse, MAE = mae)
</syntaxhighlight>
In regressione si usano metriche di errore: '''RMSE''' (radice dell'errore quadratico medio, penalizza gli errori grandi) e '''MAE''' (errore assoluto medio).
== Un esempio non supervisionato: k-means ==
<syntaxhighlight lang="r">
X <- scale(iris[, 1:4]) # usiamo solo le misure, senza la specie
set.seed(42)
km <- kmeans(X, centers = 3, nstart = 25)
table(Cluster = km$cluster, Specie = iris$Species)
</syntaxhighlight>
Il modello non ha visto le specie, ma i cluster ne ricalcano in gran parte la divisione. Questo non succede sempre: i cluster non coincidono necessariamente con categorie reali.
== Errori comuni da evitare ==
* '''Valutare sui dati di addestramento''': porta a sovrastimare le prestazioni.
* '''Fuga di informazioni (data leakage)''': calcolare medie, scalature o imputazioni sull'intero dataset prima della divisione. Calcolale solo sul training e applicale al test.
* '''Dimenticare il seme''' (<code>set.seed()</code>): senza, i risultati cambiano a ogni esecuzione.
* '''Usare solo l'accuratezza''' con classi sbilanciate.
* '''Confondere correlazione e causalità''': un buon modello predittivo non spiega il perché.
* '''Usare il test set più volte''' per scegliere il modello: diventa di fatto un secondo training set.
== Mini-quiz di autovalutazione ==
* Qual è la differenza tra classificazione e regressione?
* Perché si tiene da parte un test set?
* Che cosa indica una grande differenza tra accuratezza sul training e sul test?
* Perché il kNN richiede la standardizzazione e la Random Forest no?
* Perché k-means è un metodo non supervisionato?
<div class="mw-collapsible mw-collapsed" data-expandtext="Mostra risposte" data-collapsetext="Nascondi risposte">
# La classificazione prevede una categoria, la regressione un numero.
# Per stimare le prestazioni su dati mai visti dal modello.
# Overfitting: il modello ha memorizzato il training set.
# Il kNN si basa sulle distanze, che dipendono dalla scala delle variabili; gli alberi dividono per soglie e non risentono della scala.
# Perché non usa la variabile target per formare i gruppi.
</div>
== Esercizi ==
# Ripeti il flusso con il dataset <code>iris</code> usando <code>p = 0.8</code>. Cambiano i risultati?
# Aggiungi un modello SVM (<code>method = "svmRadial"</code>) al confronto.
# Sul dataset <code>mtcars</code> aggiungi la variabile <code>cyl</code> al modello lineare e confronta l'RMSE.
# Prova k-means con <code>centers = 2</code> e <code>centers = 4</code>: come cambia la tabella rispetto alle specie?
# Ripeti l'Esercizio 1 con <code>set.seed(1)</code> e <code>set.seed(2)</code> e confronta la variabilità delle prestazioni.
== Avvertenza ==
I dataset usati qui sono didattici. Un modello predittivo in ambito sanitario richiede validazione clinica, controllo della qualità dei dati e conformità normativa prima di qualunque uso reale: vedi le Unità 5 e 6.
== Prosegui da qui ==
* [[PenuX in R: Unità 2 - Preparazione e Caricamento dei Dati|Unità 2: preparazione dei dati]]
* [[PenuX in R: Unità 7 - Esercitazioni di Machine Learning in R|Unità 7: esercitazioni di machine learning]]
* [[PenuX in R]]
== Il progetto PenuX ==
Repository PenuX: https://github.com/netanelcyber/penux
Sito PenuX: https://penux.uk
[[uk:PenuX в R: Базовий посібник з машинного навчання в R]]
g3u8kf3wx0r3a8gyg127lvctny6i7hs