Persatuan R dan PostgreSQL. Kami menganalisis pekerjaan bandara, menghitung pensiun

Bagian I. R mengekstrak dan menggambar


Tentu saja, PostgreSQL diciptakan dari awal sebagai DBMS universal, dan bukan sebagai sistem OLAP khusus. Tetapi salah satu keuntungan besar Postgres adalah dukungannya untuk bahasa pemrograman, yang dengannya Anda dapat memanfaatkannya. Mengingat banyaknya bahasa prosedural bawaan, itu tidak ada bandingannya. PL / R - server implementasi R - bahasa favorit analis - salah satunya. Tetapi lebih lanjut tentang itu nanti.

R adalah bahasa yang luar biasa dengan tipe data khusus - list , misalnya, dapat mencakup tidak hanya data dari tipe yang berbeda, tetapi juga fungsinya (secara umum, bahasa tersebut eklektik, dan kami tidak akan berbicara tentang kepemilikannya pada keluarga tertentu, sehingga tidak menyebabkan diskusi yang mengganggu). Ini memiliki tipe data.frame cantik yang meniru tabel RDBMS - itu adalah matriks di mana kolom berisi tipe data yang berbeda yang umum di tingkat kolom. Oleh karena itu (dan karena alasan lain) bekerja dengan database di R cukup nyaman.

Kami akan bekerja pada baris perintah di lingkungan RStudio dan terhubung ke PostgreSQL melalui driver ODBC RpostgreSQL . Mereka mudah dipasang.

Karena R dibuat sebagai semacam varian bahasa S untuk mereka yang terlibat dalam statistik, kami juga akan memberikan contoh dari statistik sederhana dengan grafik sederhana. Kami tidak memiliki tujuan untuk memperkenalkan bahasa, tetapi ada tujuan untuk menunjukkan interaksi R dan PostgreSQL .

Ada tiga cara untuk memproses data yang disimpan dalam PostgreSQL.

Pertama, Anda dapat memompa data dari database dengan cara apa pun yang mudah, kemas, katakanlah, di JSON - R memahaminya - dan memprosesnya lebih lanjut dalam R. Ini biasanya bukan cara yang paling efisien dan tentu saja bukan yang paling menarik, kami tidak akan mempertimbangkannya di sini.

Kedua, Anda dapat berkomunikasi dengan database - baca darinya dan masukkan data ke dalamnya - dari lingkungan R sebagai klien, menggunakan driver ODBC / DBI, memproses data dalam R. Kami akan menunjukkan bagaimana ini dilakukan.

Dan akhirnya, Anda dapat melakukan pemrosesan dengan alat R yang sudah ada di server database, menggunakan PL / R sebagai bahasa prosedural terintegrasi. Ini masuk akal dalam sejumlah kasus, karena dalam R, misalnya, ada cara yang sesuai untuk menggabungkan data yang tidak ada dalam pl/pgsql . Kami akan menunjukkan ini juga.

Pendekatan umum adalah dengan menggunakan opsi ke-2 dan ke-3 dalam berbagai fase proyek: pertama-tama debug kode sebagai program eksternal, dan kemudian transfer ke pangkalan.

Mari kita mulai. Bahasa yang ditafsirkan. Oleh karena itu, Anda dapat mengikuti langkah-langkahnya, atau Anda dapat memasukkan kode ke dalam skrip. Masalah selera: contoh-contoh dalam artikel ini pendek.

Pertama, tentu saja, Anda perlu menghubungkan driver yang sesuai:

 # install.packages("RPostgreSQL") require("RPostgreSQL") drv <- dbDriver("PostgreSQL") 

Operasi penugasan terlihat di R, seperti yang Anda lihat, aneh. Secara umum, dalam R a <- b artinya sama dengan b -> a, tetapi cara penulisan pertama lebih umum.

Kami akan mengambil basis data yang sudah selesai: demobase transportasi udara , yang digunakan oleh materi pelatihan Postgres Professional . Pada halaman ini Anda dapat memilih opsi basis data sesuai selera (yaitu, ukuran) dan membaca deskripsinya. Kami mereproduksi skema data untuk kenyamanan:



Misalkan pangkalan diinstal pada server 192.168.1.100 dan disebut demo . Terhubung:

 con <- dbConnect(drv, dbname = "demo", host = "192.168.1.100", port = 5434, user = "u_r") 

Kami melanjutkan. Mari kita lihat dengan permintaan penerbangan kota mana yang paling sering terlambat:

 SELECT ap.city, avg(extract(EPOCH FROM f.actual_arrival) - extract(EPOCH FROM f.scheduled_arrival))/60.0 t FROM airports ap, flights f WHERE ap.airport_code = f.departure_airport AND f.scheduled_arrival < f.actual_arrival AND f.departure_airport = ap.airport_code GROUP BY ap.city ORDER BY t DESC LIMIT 10; 

