Yazar | Xu Tao
Yüksek konut fiyatları Pekin'deki insanları endişelendiriyor Bu makale Pekin'in ikinci el konut verilerini analiz ediyor.
Bu makale esas olarak iki bölüme ayrılmıştır: Python, Ganji.com'un ikinci el konut verilerini tarar ve R, PythonR'de yeni olan öğrenciler için uygun olan, taranan ikinci el konut fiyatları üzerinde doğrusal regresyon analizi yapar.
Python Ganji.com Beijing ikinci el konut verilerini tarıyor
Bir ay boyunca taramaya başladım, bu yüzden Xpath, Beautiful Soup ve her web sitesini uygulama konsolidasyonu için ayrı ayrı taramak için düzenli üç yöntem kullandım. Veri kaynakları aşağıdaki gibidir:
Xpath taranıyor:
Bu esas olarak, belirli öğelerin var olup olmadığını belirlemek için Xpath'in nasıl kullanılacağı sorununu çözmek içindir.Örneğin, evin herhangi bir dekorasyon bilgisi yoksa, yargılamadan, belirli öğelerin yokluğu sürünmenin kesintiye uğramasına neden olacaktır.
ithalat istekleri
lxml ithalat etree'den
request.exceptions import RequestException
çoklu işlemeyi içe aktar
ithalat zamanı
üstbilgiler = {
'Kullanıcı-Aracı': 'Mozilla / 5.0 (Windows NT 10.0; WOW64) AppleWebKit / 537.36 (KHTML, Gecko gibi) Chrome / 55.0.2883.87 Safari / 537.36'}
def get_one_page (url):
Deneyin:
yanıt = request.get (url, başlıklar = başlıklar)
response.status_code == 200 ise:
return response.text
dönüş Yok
RequestException hariç:
dönüş Yok
def parse_one_page (içerik):
Deneyin:
seçici = etree.HTML (içerik)
TÜMÜ = selector.xpath ('// * / div / div / div / div')
TÜMÜNDE div için:
Yol ver {
'Ad': div.xpath ('dl / dd / a / text ()'),
'Tür': div.xpath ('dl / dd / span / text ()'),
'Alan': div.xpath ('dl / dd / span / text ()'),
'Doğru': div.xpath ('dl / dd / span / text ()'),
'Kat': div.xpath ('dl / dd / span / text ()'). Strip (). Replace ('\ n', ""),
'Süsle': div.xpath ('dl / dd / span / text ()'),
#Adresin özel bir muameleye ihtiyacı var
'Adres': div.xpath ('dl / dd // text ()') + div.xpath ('dl / dd // text ()'). Replace ('\ n', '') + div.xpath ('dl / dd // metin ()'). şerit (),
'Toplam Fiyat': div.xpath ('dl / dd / div / span / text ()') + div.xpath ('dl / dd / div / span / text ()'),
'Fiyat': div.xpath ('dl / dd / div / text ()')
}
div == Yok ise: ## Yargıyı buraya ekleyin, öğelerden biri boşsa, Yok sonucunu verin
dönüş Yok
İstisna hariç:
dönüş Yok
def main ():
i aralığı (1, 500) için: # Burada, veri aralığı içinde 500 sayfalık veriyi taramaya ayarlanmıştır, tarama miktarını
url = 'http: //bj.ganji.com/fang5/o {} /'.format (i)
içerik = get_one_page (url)
print ('Sayfa {} yakalandı'.format (i))
parse_one_page (içerik) içindeki div için:
baskı (böl)
__name__ == '__ main__' ise:
ana()
Güzel Çorba taraması:
ithalat istekleri
yeniden ithal
request.exceptions import RequestException
bs4'ten BeautifulSoup içe aktarın
csv içe aktar
ithalat zamanı
üstbilgiler = {'Kullanıcı-Aracı': 'Mozilla / 5.0 (Windows NT 10.0; WOW64) AppleWebKit / 537.36 (KHTML, Gecko gibi) Chrome / 55.0.2883.87 Safari / 537.36'}
def get_one_page (url):
Deneyin:
yanıt = request.get (url, başlıklar = başlıklar)
response.status_code == 200 ise:
return response.text
dönüş Yok
RequestException hariç:
dönüş Yok
def parse_one_page (içerik):
Deneyin:
çorba = BeautifulSoup (içerik, 'html.parser')
öğeler = çorba.find ('div', class_ = re.compile ('js-tips-list'))
items.find_all ('div', class_ = re.compile ('ershoufang-list')) içindeki div için:
Yol ver {
'Ad': div.find ('a', class_ = yeniden.compile ('js-title')). Metin,
'Tür': div.find ('dd', class_ = re.compile ('size')). Content.text, #tag öğesinin .contents özelliği, etiketin alt düğümlerini bir liste olarak çıkarabilir
'Alan': div.find ('dd', class_ = yeniden.compile ('size')). Content.text,
'Doğru': div.find ('dd', class_ = yeniden.compile ('size')). Content.text,
'Kat': div.find ('gg', sınıf_ = yeniden. Yığın ('boyut')). İçindekiler.text.replace ('\ n', ''),
'Süsle': div.find ('dd', class_ = yeniden.compile ('size')). Content.text,
'Adres': div.find ('span', class_ = re.compile ('alan')). Text.strip (). Replace ('', ''). Replace ('\ n', ''),
'Toplam Fiyat': div.find ('span', class_ = re.compile ('js-price')). Text + div.find ('span', class_ = re.compile ('yue')). Metin,
'Fiyat': div.find ('div', class_ = yeniden.compile ('zaman')). Metin
}
# Bazı ikinci el konut bilgileri, şu gibi bilgilerin bir kısmından yoksundur: dekorasyon bilgisi eksikliği veya kat bilgisi eksikliği, şu anda bir değerlendirme eklemeniz gerekir, aksi takdirde tarama kesintiye uğrayacaktır.
div == Yok ise:
dönüş Yok
İstisna hariç:
dönüş Yok
def main ():
aralıktaki i için (1,50):
url = 'http: //bj.ganji.com/fang5/o {} /'.format (i)
içerik = get_one_page (url)
print ('Sayfa {} yakalandı'.format (i))
parse_one_page (içerik) içindeki div için:
baskı (böl)
varsayılan yol dosya adını doğrudan yazmaksa, f: # Data.csv dosyası depolama yolu olarak open ('Data.csv', 'a', newline = '') ile.
alan adları =
writer = csv.DictWriter (f, alan adları = alan adları)
writer.writeheader ()
parse_one_page (içerik) içindeki öğe için:
writer.writerow (öğe)
time.sleep (3) # Tarama sıklığını ayarlayın. Başlangıçta çok fazla tarama yaptım ve bu da web sayfasının doğrulanmasına neden oldu.
__name __ == '__ main__' ise:
ana()
Düzenli tarama: Uzun zamandır çalıştım ama hala çözmedim.
Bu süreçte kolaylıkla karşılaşılan sorunlar şunlardır:
işletim sistemini içe aktar
# Python'un varsayılan çalışma dizinini görüntüleyin
baskı (os.getcwd ())
# Çalışma dizinini değiştirin
os.chdir ('e: \ workpython')
baskı (os.getcwd ())
# Çıktı çalışma dizini
e: \ workpython
Pycharm aşağıdaki gibi yazdırır:
Sözlük döngüsünü doğrudan CSV'ye yazmanın etkisi aşağıdaki gibidir:
R, taranmış ikinci el konut fiyatları üzerinde genel bir doğrusal regresyon analizi yapar
Ganji.com'un yakalanan ikinci el konut verileri üzerinde bazı basit analizler yapmak için R'yi kullanalım.
Verilerin açıklaması
Ad: Analitik referans önemi olmaksızın, tüccarlar için esas olarak dikkat çekici sorular
Tip: Yatak odası sayısı, oturma odası sayısı, banyo sayısı
Alan: Alan (metrekare)
Doğru: Doğru
Kat: Kat
Süsle: ince dekorasyon, sade dekorasyon, kaba oda gibi dekorasyon durumu
Adres: İkinci el evin adresi
Toplam Fiyat: Toplam fiyat
Fiyat: Ortalama fiyat (yuan / metrekare)
Veri temizleme
veri < -read.csv ("E: // R / RData / data.csv İçin Veri")
VERİ < -data # Ad ve Adres sütunlarını kaldırın
VERİ
# Yargı tarama sırasında eklendi, bu nedenle taranan verilerde eksik değerler olup olmadığını bilmiyorum, buradan kontrol edin
colSums (is.na (DATA))
# Burada, Type'ın yatak odası, oturma odası ve banyosu üç farklı sütuna ayrılmıştır.
## Bazı evlerde oturma odası bulunmadığına dikkat edilmelidir, örneğin: 1 yatak odası ve 1 banyonun şu anda ayrı ayrı ele alınması gerekir ve bazılarının tuvalet bilgisi yoktur.
kütüphane (tidyr)
kitaplık (stringr)
VERİ = ayrı (veri = DATA, col = Tür, içine = c ("Yatak odaları", "Salonlar"), sep = "")
VERİ = ayrı (veri = DATA, col = Salonlar, = c ("Salonlar", "Tuvalet"), sep = "salon")
## Banyonun arkasındaki Çince karakterleri kaldırın
DATA $ Tuvalet < -str_replace (DATA $ Tuvalet, "", "")
### Şekil 6'da gösterildiği gibi, Salonlarda Çince karakterleri kaldırın, çünkü bazı konut bilgilerinde oturma odası yoktur, örneğin: 1 yatak odası ve 1 salon. Yatak odası ve oturma odası olarak bölündüğünde, banyo oturma odasına bölünecektir.
DATA $ Salonları < -str_replace (DATA $ Salonları, "", "")
## Verileri oturma odası bilgisi olmadan alın, bu veriler Salonlar sütununa ayrılmıştır
yeni veri < -VERİ
yeni veri
## Salonlar sütununu oturma odası olmadan 0 olarak doldurun
VERİ < -0
VERİ < -yeni veri
colSums (DATA == "")
Yatak Odası Salonları Tuvalet Alanı Yer Dekorasyonuna Doğru
00 20 00 0
Toplam Fiyat Fiyatı
00
## Bilgisiz 2 tuvalet olduğunu bulduk, 0 olarak doldurun.
DATA $ Tuvalet < -0
## Burada Alan'dan sonra metrekareyi kaldırın
VERİ $ Alan < -str_replace (DATA $ Alan, "", "")
## Doğru türünü görüntüleyin
tablo (DATA $ Doğru)
Kuzeye doğru Kuzeydoğuya Güneydoğuya Doğubatıya Doğuya Kuzeybatıya Güneybatıya doğru
512523506532190167838
Güneybatı batıya dönük
2826
## Kat bilgilerinin tüm parantezlerini kaldırın
DATA $ Taban < -str_replace (DATA $ Floor, ". *", "") ## Normal ifade
# Katın kategori bilgilerini görüntüleyin
Alt kat, yer altı, yüksek kat, 1 kat, 2 kat, 3 kat, 4 kat, 5 kat, Orta kat
632327903661101681301016
# Toplam Fiyat ve Fiyattan sonra sırasıyla 10.000 yuan ve yuan / kaldır
DATA $ Toplam Fiyat < -str_replace (DATA $ TotalPrice, "10.000 yuan", "")
DATA $ Fiyat < -str_replace (DATA $ Fiyat, "yuan / ", "")
kafa (DATA)
## Veri formatını dönüştürme
DATA $ Yatak odaları < -as.factor (DATA $ Yatak Odası)
DATA $ Salonları < -as.factor (DATA $ Salonları)
DATA $ Tuvalet < -as.faktör (DATA $ Tuvalet)
VERİ $ Alan < -as.numeric (VERİ $ Alanı)
DATA $ Toplam Fiyat < -as.numeric (DATA $ TotalPrice)
DATA $ Fiyat < -as.numeric (DATA $ Fiyat)
VERİ $ Doğru < -as.faktör (DATA $ Towards)
DATA $ Süsle < -as.factor (DATA $ Süsle)
str (VERİ)
Yukarıdaki veriler temizlendi.
Açıklayıcı analiz
Bu bölümün ana fikri, tek bir bağımsız değişkenin bağımlı değişken üzerindeki etkisini araştırmaktır.Konut fiyatlarını etkileyen faktörleri simüle etmeden ve keşfetmeden önce, öncelikle konut fiyatlarını etkileyen faktörleri yargılamak için her bir değişkenin tanımlayıcı bir analizini yapın. Burada çeşitli faktörlerin toplam fiyat üzerindeki etkisini araştırıyoruz.
Yatak Odası ve Toplam Fiyat arasındaki ilişkiyi keşfedin
tablo (DATA $ Yatak odaları)
12 34 56 79
5411225779193102205 1
## 6, 7 ve 9 yatak odalı yatak odalarının sayısı az olduğu için burada bu verileri boşaltıyoruz.
VERİ < -VERİ
VERİ < -VERİ
VERİ < -VERİ
tablo (DATA $ Yatak odaları)
12 34 5
5411225779193102
kütüphane (ggplot2)
ggplot (DATA, aes (x = Yatak Odası, y = ToplamFiyat)) + geom_boxplot (col = "kırmızı")
DATA $ Yatak odaları < -as.numeric (DATA $ Yatak Odası)
## Burada yatak odası sayısı 1, 2'dir ve 3'ü A, 4'ü B, 5'i C'dir.
DATA $ Yatak odaları < - "A"
DATA $ Yatak odaları < - "A"
DATA $ Yatak odaları < - "A"
DATA $ Yatak odaları < - "B"
DATA $ Yatak odaları < - "C"
Toplam Fiyat, yatak odası sayısına göre değişir. Ve yatak odası sayısının artmasıyla birlikte toplam fiyat da yükseliyor ki bu da kamuoyunun algısına uygun.
Salonlar ve TotalPrice arasındaki ilişkiyi keşfedin
masa (DATA $ Salonlar)
01 23 45 9
201674105077181 0
## 5 Oturma odasında sadece bir kişi var, onu burada taburcu edeceğiz
VERİ < -VERİ
masa (DATA $ Salonlar)
01 23 45 9
201674105077180 0
ggplot (DATA, aes (x = Salonlar, y = Toplam Fiyat)) + geom_boxplot (col = "kırmızı")
Toplam fiyat, oturma odası sayısı 3 olduğunda en yüksek, salon sayısı 0, 1 ve 2 olduğunda toplam fiyat 3 ve 4 salon sayısından daha düşüktür.
Tuvalet ve TotalPrice arasındaki ilişkiyi keşfedin
# Tuvalet ve toplam fiyat arasındaki ilişkiyi keşfedin
masa (DATA $ Tuvalet)
01 23 45 67 9
2214247011674267 20
# Burada 0, 6 ve 7 numaralı banyo sayısını kaldırın
VERİ < -VERİ
VERİ < -VERİ
VERİ < -VERİ
masa (DATA $ Tuvalet)
01 23 45 67 9
0214247011674260 00
ggplot (DATA, aes (x = Tuvalet, y = Toplam Fiyat)) + geom_boxplot (col = "kırmızı")
Genel olarak, ne kadar çok yatak odası varsa, o kadar çok banyo vardır, yani daha fazla banyo, toplam fiyat o kadar yüksek olur.
Alan ve Toplam Fiyat arasındaki ilişkiyi keşfedin
ggplot (DATA, aes (x = Alan, y = Toplam Fiyat)) + geom_point (col = 'kırmızı')
Bu, konut alanı ne kadar büyükse, toplam fiyat o kadar yüksek olur.
Towards ve TotalPrice arasındaki ilişkiyi keşfedin
ggplot (DATA, aes (x = Doğru, y = Toplam Fiyat)) + geom_boxplot (col = "kırmızı")
Taban ve Toplam Fiyat arasındaki ilişkiyi keşfedin
ggplot (DATA, aes (x = Kat, y = Toplam Fiyat)) + geom_boxplot (col = "kırmızı")
Resimdeki bilgiler toplamda sadece 1, 2 ve 3 kat olduğunu ve yeraltının toplam fiyatının daha yüksek olduğunu göstermektedir.
Dekorasyon ve Toplam Fiyat arasındaki ilişkiyi keşfedin
ggplot (DATA, aes (x = Süsleme, y = Toplam Fiyat)) + geom_boxplot (col = "kırmızı")
Farklı dekorasyon bilgilerinin toplam fiyat üzerinde çok az etkisi vardır.
Model oluşturma
Uygun < -lm (Toplam Fiyat ~ Yatak Odası + Salonlar + Tuvalet + Alan + + Kata Doğru + Dekorasyon, veri = DATA)
özet (uygun)
Aramak:
lm (formül = Toplam Fiyat ~ Yatak Odası + Salonlar + Tuvalet + Alan +
+ Kat + Dekorasyon yönünde, veri = VERİ)
Artıklar:
Min 1Q Medyan 3Q Maks
-1330,80 -103,49 -21,4163,882961,59
Katsayılar:
Tahmin Std. Hata t değeri Pr ( > | t |)
(Kesişme) -112.763388.3010 -1.2770.201697
Yatak Odası2 -43.593416.2533 -2.6820.007359 **
Yatak Odası3 -82.656520.7641 -3.9817.04e-05 ***
Yatak Odası4 -63.309634.9521 -1.8110.070198.
Yatak Odası579.061854.07631.4620.143842
Salonlar1 -5.066364.2764 -0.0790.937182
Salonlar2 -53.890565.4427 -0.8230.410307
Salonlar3 -303.975079.2280 -3.8370.000127 ***
Salonlar4 -528.5427104.0849 -5.0784.07e-07 ***
Tuvalet2112.956619.11715.9093.87e-09 ***
Tuvalet3543.730438.805614.012 < 2e-16 ***
Tuvalet4735.189455.097713.343 < 2e-16 ***
Tuvalet5338.790684.28514.0205.98e-05 ***
Alan 5.10910.161931.557 < 2e-16 ***
Kuzeydoğuya doğru 138.908879.38171.7500.080248.
Güneydoğu'ya doğru 187.189568.53882.7310.006351 **
Doğu-Batı yönünde 176.305565.83842.6780.007453 **
Doğuya doğru 210.943573.27442.8790.004022 **
Kuzey-güneye doğru 75.783157.11991.3270.184704
Güneye Doğru 60.194956.96781.0570.290763
Kuzeybatıya doğru 75.432671.14151.0600.289091
Güneybatıya doğru 169.810675.96262.2350.025467 *
Batıya Doğru 234.081676.55853.0580.002253 **
Yeraltı kat -812.357863.3277 -12.828 < 2e-16 ***
Kat 12.352514.24660.8670.385991
Kat 1 kat -313.727852.1342 -6.0182.00e-09 ***
Kat 2 Katlıdır -453.369241.6829 -10.877 < 2e-16 ***
Kat 3 katlıdır -601.703244.3336 -13.572 < 2e-16 ***
Kat 4 katlıdır -183.786636.3396 -5.0574.52e-07 ***
Kat 5 Katlıdır -41.418425.7922 -1.6060.108419
Orta Kat -1.722313.5961 -0.1270.899204
Sade dekorasyonu süsle -63.159122.0584 -2.8630.004224 **
Süsleme -49.327619.8544 -2.4840.013033 *
Boşluk süsleme -157.029924.3012 -6.4621.22e-10 ***
---
İşaret kodları: 0 "***" 0.001 "**" 0.01 "*" 0.05 "." 0.1 "" 1
Artık standart hata: 2794 serbestlik derecesinde 265.5
Çoklu R-kare: 0.6852, Düzeltilmiş R-kare: 0.6815
F istatistiği: 33 ve 2794 DF'de 184,3, p değeri: < 2.2e-16
Modelin F testi, kurulan modelin anlamlı olduğunu gösteren sıfır hipotezini reddeder; Ajusted R-kare 0,6815'dir ve modelin uyumu kabul edilebilir.
Yazar: Xu Tao, 19 yıllık mezunlar, mercan resiflerine odaklanan araştırmalar, her türlü temizlik verisi gibi R, kullanıcılar neredeyse @parkson'u biliyor.
Feragatname: Bu makale, resmi hesap verileri Senlin tarafından sağlanmıştır ve telif hakkı diğer tarafa aittir.
"Belgeler için çağrı"
CSDN halka açık hesabı, "on binlerce teknik insanla büyüme" kavramına bağlıdır. Teknik insanların ilk kez ilgilendikleri endüstri odak olaylarını teknik insanların benzersiz bakış açılarından tanımlamak için yalnızca "inek başlıkları" ve "konuşma" sütunlarını kullanmakla kalmaz, aynı zamanda "Teknoloji Başlıkları" sütunu, sektördeki popüler teknolojilerin ve uygulamaların derinlemesine bir yorumunu sunarak, tüm geliştiricilerin teknolojik trendlere ayak uydurmasına, uyanık bir teknolojik anlayışı sürdürmesine ve sektör eğilimleri ve teknolojileri hakkında daha kapsamlı bir anlayışa sahip olmasına olanak tanır.
Yüksek kaliteli makaleleriniz veya sektörün sıcak olayları, teknoloji trendleri hakkında içgörüler veya derinlemesine uygulama uygulamaları, senaryolar vb. Hakkında yeni içgörüleriniz varsa, gönderimler için lütfen CSDN ile iletişime geçin. İletişim: WeChat (guorui_1118, lütfen gönderim + ad + şirket pozisyonunu not edin), e-posta (guorui@csdn.net).