рдЖрд░ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рд╛рд░рдгреАрдмрджреНрдз рдбреЗрдЯрд╛ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдФрд░ рджреГрд╢реНрдп

рд╕рд╛рдордЧреНрд░реА рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧреА рдЬреЛ рдЖрд░ рднрд╛рд╖рд╛ рдХреЛ рд╕рд╛рд░рдгреАрдмрджреНрдз рдбреЗрдЯрд╛ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдХрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд╕реАрдЦрддреЗ рд╣реИрдВ рдФрд░ рдореБрдЦреНрдп рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЪрд░рдгреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдПрдХ рдХреНрд░реЙрд╕-рдХрдЯрд┐рдВрдЧ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реАрдПрд╕рд╡реА рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░рдиреЗ, рдбреЗрдЯрд╛ рдХреНрд▓реАрдВрдЬрд┐рдВрдЧ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдЯреЗрдХреНрд╕реНрдЯ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ, рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рдорд╛рдк рд╕реЗ рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдФрд░ рдЪрд╛рд░реНрдЯ рдХреЛ рдкреНрд▓реЙрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджрд┐рдЦрд╛рддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ data.table, reshape2, stringdist, рдФрд░ ggplot2 рд╕рдВрдХреБрд▓ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдореЙрд╕реНрдХреЛ рдореЗрдВ рдЯреИрдХреНрд╕реА рджреНрд╡рд╛рд░рд╛ рдпрд╛рддреНрд░рд┐рдпреЛрдВ рдФрд░ рд╕рд╛рдорд╛рди рдХреЗ рдкрд░рд┐рд╡рд╣рди рдкрд░ рдЧрддрд┐рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд░реА рдХрд┐рдП рдЧрдП рдкрд░рдорд┐рдЯ рдХреА рдЬрд╛рдирдХрд╛рд░реА "рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбреЗрдЯрд╛" рдХреЗ рд░реВрдк рдореЗрдВ рд▓реА рдЧрдИ рдереАред рдкрд░рд┐рд╡рд╣рди рд╡рд┐рднрд╛рдЧ рдФрд░ рдорд╛рд╕реНрдХреЛ рдХреЗ рд╕рдбрд╝рдХ рдкрд░рд┐рд╡рд╣рди рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХреЗ рд╡рд┐рдХрд╛рд╕ рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдбреЗрдЯрд╛ред рдбреЗрдЯрд╛рд╕реЗрдЯ рдбреЗрдЯрд╛.mos.ru/datasets/655 рдкреГрд╖реНрда
рд╕реНрд░реЛрдд рдбреЗрдЯрд╛ рдореЗрдВ рдирд┐рдореНрди рдкреНрд░рд╛рд░реВрдк рд╣реИ:
ROWNUM;VEHICLE_NUM;FULL_NAME;BLANK_NUM;VEHICLE_BRAND_MODEL;INN;OGRN 1;"248197";" ┬л-┬╗";"017263";"FORD FOCUS";"7734653292";"1117746207578" 2;"249197";" ┬л-┬╗";"017264";"FORD FOCUS";"7734653292";"1117746207578" 3;"245197";" ┬л-┬╗";"017265";"FORD FOCUS";"7734653292";"1117746207578" ``` 

1. рдкреНрд░рд╛рдердорд┐рдХ рдбреЗрдЯрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ
рдбреЗрдЯрд╛ рдХреЛ рд╕реАрдзреЗ рд╕рд╛рдЗрдЯ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рддреБрд░рдВрдд рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХреЗ рд╕реЗ рдХреЙрд▓рдо рдХрд╛ рдирд╛рдо рдмрджрд▓реЗрдВред
 url <- "http://data.mos.ru/datasets/download/655" colnames = c("RowNumber", "RegPlate", "LegalName", "DocNum", "Car", "INN", "OGRN", "Void") rawdata <- read.table(url, header = TRUE, sep = ";", colClasses = c("numeric", rep("character",6), NA), col.names = colnames, strip.white = TRUE, blank.lines.skip = TRUE, stringsAsFactors = FALSE, encoding = "UTF-8") 
рдЕрдм рдЖрдк рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдФрд░ рдХрд▓реНрдкрдирд╛ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ...

2. рдбреЗрдЯрд╛ рд░реВрдкрд╛рдВрддрд░рдг
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд▓рд╛рдЗрд╕реЗрдВрд╕рдзрд╛рд░реА рдХреЗ рд╕рдВрдЧрдардирд╛рддреНрдордХ рд░реВрдк рдФрд░ рдХрд╛рд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЯреИрдХреНрд╕рд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд╛рд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╡рд┐рддрд░рдг рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╕рдВрдмрдВрдзрд┐рдд рдбреЗрдЯрд╛ рдХреЛ рдЕрд▓рдЧ рд╕реЗ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА FULL_NAME (рдмрджрд▓рд╛ рд╣реБрдЖ рд╡реИрдзрд╛рдирд┐рдХ рдирд╛рдо) рдФрд░ VEHICLE_BRAND_MODEL (рдХрд╛рд░) рдореЗрдВ рд╕рдорд╛рд╣рд┐рдд рд╣реИред
рд╕реНрд░реЛрдд рдбреЗрдЯрд╛ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИ
рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд▓реАрдЧрд▓рдиреЗрдо рдФрд░ рдХрд╛рд░ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдкрд╣рд▓реЗ рд╢рдмреНрдж рдХреНрд░рдорд╢рдГ, рдХрд╛рдиреВрдиреА рд░реВрдк рдФрд░ рдорд╢реАрди рдХреЗ рд░реВрдк рд╣реИрдВ (рдпрд╣ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ, рдпрд╣ рдиреАрдЪреЗ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛)ред рдкреЛрд░реНрдЯреЗрдмрд▓ рдлрд╝реАрд▓реНрдбреНрд╕ рдХреА рд╕реНрдкрд╖реНрдЯ рд╕реВрдЪреА рдХреЗ рд╕рд╛рде data.table рдХреЗ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рджреМрд░рд╛рди рдЕрдирд╛рд╡рд╢реНрдпрдХ рдлрд╝реАрд▓реНрдб рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЫреЛрдбрд╝ рджреА рдЬрд╛рдПрдВрдЧреАред
 ptn <- "^(.+?) (.+)$" # regexp pattern to match first word dt <- data.table(rawdata)[, list(RegPlate, LegalName, Car, OGRN, OrgType = gsub(ptn, "\\1" , toupper( LegalName )), CarBrand = gsub(ptn, "\\1", toupper( Car ))) ] rm(rawdata) # Clear some memory 

3. рдкрд╣рд▓реЗ рдкрд░рд┐рдгрд╛рдо
рдЬрд╛рдБрдЪреЗрдВ рдХрд┐ рдХреМрди рд╕реЗ рд╕рдВрдЧрдардирд╛рддреНрдордХ рд░реВрдк рдбреЗрдЯрд╛ рд╕реЗ рдирд┐рдХрд╛рд▓реЗ рдЧрдП рд╣реИрдВред
 sort( table(dt$OrgType) ) 
 ##      ## 1 392 649 17118 17680 
рдбреЗрдЯрд╛ рдХрд╛рдлреА рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВ: рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЙрджреНрдпрдореА рдкреНрд░рд╛рдкреНрдд рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ (рдЯреИрдХреНрд╕ рдореЗрдВ рдХрдореА?) рдореЗрдВ рдЕрдЧреНрд░рдгреА рд╣реЛрддреЗ рд╣реИрдВ, рд╕реАрдорд┐рдд рджреЗрдпрддрд╛ рд╡рд╛рд▓реА рдХрдВрдкрдирд┐рдпрд╛рдВ рд╣реЛрддреА рд╣реИрдВ, рд╕рдВрдпреБрдХреНрдд рд╕реНрдЯреЙрдХ рдХрдВрдкрдирд┐рдпреЛрдВ рдХреЛ рдЦреЛрд▓рдирд╛ рдФрд░ рдмрдВрдж рдХрд░рдирд╛, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рдЧреИрд░-рд▓рд╛рднрдХрд╛рд░реА рд╕рд╛рдЭреЗрджрд╛рд░реА рднреАред
рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХрд╛рдиреВрдиреА рд░реВрдк рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдХрд┐рддрдиреЗ рд╕реНрд╡рддрдВрддреНрд░ рд▓рд╛рдЗрд╕реЗрдВрд╕рдзрд╛рд░рд┐рдпреЛрдВ (рдФрд░ рдХрд╛рд░реЛрдВ рдХреЛ) рдиреЗ рд▓рд╛рдЗрд╕реЗрдВрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рд╣реИ, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдЙрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рдП рдЬреЛ рдХрд╛рдиреВрдиреА рдЗрдХрд╛рдИ (PSRN) рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИред
 dt[, list( N = length( unique(OGRN) ) ), by = OrgType][order(N, decreasing = TRUE)] 
 ## OrgType N ## 1:  12352 ## 2:  563 ## 3:  14 ## 4:  6 ## 5:  1 

рдбреЗрдЯрд╛ рдХреА рд╕рдлрд╛рдИ

рдорд╛рд╕реНрдХреЛ рдореЗрдВ рдЯреИрдХреНрд╕рд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реЛрдВ рдХреЗ рдХрд┐рд╕ рдмреНрд░рд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?
рдбреЗрдЯрд╛ рд╕реЗрдЯ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХрд╛рд░ рдмреНрд░рд╛рдВрдб рд╢рд╛рдорд┐рд▓ рд╣реИрдВ: 115, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рднреА рдЕрджреНрд╡рд┐рддреАрдп рд╣реИрдВ? рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╣рдо "M" рдЕрдХреНрд╖рд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдЕрдВрдХреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВрдЧреЗред
 sort( unique( dt[grep("^M.*", CarBrand), CarBrand])) 
 ## [1] "M214" "MASERATI" "MAZDA" ## [4] "MAZDA-" "MERCEDES" "MERCEDES-BENZ" ## [7] "MERCEDES-BENZ-" "MERCEDES-BENZ-S500" "MERCEDES-BENZC" ## [10] "MERCEDES-BENZE200K" "MERCEDES-BENZE220CDI" "MERCEDES-BNZ" ## [13] "MERCERDES-BENZ" "MERCRDES" "MERCRDES-BENZ" ## [16] "MERSEDES-" "MERSEDES-BENZ" "METROCAB" ## [19] "MG" "MINI" "MITSUBISHI" 
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрд╛рд░ рдмреНрд░рд╛рдВрдб рдбреЗрдЯрд╛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░рдг рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╣реА рдмреНрд░рд╛рдВрдб - рдорд░реНрд╕рд┐рдбреАрдЬ-рдмреЗрдВрдЬ - рд╡рд┐рднрд┐рдиреНрди рдирд╛рдореЛрдВ рдХреЗ рддрд╣рдд рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕реЗ рдкрд╣рд▓реЗ, рдбреЗрдЯрд╛ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдкрд╛рдареНрдп рд╕реВрдЪрдирд╛ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рдЖрдзрд╛рд░ рдЦреЛрдЬ рдлрд╝рдВрдХреНрд╢рди "рд▓рд╛рдЗрди рд╕реНрдкреЗрд╕рд┐рдВрдЧ" рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдЬреЛрдбрд╝реА рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд▓рд┐рдП, рд╡реЗ рдПрдХ рдореАрдЯреНрд░рд┐рдХ рдХреЛ рд╡рд░реНрдгреЛрдВ рдкрд░ рдкрд░рд┐рдЪрд╛рд▓рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЛ рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВред рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд╕рдорд╛рди, рдХрдо рд╕рдВрдЪрд╛рд▓рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рд╕рдорд╛рди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╢реВрдиреНрдп рдХреА рджреВрд░реА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдФрд░ рд╕рдмрд╕реЗ рднрд┐рдиреНрди рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдПрдХ рдХреА рджреВрд░реА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдареАрдХ рдЙрд╕реА рддрд░рд╣ рд╣реИ рдЬреИрд╕реЗ рд╕рдорд╛рди рдирд╛рдо рдХреЗ рдкреИрдХреЗрдЬ рдХреЗ рд╕реНрдЯреНрд░реИрдВрдбрд┐рд╕реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЬрд╛рд░реЛ-рд╡рд┐рдВрдХрд▓рд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдЪрд▓реЛ рджреВрд░реА рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рд╕рдорд╛рдирддрд╛, 1-рд╕реНрдЯреНрд░реЗрдВрдерд┐рд╕реНрдЯ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВред
 1 - stringdist( c("MERCEDES","MERSEDES","MAZDA","RENAULT","SAAB"), "MERCEDES", method = "jw", p = 0.1) 
 ## [1] 1.0000 0.9417 0.5950 0.3452 0.0000 
рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдбреЗрдЯрд╛ рд╕рдлрд╛рдИ рдХрд╛рд░реНрдп рдХреЗрд╡рд▓ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдкреНрд░рддреНрдпреЗрдХ рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд▓рд┐рдП, рдпрд╣ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗ рд╕рдмрд╕реЗ рд╕рдорд╛рди рдореВрд▓реНрдп рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣рдореЗрд╢рд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА (рдЬреИрд╕рд╛ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реИ)ред рджреВрд╕рд░реЗ, рдХреБрдЫ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рдПрдХ рд╕рдЯреАрдХ рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рднреА рдореИрдиреБрдЕрд▓ рдбреЗрдЯрд╛ рд╕реБрдзрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рдзрд┐ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рддреАрди рдмреНрд░рд╛рдВрдб рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЙрдкрдпреБрдХреНрдд рд╣реИрдВ, рдЬреЛ рдХрд┐ рдЧрд▓рдд рдорд╛рди "BAZ" рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреБрдХреНрдд рд╣реИрдВ:
 1 - stringdist("BAZ", c("VAZ", "UAZ", "ZAZ"), method = "jw", p = 0.1) 
 ## [1] 0.7778 0.7778 0.7778 
рдЕрд░реНрдз-рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╕реБрдзрд╛рд░ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдиреАрдЪреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рд░реВрдк рд╕реЗ рд╕реБрдзрд╛рд░ рд╡рд┐рдХрд▓реНрдк рдЙрддреНрдкрдиреНрди рдХрд░рдХреЗ рдбреЗрдЯрд╛ рдХреНрд▓реАрдВрдЬрд┐рдВрдЧ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдХреЗ рдХрд╛рдо рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдпрд╛ рддреЛ рд╕рд╣рдордд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕рд╣реА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдбреЗрдЯрд╛, рдЕрдХреНрд╕рд░ рд╕рд╛рдордирд╛ рдХрд┐рдП рдЧрдП рдорд╛рди рд╕рд╣реА рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рд╢рд╛рдпрдж рд╣реА рдХрднреА рд╕рд╛рдордирд╛ рдХреА рдЧрдИ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛрддреА рд╣реИрдВред рдлрд╝реНрд░реАрдХреНрд╡реЗрдВрд╕реА рд╡реИрд▓реНрдпреВ рдХреЛ рд╡рдЬрд╝рдирд┐рдВрдЧ рдлреИрдХреНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЖрдиреБрдкрд╛рддрд┐рдХ рд░реВрдк рд╕реЗ рдкрдВрдХреНрддрд┐ рдирд┐рдХрдЯрддрд╛ рдореАрдЯреНрд░рд┐рдХ рдореЗрдВ рд╡реГрджреНрдзрд┐ред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЕрдХреНрд╕рд░ рд╕рд╛рдордирд╛ рдХрд┐рдП рдЧрдП рдХрд╛рд░ рдмреНрд░рд╛рдВрдб, рдорд╛рддреНрд░рд╛ рдХреЗ рдХрд╛рд░рдг рдЖрдЧреЗ рдирд╣реАрдВ рдЖрддреЗ рд╣реИрдВ, рд╕рдорд╛рдирддрд╛ рдХреЗ рдмрдЬрд╛рдп, рдереНрд░реЗрд╢реЛрд▓реНрдб рд╡реИрд▓реНрдпреВ t рдКрдкрд░ рд╕рдорд╛рдирддрд╛ рдХреА рдбрд┐рдЧреНрд░реА рд╡рд╛рд▓реЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдмрд╛рдж рдореЗрдВ t рдЪреБрдирдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ)ред рдорд╢реАрди рдХреЗ рдмреНрд░рд╛рдВрдб рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЕрдиреБрд╢рдВрд╕рд┐рдд "рд╕рдВрджрд░реНрдн" рдореВрд▓реНрдп рдЙрд╕реА рдбреЗрдЯрд╛ рд╕реЗрдЯ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИред "рдмреНрд░рд╛рдВрдб - рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдлрд┐рдХреНрд╕" рдЬреЛрдбрд╝реЗ рд╕реАрдПрд╕рд╡реА рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрдкреБрдЯ рд╣реИрдВред рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдФрд░ рд╕реБрдзрд╛рд░ рдХреЗ рдмрд╛рдж, рд╕рд╣реА рд╕реАрдПрд╕рд╡реА рдлрд╝рд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддреА рд╣реИред
рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдореМрдЬреВрджрд╛ рдбреЗрдЯрд╛рд╕реЗрдЯ рдкрд░ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдлрд┐рдЯ рджреЗрддрд╛ рд╣реИред
 bestmatch.gen <- function(wc, t = 0){ # wc = counts of all base text words # t = threshold: only the words with similarity above threshold count bestmatch <- function(a){ sim <- 1 - stringdist( toupper(a), toupper( names(wc) ) , method = "jw", p = 0.1 ) # Compute weights and implicitly cut off everything below threshold weights <- sim * wc * (sim > t) # Return the one with maximum combined weight names( sort(weights, decr = TRUE)[1] ) } bestmatch } 
t рдХреА рджрд╣рд▓реАрдЬ рдореВрд▓реНрдп рдЕрдиреБрднрд╡рдЬрдиреНрдп рд░реВрдк t рдЪреБрдиреА рдЬрд╛рддреА рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХрд┐ рдереНрд░реЗрд╢реЛрд▓реНрдб рдкреИрд░рд╛рдореАрдЯрд░ t = 0.7 рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
  bm07 <- bestmatch.gen( table( dt$CarBrand), t = 0.7 ) s <- c("FORD","RENO","MERS","PEGO") sapply(s, bm07) 
 ## FORD RENO MERS PEGO ## "FORD" "RENAULT" "MERCEDES-BENZ" "PEUGEOT" 
рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рдерд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдмрд╣реБрдд рдЦреБрд╢реА рдХреА рдмрд╛рдд рд╣реИред рд╕рдорд╛рди рдирд╛рдо рд╡рд╛рд▓реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╡рд╛рд▓реЗ рдХрд╛рд░ рдмреНрд░рд╛рдВрдб рдЬреЛ рдбреЗрдЯрд╛рд╕реЗрдЯ рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рджрд░реНрд╢рд╛рдП рдЧрдП рд╣реИрдВ, рдЕрдиреНрдп рд╕рд╣реА рдирд╛рдореЛрдВ рдХреЛ "рдЦреАрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ"ред
 s <- c("HONDA", "CHRYSLER", "VOLVO") sapply(s, bm07) 
 ## HONDA CHRYSLER VOLVO ## "HYUNDAI" "CHEVROLET" "VOLKSWAGEN" 
рдЖрдЗрдП рджрд╣рд▓реАрдЬ рдорд╛рди рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред
 bm09 <- bestmatch.gen( table( dt$CarBrand), t = 0.9 ) s <- c("HONDA","CHRYSLER","VOLVO") sapply(s, bm09) 
 ## HONDA CHRYSLER VOLVO ## "HONDA" "CHRYSLER" "VOLVO" 
рдХреНрдпрд╛ рд╕рдм рдареАрдХ рд╣реИ? рд▓рдЧрднрдЧред рдбрд┐рд╕рд┐рдорд┐рд▓рд░ рд▓рд╛рдЗрдиреЛрдВ рдХреА рдмрд╣реБрдд рдХрдбрд╝реА рдХрддрд░рди рдЗрд╕ рддрдереНрдп рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддреА рд╣реИ рдХрд┐ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреБрдЫ рдЧрд▓рдд рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕рд╣реА рдорд╛рдирддрд╛ рд╣реИред рдРрд╕реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдареАрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
 s <- c("CEAT", "CVEVROLET") sapply(s, bm09) 
 ## CEAT CVEVROLET ## "CEAT" "CVEVROLET" 
рдЕрдм рдорд╢реАрдиреЛрдВ рдХреЗ рдмреНрд░рд╛рдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрджреНрд╡рд┐рддреАрдп рдореВрд▓реНрдпреЛрдВ рдХреА рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИред рдЪреВрдВрдХрд┐ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рд╛рде рд╕реЗ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдпрджрд┐ рдЗрд╕рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝реАрд▓реНрдб рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдореВрд▓ рдореВрд▓реНрдп (рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ) рд╕реЗ рдЕрд▓рдЧ рд╣реИ, рдХрд┐рддрдиреА рдмрд╛рд░ рдмреНрд░рд╛рдВрдб рдирд╛рдо рдкреНрд░рдХрдЯ рд╣реЛрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдПрдХ рд▓реЗрдмрд▓ рдЬреЛ рд░рд┐рдХреЙрд░реНрдб рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╕реЗрдЯ рдХреА рдХреБрдЫ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдЙрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рджреБрд░реНрд▓рдн (рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЧрд▓рдд) рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕рд╣реА рдорд╛рдирддрд╛ рд╣реИред
 ncb <- table(dt$CarBrand) scb <- names(ncb) # Source Car Brands acb <- sapply(scb, bm09) # Auto-generated replacement cbdict_out <- data.table(ncb)[,list( SourceName = scb, AutoName = acb, SourceFreq = as.numeric(ncb), AutoFreq = as.numeric( ncb[acb] ), Action = ordered( scb == acb, labels = c("CHANGE","KEEP")), DictName = acb )] # Add alert flag # Alert when suggested is a low-frequency dictionary word cbdict_out <- cbdict_out[, Alert := ordered( AutoFreq <= quantile(AutoFreq, probs = 0.05, na.rm = TRUE), labels = c("GOOD","ALERT")) ] write.table( cbdict_out[ order(SourceName), list( Alert, Action, SourceName, AutoName, SourceFreq, AutoFreq, DictName) ], "cbdict_out.txt", sep = ";", quote = TRUE, col.names = TRUE, row.name = FALSE, fileEncoding = "UTF-8") 
DictName рдлрд╝реАрд▓реНрдб рдХреЗ рдорд╛рдиреЛрдВ рдХреЛ рдЬрд╛рдБрдЪрдирд╛ рдФрд░ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдФрд░ рдмрд╛рдж рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХреЗ рд▓рд┐рдП "cbdict_in.txt" рдирд╛рдо рд╕реЗ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд╣реЗрдЬреЗрдВред
рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рд╕реЗрдЯ рдореЗрдВ рдРрд╕реА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ рдЬреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИрдВ:
рдбреЗрдЯрд╛ рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕реАрдорд╛рдПрдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИредрд╣рдо cbdict_in.txt рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╕рдВрдкрд╛рджрд┐рдд рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВред
 if ( file.exists("cbdict_in.txt")) url <- "cbdict_in.txt" else url <- "cbdict_out.txt" cbdict_in <- read.table( url, header = TRUE, sep = ";", colClasses = c( rep("character",4), "numeric", "numeric", "character"), encoding = "UTF-8") cbdict <- cbdict_in$DictName names(cbdict) <- cbdict_in$SourceName 
рдФрд░ рд╣рдо рдбреЗрдЯрд╛ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХрд╛рд░реЛрдВ рдХреЗ рдмреНрд░рд╛рдВрдбреЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕рд╣реА рдХрд░рддреЗ рд╣реИрдВред
 dt[, CarBrand := cbdict[CarBrand]] dt[is.na(CarBrand), CarBrand := "UNKNOWN"] 
рдХрд╛рд░реЛрдВ рдХреЗ рдмреНрд░рд╛рдВрдбреЛрдВ рдХреЗ рдЕрджреНрд╡рд┐рддреАрдп рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕рд╛рдл рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рд▓рдЧрднрдЧ рдЖрдзрд╛ рд╣реЛ рдЧрдпрд╛
 length( unique(dt$CarBrand) ) 
 ## [1] 72 

рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм

1. рд╢реАрд░реНрд╖ 10 рд╕рдВрдЧрдарди
10 рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рдЯреИрдХреНрд╕реА рдкрд╛рд░реНрдХреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рдЖрдпрд╛рдо - рдкреАрдПрд╕рдЖрд░рдПрди рдХреЗ рд▓рд┐рдП рд░реЗрдЯрд┐рдВрдЧ рдмрдирд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
 st <- dt[, list( NumCars = length(RegPlate)), by = list(OGRN, LegalName) ] head( st[order( NumCars, decreasing = TRUE)], 10) 
 ## OGRN LegalName NumCars ## 1: 1137746197104  ┬л┬╗ 866 ## 2: 1037727000893  ┬л-┬╗ 751 ## 3: 1067746273198  ┬л ┬╗ 547 ## 4: 1037789018849  ┬л┬╗ 541 ## 5: 1127746010700  ┬л-24 ┬╗ 406 ## 6: 1057748223653  ┬л┬╗ 349 ## 7: 5067746596297  ┬л┬╗ 288 ## 8: 1027739272175  ┬л14 ┬╗ 267 ## 9: 1137746133250  ┬л ┬╗ 255 ## 10: 5077746757688  ┬л┬╗ 238 
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕ рдбреЗрдЯрд╛рд╕реЗрдЯ рдореЗрдВ, рдХреЗрд╡рд▓ рд▓рд╛рдЗрд╕реЗрдВрд╕рдзрд╛рд░рд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╛рдиреВрдиреА рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХреА рдЬрд╛рддреА рд╣реИ, рдЯреНрд░реЗрдбрдорд╛рд░реНрдХ рдирд╣реАрдВред рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рд╕рдВрдЧрдарди рдФрд░ OGRN рдХреЗ рдирд╛рдо рд╕реЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдЯреИрдХреНрд╕реА рдмреЗрдбрд╝реЗ рдХрд┐рд╕ рдмреНрд░рд╛рдВрдб рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдЖрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рд╕рдордп рд▓реЗрдиреЗ рд╡рд╛рд▓реА рд╣реИред рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рдЯреИрдХреНрд╕реА рдмреЗрдбрд╝реЗ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдкрд░рд┐рдгрд╛рдо " top10orgs.csv " рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХрддреНрд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
 top10orgs <- data.table( read.table( "top10orgs.csv", header = TRUE, sep = ";", colClasses = "character", encoding = "UTF-8")) 
рд╣рдо рджреЛ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЗ рдЬреЙрдЗрди рдСрдкрд░реЗрд╢рди рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП data.table рдХреА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
 setkey(top10orgs,OGRN) setkey(st,OGRN) st[top10orgs][order(NumCars, decreasing = TRUE), list(OrgBrand, EasyPhone, NumCars)] 
 ## OrgBrand EasyPhone NumCars ## 1:  781 81 82 866 ## 2: 956 956 8 956 751 ## 3: - 641 11 11 547 ## 4:   500 0 500 541 ## 5: 24 777 66 24 406 ## 6:   777 5 777 349 ## 7:    940 88 88 288 ## 8: 14  707 2 707 267 ## 9: Cabby 21 21 989 255 ## 10:  927 11 11 238 

2. рдХрд╛рдиреВрдиреА рдЗрдХрд╛рдИ рдХреЗ рд░реВрдк рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рддреАрди рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдХрд╛рд░ рдмреНрд░рд╛рдВрдб
рд▓рд╛рдЗрд╕реЗрдВрд╕реА рдХреЗ рдХрд╛рдиреВрдиреА рд░реВрдк рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд╛рд░реЛрдВ рдХреЗ рдХреМрди рд╕реЗ рдмреНрд░рд╛рдВрдб рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИрдВ? рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдбреЗрдЯрд╛ рдХреЛ рджреЛ рдЖрдпрд╛рдореЛрдВ рдореЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ - рдорд╢реАрди рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдФрд░ рд╕рдВрдЧрдардирд╛рддреНрдордХ рд░реВрдкред
рдкреНрд░рдХреНрд░рд┐рдпрд╛ рддреАрди рдЪрд░рдгреЛрдВ рдореЗрдВ рд╣реЛрддреА рд╣реИ:
  1. рдХреБрд▓ рд╕рдВрдХреЗрддрдХ рдХреА рдЧрдгрдирд╛ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, PSRN рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛)ред
  2. рд░реИрдВрдХ рдЧрдгрдирд╛ред
  3. рд░реИрдВрдХ рдкреНрд░рддрд┐рдмрдВрдз (рд╢реАрд░реНрд╖ 3), рдЫрдБрдЯрд╛рдИ, рд╕реНрддрдВрдн рдкреБрдирд░реНрд╡рд┐рддрд░рдг рдФрд░ рдбреЗрдЯрд╛ рдЖрдЙрдЯрдкреБрдЯред

 st <- dt[, list(AGGR = length(RegPlate)), by = list(OrgType, CarBrand) ] st.r <- st[, list(CarBrand, AGGR, r = ( 1 + length(AGGR) - rank(AGGR, ties.method="first"))), by = list(OrgType)] # ranking by one dimension st.out <- st.r[ r <= 3 ][, list(r, OrgType, cval = paste0(CarBrand," (",AGGR,")"))] dcast(st.out, r ~ OrgType, value.var = "cval")[-1] # reshape data and hide r 
 ##      ## 1 FORD (212) CHEVROLET (2465) VOLVO (1) KIA (192) FORD (3297) ## 2 RENAULT (175) FORD (2238) <NA> CHEVROLET (115) RENAULT (2922) ## 3 HYUNDAI (122) RENAULT (1996) <NA> FORD (53) HYUNDAI (2812) 

рджреГрд╢реНрдп

1. рдкрд╛рдИ рдЪрд╛рд░реНрдЯ рдбреЗрдЯрд╛ рдбрд┐рд╕реНрдкреНрд▓реЗ
рдкрд╛рдИ рдЪрд╛рд░реНрдЯ, рдкрд╛рдИ рдЪрд╛рд░реНрдЯ, рд╡реНрдпрд╛рдкрд╛рд░ рдХреЗ рдорд╛рд╣реМрд▓ рдореЗрдВ рдмрд╣реБрдд рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИ, рд▓реЗрдХрд┐рди рдбреЗрдЯрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдкреЗрд╢реЗрд╡рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдЗрд╕рдХреА рдЖрд▓реЛрдЪрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред рдлрд┐рд░ рднреА, рдпрд╣ "рдкрдХрд╛рдирд╛" рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдк рдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рдЯреИрдХреНрд╕реА рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рд╡рд┐рддрд░рдг рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЖрд░реЗрдЦ рдХреЛ рдУрд╡рд░рд▓реЛрдб рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХрдо рд╕реЗ рдХрдо 1000 рд▓рд╛рдЗрд╕реЗрдВрд╕ рд╡рд╛рд▓реЗ рдмреНрд░рд╛рдВрдб рджрд┐рдЦрд╛рдПрдВрдЧреЗред
 st <- dt[, list(N = length(RegPlate)), by = CarBrand ] # Summary table st <- st[, CarBrand := reorder(CarBrand, N) ] piedata <- rbind( st[ N >= 1000 ][ order(N, decreasing=T) ], data.table( CarBrand = " ", N = sum( st[N < 1000]$N) ) ) piedata 
 ## CarBrand N ## 1: FORD 5800 ## 2: RENAULT 5093 ## 3: HYUNDAI 4727 ## 4: CHEVROLET 4660 ## 5: KIA 2220 ## 6: SKODA 2073 ## 7: NISSAN 1321 ## 8: VOLKSWAGEN 1298 ## 9: TOYOTA 1075 ## 10: MERCEDES-BENZ 1039 ## 11:   6534 
рд╢реЗрдбреНрдпреВрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЯрд┐рдХрдЯреЛрдВ рдХреЗ рдРрд╕реЗ рдХреНрд░рдо рдХреЛ рдареАрдХ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдпрджрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЫрдВрдЯрд╛рдИ рдЕрдВрддрд┐рдо рд╕реНрдерд╛рди рд╕реЗ "рдЕрдиреНрдп рдмреНрд░рд╛рдВрдбреЛрдВ" рдХреЛ рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рдкрд░ рд▓рд╛рдПрдЧреАред
 piedata <- piedata[, CarBrand := factor(CarBrand, levels = CarBrand, ordered = TRUE)] 
рдЪрд╛рд░реНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, ggplot2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
 pie <- ggplot(piedata, aes( x = "", y = N, fill = CarBrand)) + geom_bar(stat = "identity") + coord_polar(theta = "y") pie 
plot of chunk pie_1
рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдлреА рдЬрд╛рдирдХрд╛рд░реАрдкреВрд░реНрдг рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореИрдВ рдХрдИ рджреГрд╢реНрдп рд╕реБрдзрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛:
рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб рдЖрдкрдХреЛ рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдмрдЧрд▓ рдореЗрдВ рд▓реЗрдмрд▓ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рд╕реЗрдХреНрдЯрд░ рдХреЗ рдХреЗрдВрджреНрд░ рдХреЗ рдмрд┐рдВрджреБ рдХреА рдЧрдгрдирд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдХреНрд╖реЗрддреНрд░ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ ( рдЖрд░реНрдЯреЗрд▓рд╕реНрдЯреИрдЯрд┐рд╕реНрдЯрд┐рдХреЛрд╡реЛрд╡ рдкрд░ рдЬрд╛рд╕реВрд╕реА)ред
 piedata <- piedata[, pos := cumsum(N) - 0.5*N ] pie <- ggplot(piedata, aes( x = "", y = N, fill = CarBrand)) + geom_bar( color = "black", stat = "identity", width = 0.5) + geom_text( aes(label = N, y = pos), x = 1.4, color = "black", size = 5) + scale_fill_brewer(palette = "Paired", name = " ") + coord_polar(theta = "y") + theme_bw() + theme ( panel.border = element_blank() , panel.grid.major = element_blank() , axis.ticks = element_blank() , axis.title.x = element_blank() , axis.title.y = element_blank() , axis.text.x = element_blank() , legend.title = element_text(face="plain", size=16) ) pie 
plot of chunk pie_2
2. рдмрд╛рд░ рдЪрд╛рд░реНрдЯ
рд╕рд░реНрдХрд▓ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реАрдкреВрд░реНрдг рд╡рд┐рдХрд▓реНрдк рдПрдХ рдмрд╛рд░ рдЪрд╛рд░реНрдЯ, рдмрд╛рд░ рдЪрд╛рд░реНрдЯ рд╣реИред рдЗрд╕ рддрдереНрдп рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐ рдХреЙрд▓рдо рдХреА рд▓рдВрдмрд╛рдИ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЖрд░реНрдХреНрд╕ рдХреА рд▓рдВрдмрд╛рдИ рдпрд╛ рд╕рд░реНрдХрд▓ рд╕реЗрдХреНрдЯрд░реЛрдВ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдмрд╛рд░ рдЪрд╛рд░реНрдЯ рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдк рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдВрдЧрдардирд╛рддреНрдордХ рд░реВрдкреЛрдВ рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рд╡рд┐рддрд░рдгред
 st <- dt[, list(N = length(RegPlate)), by = list(OrgType, CarBrand) ] # Summary table cbsort <- st[, list( S = sum(N) ), keyby = CarBrand ] # Order by total number setkey(st, CarBrand) st <- st[cbsort] # Join topcb <- st[ S >= 1000 ][ order(S) ] bottomcb <- st[S < 1000, list(CarBrand = " ", OrgType, N = sum(N)), by = OrgType] bottomcb <- bottomcb[, list(CarBrand, OrgType, N, S = sum(N))] bardata <- rbind( bottomcb, topcb) bardata <- bardata[, CarBrand := factor(CarBrand, levels = unique(CarBrand), ordered=T)] # bar <- ggplot(bardata, aes(x = CarBrand, weight = N, fill = OrgType)) + geom_bar() + coord_flip() + scale_fill_brewer(palette = "Spectral", name = "") + labs(list(y = " ", x = " ")) + theme_bw() bar 
plot of chunk bar
3. рд╣реАрдЯ рдореИрдк рдЖрд░реЗрдЦ
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдк рдЗрд╕ рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рдкрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ: "рдХрд┐рд╕ рдХрд╛рд░ рдмреНрд░рд╛рдВрдб рдХреЗ рдорд╛рд▓рд┐рдХреЛрдВ (рдЯреИрдХреНрд╕реА рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЗ рдмреАрдЪ) рдХреЛ" рд╕реБрдВрджрд░ "рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЦрддрд░рд╛ рд╣реИ?" рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рддреНрд░рд┐рднреБрдЬ рдореЗрдВ рд╕рдорд╛рди рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕реБрдВрджрд░ рд╕рдВрдЦреНрдпрд╛ рдорд╛рдирддреЗ рд╣реИрдВ: 111, 222, рдЖрджрд┐ред
рд╡рд┐рд╢реНрд▓реЗрд╖рдг рджреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рдЖрдпрд╛рдореЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдХрд╛рд░ рдХрд╛ рдмреНрд░рд╛рдВрдб рдФрд░ рддреАрдиред рд╕рдВрдХреЗрддрдХ - рдмреНрд░рд╛рдВрдб рдФрд░ рдЯреНрд░рд┐рдкрд▓ рдХреЗ рджрд┐рдП рдЧрдП рд╕рдВрдпреЛрдЬрди рдХреЗ рд╕рд╛рде рдХрд╛рд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ред рдЗрд╕ рддрд░рд╣ рдХреЗ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЯреЗрдмрд▓ рдХрд╛ рдПрдХ рджреГрд╢реНрдп рдПрдирд╛рд▓реЙрдЧ, рд╣реАрдЯ рдореИрдк рдЖрд░реЗрдЦ, рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓ рд╣реИред рдЕрдзрд┐рдХ рд▓реЛрдХрдкреНрд░рд┐рдп рдЯреНрд░рд┐рдкрд▓, рдЕрдзрд┐рдХ рдЧрд╣рди рд░рдВрдЧ рд╕реЗрд▓ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдПрдиреНрдХреЛрдб рдХрд░рддрд╛ рд╣реИред
 ln <- dt[grep( "^[^0-9]([0-9])\\1{2}.+$" , RegPlate), list(CarBrand, LuckyNum = gsub("^[^0-9]([0-9]{3}).+$","\\1", RegPlate))] ln <- ln[, list( N = .N), by = list(CarBrand, LuckyNum) ] ln <- ln[, Luck := sum(N), by = list(CarBrand) ] # Total number of lucky regplates per car brand ln <- ln[, CarBrand := reorder(CarBrand, Luck) ] # heatmap <- ggplot(ln, aes(x = CarBrand, y = LuckyNum)) + geom_tile( aes(fill = as.character(N)), color = "black") + scale_fill_brewer(palette = "YlOrRd", name = " ┬л┬╗ :") + labs(list(x = " ", y = " ")) + theme_bw() + theme ( panel.grid.major = element_blank() , axis.text.x = element_text(angle = 45, hjust = 1) , axis.title.y = element_text(vjust = 0.3) , legend.position = "top" , legend.title.align = 1 ) heatmap 
plot of chunk lucky_numbers
рд╕рднреА рдЪрд┐рддреНрд░ рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рд░реВрдк рд╕реЗ рдЖрдзрд╛рд░рд┐рдд рд░рдВрдЧ рдкрдЯреНрдЯрд┐рдХрд╛ 2.0 рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рд░рдВрдЧ рдкрдЯреНрдЯрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред


Source: https://habr.com/ru/post/In217963/


All Articles