#Introduction Ce document présente les exercices de manipulation de chaînes de caractères en utilisant principalement les packages stringr, tidyr et tidytext.

##1. Transformations de base Dans cette section, nous créons une table de données et appliquons des transformations de casse.

# Création de la table
data_textuelle <- tibble(
  nom = c("Mr Eric Legrand", "Mme Anabelle Dupont", "Mme Fatou Slaoui"),
  adresse = c("12 rue Archimède", "47 avenue de la Libération", "3 rue des Fleurs"),
  ville = c("Niort", "Poitiers", "Marseille")
)

# Exercices 1 à 3 : Transformations et concaténations
resultats_transfo <- data_textuelle %>%
  mutate(
    nom_MAJ = str_to_upper(nom),
    adresse_min = str_to_lower(adresse),
    ville_Capital = str_to_title(ville),
    adresse_complete = str_c(adresse, " ", str_to_upper(ville)),
    info_totale = str_c(nom, adresse, ville, sep = " - ")
  )

knitr::kable(resultats_transfo)
nom adresse ville nom_MAJ adresse_min ville_Capital adresse_complete info_totale
Mr Eric Legrand 12 rue Archimède Niort MR ERIC LEGRAND 12 rue archimède Niort 12 rue Archimède NIORT Mr Eric Legrand - 12 rue Archimède - Niort
Mme Anabelle Dupont 47 avenue de la Libération Poitiers MME ANABELLE DUPONT 47 avenue de la libération Poitiers 47 avenue de la Libération POITIERS Mme Anabelle Dupont - 47 avenue de la Libération - Poitiers
Mme Fatou Slaoui 3 rue des Fleurs Marseille MME FATOU SLAOUI 3 rue des fleurs Marseille 3 rue des Fleurs MARSEILLE Mme Fatou Slaoui - 3 rue des Fleurs - Marseille

##2. Découpage et Séparation Ici, nous explorons comment scinder des colonnes complexes en plusieurs variables.

# Exercice 4 : Découpage avec str_split
data_ex4 <- data_textuelle %>%
  mutate(concatene = str_c(nom, adresse, ville, sep = '|'))

# Extraction du premier élément de la liste pour démonstration
decoupage_exemple <- str_split(data_ex4$concatene, "\\|")[[1]]
print(decoupage_exemple)
## [1] "Mr Eric Legrand"  "12 rue Archimède" "Niort"
# Exercice 5 : Séparation de colonnes avec separate()
# Note : Correction du séparateur (espace)
data_separee <- data_textuelle %>%
  separate(
    col = nom,
    into = c("genre", "prenom", "nom_de_famille"),
    sep = " "
  )

knitr::kable(data_separee)
genre prenom nom_de_famille adresse ville
Mr Eric Legrand 12 rue Archimède Niort
Mme Anabelle Dupont 47 avenue de la Libération Poitiers
Mme Fatou Slaoui 3 rue des Fleurs Marseille

##3. Analyse de texte (NLP) Utilisation de tidytext pour le nettoyage et l’analyse fréquentielle

corpus <- tibble(
  id = 1:3,
  texte = c(
    "La data science est un domaine interdisciplinaire.",
    "Le text mining permet d'analyser des documents.",
    "Les ingénieurs utilisent R et Python pour le NLP."
  )
)

# Nettoyage manuel (Exercice 7)
corpus_nettoye <- corpus %>%
  mutate(
    texte_lower = str_to_lower(texte),
    # Correction de [:punch] en [:punct:] et [:digit] en [:digit:]
    texte_propre = str_replace_all(texte_lower, "[[:punct:]]", " "),
    texte_final = str_remove_all(texte_propre, "[[:digit:]]")
  )

# Tokenisation automatique (Exercice 8 & 9)
alice_text <- "Tom was beginning to get very tired of sitting by her sister on the bank, and of having nothing to do : once or twice he had peeped into the book his sister was reading, but it had no pictures or conversations in it, 'and what is the use of a book,' thought Alice 'without pictures or conversation?'"

resultats_alice <- tibble(texte = alice_text) %>%
  unnest_tokens(word, texte) %>%
  count(word, sort = TRUE) %>%
  mutate(probabilite = n / sum(n))

knitr::kable(head(resultats_alice, 5))
word n probabilite
of 3 0.0526316
or 3 0.0526316
the 3 0.0526316
and 2 0.0350877
book 2 0.0350877

Observation : Les mots les plus fréquents sont des mots de liaison (stop words), ce qui est typique en analyse textuelle.

##4. Recherche et Extraction (Regex) Utilisation des expressions régulières pour filtrer et extraire des motifs

# Exercice 10 à 12
data_recherche <- data_textuelle %>%
  mutate(
    contient_liberation = str_detect(adresse, "Libération"),
    numero_rue = str_extract(adresse, "\\d+"),
    nom_corrige = str_replace(nom, "Mr", "M."),
    adresse_norm = str_replace_all(adresse, c("rue" = "RUE", "avenue" = "Avenue"))
  )

knitr::kable(data_recherche)
nom adresse ville contient_liberation numero_rue nom_corrige adresse_norm
Mr Eric Legrand 12 rue Archimède Niort FALSE 12 M. Eric Legrand 12 RUE Archimède
Mme Anabelle Dupont 47 avenue de la Libération Poitiers TRUE 47 Mme Anabelle Dupont 47 Avenue de la Libération
Mme Fatou Slaoui 3 rue des Fleurs Marseille FALSE 3 Mme Fatou Slaoui 3 RUE des Fleurs

##5. Nettoyage de données monétaires Gestion des caractères spéciaux et conversion de types.

donnees_argent <- tibble(
  Id = 1:4,
  Montant = c("10$", "20$", "40$", "50$")
)

# Nettoyage et calcul de la moyenne
donnees_finales <- donnees_argent %>%
  mutate(
    prix_numerique = as.numeric(str_replace(Montant, "\\$", ""))
  )

moyenne_prix <- mean(donnees_finales$prix_numerique)

La moyenne des montants est de r moyenne_prix.

##6. Application sur données réelles (Flights) Analyse des délais sur le dataset nycflights13.

library(nycflights13)

flights_analyse <- flights %>%
  select(dep_delay, carrier, flight) %>%
  drop_na(dep_delay) %>% 
  mutate(
    delay_text = as.character(dep_delay),
    retard_dep = !str_detect(delay_text, "^-") & dep_delay != 0,
    on_time = str_detect(delay_text, "^0$"),
    retard_extreme = dep_delay >= 60
  )

head(flights_analyse) %>% knitr::kable()
dep_delay carrier flight delay_text retard_dep on_time retard_extreme
2 UA 1545 2 TRUE FALSE FALSE
4 UA 1714 4 TRUE FALSE FALSE
2 AA 1141 2 TRUE FALSE FALSE
-1 B6 725 -1 FALSE FALSE FALSE
-6 DL 461 -6 FALSE FALSE FALSE
-4 UA 1696 -4 FALSE FALSE FALSE