Untuk mendapatkan menit terlambat, kami menggunakan konstruksi postgres extract(EPOCH FROM ...) untuk mengekstrak detik "absolut" dari bidang timestamp dan dibagi dengan 60.0, bukan 60, untuk menghindari membuang sisanya saat membagi, dipahami sebagai integer. EXTRACT MINUTE tidak dapat digunakan, karena ada penundaan selama lebih dari satu jam. Kami rata-rata keterlambatan oleh operator avg - avg .

Kami meneruskan teks ke variabel dan mengirim permintaan ke server:

 sql1 <- "SELECT ... ;" res1 <- dbGetQuery(con, sql1) 

Sekarang kita akan mencari tahu dalam bentuk apa permintaan itu datang. Untuk melakukan ini, bahasa R memiliki fungsi class()

 class (res1) 

Ini akan menunjukkan bahwa hasilnya dikemas ke dalam tipe data.frame , yaitu, kita ingat bahwa itu adalah analog dari tabel dasar: pada kenyataannya, ini adalah matriks dengan kolom tipe sewenang-wenang. Ngomong-ngomong, dia tahu nama-nama kolom, dan kolom, jika ada, dapat diakses, misalnya, seperti ini:

 print (res1$city) 

Saatnya memikirkan bagaimana memvisualisasikan hasil. Untuk melakukan ini, Anda dapat melihat apa yang kami miliki. Misalnya, pilih jadwal yang sesuai dari daftar ini :

  • R-Bar Charts (Bar)
  • R-Boxplots (stok)
  • R-Histogram
  • Grafik R-Line (grafik)
  • R-Scatterplots (point)

Harus diingat bahwa untuk setiap jenis input, disediakan tipe data yang cocok untuk gambar. Pilih bagan batang (balok telentang). Ini membutuhkan dua vektor untuk nilai aksial. Jenis "vektor" dalam R hanyalah seperangkat nilai dari jenis yang sama. c() adalah konstruktor vektor.

Anda dapat menghasilkan dua vektor yang diperlukan dari hasil tipe data.frame sebagai berikut:

 Time <- res1[,c('t')] City <- res1[,c('city')] class (Time) class (City) 

Ekspresi di sisi kanan terlihat aneh, tapi itu teknik yang nyaman. Selain itu, berbagai ekspresi dapat ditulis dengan sangat kompak dalam R. Dalam tanda kurung siku sebelum koma, indeks seri, setelah koma - indeks kolom. Fakta bahwa koma tidak bernilai apa-apa hanya berarti bahwa semua nilai akan dipilih dari kolom yang sesuai.

Kelas Waktu adalah numeric , dan kelas Kota adalah character . Ini adalah varietas vektor.

Sekarang Anda bisa melakukan visualisasi itu sendiri. Anda harus menentukan file gambar.

 png(file = "/home/igor_le/R/pics/bars_horiz.png") 

Setelah itu, prosedur yang membosankan berikut: mengatur parameter ( par ) dari grafik. Dan bukan untuk mengatakan bahwa segala sesuatu dalam paket grafis R adalah intuitif. Misalnya, parameter las menentukan posisi label dengan nilai di sepanjang sumbu relatif terhadap sumbu itu sendiri:

  • 0 dan secara default paralel dengan sumbu;
  • 1 - selalu horisontal;
  • 2 - tegak lurus terhadap sumbu;
  • 3 - selalu tegak

Kami tidak akan mengecat semua parameter. Secara umum, ada banyak dari mereka: bidang, skala, warna - cari, bereksperimen di waktu luang Anda.

 par(las=1) par(mai=c(1,2,1,1)) 

Akhirnya, kami membuat grafik dari kolom telentang:

 barplot(Time, names.arg=City, horiz=TRUE, xlab=" ()", col="green", main="  ", border="red", cex.names=0.9) 

Bukan itu saja. Saya harus mengatakan satu hal terakhir:

 dev.off() 




Untuk perubahan, kita akan menggambar diagram titik keterlambatan. Hapus LIMIT dari permintaan, sisanya sama. Tetapi sebar grafik membutuhkan satu vektor, bukan dua.

 Dots <- res2[,c('t')] png(file = "/home/igor_le/R/scripts/scatter.png") plot(input5, xlab="",ylab="",main=" ") dev.off() 



Untuk visualisasi, kami menggunakan paket standar. Jelas bahwa R adalah bahasa yang populer dan paket ada di sekitar infinity. Anda dapat bertanya tentang yang sudah diinstal seperti ini:

 library() 

Bagian II R menghasilkan pensiunan


R nyaman digunakan tidak hanya untuk analisis data, tetapi juga untuk pembuatannya. Di mana ada fungsi statistik yang kaya, tidak mungkin ada berbagai algoritma untuk membuat urutan acak. Secara khusus, Anda bisa menggunakan distribusi khas (Gaussian) dan tidak cukup khas (Zipf) untuk mensimulasikan kueri basis data.

Tetapi lebih lanjut tentang itu di bagian selanjutnya.

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


All Articles