>> [Musik spiller]
DUSTIN TRAN: Hej.
Mit navn er Dustin.
Så jeg vil præsentere Dataanalyse i R.
Bare en lille smule om mig selv.
Jeg er i øjeblikket en ph.d.-studerende i den tekniske og Applied Sciences.
Jeg studerer et skæringspunkt for machine learning og statistik
så Dataanalyse i R er virkelig grundlæggende for hvad
Jeg gør på daglig basis.
>> Og R er især god til dataanalyse
fordi det er meget godt for prototyper.
Og som regel, når du laver en slags dataanalyse, en masse af problemerne
vil kognitive.
Og så du bare vil have nogle virkelig gode sprog,
er bare god til at gøre indbyggede funktioner, i modsætning
at skulle beskæftige sig med lavt niveau ting.
Så i starten, jeg bare at indføre, hvad der er R, hvorfor skulle
du ønsker at bruge det, og derefter gå over i nogle demo,
og bare gå videre derfra.
>> Så hvad er R?
R er blot et sprog udviklet til statistisk databehandling
og visualisering.
Så hvad dette betyder, at det er en meget god sprog
for nogen form for ting, der beskæftiger sig med usikkerhed eller datavisualisering.
Så du har alle disse sandsynlighedsfordelinger.
Der vil være indbyggede funktioner.
Du har også fremragende plotte pakker.
>> Python er en anden konkurrerende sprog for data.
Og en ting, som jeg synes, at R er meget bedre til, er visualisering.
Så hvad vil du se i demoen som godt er bare en meget intuitiv sprog
der bare virker særdeles godt.
Det er også gratis og open source, som er et andet godt sprog, jeg gætte.
>> Og her, en flok bare søgeord kastet på dig.
Det er dynamisk, hvilket betyder, hvis du har en specifik type tildelt et objekt
end det vil bare ændre det i farten.
Det er doven, så det er smart om hvordan den gør beregninger.
Funktionel betyder at det kan virkelig fungere baseret ud af funktioner, så anything--
enhver form for manipulation, du er gør, vil den blive baseret ud funktioner.
>> Så binære operatorer, f.eks er blot sagens natur funktioner.
Og alt det, du kommer til at gøre, er
vil blive kørt væk funktioner selv.
Og så objektorienteret så godt.
>> Så her er en XKCD plot.
Ikke kun fordi jeg har lyst til XKCD er grundlæggende for enhver slags
for præsentation, men fordi Jeg har lyst til dette virkelig
hamrer det punkt, at en stor del af tid, når du laver en slags data
analyse, er problemet ikke så meget, hvor hurtigt det kører,
men hvor lang tid det kommer til at tage dig at programmere opgaven.
Så her er bare at analysere, om strategi på a eller b er mere effektiv.
Dette vil være noget, som du er
kommer til at beskæftige sig meget med i slags lav-niveau sprog
hvor du beskæftiger sig med SEG fejl, hukommelse tildeling, startværdier,
selv gør de indbyggede funktioner.
Og det her er alle håndteret meget, meget elegant i R.
>> Så bare at hamre dette punkt, den største flaskehals
vil være kognitive.
Så dataanalyse er en meget hård problem.
Uanset om du gør maskine læring eller du er
gør netop en slags grundlæggende udforskning data,
du ikke ønsker at have at tage et dokument
og derefter kompilere noget, hver gang du
ønsker at se, hvad en kolonne ser ud, hvilke særlige poster i en matrix
ser ud.
Så du bare vil have nogle virkelig rart grænseflade
kan du køre en simpel funktion at indekser til uanset
du gerne vil og bare køre den derfra.
Og du har brug for domæne specifikke sprog for dette.
Og R vil virkelig hjælpe dig med at definere den problem og løse det på denne måde.
>> Så her er et plot, der viser programmering popularitet af R som det er gået over tid.
Så som du kan se, ligesom 2013 eller så det bare blæst op voldsomt.
Og det har været netop på grund af det kæmpe trend i teknologibranchen
om store data.
Også ikke kun teknologien industri, men virkelig
enhver industri at-- fordi en masse af industrier
er slags grundlæggende for forsøger at løse disse problemer.
Og som regel, kan du have nogle gode måde at måle disse problemer
eller endda definere dem eller løse dem ved hjælp af data.
Så jeg tror lige nu R er den 11. mest populære sprog på TIOBE
og det har været stigende siden da.
>> Så her er nogle flere funktioner i R. Det har
et enormt antal kolli og for alle disse forskellige ting.
Så hver gang du har en bestemt problem, de fleste
tiden R vil have denne funktion for dig.
Så uanset om du ønsker at opbygge en slags maskine
læring algoritme kaldet Random Forest eller Decision Trees,
eller endog forsøger at tage gennemsnittet af en funktion eller en hvilken som helst af det her,
R vil have det.
>> Og hvis du gør, du holder af optimering, en ting, der er fælles
er, at når du er færdig prototyping en slags højniveausprog,
du vil smide det in-- Du vil bare port, at over
til nogle lavniveau-sprog.
Hvad er godt ved R er, at når du er gjort prototyping det, kan du køre C ++,
eller Fortran, eller nogen af ​​disse lavere niveau dem direkte ind i R.
Så det er en rigtig cool funktion om R,
hvis du virkelig bekymrer sig om optimering punkt.
>> Og det er også rigtig god for web visualiseringer.
Så D3.js, for eksempel, er Jeg gætter andet seminar
at vi præsenterede i dag.
Og det er virkelig fantastisk for laver interaktive visualiseringer.
Og D3.js forudsætter, at du har en slags data, der skal plottes
og R er en fantastisk måde at være i stand til at gøre dataanalyse, før du eksporterer den
over til D3.js eller bare køre D3.js kommandoer i R selv,
samt alle disse andre biblioteker samt.
>> Så det var bare at indførelsen af hvad er R, og hvorfor du måske bruge det.
Så forhåbentlig, jeg har overbevist dig noget
om prøver bare at se, hvad det er ligesom.
Så jeg har tænkt mig at gå videre og gå igennem nogle grundlæggende om R objekter
og hvad du virkelig kan gøre.
>> Så her er blot en flok matematiske kommandoer.
Så siger you're-- du ønsker at opbygge sprog dig selv og du bare vil
at have en masse forskellige værktøjer.
Enhver form for operation, du tror, ​​du gerne ønsker, er temmelig meget vil være i R.
>> Så her er 2 plus 2.
Her er 2 gange pi.
R har en flok indbyggede konstanter at du ofte vil bruge som pi, e.
>> Og så, her er 7 plus runif, så runif 1.
Dette er en funktion, der er genererer en tilfældig ensartet fra 0 til 1.
Og så er der 3 til potensen af ​​4.
Der er kvadratrødder.
>> Der er log.
Så log vil gøre basen eksponentiel af sig selv.
Og så, hvis du angiver en base, så du kan gøre hvad basen, du ønsker.
Og så er her nogle andre kommandoer.
Så du har 23 mod 2.
Så har du resten.
Så har du videnskabelig notation, hvis du også
ønsker at gøre bare mere og mere komplicerede ting.
>> Så her er opgaven.
Så typiske opgaver i R er udført med en pil
så det er mindre end og derefter bindestreg.
Så her er jeg bare tildele 3 til den variable val.
>> Og så er jeg udskrivning ud val og så er det udskrives tre.
Som standard i R tolk, det vil udskrive tingene ud for dig
så du ikke behøver at angive udskrive en val enhver tid, du ønsker at udskrive noget.
Du kan bare gøre val og så det vil gøre det for dig.
>> Du kan også bruge lig teknisk som en opgave operatør.
Der er små finesser mellem at bruge pilen
operatør og lighedstegnet operatør for opgaver.
Mest af konvention, alle vil bare bruge pilen operatør.
>> Og her, jeg tildele denne skrå notation kaldes 1 colon 6.
Dette genererer en vektor fra 1 til 6.
Og det er virkelig rart, fordi så du lige tildele vektoren val
og der virker af sig selv.
>> Så dette er allerede går fra en single-- en meget intuitiv data
struktur blot en dobbelt af nogle type af typen i en vektor
og som vil samle alle de skalare værdier for dig.
Så efter at gå fra skalar, du har R objekter, og dette er en vektor.
En vektor er en hvilken som helst slags indsamling af samme type.
Så her er en flok vektorer.
>> Så dette er numerisk.
Numerisk er R måde at sige dobbelt.
Og så som standard, enhver nummer vil være en dobbelt.
>> Så hvis du har C på 1,1, 3, negativ 5,7, c er en funktion.
Dette sammenkæder alle tre numre i en vektor.
Og det vil være-- så hvis du bemærker 3 af sig selv,
normalt du ville påtage sig at dette er ligesom et heltal,
men fordi alle vektorer er af samme type,
dette er en vektor af double eller numerisk i dette tilfælde.
>> rnorm er en funktion, der genererer standard normal variables--
eller standard normale værdier.
Og jeg angive to af dem.
Så jeg gør rnorm 2, tildele det til udviklere, og så er jeg udskrive udviklere.
Så disse er blot to tilfældige normale værdier.
>> Og så int'er hvis du gør du holder af heltal.
Så det er bare om hukommelse allokering og spare hukommelse.
Så du ville have til at tilføje dine tal fra hovedstaden L.
>> Generelt er det R historiske notation
for noget, der hedder lang heltal.
Så det meste af tiden, vil du beskæftige sig med double.
Og hvis du nogensinde vil senere på at optimere din kode,
du kan bare tilføje disse L's bagefter eller under det
hvis du ligesom precognitive hvad du kommer til at gøre disse variabler.
>> Så her er en vektor karakter.
Så igen, jeg sammenkæde tre strygere denne gang.
Bemærk at dobbelt strygere og enkelt strenge er det samme i R.
Så jeg har Arthur og Marvin 's og så når jeg printe det ud, alle af dem
vil vise dobbelte strenge.
Og hvis du også ønsker at inkludere dobbelt eller enkelt streng
i dine karakterer, så kan du enten veksle dine strenge.
>> Så Marvin for andet element, er det
vil show-- dig bare har dobbelt strenge
og derefter en enkelt streng så dette er alternerende.
Ellers, hvis du ønsker at bruge en dobbelt string operatør i en dobbelt snor
når du erklære det, så du bare bruge escape operatør.
Så du gør det backslash dobbelt snor.
>> Og endelig har vi også har logiske vektorer.
Så logical-- så sandt og FALSK, og de er
vil være store bogstaver.
Og så igen, jeg sammenkæde dem og derefter tildele dem til bools.
Så bools vil vise du SAND, FALSK, og SAND.
>> Så her er vektoriseret indeksering.
Så i starten, jeg Jeg tager en function--
dette kaldes en sequence-- sekvens fra 2 til 12.
Og jeg tager en sekvens med 2.
Så det kommer til at gøre 2, 4, 6, 8, 10 og 12.
Og så er jeg indeksering at få det tredje element.
>> Så én ting at huske på er at R indekser ved at starte fra 1.
Så vals 3 vil give du det tredje element.
Dette er slags forskellig fra andre sprog, hvor det starter fra nul.
Så i C eller C ++, for eksempel, er du kommer til at få det fjerde element.
>> Og her er vals 3.-5.
Så en ting, der er virkelig cool er, at du
kan generere midlertidige variabler inde og så bare bruge dem på flue.
Så her er på 3 til 5.
Så jeg genererer en vektor 3, 4 og 5 og derefter
Jeg indeksere at få den tredje, fjerde, og femte elementer.
>> Så samme måde kan du abstrakt dette til bare gøre
nogen form for en vektor der giver dig indeksering.
Så her er vals og derefter første, tredje og sjette elementer.
Og så, hvis du vil at gøre et supplement,
så du bare gøre det minus bagefter og der vil
giver dig alt det er ikke det første, tredje eller sjette element.
Så dette vil være 4, 8 og 10.
>> Og hvis du ønsker at få endnu mere avanceret,
du kan sammenkæde booleske vektorer.
Så dette indeks vil give dig denne Boolean vektor af længde 6.
Så rep TRUE komma 3.
Dette vil gentage TRUE tre gange.
Så dette vil give dig en vektor SAND, SAND, SAND.
>> rep FALSK 4-- dette vil give dig en vektor af falsk, falsk, falsk, falsk.
Og så c kommer til at sammenkæde disse to Booleans sammen.
Så du kommer til at få tre TRUEs og derefter fire FALSEs.
>> Så når du indeks vals, er du kommer til at få den sande, SAND, SAND.
Så det kommer til at sige ja, Jeg vil have disse tre elementer.
Og så falsk, falsk, Falsk, falsk går
at sige nej, jeg vil ikke have de elementer så det kommer ikke til at returnere dem.
>> Og jeg tror der er faktisk en tastefejl her fordi det siger gentag TRUE 3
og igen og igen, 4, og teknisk set, du kun har seks elementer så gentag FALSK,
det bør være igen og igen, 3.
Jeg tror R er også smart nok sådan at hvis du bare angive 4 her, og
Det vil ikke engang fejl ud.
Det vil bare give dig denne værdi.
Så det vil bare ignorere det fjerde FALSK.
>> Så her er vektoriseret opgave.
Så set.seed-- det bare sætter frø til pseudotilfældige numre.
Så jeg sætte frø til 42, hvilket betyder, at hvis jeg generere
tre tilfældige normale værdier, og derefter, hvis du
køre set.seed på din egen computer ved hjælp af samme værdi 42,
så får du også den samme tre tilfældige normale.
>> Så dette er virkelig god for reproducerbarhed.
Normalt, når du laver nogle slags videnskabelig analyse,
du ønsker at sætte frø.
På den måde andre forskere kan bare reproducere nøjagtig samme kode, du har
gjort, fordi de vil have den nøjagtige samme stokastiske variable at-- eller tilfældig
værdier, som du har taget ud samt.
>> Og så vektoriseret opgave her viser de Vals 1 til 2.
Så det tager de første to elementer for Vals og derefter tildeler dem til 0.
Og så kan du også bare gøre det lignende ting med Booleans.
>> Så vals er ikke lig med 0-- denne vilje give dig en vektor FALSK, FALSK, SAND
i dette tilfælde.
Og så, det vil sige enhver af disse indekser, der var sandt,
så det kommer til at tildele den pågældende til 5.
Så det tager det tredje element her og derefter tildeler den til 5.
>> Og det er virkelig rart i forhold til lav-niveau sprog
hvor du skal bruge til sløjfer at gøre alt dette vektoriseret ting
fordi det er bare meget intuitiv og det er en enkelt one-liner.
Og hvad er stor om vektoriseret notation
er, at i R, er disse slags indbygget, så de er næsten lige så hurtigt
som gør i et lavt niveau sprog som modsætning til at gøre en for-løkke i R
og derefter have det til at gøre den dynamiske indeksering selv.
Og der vil være langsommere end at gøre denne slags vektoriseret ting
hvor det kan gøre det i parallel, hvor det gør det i gevindskæring dybest set.
>> Så her er vektoriseret operationer.
Så jeg generere en værdi 1 til 3, tildele det til vec1, 3 og 5, vec2,
at tilføje dem sammen.
Den tilføjer dem komponent-wise, så det er 1 plus 3, 2 plus 4, og så videre.
>> vec1 gange vec2.
Dette multiplicerer to værdier komponent klogt.
Så det er 1 gange 3, 2 gange 4, og derefter 3 gange 5.
>> Og så, på samme måde kan du også gøre comparisons-- logiske sammenligninger.
Så det er FALSK FALSK SAND i dette tilfælde, fordi 1 ikke er større end 3,
2 ikke er større end 4.
Det er, tror jeg, en anden tastefejl, 3 er absolut ikke større end 5.
Ja.
Og så kan du bare gøre alt disse enkle operationer
fordi deres arvet fra klasserne selv.
>> Så det var bare vektoren.
Og det er slags af de mest grundlæggende R objekt, fordi givet en vektor,
du kan konstruere mere avancerede objekter.
>> Så her er en matrix.
Dette er hovedsagelig indvinding af, hvad en matrix er selv.
Så i dette tilfælde er det tre forskellige vektorer, hvor hver enkelt er en kolonne,
eller du kan overveje det som hver enkelt er en række.
>> Så jeg lagring af en matrix fra 1 til 9 og så er jeg angive 3 rækker.
Så 1 til 9 vil give dig en vektor 1, 2, 3, 4, 5, 6, og hele vejen til 9.
>> En ting at også huske på er, at R gemmer værdierne i kolonne-dur format.
Så med andre ord, når du ser 1 til 9, det vil gemme them--
det vil være 1, 2, 3 i den første kolonne,
og så det vil gøre 4, 5, 6 i anden kolonne
og derefter 7, 8, 9 i tredje kolonne.
>> Og her er nogle andre fælles funktioner, du kan bruge.
Så dim mat, vil dette give dig dimensionerne af matricen.
Det kommer til at returnere dig en vektor dimension.
Så i dette tilfælde, fordi vores matrix er 3 med 3,
det kommer til at give dig en numerisk vektor, der er 3 3.
>> Og her er bare viser matrixmultiplikation.
Så normalt, hvis du bare gøre asterisk-- så mat stjerne mat--
dette vil være komponent-wise operation
eller hvad hedder det Hadamard produkt.
Så det kommer til at gøre hver element komponent-wise.
Men hvis du vil matrix multiplication--
så at gange den første række gange den anden matrix første kolonne
og så on-- du ville bruge denne procent operation.
>> Og t måtten er blot en operation for transponering.
Så jeg siger tage Transpose i matricen, ganges med matricen
selv.
Og så det kommer til at tilbage til dig en anden 3
med 3 matrix viser det produkt, du gerne vil.
>> Og så var matrix.
Her er hvad der kaldes en data frame.
En data ramme, du kan tænke på som en matrix, men hver kolonne selv
vil være af en anden type.
>> Så hvad er virkelig cool om data rammer er, at i dataanalyse selv,
du kommer til at have alt dette heterogene data og alle disse virkelig
rodet ting hvor hver af kolonnerne selv kan være af forskellige typer.
Så her jeg siger skabe en dataramme, gør int'er fra 1 til 3,
og derefter også en vektor karakter.
Så jeg kan indeksere gennem hver af disse kolonner
og så vil jeg få værdierne selv.
Og du kan også gøre en slags af operationer på data frames.
Og det meste af tiden, når du er gør dataanalyse eller en slags
af forbehandling, vil du være arbejde med disse datastrukturer
hvor hver kolonne går at være af en anden type.
>> Endelig så disse er i bund de fire væsentlige objekter i R. List
vil bare indsamle nogen andre objekter, du ønsker.
Så det vil lagre dette i en variabel, som du nemt kan få adgang til.
>> Så her, jeg tager en liste.
Jeg siger ting lig med 3.
Så jeg har tænkt mig at have et element i listen, og dette kaldes ting,
og det kommer til at have værdien 3.
>> Jeg kan også oprette en matrix.
Så det er 1 til 4 og slutrække er lig med 2, så en 2 af 2 matrix.
Også på listen, og det hedder mat.
moreStuff, en tekststreng, og endda en anden liste i sig selv.
>> Så dette er en liste, der er 5 og bjørn.
Så det har værdien 5, og det har tegnstreng bjørn
og det er en liste i en liste.
Så du kan få disse rekursive ting, hvor
du har another-- a skrive af typen.
Så på samme måde, kan du have en matrix inde i en anden matrix og så videre.
Og en liste er bare en god måde indsamle og aggregere
alle disse forskellige objekter.
>> Og endelig, her blot hjælpe i tilfælde Dette var blot gået over meget hurtigt.
Så når du er forvirret om en slags funktion,
kan du gøre ved hjælp af denne funktion.
Så du kan gøre for hjælp matrix eller et spørgsmålstegn matrix.
Og hjælp og spørgsmålstegnet er bare forkortelse for det samme
så de er aliaser.
>> LM er en funktion, bare gør en lineær model.
Men hvis du bare har ingen idé om, hvordan det værker, kan du bare gøre hjælp af lm
og der vil give dig nogle slags dokumentation,
ser lidt ligesom en mand side i Unix, hvor
du har en kort beskrivelse af, hvad det gør, også hvad dens argumenter er,
hvad den returnerer, og kun tips til, hvordan at bruge det, og nogle eksempler så godt.
>> Så lad mig gå videre og show nogle demo af at bruge R. OK.
Så jeg gik over meget hurtigt bare data
strukturer og nogle slags af op-- nogle af operationerne.
Her er nogle funktioner.
>> Så her jeg bare at definere en funktion.
Så jeg også bruger tildelingsoperator her,
og så siger jeg erklære den som en funktion.
Og det tager den x-værdi.
Så dette er en hvilken som helst værdi, du vil og jeg har tænkt mig at vende tilbage x selv.
Så det er identiteten funktion.
>> Og hvad er cool om dette i forhold til andre sprog
og et andet lavt niveau sprog er, at X
kan være af enhver type i sig selv og det vil vende tilbage denne type.
Så du kan imagine-- så lad mig bare køre dette hurtigt.
Undskyld.
>> Så én ting, jeg bør også nævne er, at denne editor jeg bruger
kaldes rstudio.
Dette er, hvad der kaldes en IDE.
Og én ting, der er virkelig nice om dette
er, at det indeholder en masse af ting, du ønsker at gøre i R af sig selv
lige meget intuitivt.
>> Så her er en tolk konsol.
Så på samme måde, kan du også få denne konsol rå bare ved at gøre et stort R.
Og det er præcis den samme som konsollen.
Så jeg kan bare gøre id-funktion x, x, x.
Og then-- og derefter at vil være fint i sig selv.
>> Så rstudio er stor fordi det har konsollen.
Det har også de dokumenter du gerne vil køre på.
Og så det har nogle variabler at du kan se i miljøer.
Og så, hvis du har at gøre plots, så er du
kan kun se det her, i modsætning til forvalte alle disse forskellige vinduer
af sig selv.
>> Jeg faktisk personligt bruge Vim, men jeg lyst rstudio er fremragende bare
for at få en god idé af, hvordan man bruger R. Normalt
når du forsøger at lære nogle nye opgave,
du ikke ønsker at håndtere alt for mange ting på én gang.
Så R er blot en very-- rstudio er en meget god måde at lære R
uden at skulle beskæftige sig med alle disse andre ting.
>> Så her jeg kører id hej.
Dette returnerer hej.
id 123.
Her er en vektor af heltal.
Så på samme måde, fordi du kan træffe en slags værdi,
du kan gøre returnere id X, så det returnerer 1234 og 5.
>> Og lad mig lige vise dig, at dette er faktisk et heltal.
Og på samme måde, hvis du gør klasse id x, går det at være heltal.
Og så kan du også sammenligne de to, og det er sandt.
Så jeg kontrollere, om id for x lig ligemænd x og varsel
at det giver dig to TRUEs.
Så dette er ikke at sige, er de to objekter er identiske,
men hver af de angivelser inden for de vektorer identiske.
>> Her er bounded.compare.
Så det er lidt mere kompliceret ved, at det har en hvis tilstand og andet
og så tager det to argumenter ad gangen.
Så x er af enhver type.
Og jeg siger dette andet argument er en.
Dette kan være alt så godt.
Men som standard, det vil tage 5 Hvis du ikke angiver noget.
>> Så her vil jeg sige hvis x er større end en.
Så hvis jeg ikke angiver en, det siger, at hvis x er større end 5,
så jeg har tænkt mig at vende tilbage SAND.
andet, vil jeg vende tilbage FALSK.
Så lad mig gå videre og definere dette.
>> Og nu jeg har tænkt mig at køre bounded.compare 3.
Så det siger er 3 mindre than-- er 3 større end 5.
Nej, det er ikke så FALSK.
>> Og bounded.compare 3 og jeg har tænkt mig at sammenligne den med en lig med 2.
Så nu er jeg siger ja, nu har jeg ønsker en at være noget andet.
Så jeg har tænkt mig at sige en, skal du være 2.
>> Jeg kan enten gøre denne slags notation eller jeg sige en er lig med 2.
Dette er en mere læsbar i, at når du er
ser på disse virkelig komplicerede funktioner,
tage flere arguments-- og dette kan være snesevis oftentimes-- bare at sige
et lig 2 er mere læsbar for dig, så senere i fremtiden
vil du vide, hvad du laver.
>> Så i dette tilfælde, er jeg siger, er 3 større end 2.
Ja, det er.
Og på samme måde kan jeg bare fjerne dette og siger, er 3 større end 2
hvor a er lig med 2.
Og det er også sandt.
Ja?
>> PUBLIKUM: Er du fuldbyrdende linje for linje?
>> DUSTIN TRAN: Ja jeg er.
Så hvad jeg gør her er tager denne tekst document--
og hvad der er fantastisk ved rstudio er, at Jeg kan bare køre en short-- en vigtig genvej.
Så jeg gør Ctrl-Enter.
>> Og så, jeg tager den linje i teksten dokument
og derefter sætte i konsollen.
Så her jeg siger, bounded.compare og jeg gør Ctrl-X.
Så jeg kan bare køre her.
Og så der vil tage line og derefter sætte det her.
Og så på samme måde, jeg kan gøre køre her.
Og så vil det bare holde definere linjerne i konsollen som.
>> Og hvis du også mærke til krøllede seler er der ligesom i C syntaks.
x-- hvis hvis betingelse er også vil bruge parenteser og derefter
du kan bruge andet.
En anden grund er ellers hvis.
Så dette vil være x lig er lig med en, for eksempel.
Og så jeg har tænkt mig at returnere noget her.
>> Bemærk, at der er to forskellige ting her, som der foregår.
Den ene er, at her jeg angive returnere værdien SAND.
Her Jeg siger bare x.
Så R vil sædvanligvis ved standard tage det sidste arguments--
eller tage den sidste linje i koden, og det vil være, hvad det er returneret.
Så her er den samme ting som at gøre tilbagevenden x.
>> Og bare for at vise dig.
Og så vil det fungere ligesom det.
Så lad mig fortsætte med dette.
>> Så ellers hvis.
Og virkelig, jeg kan vende tilbage noget jeg gerne vil.
Så jeg behøver ikke engang at retur Booleans hele tiden,
Jeg kan bare returnere noget andet.
Så jeg kan gøre tilbagevenden bjørn.
>> Så hvis X er lig er lig med en, det kommer til at vende tilbage bjørn.
Ellers går det til at returnere SAND.
Jeg kan også gøre en vektor eller virkelig noget.
>> Og normalt statisk maskinskrevne sprog,
du er nødt til at angive en type her.
Og bemærk, at det bare kan være alt.
Og R er intelligent nok, at det vil bare gøre det, og det vil fungere fint.
>> Så lad mig definere dette.
Unexpected-- oh undskyld.
Det bør være en krøllet klammeparentes her.
OK.
Cool.
Ok.
Så lad os nu sammenligne 3 og en lig med 3.
Så det burde return-- yeah-- værdien bjørn.
>> Så nu en mere generel ting er ligesom Hvad med andre datastrukturer.
Så du har denne funktion.
Dette kommer til at arbejde på en slags værdi som 3 eller numerisk,
med andre ord, dobbelt.
>> Men hvad med noget som en vektor.
Så hvad sker der, hvis du do-- så jeg er vil tildele val til, sige, 4 til 6.
Så hvis jeg returnere dette, dette er en vektor fra 4, 5, 6.
>> Lad os nu se hvad der sker hvis jeg gør bounded.compare val.
Så dette vil give dig 15 1251.
Så med andre ord, det siger hvis man ser på denne betingelse
så det siger x er mindre end en eller noget.
Så dette er en anelse forvirrende, fordi nu
du bare ikke ved, hvad der foregår.
Så jeg gætte én ting, der er virkelig godt om blot forsøger at debug
er, at du bare kan gøre val er større end en og se hvad der sker der.
>> Så val-- a er som standard 5 så lad os bare Val større end 5.
Så dette er en vektor FALSK FALSK SAND.
Så nu når du kigger på dette, går det til at sige, om,
og så det kommer til at give dig denne er en vektor af false false SAND.
>> Så når du passerer dette i R, R har ingen idé om, hvad du laver.
Fordi det forventer en enkelt værdi, som er en boolesk og nu
du giver det en vektor af Booleans.
Så som standard, R er bare kommer til at sige, hvad dælen,
Jeg har tænkt mig at antage, at du er kommer til at tage det første element her.
Så jeg har tænkt mig at say-- jeg har tænkt mig at antage, at dette er forkert.
Så det kommer til at sige nej, det er ikke rigtigt.
>> Ligeledes går det til være val lig er lig med en.
Nej, undskyld 5.
Og det vil også være falsk så godt.
Så det kommer til at sige nej, Det er ikke sandt så godt, så det er
vil returnere denne sidste.
>> Så dette er enten en god ting eller en dårlig ting, afhængigt af hvordan du se den.
Fordi når du er skaber disse funktioner,
Du behøver faktisk ikke ved, hvad der foregår.
Så nogle gange du ønsker en fejl, eller måske du bare vil have en advarsel.
I dette tilfælde har R ikke.
Så det er virkelig op til du baseret ud af, hvad
du synes sproget skal gøre i dette tilfælde
hvis du passerer i en vektor af Booleans når du laver en hvis tilstand.
>> Så lad os sige, at du havde det oprindelige en med hvis ellers returnerer SAND, og ​​du er
vil returnere FALSK.
Så en måde bort dette er at sige, at jeg
behøver ikke engang denne betingede ting.
En anden ting, jeg kan gøre, er bare returnere værdier selv.
Så hvis du bemærker, hvis du do val er større end 5,
dette vil returnere en vektor false false SAND.
>> Måske det er det, du ønsker for bounded.compare.
Du ønsker at returnere en vektor af Booleans hvor den sammenligner hver af værdierne
for sig selv.
Så kan du bare bounded.compare funktion X, A er lig med 5.
Og så i stedet for at gøre dette, hvis andet tilstand,
Jeg bare at vende tilbage x er større end 5.
Så hvis det er sandt, så det kommer til at returnere sandt.
Og så hvis det ikke er, det er vil returnere FALSK.
>> Og det vil arbejde for nogen af ​​disse strukturer.
Så jeg kan bounded.compare c 1 6 eller 9 og så vil jeg sige et lig 6,
f.eks.
Og så det kommer til at give dig den rigtige Boolean
vektor, du designer.
>> Så dem er blot funktioner og lad mig nu bare
vise dig nogle interaktive visuals.
Jeg tror ikke, jeg har faktisk Wi-Fi her så lad mig bare gå videre
og springe denne ene jeg gætte.
>> Men én ting, der er cool er dog, at hvis du bare
ønsker at teste en flok forskellige data kommandoer,
der er en masse forskellige datasæt , der allerede er indlæst i R.
Så en af ​​dem er kaldet iris datasæt.
Dette er en af ​​de mest kendte dem i machine learning.
Du vil som regel bare gøre en slags testcases for at se om din kode kører.
Så lad os bare kontrollere, hvad iris er.
>> Så denne ting går at være en dataramme.
Og det er lidt længe, ​​fordi Jeg udskrives iris.
Det er at udskrive hele ting.
Så det har alle disse forskellige navne.
Så iris er en samling af forskellige blomster.
I dette tilfælde er det at fortælle du arterne af det,
alle disse forskellige bredder og længder af bægerblad og kronblad.
>> Og så normalt, hvis du vil udskrive iris,
for eksempel, behøver du ikke ønsker at have det gøre alt dette, fordi der kan tage over
hele din konsol.
Så en ting, der er virkelig nice er hoved-funktionen.
Så hvis du bare gøre hoved iris, vil dette give dig
de første fem rækker, eller seks jeg gætte.
Og så godt, du kan bare angive her.
Så 20-- dette vil give du de første 20 rækker.
Og jeg faktisk var venlig af overrasket over, at dette
gav mig seks, så lad mig gå videre og tjek iris-- eller hoved, undskyld.
Og her vil det give du dokumentationen
hvad værdien hovedet gør.
Så det returnerer den første eller sidste af et objekt.
Og så jeg har tænkt mig at se på standardindstillingerne.
Og så siger standard metode hoved X og n er lig 6L.
Så dette returnerer de første seks elementer.
Og på samme måde, hvis du bemærker her, jeg behøvede ikke at angive n er lig 6.
Som standard bruger seks, tror jeg.
Og så, hvis jeg ønsker at angive en vis værdi, så jeg kan se, at så godt.
>> Så det er nogle enkle kommandoer og her er en anden en, der er bare-- godt,
Jeg can-- det er faktisk lidt mere kompleks,
men det vil bare tage klassen af hver kolonne i iris datasæt.
Så dette vil vise dig, hvad hver af disse søjler er i form af deres typer.
Så bægerblad længde er numerisk, bægerblad bredde er numeriske.
Alle disse værdier er lige numerisk fordi du kan fortælle fra disse data
strukturere disse er alle kommer til at numerisk.
>> Og de arter kolonne vil være en faktor.
Så normalt, skulle man tro, at dette er ligesom en tegnstreng.
Men hvis du bare gøre irisSpecies, og så vil jeg gøre hoved 5,
og dette vil udskrive de første fem værdier.
>> Og så bemærke dette niveau.
Så dette er saying-- dette er R måde have kategoriske variable.
Så i stedet for bare have tegnstrenge,
det har niveauer angivelse hvilke af disse ting er.
>> Så lad os sige irisSpecies 1.
Så hvad du ønsker at gøre her er jeg Delsæt for denne art kolonne.
Så dette tager Art-søjle og derefter
den indekserer at få det første element.
Så dette bør give dig setosa.
Og det giver dig også niveauer her.
>> Så du kan også sammenligne dette til karakteren setosa
og dette vil ikke til at være sandt, fordi en
er af en anden type end den anden.
Eller jeg tror det er sandt, fordi R er mere intelligent end.
Og det ser på dette, og derefter siger, måske det er det, du ønsker.
Så det kommer til at sige det tegn streng setosa er den samme som denne.
Og så samme måde kan du også bare snuppe disse som så på.
>> Så det er blot en slags hurtige kommandoer datasættet.
Så her er nogle udforskning af data.
Så det er lidt mere involveret i analysen af ​​data.
Og dette er taget fra nogle Bootcamp i F i Berkeley.
>> Så bibliotek udenlandske.
Så jeg har tænkt mig at lægge i en bibliotek, der hedder udenlandske.
Så dette vil give mig read.dta så antage, at jeg har denne datasæt.
Dette er gemt i den aktuelle arbejdsmappe af min konsol.
Så lad os bare se, hvad arbejdsmappen er.
>> Så her er min arbejdsmappe.
Og læse dot data, dette ting, siger denne fil
ligger i data mappen denne aktuelle arbejdsmappe.
Og read.dta dette ikke er en standard kommando.
Jeg gætte, jeg indlæst det i forvejen.
IEI overtog jeg indlæst denne i forvejen.
>> Men så read.dta ikke vil at være en standard kommando.
Og det er derfor, du kommer til at have at indlæse i dette bibliotek package--
denne pakke kaldet udenlandske.
Og hvis du ikke har pakken, tror jeg
udenlandsk er en af ​​de indbyggede dem.
Ellers kan du også gøre install.packages
og dette vil installere pakken.
Og det vil give dig R. Øh, nej.
Og så er jeg bare kommer til at stoppe dette, fordi jeg allerede har det.
>> Men hvad er virkelig rart om R er, at pakken ledelse
Systemet er meget elegant.
Fordi det vil gemme alt virkelig pænt til dig.
Så i dette tilfælde, det vil gemme det i, jeg tror, ​​dette bibliotek her.
>> Så når du har lyst til installere nye pakker,
det er lige så simpelt som gør install.packages
og R vil administrere alle pakkerne til dig.
Så du behøver ikke at gøre noget i Python, hvor du har ekstern pakke
ledere som papir Anaconda hvor du er
doing-- du installerer pakker uden for Python
og så er du forsøger at køre dem selv.
Så det er virkelig pæn måde.
>> Og install.packages kræver internet.
Det tager det fra en server og arkiv,
samler alle pakkerne, hedder KRAN.
Og du kan angive, hvilken slags spejl du vil hente pakkerne fra.
>> Så her jeg tager dette datasæt.
Jeg læser det i at bruge denne funktion.
Så lad mig gå videre og gøre det.
>> Så lad os antage, at du har denne datasæt
og du har absolut ingen idé om, hvad det er.
Og det faktisk kommer op temmelig ofte i industrien
hvor du bare har disse tons og tonsvis af rodet ting
og de er utroligt umærket.
Så her jeg har denne datasæt og jeg ved ikke,
hvad det er, så jeg er bare viser at tjekke det ud.
>> Så jeg har tænkt mig at gøre med hovedet først.
Så jeg tjekke de første seks kolonner af hvad dette datasæt er.
Så dette er state, pres04, og derefter Alle disse forskellige slags kolonner.
Og hvad er interessant her, tror jeg, er, at du
vil antage, at det ser som en slags valg.
Og jeg gætter bare fra ser på fil
nævne dette er en form for indsamling af data om ansøgere eller vælgere
der stemte for bestemte præsidenter eller præsident kandidater
for valget i 2004.
>> Så her er værdier 1, 2 så en måde til at lagre
Formand kandidater er deres navne.
I dette tilfælde ser det ud de er bare heltalsværdier.
Så 2004 var det Bush versus Kerry tror jeg.
Og nu, lad os sige, at du bare ikke kender om 1 svarer til Bush eller 2
svarer til Kerry eller og så videre og så videre, ikke?
>> Og det er, bare for mig, et temmelig almindeligt problem.
Så hvad kan du gøre i dette tilfælde?
Så lad os se alle disse andre ting.
>> tilstand, jeg går ud fra dette kommer fra forskellige stater.
partyid, indkomst.
Lad os se på partyid.
Så måske en ting du kan gøre, er se på hver af observationerne
at have en partyid af republikanske eller demokrat eller noget.
Så lad os bare se på, hvad partyid er.
>> Så jeg har tænkt mig at tage dat og så jeg har tænkt mig
at gøre dette dollartegn operatør, at jeg gjorde tidligere
og dette vil delmængde til den pågældende kolonne.
Og så jeg har tænkt mig at lede dette i 20, bare for at se, hvad det ser ud.
>> Så dette er bare en masse nationale kontorer.
Så med andre ord har du manglende data om disse fyre.
Men du også bemærke dette dat partyid er en faktor
så det giver dig forskellige kategorier.
Så med andre ord kan partyid tage Demokrat, republikaner, Independent,
eller noget andet.
>> Så lad os gå videre og lad os se, hvilke af disse is-- oh, OK.
Så jeg har tænkt mig at delmængde at partyid og derefter
se på, hvilke der er S, f.eks.
Dette vil give dig en boolesk, en enorm Boolean af TRUEs og FALSEs.
>> Og nu, lad os sige, jeg vil at delmængde til disse fyre.
Så dette vil tage min dat og delmængde til uanset hvilken observationer
har partyid ligemænd lig demokrat.
Og det er ganske lang, fordi der er så mange af dem.
Så nu, jeg skal til at lede dette i 20.
>> Og som du bemærker, er lig ligemænd er interessant, fordi du er
already-- du også herunder nationale kontorer.
Så i dette tilfælde, du stadig ikke kan få alle oplysninger, fordi nu har du nationale kontorer
og du blot ønsker at se, hvilke af de observation svarer til demokrat
og ikke disse manglende værdier selv.
Så hvordan ville du slippe af med disse kontorer?
>> Så her er jeg bare ved hjælp af op-tasten på min markøren og derefter sige at bevæge sig rundt.
Og så her jeg bare sige is.na datpartyid.
Så dette og og vil tage to forskellige Boolske vektorer
og siger, at det vil være SAND og FALSK f.eks.
Så det kommer til at gøre denne komponent-wise.
Så her jeg siger take datarammen, delmængde
til dem, der svarer til demokrat, og fjerne nogen af ​​dem, der ikke er NA.
>> Så denne will-- bør give dig noget.
Lad os se is.na.
Lad os prøve is.na datpartyid.
Og dette bør give du-- sorry-- blot en boolesk vektor.
Og så, fordi det er så lang, Jeg har tænkt mig at delmængde til 20.
OK.
Så dette bør arbejde.
>> Og det her vil også være TRUEs.
Ah, så min fejl her er at I'm-- I bruge C ++ og R i flæng, så jeg gør
denne fejl hele tiden.
Den og operatør er faktisk den, du ønsker.
Du ønsker ikke at bruge to og-tegn, bare en enkelt.
OK.
>> Så lad os se.
Så vi subsetted til partyid hvor de er demokrat
og de er ikke manglende værdier.
Og lad os nu se på hvilke de er for.
Så det ser ud som de fleste af dem stemte for 1.
Så jeg har tænkt mig at gå videre og sige, at er Kerry.
>> Og på samme måde, kan du også gå til republikanske
og forhåbentlig, bør dette give dig 2.
Det er bare en masse forskellige kolonner.
Og ja, det er 2.
Så partyid alle republikanske, de fleste af dem stemmer på 2.
>> Så det ser ud som, bare ved at kigge på dette,
Republikanske bliver en very-- eller partyid
vil være en meget stor faktor i fastlæggelsen
hvilken kandidat de er vil stemme på.
Og dette er naturligvis sandt i almindelighed.
Og det passer til din intuition, selvfølgelig.
Så det ser ud som om jeg er løbe tør for tid, så
lad mig bare skal gå videre og vis nogle hurtige billeder.
Så her er noget, der er lidt mere kompliceret med visualisering.
Så i dette tilfælde, er dette en meget simpel analyse af blot at kontrollere, hvad
formanden for '04 er.
>> Så i dette tilfælde, lad os sige, at du ønskede at besvare dette spørgsmål.
Så formoder, at vi ønskede at vide afstemningen adfærd i 2004 præsidentvalget
og hvordan det varierer fra løb.
Så ikke nok med at du vil se stemmeadfærd,
men du ønsker at delmængde af hver race og slags opsummere det.
Og du kan kun fortælle af dette kompleks notation
at dette er en slags få uklar.
>> Så en af ​​de mere avancerede R pakker, der er også slags nyere
kaldes dplyr.
Så det er denne ene lige her.
Og ggg-- ggplot2 er bare en dejlig måde at gøre bedre visualiseringer
end den indbyggede i ét.
>> Så jeg har tænkt mig at indlæse disse to biblioteker.
Og så jeg har tænkt mig at gå videre og køre denne kommando.
Du kan bare behandle det som en sort boks.
>> Hvad sker er, at dette rør operatør passerer i dette argument
ind på her.
Så jeg siger gruppe af dat race og daværende præsident 04.
Og så alle disse andre kommandoer filtrerer og derefter sammenfatter
hvor jeg gør tæller og så jeg plotte det her.
OK cool.
Så lad os gå videre og se, hvad det ser ud.
>> Så hvad der sker her, er, at jeg bare plottet hver af løbene og derefter
hvilke de er for.
Og disse to forskellige værdier svarer til 2 og 1.
Hvis du ønsker at være mere elegant, kan du også
bare angive, at 2 er Kerry-- eller 2 er Bush, og derefter 1 er Kerry.
Og du kan også have at De i Deres legende.
>> Og du kan også opdele disse søjlediagrammer.
Fordi én ting er at, hvis du bemærker,
dette er ikke meget let at identificere hvilken af ​​disse to værdier er større.
Så en ting du gerne vil gøre er at tage denne blå område
og bare flytte det over her, så du kan sammenligne disse to ved siden af ​​hinanden.
Og jeg tror det er noget, jeg ikke har tid til at gøre lige nu,
men det er også meget let at gøre.
Du kan bare kigge ind man-siderne for ggplot.
Så du kan bare ggplot ligesom at og læse i denne mand side.
>> Så lad mig lige hurtigt vise dig nogle seje ting.
Lad os gå videre og gå at-- blot en anvendelse af machine learning.
Så lad os sige, at vi har disse tre pakker, så jeg har tænkt mig at indlæse disse i.
Så dette blot udskriver nogle oplysninger efter jeg lagt i ting.
Så siger jeg read.csv, dette datasæt, og nu
Jeg har tænkt mig at gå videre og se og se hvad der er inde i dette datasæt.
>> Så de første 20 observationer.
Så jeg bare have X1, X2, og Y. Så det virker som en flok af disse værdier
spænder fra måske 20 til 80 eller deromkring.
Og så fremdeles for X2 og derefter denne Y synes at være etiketter 0 og 1.
>> For at bekræfte dette, kan jeg bare gøre sammenfatning af data X1.
Og så fremdeles for alle disse andre kolonner.
Så resumé er en hurtig måde blot viser dig hurtige værdier.
Åh, undskyld.
Dette bør man være Y.
>> Så i dette tilfælde giver fraktiler, medianer, maxes så godt.
I dette tilfælde dataY, kan du se at det bare kommer til at være 0 og 1.
Også middelværdien siger 0,6, betyder blot, at det
ser ud til jeg har flere 1s end 0'erne.
>> Så lad mig gå videre og show dig, hvad det ligner.
Så jeg bare at plotte dette.
Lad os se, hvordan man kan klare dette.
Oh OK.
OK.
>> Så dette er, hvad det ser ud.
Så det ser ud som gule jeg specificeret som 0 og derefter rød jeg angivet som 1'ere.
Så her ser det ud label punkter og det
virker som om du bare ville nogle slags gruppering på dette.
>> Og lad mig bare gå videre og show du nogle af disse indbyggede funktioner.
Så her er lm.
Så dette er blot forsøger at montere en linje til dette.
Så hvad er den bedste måde at jeg kan passe en linje sådan
at det bedst vil adskille denne form for klyngedannelse.
Og ideelt set, kan du bare se at jeg bare køre alle disse kommandoer
og så, jeg har tænkt mig videre og tilføje linjen.
>> Så det virker som det bedste gæt.
Det er at tage den bedste, der minimerer fejlen i forsøget på at passe denne linje.
Det er klart, det ser slags godt, men det er ikke den bedste.
Og lineære modeller, i Generelt vil være
virkelig stor for teori og bare slags af bygge- grundlæggende elementer i maskinen
læring.
Men i praksis, er du nødt til ønsker at gøre noget mere generelt.
>> Så du kan bare prøve at køre noget, der hedder et neuralt netværk.
Disse ting er stadig mere almindelige.
Og de arbejder bare fantastisk til store datasæt.
Så i dette tilfælde, vi kun have-- lad os see-- vi har nrow.
Så nrow er bare at sige antal rækker.
Så i dette tilfælde, jeg har 100 observationer.
>> Så lad mig gå videre og gøre et neuralt netværk.
Så dette er virkelig rart fordi jeg bare kan sige nnet
og så er jeg regression Y. Så Y er denne kolonne.
Og så regression det på de to andre variabler.
Så det er kortere notation for X1 og X2.
>> Så lad os gå videre og køre dette.
Åh, undskyld.
Jeg har brug for at køre det hele.
Og dette er blot udskriver notation for hvor hurtigt eller ikke hurtigt det
konvergeret.
Så det ser ud som det gjorde konvergerer.
Så lad mig gå videre og print ud af, hvad det ligner.
>> Se her er billedet, og her er en kontur viser, hvor godt det passer.
Og det er bare-- du kan se dette, at det er meget, meget rart.
Det kunne endda være overfitting, men du kan også
udgør dette med andre teknikker som krydsvalidering.
Og disse er også indbygget i R.
>> Og lad mig lige vise dig Support vektormaskine.
Dette er en anden virkelig almindelig teknik i machine learning.
Det er meget lig lineære modeller, men det bruger hvad der kaldes en kerne metode.
Og lad os se, hvor godt det gør.
Så dette er meget lig hvordan godt et neuralt netværk udfører,
men det er meget mere smidig.
Og det er baseret ud af hvad-- hvordan SVMs arbejde.
>> Så dette er blot en meget hurtigt overblik over nogle
af de indbyggede funktioner, du kan gøre og også nogle af udforskningen af ​​data.
Så lad mig bare gå videre og gå tilbage til dias.
>> Så er naturligvis ikke meget omfattende.
Og det er egentlig bare en teaser viser dig, hvad du virkelig kan gøre i R.
Så hvis du vil bare gerne at lære mere, her
er en masse forskellige ressourcer.
>> Så hvis du er glad for lærebøger eller du er bare glad for at læse ting online,
så er dette en fantastisk en af ​​Hadley Wickham,
der også skabt alle disse virkelig cool pakker.
Hvis du er glad for videoer, så Berkeley har en awesome bootcamp
det er several-- der er slags lang.
Og det vil lære dig næsten alt, hvad du gerne vil vide om R.
>> Og på samme måde er der Codeacademy og alle disse andre slags
af interaktive hjemmesider.
De er også at få common-- mere og mere almindelige.
Så dette er meget lig Codeacademy.
Og endelig, hvis du bare vil Fællesskabet og hjælpe,
disse er en flok ting, du kan gå til.
Det er klart, vi stadig bruge postlister, bare
Ligesom næsten alle andre programmeringssprog samfund.
Og #rstats, dette er vores samfund Twitter.
Det er faktisk ret almindelige.
Og så bruger!
Er bare vores konference.
>> Og så, selvfølgelig, kan du bruge alle disse andre Q & A ting,
Ligesom Stack Overflow, Google, og derefter GitHub.
Fordi de fleste af disse pakker og en masse af fællesskabet
vil være centreret omkring udvikling kode, fordi det er open source.
Og det er bare virkelig rart på GitHub.
Og endelig kan du kontakte mig, hvis du bare have nogen hurtige spørgsmål.
Så du kan finde mig på Twitter her, min hjemmeside, og lige min e-mail.
Så forhåbentlig, det var something-- kun en kort teaser
hvad R er virkelig i stand til at gøre.
Og forhåbentlig du bare tjek disse tre links
og se, hvad du kan gøre mere.
Og jeg tror det er bare om det.
Tak.
>> [Applaus]